diff -Naur ns-3.22/AUTHORS ns-3.23/AUTHORS
--- ns-3.22/AUTHORS	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/AUTHORS	2015-05-13 11:05:26.000000000 -0700
@@ -28,9 +28,11 @@
 Eugene Chemeritskiy (echemeritskiy@arccn.ru)
 Yufei Cheng (yfcheng@ittc.ku.edu)
 Andrey Churin (aachurin@gmail.com)
+Benjamin Cizdziel (ben.cizdziel@gmail.com)
 Salva Climent (jocliba@gmail.com)
 Luis Cortes (cortes@gatech.edu)
 Luca Costantino (luca.costantino@gmail.com)
+Matthieu Coudron (matthieu.coudron@lip6.fr)
 Alexander D'souza (moijes12@gmail.com)
 Sébastien Deronne (sebastien.deronne@gmail.com)
 Craig Dowell (craigdo@ee.washington.edu)
@@ -49,6 +51,7 @@
 Ashim Ghosh (ashim.atiit@gmail.com)
 Martin Giachino (martin.giachino@gmail.com,giachino@fing.edu.uy)
 Tom Goff (tgoff@tgoff.net)
+Mohit Goyal (mohit.bits@gmail.com)
 Juan C. Granda (jcgranda@uniovi.es)
 David Gross (gdavid.devel@gmail.com)
 Maja Grubišić (maja.grubisic@live.com)
@@ -57,6 +60,7 @@
 Bruno Haick (bghaick@hotmail.com)
 Frank Helbert (frank@ime.usp.br)
 Tom Henderson (tomhend@u.washington.edu)
+Christopher Hepner (hepner@hs-ulm.de)
 Budiarto Herman (budiarto.herman@magister.fi)
 Tom Hewer (tomhewer@mac.com)
 Kristian A. Hiorth (kristahi@ifi.uio.no)
@@ -82,6 +86,7 @@
 Emmanuelle Laprise (emmmanuelle.laprise@bluekazoo.ca)
 Kristijan Lenković (k.lenkovic@me.com)
 Daniel Lertpratchya (nikkipui@gmail.com)
+Brett Levasseur (brettl20@gmail.com)
 Björn Lichtblau (lichtbla@informatik.hu-berlin.de)
 Timo Lindhorst (tlnd@online.de)
 Erwan Livolant (erwan.livolant@inria.fr)
@@ -101,6 +106,7 @@
 Edvin Močibob (edvin.mocibob@gmail.com)
 Mike Moreton (mjvm_ns@hotmail.com)
 Michele Muccio (michelemuccio@virgilio.it)
+Esteban Municio (esteban.municio@urjc.es)
 Sidharth Nabar (snabar@uw.edu)
 Hemanth Narra (hemanth@ittc.ku.edu)
 Roman Naumann (naumann@informatik.hu-berlin.de)
diff -Naur ns-3.22/CHANGES.html ns-3.23/CHANGES.html
--- ns-3.22/CHANGES.html	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/CHANGES.html	2015-05-13 11:05:26.000000000 -0700
@@ -51,6 +51,39 @@
 us a note on ns-developers mailing list.</p>
 
 <hr>
+<h1>Changes from ns-3.22 to ns-3.23</h1>
+<h2>New API:</h2>
+<ul>
+  <li> The mobility module includes a GeographicPositions class used to
+convert geographic to cartesian coordinates, and to generate randomly
+distributed geographic coordinates.
+  </li>
+  <li>  The spectrum module includes new TvSpectrumTransmitter classes and helpers to create television transmitter(s) that transmit PSD spectrums customized by attributes such as modulation type, power, antenna type, channel frequency, etc.
+  </li>
+</ul>
+<h2>Changes to existing API:</h2>
+<ul>
+  <li> In LteSpectrumPhy, LtePhyTxEndCallback and the corresponding methods have been removed, since they were unused.
+  </li>
+  <li> In the DataRate class in the network module, CalculateTxTime has been declared deprecated.  CalculateBytesTxTime and CalculateBitsTxTime are to be used instead.  The return value is a Time, instead of a double.
+  </li>
+  <li> In the Wi-Fi InterferenceHelper, the interference event now takes the WifiTxVector as an input parameter, instead of the WifiMode.  A similar change was made to the WifiPhy::RxOkCallback signature.
+  </li>
+</ul>
+<h2>Changes to build system:</h2>
+<ul>
+  <li> None </li>
+</ul>
+<h2>Changed behavior:</h2>
+This section is for behavioral changes to the models that were not due to a bug fix.
+<ul>
+  <li> In Wi-Fi, HT stations (802.11n) now support two-level aggregation. The InterferenceHelper now distinguishes between the PLCP and regular payload reception, for higher fidelity modeling.  ACKs are now sent using legacy rates and preambles.  Acces points now establish BSSBasicRateSet for control frame transmissions.  PLCP header and PLCP payload reception have been decoupled to improve PHY layer modeling accuracy.  RTS/CTS with A-MPDU is now fully supported.  
+  </li>
+  <li> The mesh module was made more compliant to the IEEE 802.11s-2012 standard and packet traces are now parseable by Wireshark.  
+  </li>
+</ul>
+
+<hr>
 <h1>Changes from ns-3.21 to ns-3.22</h1>
 <h2>New API:</h2>
 <ul>
diff -Naur ns-3.22/doc/doxygen.conf ns-3.23/doc/doxygen.conf
--- ns-3.22/doc/doxygen.conf	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/doxygen.conf	2015-05-13 11:05:26.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-dev"
+PROJECT_NUMBER         = "3.23"
 
 # 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
diff -Naur ns-3.22/doc/manual/source/attributes.rst ns-3.23/doc/manual/source/attributes.rst
--- ns-3.22/doc/manual/source/attributes.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/attributes.rst	2015-05-13 11:05:26.000000000 -0700
@@ -165,6 +165,7 @@
     {
       static TypeId tid = TypeId ("ns3::Node")
         .SetParent<Object> ()
+        .SetGroupName ("Network")
         .AddConstructor<Node> ()
         .AddAttribute ("DeviceList",
 	               "The list of devices associated to this Node.",
@@ -300,6 +301,7 @@
     {
       static TypeId tid = TypeId ("ns3::DropTailQueue")
         .SetParent<Queue> ()
+        .SetGroupName ("Network")
         .AddConstructor<DropTailQueue> ()
         .AddAttribute ("MaxPackets", 
                        "The maximum number of packets accepted by this DropTailQueue.",
diff -Naur ns-3.22/doc/manual/source/conf.py ns-3.23/doc/manual/source/conf.py
--- ns-3.22/doc/manual/source/conf.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/conf.py	2015-05-13 11:05:26.000000000 -0700
@@ -48,9 +48,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.22/doc/manual/source/new-models.rst ns-3.23/doc/manual/source/new-models.rst
--- ns-3.22/doc/manual/source/new-models.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/new-models.rst	2015-05-13 11:05:26.000000000 -0700
@@ -341,6 +341,7 @@
     {
       static TypeId tid = TypeId ("ns3::ErrorModel")
         .SetParent<Object> ()
+        .SetGroupName ("Network")
         ;
       return tid;
     }
@@ -359,6 +360,7 @@
     {
       static TypeId tid = TypeId ("ns3::RateErrorModel")
         .SetParent<ErrorModel> ()
+        .SetGroupName ("Network")
         .AddConstructor<RateErrorModel> ()
         ;
       return tid;
@@ -556,6 +558,7 @@
     {
       static TypeId tid = TypeId ("ns3::RateErrorModel")
         .SetParent<ErrorModel> ()
+        .SetGroupName ("Network")
         .AddConstructor<RateErrorModel> ()
       ...
 
diff -Naur ns-3.22/doc/manual/source/random-variables.rst ns-3.23/doc/manual/source/random-variables.rst
--- ns-3.22/doc/manual/source/random-variables.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/random-variables.rst	2015-05-13 11:05:26.000000000 -0700
@@ -277,6 +277,7 @@
     { 
       static TypeId tid = TypeId ("ns3::RandomPropagationDelayModel")
         .SetParent<PropagationDelayModel> ()
+        .SetGroupName ("Propagation")
         .AddConstructor<RandomPropagationDelayModel> ()
         .AddAttribute ("Variable",
                        "The random variable which generates random delays (s).",
diff -Naur ns-3.22/doc/manual/source/test-framework.rst ns-3.23/doc/manual/source/test-framework.rst
--- ns-3.22/doc/manual/source/test-framework.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/test-framework.rst	2015-05-13 11:05:26.000000000 -0700
@@ -4,7 +4,7 @@
 Testing framework
 -----------------
 
-ns-3 consists of a simulation core engine, a set of models, example programs, 
+|ns3| consists of a simulation core engine, a set of models, example programs, 
 and tests.  Over time, new contributors contribute models, tests, and 
 examples.  A Python test program ``test.py`` serves as the test
 execution manager; ``test.py`` can run test code and examples to
@@ -17,7 +17,7 @@
 BuildBots
 *********
 
-At the highest level of ns-3 testing are the buildbots (build robots).  
+At the highest level of |ns3| testing are the buildbots (build robots).  
 If you are unfamiliar with
 this system look at `<http://djmitche.github.com/buildbot/docs/0.7.11/>`_.  
 This is an open-source automated system that allows |ns3| to be rebuilt
@@ -120,6 +120,17 @@
     -e EXAMPLE, --example=EXAMPLE
                           specify a single example to run (no relative path is
                           needed)
+    -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
@@ -307,7 +318,7 @@
 
   PASS: Example examples/udp/udp-echo
 
-You can specify the directory where ns-3 was built using the
+You can specify the directory where |ns3| was built using the
 ``--buildpath`` option as follows.
 
 ::
@@ -329,7 +340,7 @@
   PASS: Example examples/tutorial/first.py
 
 Because Python examples are not built, you do not need to specify the
-directory where ns-3 was built to run them.
+directory where |ns3| was built to run them.
 
 Normally when example programs are executed, they write a large amount of trace 
 file data.  This is normally saved to the base directory of the distribution 
@@ -399,7 +410,7 @@
   $ ./test.py --verbose
 
 All of these options can be mixed and matched.  For example, to run all of the 
-ns-3 core test suites under valgrind, in verbose mode, while generating an HTML
+|ns3| core test suites under valgrind, in verbose mode, while generating an HTML
 output file, one would do::
 
   $ ./test.py --verbose --grind --constrain=core --html=results.html 
@@ -417,14 +428,32 @@
 * Examples
 * Performance Tests
 
+Moreover, each test is further classified according to the expected time needed to
+run it. Tests are classified as:
+
+* QUICK 
+* EXTENSIVE
+* TAKES_FOREVER
+
+Note that specifying EXTENSIVE fullness will also run tests in QUICK category. 
+Specifying TAKES_FOREVER will run tests in EXTENSIVE and QUICK categories. 
+By default, only QUICK tests are ran.
+
+As a rule of thumb, tests that must be run to ensure |ns3| coherence should be
+QUICK (i.e., take a few seconds). Tests that could be skipped, but are nice to do
+can be EXTENSIVE; these are tests that typically need minutes. TAKES_FOREVER is
+left for tests that take a really long time, in the order of several minutes.
+The main classification goal is to be able to run the buildbots in a reasonable
+time, and still be able to perform more extensive tests when needed.
+
 BuildVerificationTests
 ++++++++++++++++++++++
 
 These are relatively simple tests that are built along with the distribution
 and are used to make sure that the build is pretty much working.  Our
 current unit tests live in the source files of the code they test and are
-built into the ns-3 modules; and so fit the description of BVTs.  BVTs live
-in the same source code that is built into the ns-3 code.  Our current tests
+built into the |ns3| modules; and so fit the description of BVTs.  BVTs live
+in the same source code that is built into the |ns3| code.  Our current tests
 are examples of this kind of test.
 
 Unit Tests
@@ -432,10 +461,10 @@
 
 Unit tests are more involved tests that go into detail to make sure that a
 piece of code works as advertised in isolation.  There is really no reason
-for this kind of test to be built into an ns-3 module.  It turns out, for
+for this kind of test to be built into an |ns3| module.  It turns out, for
 example, that the unit tests for the object name service are about the same
 size as the object name service code itself.  Unit tests are tests that
-check a single bit of functionality that are not built into the ns-3 code,
+check a single bit of functionality that are not built into the |ns3| code,
 but live in the same directory as the code it tests.  It is possible that
 these tests check integration of multiple implementation files in a module
 as well.  The file src/core/test/names-test-suite.cc is an example of this kind
@@ -451,11 +480,11 @@
 but they are typically overloaded examples.  We provide a new place 
 for this kind of test in the directory ``src/test``.  The file
 src/test/ns3tcp/ns3-interop-test-suite.cc is an example of this kind of
-test.  It uses NSC TCP to test the ns-3 TCP implementation.  Often there
+test.  It uses NSC TCP to test the |ns3| TCP implementation.  Often there
 will be test vectors required for this kind of test, and they are stored in
 the directory where the test lives.  For example,
 ns3tcp-interop-response-vectors.pcap is a file consisting of a number of TCP
-headers that are used as the expected responses of the ns-3 TCP under test
+headers that are used as the expected responses of the |ns3| TCP under test
 to a stimulus generated by the NSC TCP which is used as a ''known good''
 implementation.
 
@@ -492,7 +521,7 @@
 
    $ ./waf --configure --enable-examples --enable-tests
 
-Then, build ns-3, and after it is built, just run ``test.py``.  ``test.py -h``
+Then, build |ns3|, and after it is built, just run ``test.py``.  ``test.py -h``
 will show a number of configuration options that modify the behavior
 of test.py.
 
@@ -503,12 +532,19 @@
 Debugging Tests
 ***************
 
-The debugging of the test programs is best performed running the low-level test-runner program. The test-runner is the bridge from generic Python code to |ns3| code. It is written in C++ and uses the automatic test discovery process in the 
-|ns3| code to find and allow execution of all of the various tests.
-
-The main reason why ``test.py`` is not suitable for debugging is that it is not allowed for logging to be turned on using the ``NS_LOG`` environmental variable when test.py runs.  This limitation does not apply to the test-runner executable. Hence, if you want to see logging output from your tests, you have to run them using the test-runner directly.
+The debugging of the test programs is best performed running the low-level 
+test-runner program. The test-runner is the bridge from generic Python 
+code to |ns3| code. It is written in C++ and uses the automatic test 
+discovery process in the |ns3| code to find and allow execution of all 
+of the various tests.
+
+The main reason why ``test.py`` is not suitable for debugging is that it is 
+not allowed for logging to be turned on using the ``NS_LOG`` environmental 
+variable when test.py runs.  This limitation does not apply to the test-runner 
+executable. Hence, if you want to see logging output from your tests, you 
+have to run them using the test-runner directly.
 
-In order to execute the test-runner, you run it like any other ns-3 executable
+In order to execute the test-runner, you run it like any other |ns3| executable
 -- using ``waf``.  To get a list of available options, you can type::
 
   $ ./waf --run "test-runner --help"
@@ -761,7 +797,7 @@
   MyTestSuite::MyTestSuite ()
     : TestSuite ("my-test-suite-name", UNIT)
   {
-    AddTestCase (new MyTestCase);
+    AddTestCase (new MyTestCase, TestCase::QUICK);
   }
   
   MyTestSuite myTestSuite;
diff -Naur ns-3.22/doc/models/Makefile ns-3.23/doc/models/Makefile
--- ns-3.22/doc/models/Makefile	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/models/Makefile	2015-05-13 11:05:26.000000000 -0700
@@ -250,6 +250,9 @@
 	$(SRC)/spectrum/doc/spectrum-channel-phy-interface.png \
 	$(SRC)/spectrum/doc/spectrum-channel-phy-interface.pdf \
 	$(SRC)/spectrum/doc/spectrum-analyzer-example.eps \
+	$(SRC)/spectrum/doc/spectrum-tv-rand-geo-points.eps \
+	$(SRC)/spectrum/doc/spectrum-tv-8vsb.png \
+	$(SRC)/spectrum/doc/spectrum-tv-cofdm.png \
 	$(SRC)/lr-wpan/doc/lr-wpan-arch.dia \
 	$(SRC)/lr-wpan/doc/lr-wpan-data-example.dia \
 	$(SRC)/lr-wpan/doc/lr-wpan-primitives.dia \
@@ -335,6 +338,7 @@
 	$(FIGURES)/lte-strongest-cell-handover-algorithm.eps \
 	$(FIGURES)/auvmobility-classes.eps \
 	$(FIGURES)/spectrum-analyzer-example.eps \
+	$(FIGURES)/spectrum-tv-rand-geo-points.eps \
 	$(FIGURES)/lr-wpan-primitives.eps \
 	$(FIGURES)/lr-wpan-data-example.eps \
 	$(FIGURES)/lr-wpan-arch.eps \
@@ -390,6 +394,7 @@
 $(FIGURES)/helpers.pdf_width = 8cm
 $(FIGURES)/auvmobility-classes.pdf_width = 10cm
 $(FIGURES)/spectrum-analyzer-example.pdf_width = 15cm
+$(FIGURES)/spectrum-tv-rand-geo-points.pdf_width = 8cm
 $(FIGURES)/lr-wpan-primitives.pdf_width = 3in
 $(FIGURES)/lr-wpan-arch.pdf_width = 2in
 
diff -Naur ns-3.22/doc/models/source/conf.py ns-3.23/doc/models/source/conf.py
--- ns-3.22/doc/models/source/conf.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/models/source/conf.py	2015-05-13 11:05:26.000000000 -0700
@@ -48,9 +48,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.22/doc/tutorial/source/building-topologies.rst ns-3.23/doc/tutorial/source/building-topologies.rst
--- ns-3.22/doc/tutorial/source/building-topologies.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/building-topologies.rst	2015-05-13 11:05:26.000000000 -0700
@@ -24,7 +24,7 @@
 this section.  The appearance and operation of these helpers should look 
 quite familiar to you.
 
-We provide an example script in our examples/tutorial} directory.  This script
+We provide an example script in our ``examples/tutorial`` directory.  This script
 builds on the ``first.cc`` script and adds a CSMA network to the 
 point-to-point simulation we've already considered.  Go ahead and open 
 ``examples/tutorial/second.cc`` in your favorite editor.  You will have already seen
@@ -524,7 +524,7 @@
 
   $ tcpdump -nn -tt -r second-0-0.pcap
 
-and see that the echoed packet arrives back at the source at 2.007602 seconds,
+and see that the echoed packet arrives back at the source at 2.017607 seconds,
 
 .. sourcecode:: text
 
@@ -884,7 +884,7 @@
 Next, we see an old friend.  We instantiate a ``PointToPointHelper`` and 
 set the associated default ``Attributes`` so that we create a five megabit 
 per second transmitter on devices created using the helper and a two millisecond 
-delay on channels created by the helper.  We then ``Intall`` the devices
+delay on channels created by the helper.  We then ``Install`` the devices
 on the nodes and the channel between them.
 
 ::
@@ -1261,7 +1261,7 @@
 packets in this trace.  We leave it as an exercise to completely parse the 
 trace dump.
 
-Now, look at the pcap file of the right side of the point-to-point link,
+Now, look at the pcap file of the left side of the point-to-point link,
 
 .. sourcecode:: bash
 
diff -Naur ns-3.22/doc/tutorial/source/conceptual-overview.rst ns-3.23/doc/tutorial/source/conceptual-overview.rst
--- ns-3.22/doc/tutorial/source/conceptual-overview.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/conceptual-overview.rst	2015-05-13 11:05:26.000000000 -0700
@@ -92,7 +92,7 @@
 
 Net Device
 ++++++++++
-It used to be the case that if you wanted to connect a computers to a network,
+It used to be the case that if you wanted to connect a computer to a network,
 you had to buy a specific kind of network cable and a hardware device called
 (in PC terminology) a *peripheral card* that needed to be installed in
 your computer.  If the peripheral card implemented some networking function,
diff -Naur ns-3.22/doc/tutorial/source/conf.py ns-3.23/doc/tutorial/source/conf.py
--- ns-3.22/doc/tutorial/source/conf.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/conf.py	2015-05-13 11:05:26.000000000 -0700
@@ -48,9 +48,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.22/doc/tutorial/source/data-collection.rst ns-3.23/doc/tutorial/source/data-collection.rst
--- ns-3.22/doc/tutorial/source/data-collection.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/data-collection.rst	2015-05-13 11:05:26.000000000 -0700
@@ -321,6 +321,7 @@
   {
     static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
       .SetParent<Probe> ()
+      .SetGroupName ("Stats")
       .AddConstructor<Ipv6PacketProbe> ()
       .AddTraceSource ( "Output",
                         "The packet plus its IPv6 object and interface that serve as the output for this probe",
diff -Naur ns-3.22/doc/tutorial/source/getting-started.rst ns-3.23/doc/tutorial/source/getting-started.rst
--- ns-3.22/doc/tutorial/source/getting-started.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/getting-started.rst	2015-05-13 11:11:44.000000000 -0700
@@ -96,15 +96,15 @@
   $ cd
   $ mkdir workspace
   $ cd workspace
-  $ wget http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
-  $ tar xjf ns-allinone-3.22.tar.bz2
+  $ wget http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
+  $ tar xjf ns-allinone-3.23.tar.bz2
 
-If you change into the directory ``ns-allinone-3.22`` you should see a
+If you change into the directory ``ns-allinone-3.23`` you should see a
 number of files::
 
   $ ls
-  bake      constants.py   ns-3.22               README
-  build.py  netanim-3.105  pybindgen-0.16.0.886  util.py
+  bake      constants.py   ns-3.23               README
+  build.py  netanim-3.106  pybindgen-0.17.0.886  util.py
 
 You are now ready to build the base |ns3| distribution.
 
@@ -163,10 +163,10 @@
 
 There are a few configuration targets available:
 
-1.  ``ns-3.22``:  the module corresponding to the release; it will download
+1.  ``ns-3.23``:  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.22``:  the module that includes other optional features
+3.  ``ns-allinone-3.23``:  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 +184,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.22``.
+this tutorial example with ``ns-3.23``.
 
 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 +210,7 @@
 
 Step into the workspace directory and type the following into your shell::
 
-  $ ./bake.py configure -e ns-3.22
+  $ ./bake.py configure -e ns-3.23
 
 Next, we'l ask bake to check whether we have enough tools to download
 various components.  Type::
@@ -256,17 +256,17 @@
    >> Searching for system dependency pygoocanvas - OK
    >> Searching for system dependency python-dev - OK
    >> Searching for system dependency pygraphviz - OK
-   >> Downloading pybindgen-0.16.0.886 - OK
+   >> Downloading pybindgen-0.17.0.886 - OK
    >> Searching for system dependency g++ - OK
    >> Searching for system dependency qt4 - OK
-   >> Downloading netanim-3.105 - OK
-   >> Downloading ns-3.22 - OK    
+   >> Downloading netanim-3.106 - OK
+   >> Downloading ns-3.23 - OK    
 
 The above suggests that three sources have been downloaded.  Check the
 ``source`` directory now and type ``ls``; one should see::
 
   $ ls
-  netanim-3.105  ns-3.22  pybindgen-0.16.0.886
+  netanim-3.106  ns-3.23  pybindgen-0.17.0.886
 
 You are now ready to build the |ns3| distribution.
 
@@ -285,7 +285,7 @@
 
 If you downloaded
 using a tarball you should have a directory called something like 
-``ns-allinone-3.22`` under your ``~/workspace`` directory.  
+``ns-allinone-3.23`` under your ``~/workspace`` directory.  
 Type the following::
 
   $ ./build.py --enable-examples --enable-tests
@@ -301,7 +301,7 @@
 script builds the various pieces you downloaded.  Eventually you should see the
 following::
 
-   Waf: Leaving directory `/path/to/workspace/ns-allinone-3.22/ns-3.22/build'
+   Waf: Leaving directory `/path/to/workspace/ns-allinone-3.23/ns-3.23/build'
    'build' finished successfully (6m25.032s)
   
    Modules built:
@@ -323,7 +323,7 @@
    brite                     click                     openflow                 
    visualizer               
 
-   Leaving directory `./ns-3.22'
+   Leaving directory `./ns-3.23'
 
 Regarding the portion about modules not built::
 
@@ -349,9 +349,9 @@
 
 and you should see something like::
 
-  >> Building pybindgen-0.16.0.886 - OK
-  >> Building netanim-3.105 - OK
-  >> Building ns-3.22 - OK
+  >> Building pybindgen-0.17.0.886 - OK
+  >> Building netanim-3.106 - OK
+  >> Building ns-3.23 - OK
 
 *Hint:  you can also perform both steps, download and build by calling 'bake.py deploy'.*
 
@@ -664,7 +664,7 @@
 
   $ ../../../waf ...
 
-but that get's tedious, and error prone, and there are better solutions.
+but that gets tedious, and error prone, and there are better solutions.
 
 If you have the full |ns3| repository this little gem is a start::
 
@@ -848,7 +848,7 @@
 Working Directory
 +++++++++++++++++
 
-Waf needs to run from it's location at the top of the |ns3| tree.
+Waf needs to run from its location at the top of the |ns3| tree.
 This becomes the working directory where output files will be written.
 But what if you want to keep those ouf to the |ns3| source tree?  Use
 the ``--cwd`` argument::
diff -Naur ns-3.22/doc/tutorial/source/tracing.rst ns-3.23/doc/tutorial/source/tracing.rst
--- ns-3.22/doc/tutorial/source/tracing.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/tracing.rst	2015-05-13 11:05:26.000000000 -0700
@@ -365,6 +365,7 @@
     {
       static TypeId tid = TypeId ("MyObject")
         .SetParent (Object::GetTypeId ())
+        .SetGroupName ("MyGroup")
         .AddConstructor<MyObject> ()
         .AddTraceSource ("MyInteger",
                          "An integer value to trace.",
diff -Naur ns-3.22/doc/tutorial/source/tweaking.rst ns-3.23/doc/tutorial/source/tweaking.rst
--- ns-3.22/doc/tutorial/source/tweaking.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/tweaking.rst	2015-05-13 11:05:26.000000000 -0700
@@ -632,6 +632,46 @@
     --ns3::PointToPointChannel::Delay=2ms 
     --ns3::UdpEchoClient::MaxPackets=2"
 
+A natural question to arise at this point is how to learn about the existence
+of all of these attributes.  Again, the command line help facility has
+a feature for this.  If we ask for command line help we should see:
+
+.. sourcecode:: bash
+
+  $ ./waf --run "scratch/myfirst --PrintHelp"
+  myfirst [Program Arguments] [General Arguments]
+
+  General Arguments:
+    --PrintGlobals:              Print the list of globals.
+    --PrintGroups:               Print the list of groups.
+    --PrintGroup=[group]:        Print all TypeIds of group.
+    --PrintTypeIds:              Print all TypeIds.
+    --PrintAttributes=[typeid]:  Print all attributes of typeid.
+    --PrintHelp:                 Print this help message.
+
+If you select the "PrintGroups" argument, you should see a list of all
+registered TypeId groups.  The group names are aligned with the module names
+in the source directory (although with a leading capital letter).  Printing 
+out all of the information at once would be too much, so a further filter 
+is available to print information on a per-group basis.   So, focusing
+again on the point-to-point module:
+
+.. sourcecode:: bash
+
+  ./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
+  TypeIds in group PointToPoint:
+    ns3::PointToPointChannel
+    ns3::PointToPointNetDevice
+    ns3::PointToPointRemoteChannel
+    ns3::PppHeader
+
+and from here, one can find the possible TypeId names to search for
+attributes, such as in the ``--PrintAttributes=ns3::PointToPointChannel``
+example shown above.
+
+Another way to find out about attributes is through the ns-3 Doxygen; there
+is a page that lists out all of the registered attributes in the simulator.
+
 Hooking Your Own Values
 +++++++++++++++++++++++
 You can also add your own hooks to the command line system.  This is done
diff -Naur ns-3.22/doc/tutorial-pt-br/source/conf.py ns-3.23/doc/tutorial-pt-br/source/conf.py
--- ns-3.22/doc/tutorial-pt-br/source/conf.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial-pt-br/source/conf.py	2015-05-13 11:05:26.000000000 -0700
@@ -50,9 +50,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
 
 # The language for content autogenerated by . Refer to babel documentation
 # for a list of supported languages.
diff -Naur ns-3.22/examples/wireless/ht-wifi-network.cc ns-3.23/examples/wireless/ht-wifi-network.cc
--- ns-3.22/examples/wireless/ht-wifi-network.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/examples/wireless/ht-wifi-network.cc	2015-05-13 11:05:27.000000000 -0700
@@ -54,7 +54,7 @@
   cmd.Parse (argc,argv);
 
   std::cout << "DataRate" << "\t" << "Throughput" << '\n';
-  for (int mcs = 0; mcs <= 31; mcs++)
+  for (int i = 0; i <= 31; i++)
     {
       uint32_t payloadSize; //1500 byte IP packet
       if (udp)
@@ -76,17 +76,17 @@
       YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
       phy.SetChannel (channel.Create ());
 
-      if (mcs <= 7)
+      if (i <= 7)
         {
           phy.Set ("ShortGuardEnabled", BooleanValue (false));
           phy.Set ("ChannelBonding", BooleanValue (false));
         }
-      else if (mcs > 7 && mcs <= 15)
+      else if (i > 7 && i <= 15)
         {
           phy.Set ("ShortGuardEnabled", BooleanValue (true));
           phy.Set ("ChannelBonding", BooleanValue (false));
         }
-      else if (mcs > 15 && mcs <= 23)
+      else if (i > 15 && i <= 23)
         {
           phy.Set ("ShortGuardEnabled", BooleanValue (false));
           phy.Set ("ChannelBonding", BooleanValue (true));
@@ -105,157 +105,157 @@
 
       double datarate = 0;
       StringValue DataRate;
-      if (mcs == 0)
+      if (i == 0)
         {
           DataRate = StringValue ("OfdmRate6_5MbpsBW20MHz");
           datarate = 6.5;
         }
-      else if (mcs == 1)
+      else if (i == 1)
         {
           DataRate = StringValue ("OfdmRate13MbpsBW20MHz");
           datarate = 13;
         }
-      else if (mcs == 2)
+      else if (i == 2)
         {
           DataRate = StringValue ("OfdmRate19_5MbpsBW20MHz");
           datarate = 19.5;
         }
-      else if (mcs == 3)
+      else if (i == 3)
         {
           DataRate = StringValue ("OfdmRate26MbpsBW20MHz");
           datarate = 26;
         }
-      else if (mcs == 4)
+      else if (i == 4)
         {
           DataRate = StringValue ("OfdmRate39MbpsBW20MHz");
           datarate = 39;
         }
-      else if (mcs == 5)
+      else if (i == 5)
         {
           DataRate = StringValue ("OfdmRate52MbpsBW20MHz");
           datarate = 52;
         }
-      else if (mcs == 6)
+      else if (i == 6)
         {
           DataRate = StringValue ("OfdmRate58_5MbpsBW20MHz");
           datarate = 58.5;
         }
-      else if (mcs == 7)
+      else if (i == 7)
         {
           DataRate = StringValue ("OfdmRate65MbpsBW20MHz");
           datarate = 65;
         }
-      else if (mcs == 8)
+      else if (i == 8)
         {
           DataRate = StringValue ("OfdmRate7_2MbpsBW20MHz");
           datarate = 7.2;
         }
-      else if (mcs == 9)
+      else if (i == 9)
         {
           DataRate = StringValue ("OfdmRate14_4MbpsBW20MHz");
           datarate = 14.4;
         }
-      else if (mcs == 10)
+      else if (i == 10)
         {
           DataRate = StringValue ("OfdmRate21_7MbpsBW20MHz");
           datarate = 21.7;
         }
-      else if (mcs == 11)
+      else if (i == 11)
         {
           DataRate = StringValue ("OfdmRate28_9MbpsBW20MHz");
           datarate = 28.9;
         }
-      else if (mcs == 12)
+      else if (i == 12)
         {
           DataRate = StringValue ("OfdmRate43_3MbpsBW20MHz");
           datarate = 43.3;
         }
-      else if (mcs == 13)
+      else if (i == 13)
         {
           DataRate = StringValue ("OfdmRate57_8MbpsBW20MHz");
           datarate = 57.8;
         }
-      else if (mcs == 14)
+      else if (i == 14)
         {
           DataRate = StringValue ("OfdmRate65MbpsBW20MHzShGi");
           datarate = 65;
         }
-      else if (mcs == 15)
+      else if (i == 15)
         {
           DataRate = StringValue ("OfdmRate72_2MbpsBW20MHz");
           datarate = 72.2;
         }
-      else if (mcs == 16)
+      else if (i == 16)
         {
           DataRate = StringValue ("OfdmRate13_5MbpsBW40MHz");
           datarate = 13.5;
         }
-      else if (mcs == 17)
+      else if (i == 17)
         {
           DataRate = StringValue ("OfdmRate27MbpsBW40MHz");
           datarate = 27;
         }
-      else if (mcs == 18)
+      else if (i == 18)
         {
           DataRate = StringValue ("OfdmRate40_5MbpsBW40MHz");
           datarate = 40.5;
         }
-      else if (mcs == 19)
+      else if (i == 19)
         {
           DataRate = StringValue ("OfdmRate54MbpsBW40MHz");
           datarate = 54;
         }
-      else if (mcs == 20)
+      else if (i == 20)
         {
           DataRate = StringValue ("OfdmRate81MbpsBW40MHz");
           datarate = 81;
         }
-      else if (mcs == 21)
+      else if (i == 21)
         {
           DataRate = StringValue ("OfdmRate108MbpsBW40MHz");
           datarate = 108;
         }
-      else if (mcs == 22)
+      else if (i == 22)
         {
           DataRate = StringValue ("OfdmRate121_5MbpsBW40MHz");
           datarate = 121.5;
         }
-      else if (mcs == 23)
+      else if (i == 23)
         {
           DataRate = StringValue ("OfdmRate135MbpsBW40MHz");
           datarate = 135;
         }
-      else if (mcs == 24)
+      else if (i == 24)
         {
           DataRate = StringValue ("OfdmRate15MbpsBW40MHz");
           datarate = 15;
         }
-      else if (mcs == 25)
+      else if (i == 25)
         {
           DataRate = StringValue ("OfdmRate30MbpsBW40MHz");
           datarate = 30;
         }
-      else if (mcs == 26)
+      else if (i == 26)
         {
           DataRate = StringValue ("OfdmRate45MbpsBW40MHz");
           datarate = 45;
         }
-      else if (mcs == 27)
+      else if (i == 27)
         {
           DataRate = StringValue ("OfdmRate60MbpsBW40MHz");
           datarate = 60;
         }
-      else if (mcs == 28)
+      else if (i == 28)
         {
           DataRate = StringValue ("OfdmRate90MbpsBW40MHz");
           datarate = 90;
         }
-      else if (mcs == 29)
+      else if (i == 29)
         {
           DataRate = StringValue ("OfdmRate120MbpsBW40MHz");
           datarate = 120;
         }
-      else if (mcs == 30)
+      else if (i == 30)
         {
           DataRate = StringValue ("OfdmRate135MbpsBW40MHzShGi");
           datarate = 135;
diff -Naur ns-3.22/examples/wireless/simple-ht-hidden-stations.cc ns-3.23/examples/wireless/simple-ht-hidden-stations.cc
--- ns-3.22/examples/wireless/simple-ht-hidden-stations.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/examples/wireless/simple-ht-hidden-stations.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,179 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 Sébastien 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 "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 example considers two hidden stations in an 802.11n network which supports MPDU aggregation.
+// The user can specify whether RTS/CTS is used and can set the number of aggregated MPDUs.
+//
+// Example: ./waf --run "simple-ht-hidden-stations --enableRts=1 --nMpdus=8"
+//
+// Network topology:
+//
+//   Wifi 192.168.1.0
+//
+//        AP
+//   *    *    *
+//   |    |    |
+//   n1   n2   n3
+//
+// 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 ("SimplesHtHiddenStations");
+
+int main (int argc, char *argv[])
+{
+  uint32_t payloadSize = 1472; //bytes
+  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.Parse (argc, argv);
+    
+  if(!enableRts)
+    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+  else
+    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);
+
+  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());
+
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz"));
+  HtWifiMacHelper mac = HtWifiMacHelper::Default ();
+
+  Ssid ssid = Ssid ("simple-mpdu-aggregation");
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (ssid),
+               "ActiveProbing", BooleanValue (false));
+
+  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
+  
+  NetDeviceContainer staDevices;
+  staDevices = wifi.Install (phy, mac, wifiStaNodes);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (ssid),
+               "BeaconInterval", TimeValue (MicroSeconds(102400)),
+               "BeaconGeneration", BooleanValue (true));
+
+  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
+
+  NetDeviceContainer apDevice;
+  apDevice = wifi.Install (phy, mac, wifiApNode);
+
+  // Setting mobility model
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+  // AP is between the two stations, each station being located at 5 meters from the AP.
+  // The distance between the two stations is thus equal to 10 meters.
+  // Since the wireless range is limited to 5 meters, the two stations are hidden from each other.
+  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (10.0, 0.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+
+  mobility.Install (wifiApNode);
+  mobility.Install (wifiStaNodes);
+
+  // Internet stack
+  InternetStackHelper stack;
+  stack.Install (wifiApNode);
+  stack.Install (wifiStaNodes);
+
+  Ipv4AddressHelper address;
+
+  address.SetBase ("192.168.1.0", "255.255.255.0");
+  Ipv4InterfaceContainer StaInterface;
+  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));
+      
+  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));
+  
+  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::Run ();
+  Simulator::Destroy ();
+      
+  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.22/examples/wireless/simple-two-level-aggregation.cc ns-3.23/examples/wireless/simple-two-level-aggregation.cc
--- ns-3.22/examples/wireless/simple-two-level-aggregation.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/examples/wireless/simple-two-level-aggregation.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,214 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 Sébastien 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 "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 802.11n two-level aggregation feature works.
+// Two-level aggregation is the simultaneous use of MSDU and MPDU aggregation schemes (known as one-level aggregation techniques).
+//
+// The throughput is obtained for a given number of aggregated MSDUs and MPDUs.
+// The number of aggregated MSDUs and MPDUs can be chosen by the user through the nMsdus and nMpdus attibutes, respectively.
+//
+// Example: ./waf --run "simple-two-level-aggregation --nMsdus=3 --nMpdus=8"
+//
+// Network topology:
+//
+//   Wifi 192.168.1.0
+//
+//        AP
+//   *    *
+//   |    |
+//   n1   n2
+//
+// Packets in this simulation aren't marked with a QosTag so they are considered
+// belonging to BestEffort Access Class (AC_BE).
+//
+// Throughput gets higher as either nMsdus or nMpdus is increased (one-level aggregation),
+// or when both nMsdus and nMpdus are increases (two-level aggregation).
+// MSDU aggregation offers a better header reduction compare to MPDU aggregation,
+// while MPDU aggregation is more robust against transmission errors than MSDU aggregation.
+// The good setting of nMsdu and nMpdus will depends on various factors (payload size, channel conditions, ...).
+// Since this example considers an ideal channel, the highest throughput is obtained with the largest values for nMsdus and nMpdus parameters.
+// Users should nevertheless take care that the standard rules limit the maximum MSDU size to 7935 bytes and the MPDU size to 65535 bytes.
+// Consequently, more packets should be aggregated if their payload is small with standard-compliant parameters.
+// Users should also note that the maximum duration of the frame is limited by the standard.
+// As a result, higher values for nMsdus and nMpdus may not always provide throughput improvements.
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("SimpleTwoLevelAggregation");
+
+int main (int argc, char *argv[])
+{
+  uint32_t payloadSize = 1472; //bytes
+  uint64_t simulationTime = 10; //seconds
+  uint32_t nMsdus = 1;
+  uint32_t nMpdus = 1;
+  bool enableRts = 0;
+
+  CommandLine cmd;
+  cmd.AddValue ("nMsdus", "Number of aggregated MSDUs", nMsdus); //number of aggregated MSDUs specified by the user
+  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"));
+    }
+  else
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
+    }
+
+  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000"));
+
+  NodeContainer wifiStaNode;
+  wifiStaNode.Create (1);
+  NodeContainer wifiApNode;
+  wifiApNode.Create (1);
+
+  YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+  YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+  phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
+  phy.SetChannel (channel.Create ());
+
+  WifiHelper wifi = WifiHelper::Default ();
+  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"));
+  HtWifiMacHelper mac = HtWifiMacHelper::Default ();
+
+  Ssid ssid = Ssid ("simple-two-level-aggregation");
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (ssid),
+               "ActiveProbing", BooleanValue (false));
+
+
+  //Enable aggregation at the station side
+  if (nMpdus > 1)
+    {
+      mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable BlockAck when A-MPDU is used
+    }
+  if (nMsdus > 0)
+    {
+      mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+                                  "MaxAmpduSize", UintegerValue (nMpdus * (nMsdus * (payloadSize + 100)))); //Set the maximum size for A-MPDU with regards to the payload size and the number of MSDUs expected in each MPDU.
+    }
+  else //MPDU aggregation only (one-level aggregation)
+    {
+      mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+                                  "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 200))); //Set the maximum size for A-MPDU with regards to the payload size
+    }
+  mac.SetMsduAggregatorForAc (AC_BE,"ns3::MsduStandardAggregator",
+                              "MaxAmsduSize", UintegerValue (nMsdus * (payloadSize + 100))); //Set the maximum size for A-MSDU with regards to the payload size
+
+
+  NetDeviceContainer staDevice;
+  staDevice = wifi.Install (phy, mac, wifiStaNode);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (ssid),
+               "BeaconInterval", TimeValue (MicroSeconds (102400)),
+               "BeaconGeneration", BooleanValue (true));
+
+  //Enable aggregation at the AP side
+  if (nMpdus > 1)
+    {
+      mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable BlockAck when A-MPDU is used
+    }
+  if (nMsdus > 0)
+    {
+      mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+                                  "MaxAmpduSize", UintegerValue (nMpdus * (nMsdus * (payloadSize + 100)))); //Set the maximum size for A-MPDU according to the payload size and the number of MSDUs expected in each MPDU.
+    }
+  else //MPDU aggregation only (one-level aggregation)
+    {
+      mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+                                  "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 200))); //Set the maximum size for A-MPDU with regards to the payload size
+    }
+  mac.SetMsduAggregatorForAc (AC_BE,"ns3::MsduStandardAggregator",
+                              "MaxAmsduSize", UintegerValue (nMsdus * (payloadSize + 100))); //Set the maximum size for A-MSDU with regards to the payload size
+
+  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));
+
+  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));
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  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.22/examples/wireless/wifi-wired-bridging.cc ns-3.23/examples/wireless/wifi-wired-bridging.cc
--- ns-3.22/examples/wireless/wifi-wired-bridging.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/examples/wireless/wifi-wired-bridging.cc	2015-05-13 11:05:27.000000000 -0700
@@ -24,7 +24,7 @@
 //      +-----+      +-----+            +-----+      +-----+
 //      | STA |      | STA |            | STA |      | STA | 
 //      +-----+      +-----+            +-----+      +-----+
-//    192.168.0.3  192.168.0.4        192.168.0.5  192.168.0.6
+//    192.168.0.2  192.168.0.3        192.168.0.5  192.168.0.6
 //      --------     --------           --------     --------
 //      WIFI STA     WIFI STA           WIFI STA     WIFI STA
 //      --------     --------           --------     --------
@@ -37,7 +37,7 @@
 //             ##############           ##############
 //                 BRIDGE                   BRIDGE
 //             ##############           ############## 
-//               192.168.0.1              192.168.0.2
+//               192.168.0.1              192.168.0.4
 //               +---------+              +---------+
 //               | AP Node |              | AP Node |
 //               +---------+              +---------+
diff -Naur ns-3.22/examples/wireless/wscript ns-3.23/examples/wireless/wscript
--- ns-3.22/examples/wireless/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/examples/wireless/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -71,4 +71,10 @@
     obj.source = 'rate-adaptation-distance.cc'
 
     obj = bld.create_ns3_program('simple-mpdu-aggregation', ['internet', 'mobility', 'wifi', 'applications'])
-    obj.source = 'simple-mpdu-aggregation.cc'
\ No newline at end of file
+    obj.source = 'simple-mpdu-aggregation.cc'
+
+    obj = bld.create_ns3_program('simple-two-level-aggregation', ['internet', 'mobility', 'wifi', 'applications'])
+    obj.source = 'simple-two-level-aggregation.cc'
+
+    obj = bld.create_ns3_program('simple-ht-hidden-stations', ['internet', 'mobility', 'wifi', 'applications'])    
+    obj.source = 'simple-ht-hidden-stations.cc'
diff -Naur ns-3.22/RELEASE_NOTES ns-3.23/RELEASE_NOTES
--- ns-3.22/RELEASE_NOTES	2015-02-05 16:17:45.000000000 -0800
+++ ns-3.23/RELEASE_NOTES	2015-05-13 11:05:26.000000000 -0700
@@ -9,6 +9,72 @@
 Consult the file CHANGES.html for more detailed information about changed
 API and behavior across ns-3 releases.
 
+Release 3.23
+============
+
+Availability
+------------
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
+
+Supported platforms
+-------------------
+This release has been tested on the following platforms:
+- Ubuntu 15.04 (64 bit) with g++-4.9.2
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
+- CentOS/RHEL 6.6 (64-bit) with g++-4.4.7
+- OS X Yosemite 10.10.3 with Xcode 6.3.1 and Apple LLVM version 6.1.0
+- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
+
+New user-visible features
+-------------------------
+- (network) CalculateTxTime has been declared obsolete.
+  CalculateBytesTxTime and CalculateBitsTxTime are to be used instead.
+  The return value is a Time, instead of a double.
+- (mobility) Classes added for converting geographic to cartesian coordinates.
+- (spectrum) TvSpectrumTransmitter models added to create television 
+  transmitter(s) that transmit PSD spectrums customized by attributes such 
+  as modulation type, power, antenna type, channel frequency, etc.
+- (wifi) Several model improvements have been made.  Access points now 
+  establish BSSBasicRateSet for control frame transmissions.  PLCP header 
+  and payload reception have been decoupled for improved PHY modeling
+  accuracy.  RTS/CTS with A-MPDU is now fully supported, and 802.11n
+  stations now support two-level aggregation.
+
+Bugs fixed
+----------
+- Bug 1757 - RLC AM not using NACK_SN
+- Bug 1974 - CalculateTxTime should return a Time, not a double
+- Bug 1982 - AODV and mesh use random variables before seed can be set
+- Bug 2004 - Wrong timeout calculation for 802.11n in WifiMac
+- Bug 2008 - (lr-wpan) Crash if ending rx while status change is in progress
+- Bug 2025 - (lr-wpan) Changing the channel doesn't affect the Tx params
+- Bug 2034 - (lr-wpan) CSMA-CA BackoffPeriod is too short 
+- Bug 2054 - TCP window update can shrink the Left Edge of the window
+- Bug 2066 - A-MPDU reception should check for successful preamble
+- Bug 2067 - TCP performance when advertised window exceeds sender buffer size
+- Bug 2070 - Wrong report of Packets and Bytes stored in CoDeL
+- Bug 2073 - NDisc cache entries update timer might be stuck in a loop
+- Bug 2075 - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
+- Bug 2076 - TCP MinRTO Attribute is not actually used
+- Bug 2077 - Icmpv6L4Protocol::HandleDestinationUnreachable must check the packet size, not its serialized size
+- Bug 2079 - mcs variable in ht-wifi-network example is confusing
+- Bug 2082 - Empirical RV fails if the value provided in the CDF member function is negative
+- Bug 2083 - BridgeNetDevice may send corrupted packets
+- Bug 2087 - Waf fails to build ns-3 if the path contains accented characters
+- Bug 2090 - (rip-ng) Routes may be added twice on interface activation
+- Bug 2093 - MultiModelSpectrumChannel::GetDevice only works for 0-th index
+- Bug 2095 - (wimax) Wrong values in default-traces.h for 16 QAM 3/4
+- Bug 2097 - ACKs should be sent using legacy rates and preambles in 802.11n
+- Bug 2103 - Ipv[4,6]RoutingHelper::PrintRoutingTableAll[At,Every] hangs if a node doesn't have IP
+
+Known issues
+------------
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
 Release 3.22
 ============
 
diff -Naur ns-3.22/src/antenna/model/antenna-model.cc ns-3.23/src/antenna/model/antenna-model.cc
--- ns-3.22/src/antenna/model/antenna-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/antenna-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::AntennaModel")
     .SetParent<Object> ()
+    .SetGroupName("Antenna")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/antenna/model/cosine-antenna-model.cc ns-3.23/src/antenna/model/cosine-antenna-model.cc
--- ns-3.22/src/antenna/model/cosine-antenna-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/cosine-antenna-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::CosineAntennaModel")
     .SetParent<AntennaModel> ()
+    .SetGroupName("Antenna")
     .AddConstructor<CosineAntennaModel> ()
     .AddAttribute ("Beamwidth",
                    "The 3dB beamwidth (degrees)",
diff -Naur ns-3.22/src/antenna/model/isotropic-antenna-model.cc ns-3.23/src/antenna/model/isotropic-antenna-model.cc
--- ns-3.22/src/antenna/model/isotropic-antenna-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/isotropic-antenna-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::IsotropicAntennaModel")
     .SetParent<AntennaModel> ()
+    .SetGroupName("Antenna")
     .AddConstructor<IsotropicAntennaModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/antenna/model/parabolic-antenna-model.cc ns-3.23/src/antenna/model/parabolic-antenna-model.cc
--- ns-3.22/src/antenna/model/parabolic-antenna-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/parabolic-antenna-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::ParabolicAntennaModel")
     .SetParent<AntennaModel> ()
+    .SetGroupName("Antenna")
     .AddConstructor<ParabolicAntennaModel> ()
     .AddAttribute ("Beamwidth",
                    "The 3dB beamwidth (degrees)",
diff -Naur ns-3.22/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/aodv/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -7648,6 +7648,11 @@
                    [param('ns3::Time', 't')])
     ## aodv-routing-protocol.h (module 'aodv'): ns3::aodv::RoutingProtocol::AODV_PORT [variable]
     cls.add_static_attribute('AODV_PORT', 'uint32_t const', is_const=True)
+    ## aodv-routing-protocol.h (module 'aodv'): void ns3::aodv::RoutingProtocol::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3AodvRoutingTable_methods(root_module, cls):
diff -Naur ns-3.22/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/aodv/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -7648,6 +7648,11 @@
                    [param('ns3::Time', 't')])
     ## aodv-routing-protocol.h (module 'aodv'): ns3::aodv::RoutingProtocol::AODV_PORT [variable]
     cls.add_static_attribute('AODV_PORT', 'uint32_t const', is_const=True)
+    ## aodv-routing-protocol.h (module 'aodv'): void ns3::aodv::RoutingProtocol::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3AodvRoutingTable_methods(root_module, cls):
diff -Naur ns-3.22/src/aodv/doc/aodv.rst ns-3.23/src/aodv/doc/aodv.rst
--- ns-3.22/src/aodv/doc/aodv.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/doc/aodv.rst	2015-05-13 11:05:27.000000000 -0700
@@ -94,37 +94,43 @@
 
 No announced plans.
 
-References
-++++++++++
-
-
-Usage
-*****
-
-Examples
-++++++++
-
-Helpers
-+++++++
-
-Attributes
-++++++++++
-
-Tracing
-+++++++
-
-Logging
-+++++++
-
-Caveats
-+++++++
-
-Validation
-**********
-
-Unit tests
-++++++++++
-
-Larger-scale performance tests
-++++++++++++++++++++++++++++++
+..
+  References
+  ++++++++++
+
+..
+  Usage
+  *****
+
+..
+  Examples
+  ++++++++
+
+..
+  Helpers
+  +++++++
+
+..
+  Attributes
+  ++++++++++
+
+..
+  Tracing
+  +++++++
+
+..
+  Logging
+  +++++++
+
+..
+  Caveats
+  +++++++
+
+..
+  Validation
+  **********
+  Unit tests
+  ++++++++++
+  Larger-scale performance tests
+  ++++++++++++++++++++++++++++++
 
diff -Naur ns-3.22/src/aodv/model/aodv-packet.cc ns-3.23/src/aodv/model/aodv-packet.cc
--- ns-3.22/src/aodv/model/aodv-packet.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/model/aodv-packet.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,6 +46,7 @@
 {
   static TypeId tid = TypeId ("ns3::aodv::TypeHeader")
     .SetParent<Header> ()
+    .SetGroupName("Aodv")
     .AddConstructor<TypeHeader> ()
   ;
   return tid;
@@ -153,6 +154,7 @@
 {
   static TypeId tid = TypeId ("ns3::aodv::RreqHeader")
     .SetParent<Header> ()
+    .SetGroupName("Aodv")
     .AddConstructor<RreqHeader> ()
   ;
   return tid;
@@ -292,6 +294,7 @@
 {
   static TypeId tid = TypeId ("ns3::aodv::RrepHeader")
     .SetParent<Header> ()
+    .SetGroupName("Aodv")
     .AddConstructor<RrepHeader> ()
   ;
   return tid;
@@ -434,6 +437,7 @@
 {
   static TypeId tid = TypeId ("ns3::aodv::RrepAckHeader")
     .SetParent<Header> ()
+    .SetGroupName("Aodv")
     .AddConstructor<RrepAckHeader> ()
   ;
   return tid;
@@ -500,6 +504,7 @@
 {
   static TypeId tid = TypeId ("ns3::aodv::RerrHeader")
     .SetParent<Header> ()
+    .SetGroupName("Aodv")
     .AddConstructor<RerrHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/aodv/model/aodv-routing-protocol.cc ns-3.23/src/aodv/model/aodv-routing-protocol.cc
--- ns-3.22/src/aodv/model/aodv-routing-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/model/aodv-routing-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -67,6 +67,7 @@
   {
     static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag").SetParent<Tag> ()
       .SetParent<Tag> ()
+      .SetGroupName("Aodv")
       .AddConstructor<DeferredRouteOutputTag> ()
     ;
     return tid;
@@ -158,6 +159,7 @@
 {
   static TypeId tid = TypeId ("ns3::aodv::RoutingProtocol")
     .SetParent<Ipv4RoutingProtocol> ()
+    .SetGroupName("Aodv")
     .AddConstructor<RoutingProtocol> ()
     .AddAttribute ("HelloInterval", "HELLO messages emission interval.",
                    TimeValue (Seconds (1)),
@@ -580,12 +582,6 @@
   NS_ASSERT (ipv4 != 0);
   NS_ASSERT (m_ipv4 == 0);
 
-  if (EnableHello)
-    {
-      m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this);
-      m_htimer.Schedule (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 100)));
-    }
-
   m_ipv4 = ipv4;
 
   // Create lo route. It is asserted that the only one interface up for now is loopback
@@ -1928,5 +1924,20 @@
   return socket;
 }
 
+void
+RoutingProtocol::DoInitialize (void)
+{
+  NS_LOG_FUNCTION (this);
+  uint32_t startTime;
+  if (EnableHello)
+    {
+      m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this);
+      startTime = m_uniformRandomVariable->GetInteger (0, 100);
+      NS_LOG_DEBUG ("Starting at time " << startTime << "ms");
+      m_htimer.Schedule (MilliSeconds (startTime));
+    }
+  Ipv4RoutingProtocol::DoInitialize ();
 }
-}
+
+} //namespace aodv
+} //namespace ns3
diff -Naur ns-3.22/src/aodv/model/aodv-routing-protocol.h ns-3.23/src/aodv/model/aodv-routing-protocol.h
--- ns-3.22/src/aodv/model/aodv-routing-protocol.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/model/aodv-routing-protocol.h	2015-05-13 11:05:27.000000000 -0700
@@ -97,6 +97,8 @@
   */
   int64_t AssignStreams (int64_t stream);
 
+protected:
+  virtual void DoInitialize (void);
 private:
   
   // Protocol parameters.
diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-0-0.pcap ns-3.23/src/aodv/test/aodv-chain-regression-test-0-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-0-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,48 +1,48 @@
-ò            i         X   X                     E  4      
+ò            i          X   X                     E  4      
 
     (     
     
-           x  X   X                     E  4      
+              X   X                     E  4      
 
     (    
     
-             T   T                    E  0     
+           y  T   T                    E  0     
 
       
    
-          4  @   @   <                            
+          R  @   @   <                            
      
-        á        Ԁ                 @   @                            
+                Ԁ                 @   @                            
 
-          @   @   <                             
+        ך  @   @   <                             
      
-        f        Ԁ               F  T   T   <                0     E  0      
+                Ԁ               d  T   T   <                0     E  0      
 
      
     
-  +        V        Ԁ               n  @   @               0            
+  +        t        Ԁ                 @   @               0            
 
-        q  @   @   <                @            
+          @   @   <                @            
      
-                Ԁ                 x   x   <                @     E  T    @  
+                Ԁ                 x   x   <                @     E  T    @  
 
-                                                                               Ԁ                 @   @               P            
+                                                                               Ԁ                 @   @               P            
 
-        f        Ԁ                 x   x   <                `     E  T    ?  
+                Ԁ                 x   x   <                `     E  T    ?  
 
-                                                                       d       Ԁ               > x   x   <                p     E  T    =  
+                                                                               Ԁ               \  x   x   <                p     E  T    =  
 
-                                                                        N       Ԁ                  x   x   <                P     E  T   @  
+                                                                        l        Ԁ                  x   x   <                P     E  T   @  
 
                                                                               Ԁ                x   x   <                     E  T   ?  
 
                                                                              Ԁ              p  x   x   <                     E  T   =  
 
-                                                                              Ԁ              ((  T   T                    E  0     
+                                                                              Ԁ              g  T   T                    E  0     
 
       
     
-           T   T               `     E  0     
+          }  T   T               `     E  0     
 
       
    
@@ -52,11 +52,11 @@
 
                                                                              Ԁ                x   x   <                     E  T   =  
 
-                                                                              Ԁ                T   T                    E  0     
+                                                                              Ԁ              g  T   T                    E  0     
 
       
     
-           T   T                    E  0     
+         xi  T   T                    E  0     
 
       
    
@@ -66,11 +66,11 @@
 
                                                                              Ԁ                x   x   <                     E  T   =  
 
-                                                                              Ԁ                T   T                    E  0     
+                                                                              Ԁ              O  T   T                    E  0     
 
       
     
-         p  T   T                    E  0     
+          }  T   T                    E  0     
 
       
    
@@ -94,56 +94,56 @@
 
       
     
-         F  T   T   <                0    E  0     
+         sR  T   T   <                0    E  0     
 
      
     
-           F        Ԁ                T   T                    E  0     
+           R        Ԁ              0u  T   T                    E  0     
 
       
    
-           X   X                    E  4     
-
-          
-    
-          /  T   T               @    E  0     
+            T   T               @    E  0     
 
       
     
-         3  X   X               P    E  4     
+         (#  X   X                    E  4     
+
+          
+    
+          XK  X   X               P    E  4     
 
          
     
-          (#  T   T                    E  0     
+            T   T                    E  0     
 
       
    
-         ;  T   T               `    E  0     
+         PK  T   T               `    E  0     
 
       
     
-           T   T                    E  0     
+         (#  T   T                    E  0     
 
       
    
-         ;  T   T               p    E  0     
+         PK  T   T               p    E  0     
 
       
     
-         'X X   X                    E  4 	    
+         @ X   X                    E  4 	    
 
           
     
-          X X   X                   E  4 	    
+          I X   X                   E  4 	    
 
          
     
-          @ T   T                   E  0 
+          < T   T                   E  0 
     
 
       
    
-         a T   T                   E  0 
+         d T   T                   E  0 
     
 
       
@@ -152,7 +152,7 @@
 
       
    
-      	   h| T   T                   E  0     
+      	   M T   T                   E  0     
 
       
     
diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-1-0.pcap ns-3.23/src/aodv/test/aodv-chain-regression-test-1-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-1-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-1-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,58 +1,58 @@
-ò            i       `  X   X                     E  4      
+ò            i       '  X   X                     E  4      
 
     (     
     
-             X   X                     E  4      
+           g   X   X                     E  4      
 
     (    
     
-           I<  X   X                     E  4      
+           5  X   X                     E  4      
 
     (    
     
-           (  T   T                    E  0     
+           y  T   T                    E  0     
 
       
    
-            @   @   <                            
+            @   @   <                            
      
-                Ԁ                 @   @                            
+                Ԁ                 @   @                            
 
-        ğ  @   @   <                            
+          @   @   <                            
      
-        q        Ԁ                 T   T   <                0     E  0      
+                Ԁ                 T   T   <                0     E  0      
 
      
     
-  +                Ԁ               '  @   @                            
+  +                Ԁ               E  @   @                            
 
-        *  @   @   <                             
+        H  @   @   <                             
      
-        :        Ԁ                 T   T   <                0     E  0      
+        X        Ԁ               ܛ  T   T   <                0     E  0      
 
      
     
-  +                Ԁ                 @   @               0            
+  +                Ԁ                 @   @               0            
 
-           @   @   <                @            
+          @   @   <                @            
      
-                Ԁ                 x   x   <                @     E  T    @  
+                Ԁ                 x   x   <                @     E  T    @  
 
-                                                                               Ԁ               '  @   @               P            
+                                                                               Ԁ               E  @   @               P            
 
-        *  @   @   <                @            
+        H  @   @   <                @            
      
-        :        Ԁ                 x   x   <                `     E  T    ?  
+        X        Ԁ                  x   x   <                `     E  T    ?  
 
-                                                                               Ԁ                 @   @               P            
+                                                                               Ԁ                 @   @               P            
 
-        b        Ԁ                 x   x   <                `     E  T    >  
+                Ԁ                 x   x   <                `     E  T    >  
 
-                                                                       N       Ԁ               ( x   x   <                p     E  T    >  
+                                                                       l        Ԁ               F  x   x   <                p     E  T    >  
 
-                                                                        8       Ԁ                x   x   <                p     E  T    =  
+                                                                        V        Ԁ                 x   x   <                p     E  T    =  
 
-                                                                        {       Ԁ                 x   x   <                P     E  T   @  
+                                                                                Ԁ                 x   x   <                P     E  T   @  
 
                                                                               Ԁ                x   x   <                     E  T   ?  
 
@@ -62,15 +62,15 @@
 
                                                                       i        Ԁ                x   x   <                     E  T   =  
 
-                                                                              Ԁ              '  T   T                    E  0     
+                                                                              Ԁ                T   T                    E  0     
 
       
     
-         0  T   T                    E  0     
+         h%  T   T                    E  0     
 
       
     
-           T   T               `     E  0     
+         }  T   T               `     E  0     
 
       
    
@@ -84,15 +84,15 @@
 
                                                                               Ԁ                x   x   <                     E  T   =  
 
-                                                                      	        Ԁ                T   T                    E  0     
+                                                                      	        Ԁ                T   T                    E  0     
 
       
     
-            T   T                    E  0     
+         H  T   T                    E  0     
 
       
     
-           T   T                    E  0     
+          j  T   T                    E  0     
 
       
    
@@ -106,15 +106,15 @@
 
                                                                               Ԁ                x   x   <                     E  T   =  
 
-                                                                              Ԁ                T   T                    E  0     
+                                                                              Ԁ                T   T                    E  0     
 
       
     
-         D  T   T                    E  0     
+         !  T   T                    E  0     
 
       
     
-           T   T                    E  0     
+         }  T   T                    E  0     
 
       
    
@@ -138,56 +138,56 @@
 
       
     
-         3F  T   T   <                0    E  0     
+         Q  T   T   <                0    E  0     
 
      
     
-           F        Ԁ                T   T                    E  0     
+           R        Ԁ              u  T   T                    E  0     
 
       
    
-           X   X                    E  4     
-
-          
-    
-          p/  T   T               @    E  0     
+         g   T   T               @    E  0     
 
       
     
-         X3  X   X               P    E  4     
+         #  X   X                    E  4     
+
+          
+    
+          J  X   X               P    E  4     
 
          
     
-          #  T   T                    E  0     
+          X  T   T                    E  0     
 
       
    
-         (;  T   T               `    E  0     
+         J  T   T               `    E  0     
 
       
     
-         X  T   T                    E  0     
+         #  T   T                    E  0     
 
       
    
-         (;  T   T               p    E  0     
+         J  T   T               p    E  0     
 
       
     
-         X X   X                    E  4 	    
+         HA X   X                    E  4 	    
 
           
     
-           X   X                   E  4 	    
+          I X   X                   E  4 	    
 
          
     
-          @A T   T                   E  0 
+          X= T   T                   E  0 
     
 
       
    
-         ` T   T                   E  0 
+         pd T   T                   E  0 
     
 
       
@@ -196,7 +196,7 @@
 
       
    
-      	   { T   T                   E  0     
+      	    M T   T                   E  0     
 
       
     
diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-2-0.pcap ns-3.23/src/aodv/test/aodv-chain-regression-test-2-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-2-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-2-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,62 +1,62 @@
-ò            i       x  X   X                     E  4      
+ò            i          X   X                     E  4      
 
     (    
     
-           ;  X   X                     E  4      
+           4  X   X                     E  4      
 
     (    
     
-           `  X   X                     E  4      
+           (I  X   X                     E  4      
 
     (    
     
-           ,  @   @   <                            
+           Sm  @   @   <                            
      
-                Ԁ               e  @   @                            
+        n        Ԁ                 @   @                            
 
-          @   @   <                            
+          @   @   <                            
      
-        4        Ԁ               J  T   T   <                0     E  0      
+        R        Ԁ               h  T   T   <                0     E  0      
 
      
     
-  +        Z        Ԁ               2  @   @                            
+  +        x        Ԁ               P  @   @                            
 
-        4  @   @   <                            
+        R  @   @   <                            
      
-        D        Ԁ                 T   T   <                0     E  0      
+        b        Ԁ                 T   T   <                0     E  0      
 
      
     
-  +        á        Ԁ                 @   @                            
+  +                Ԁ                 @   @                            
 
-        f        Ԁ               F  T   T   <                0     E  0      
+                Ԁ               d  T   T   <                0     E  0      
 
      
     
-  +        q  @   @   <                @            
+  +          @   @   <                @            
      
-                Ԁ                 @   @               P            
+                Ԁ                 @   @               P            
 
-          @   @   <                @            
+          @   @   <                @            
      
-        f        Ԁ                 x   x   <                `     E  T    ?  
+                Ԁ                 x   x   <                `     E  T    ?  
 
-                                                                               Ԁ               "  @   @               P            
+                                                                               Ԁ               @  @   @               P            
 
-        %  @   @   <                @            
+        C  @   @   <                @            
      
-        5        Ԁ                 x   x   <                `     E  T    >  
+        S        Ԁ                 x   x   <                `     E  T    >  
 
-                                                                               Ԁ                @   @               P            
+                                                                               Ԁ                 @   @               P            
 
-        N       Ԁ                x   x   <                `     E  T    =  
+        l        Ԁ                 x   x   <                `     E  T    =  
 
-                                                                              Ԁ                x   x   <                p     E  T    ?  
+                                                                               Ԁ               0  x   x   <                p     E  T    ?  
 
-                                                                        "       Ԁ               p x   x   <                p     E  T    >  
+                                                                        @        Ԁ                 x   x   <                p     E  T    >  
 
-                                                                        d       Ԁ               > x   x   <                p     E  T    =  
+                                                                                Ԁ               \  x   x   <                p     E  T    =  
 
                                                                                 Ԁ                x   x   <                     E  T   ?  
 
@@ -70,15 +70,15 @@
 
                                                                               Ԁ              p  x   x   <                     E  T   =  
 
-                                                                      ((  T   T                    E  0     
+                                                                      g  T   T                    E  0     
 
       
     
-          0  T   T                    E  0     
+         $  T   T                    E  0     
 
       
     
-         YP  T   T                    E  0     
+         9  T   T                    E  0     
 
       
     
@@ -94,19 +94,19 @@
 
                                                                               Ԁ                x   x   <                     E  T   =  
 
-                                                                        T   T                    E  0     
+                                                                      g  T   T                    E  0     
 
       
     
-         `   T   T                    E  0     
-
-      
-    
-         @  T   T                    E  0     
+         PA  T   T                    E  0     
 
       
     
-                  Ԁ                x   x   <                     E  T   ?  
+         H  T   T                    E  0     
+
+      
+    
+                  Ԁ                x   x   <                     E  T   ?  
 
                                                                              Ԁ              ,  x   x   <                     E  T   >  
 
@@ -118,39 +118,39 @@
 
                                                                               Ԁ                x   x   <                     E  T   =  
 
-                                                                        T   T                    E  0     
+                                                                      O  T   T                    E  0     
 
       
     
-         C  T   T                    E  0     
+            T   T                    E  0     
 
       
     
-         H  T   T                    E  0     
+         M  T   T                    E  0     
 
       
     
-         x  T   T                   E  0     
+         $  T   T                   E  0     
 
       
     
-         `   T   T                    E  0     
+         O<  T   T                    E  0     
 
       
     
-         7  T   T               0    E  0     
+         $  T   T               0    E  0     
 
       
     
-         `   T   T               @    E  0     
+         H  T   T               @    E  0     
 
       
     
-         C  T   T               P    E  0     
+         O<  T   T               P    E  0     
 
       
     
-      	   7  T   T               `    E  0 	    
+      	   (  T   T               `    E  0 	    
 
       
     
diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-3-0.pcap ns-3.23/src/aodv/test/aodv-chain-regression-test-3-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-3-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-3-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,58 +1,58 @@
-ò            i       I<  X   X                     E  4      
+ò            i       5  X   X                     E  4      
 
     (    
     
-           q_  X   X                     E  4      
+           H  X   X                     E  4      
 
     (    
     
-           }  T   T                     E  0      
-
-      
-    
-            @   @                           
+           l  @   @                            
 
-          @   @   <                            
+        l  @   @   <                            
      
-        h        Ԁ               l  T   T   <                      E  0      
+        m        Ԁ               n  T   T   <                     E  0      
 
       
     
-  +        |        Ԁ                 @   @                            
+  +        n        Ԁ                 @   @                            
 
-          @   @   <                            
+          @   @   <                            
      
-                Ԁ                 T   T   <                0     E  0      
+        %        Ԁ               ߃  T   T   <                0     E  0      
 
      
     
-  +                Ԁ                 @   @                            
+  +                Ԁ                 @   @                            
 
-        q        Ԁ                 T   T   <                0     E  0      
+                Ԁ                 T   T   <                0     E  0      
 
      
     
-  +        *  @   @   <                @            
+  +        H  @   @   <                @            
      
-                Ԁ                 @   @               P            
+                Ԁ                 @   @               P            
 
-          @   @   <                @            
+          @   @   <                @            
      
-        b        Ԁ                 x   x   <                `     E  T    >  
+                Ԁ                 x   x   <                `     E  T    >  
 
-                                                                               Ԁ                @   @               P            
+                                                                               Ԁ               -  @   @               P            
 
-         @   @   <                0            
+        /  @   @   <                             
      
-        !       Ԁ                x   x   <                `     E  T    =  
+        ?        Ԁ                 x   x   <                `     E  T    =  
 
-                                                                              Ԁ                x   x   <                @     E  T    @  
+                                                                               Ԁ                 x   x   <                0     E  T    @  
 
-                                                                               Ԁ               Y x   x   <                p     E  T    ?  
+                                                                                Ԁ               w  x   x   <                p     E  T    ?  
 
-                                                                        N       Ԁ               ( x   x   <                p     E  T    >  
+                                                                        l        Ԁ               F  x   x   <                p     E  T    >  
 
-                                                                               Ԁ                x   x   <                     E  T   >  
+                                                                         5 T   T               @     E  0      
+
+      
+    
+                 Ԁ                x   x   <                     E  T   >  
 
                                                                              Ԁ              C  x   x   <                     E  T   =  
 
@@ -62,15 +62,15 @@
 
                                                                               Ԁ              Y  x   x   <                     E  T   >  
 
-                                                                      0  T   T                    E  0     
+                                                                      h%  T   T                    E  0     
 
       
     
-         O  T   T                    E  0     
+         8  T   T                    E  0     
 
       
     
-          j  T   T               `     E  0     
+         h) T   T               `     E  0     
 
       
     
@@ -84,15 +84,15 @@
 
                                                                               Ԁ                x   x   <                     E  T   >  
 
-                                                                         T   T                    E  0     
-
-      
-    
-         1@  T   T                    E  0     
+                                                                      @  T   T                    E  0     
 
       
     
-         H^  T   T                    E  0     
+         H  T   T                    E  0     
+
+      
+    
+         @ T   T                    E  0     
 
       
     
@@ -106,67 +106,67 @@
 
                                                                               Ԁ              t  x   x   <                     E  T   >  
 
-                                                                      D  T   T                    E  0     
+                                                                      !  T   T                    E  0     
 
       
     
-         H  T   T                    E  0     
+         L  T   T                    E  0     
 
       
     
-         u  T   T                    E  0     
+         @ T   T                    E  0     
 
       
     
-         S  T   T                   E  0     
+         8X  T   T                   E  0     
 
       
     
-         u  T   T                    E  0     
+         P- T   T                    E  0     
 
       
     
-         q_  T   T                    E  0     
+         L  T   T                    E  0     
 
       
     
-         0b  T   T                    E  0     
+         L T   T                    E  0     
 
       
     
-         S  T   T               0    E  0     
+         @  T   T               0    E  0     
 
       
     
-         p  T   T                    E  0     
-
-      
-    
-         @  T   T   <                @    E  0      
+         ' T   T   <                @    E  0      
 
      
    
-                   Ԁ              W  T   T               P    E  0     
+                  Ԁ              H T   T                    E  0     
+
+      
+    
+         PT  T   T               P    E  0     
 
       
     
-         }  T   T                    E  0     
+         P- T   T                    E  0     
 
       
     
-         [  T   T               `    E  0     
+         5  T   T               `    E  0     
 
       
     
-         0b  T   T                    E  0     
+          5 T   T                    E  0     
 
       
     
-      	   I<  T   T               p    E  0 	    
+      	    \  T   T               p    E  0 	    
 
       
     
-      	    j  T   T                    E  0 	    
+      	   P- T   T                    E  0 	    
 
       
     
diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-4-0.pcap ns-3.23/src/aodv/test/aodv-chain-regression-test-4-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-4-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-4-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,48 +1,48 @@
-ò            i       `  X   X                     E  4      
+ò            i       (I  X   X                     E  4      
 
     (    
     
-            }  T   T                     E  0      
-
-      
-    
-          )  @   @                           
+           Pl  @   @                            
 
-        ,  @   @   <                            
+        Sm  @   @   <                            
      
-        <        Ԁ                 T   T   <                      E  0      
+        cm        Ԁ               n  T   T   <                     E  0      
 
       
     
-  +                Ԁ               e  @   @                            
+  +        n        Ԁ                 @   @                            
 
-        4        Ԁ               J  T   T   <                0     E  0      
+        R        Ԁ               h  T   T   <                0     E  0      
 
      
     
-  +        %  @   @   <                @            
+  +        C  @   @   <                @            
      
-                Ԁ                @   @               P            
+                Ԁ                 @   @               P            
 
-         @   @   <                0            
+          @   @   <                             
      
-        N       Ԁ                x   x   <                `     E  T    =  
+        l        Ԁ                 x   x   <                `     E  T    =  
 
-                                                                              Ԁ                x   x   <                @     E  T    @  
+                                                                               Ԁ                 x   x   <                0     E  T    @  
 
-                                                                               Ԁ                x   x   <                p     E  T    ?  
+                                                                                Ԁ               0  x   x   <                p     E  T    ?  
 
-                                                                       !        Ԁ                x   x   <                     E  T   =  
+                                                                        4 T   T               @     E  0      
+
+      
+    
+         !        Ԁ                x   x   <                     E  T   =  
 
                                                                              Ԁ              Y  x   x   <                P     E  T   @  
 
                                                                       N        Ԁ              C  x   x   <                     E  T   ?  
 
-                                                                      YP  T   T                    E  0     
+                                                                      9  T   T                    E  0     
 
       
     
-         xi  T   T               `     E  0     
+         ( T   T               `     E  0     
 
       
     
@@ -52,11 +52,11 @@
 
                                                                       N        Ԁ                x   x   <                     E  T   ?  
 
-                                                                      @  T   T                    E  0     
+                                                                      PA  T   T                    E  0     
 
       
     
-         ]  T   T                    E  0     
+         P@ T   T                    E  0     
 
       
     
@@ -66,63 +66,63 @@
 
                                                                       N        Ԁ              ^  x   x   <                     E  T   ?  
 
-                                                                      H  T   T                    E  0     
+                                                                      M  T   T                    E  0     
 
       
     
-         0u  T   T                    E  0     
+         P@ T   T                    E  0     
 
       
     
-         AT  T   T                   E  0     
+         X  T   T                   E  0     
 
       
     
-         0u  T   T                    E  0     
+         , T   T                    E  0     
 
       
     
-         _  T   T                    E  0     
+         M  T   T                    E  0     
 
       
     
-         a  T   T                    E  0     
+         L T   T                    E  0     
 
       
     
-         AT  T   T               0    E  0     
+         PA  T   T               0    E  0     
 
       
     
-           T   T                    E  0     
-
-      
-    
-         ȉ  T   T   <                @    E  0      
+          T   T   <                @    E  0      
 
      
    
-           ؉        Ԁ              )X  T   T               P    E  0     
+                  Ԁ               H T   T                    E  0     
+
+      
+    
+         T  T   T               P    E  0     
 
       
     
-          }  T   T                    E  0     
+         , T   T                    E  0     
 
       
     
-         \  T   T               `    E  0     
+         5  T   T               `    E  0     
 
       
     
-         a  T   T                    E  0     
+         4 T   T                    E  0     
 
       
     
-      	   <  T   T               p    E  0 	    
+      	   \  T   T               p    E  0 	    
 
       
     
-      	   xi  T   T                    E  0 	    
+      	   , T   T                    E  0 	    
 
       
     
diff -Naur ns-3.22/src/aodv/test/bug-606-test-0-0.pcap ns-3.23/src/aodv/test/bug-606-test-0-0.pcap
--- ns-3.22/src/aodv/test/bug-606-test-0-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/bug-606-test-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,48 +1,48 @@
-ò            i         X   X                     E  4      
+ò            i       @  X   X                     E  4      
 
     (     
     
-             X   X                     E  4      
+           0(  X   X                     E  4      
 
     (    
     
-           3)  @   @   <                            
+           D  @   @   <                            
      
-        V*        Ԁ               I  @   @                            
+        E        Ԁ               "e  @   @                            
 
-        I  @   @   <                            
+        De  @   @   <                            
      
-        J        Ԁ               yK  T   T   <                0     E  0      
+        e        Ԁ               f  T   T   <                0     E  0      
 
      
     
-  +        K        Ԁ               1W  @   @                            
+  +        f        Ԁ               r  @   @                            
 
-        4X  @   @   <                @            
+        s  @   @   <                @            
      
-        DX        Ԁ               X  x   x   <                0     E  T    @  
+        s        Ԁ               Dt  x   x   <                0     E  T    @  
 
-                                                                       Y        Ԁ               `m  T   T               @     E  0     
+                                                                       8u        Ԁ                }  T   T               @     E  0     
 
       
    
-          Ty  @   @               P            
+            @   @               P            
 
-        #z        Ԁ               W{  x   x   <                `     E  T    ?  
+        {        Ԁ                 x   x   <                `     E  T    ?  
 
-                                                                       |        Ԁ               }  x   x   <                p     E  T    ?  
+                                                                               Ԁ               6  x   x   <                p     E  T    ?  
 
-                                                                        }        Ԁ                  x   x   <                P     E  T   @  
+                                                                        F        Ԁ                  x   x   <                P     E  T   @  
 
                                                                               Ԁ                x   x   <                     E  T   ?  
 
                                                                      !        Ԁ              1  x   x   <                     E  T   ?  
 
-                                                                      A        Ԁ                T   T                    E  0     
+                                                                      A        Ԁ              hG  T   T                    E  0     
 
       
     
-         `m  T   T               `     E  0     
+         ]  T   T               `     E  0     
 
       
    
@@ -52,7 +52,7 @@
      
        :$        Ԁ              $  x   x   <                     E  T   @  
 
-                                                                     %        Ԁ              /  T   T                    E  0     
+                                                                     %        Ԁ              ((  T   T                    E  0     
 
       
     
@@ -60,61 +60,61 @@
 
        5F        Ԁ              G  x   x   <                     E  T   ?  
 
-                                                                      N  T   T                    E  0     
+                                                                     \  @   @   <                            
+     
+       ]        Ԁ              Hq  T   T                    E  0     
 
       
    
-         \  @   @   <                            
-     
-       ]        Ԁ              |  @   @                           
+         0}  @   @                           
 
-       }  @   @   <                            
+       R}  @   @   <                            
      
-       }        Ԁ              ~  x   x   <                    E  T   ?  
+       }        Ԁ                 x   x   <                    E  T   ?  
 
-                                                                      ~        Ԁ                  x   x   <                     E  T   @  
+                                                                      0        Ԁ                  x   x   <                     E  T   @  
 
                                                                               Ԁ                x   x   <                     E  T   ?  
 
                                                                      !        Ԁ                x   x   <                0    E  T   ?  
 
-                                                                              Ԁ                T   T               @    E  0     
+                                                                              Ԁ              ((  T   T               @    E  0     
 
       
     
-         a  T   T                    E  0     
+           T   T                    E  0     
 
       
    
          (#  @   @                           
 
-       Hq  T   T                    E  0     
+       a  T   T                    E  0     
 
       
    
              @   @                           
 
-       R  T   T                    E  0     
+        }  T   T                    E  0     
 
       
    
              @   @                          
 
-       `m  T   T                    E  0     
+       e  T   T                    E  0     
 
       
    
              @   @               0           
 
-         X   X               @    E  4     
+       '  X   X               @    E  4     
 
           
     
-          '  T   T               P    E  0 	    
+          (#  T   T               P    E  0 	    
 
       
    
-      	   (#  T   T               `    E  0 
+      	     T   T               `    E  0 
     
 
       
diff -Naur ns-3.22/src/aodv/test/bug-606-test-1-0.pcap ns-3.23/src/aodv/test/bug-606-test-1-0.pcap
--- ns-3.22/src/aodv/test/bug-606-test-1-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/bug-606-test-1-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,52 +1,52 @@
-ò            i       `  X   X                     E  4      
+ò            i         X   X                     E  4      
 
     (     
     
-           H  X   X                     E  4      
+           '  X   X                     E  4      
 
     (    
     
-           (  @   @                            
+           C  @   @                            
 
-        (  @   @   <                            
+        D  @   @   <                            
      
-        p)        Ԁ               *  T   T   <                     E  0      
+        D        Ԁ               rE  T   T   <                     E  0      
 
       
     
-  +        **        Ԁ               ZI  @   @                            
+  +        E        Ԁ               J  T   T                     E  0      
+
+      
+    
+          d  @   @                            
 
-        \J  @   @   <                            
+        e  @   @   <                            
      
-        lJ        Ԁ               J  T   T   <                0     E  0      
+        e        Ԁ               Hf  T   T   <                0     E  0      
 
      
     
-  +        K        Ԁ               W  @   @                            
+  +        g        Ԁ               r  @   @                            
 
-        W  @   @   <                @            
+        s  @   @   <                @            
      
-        pX        Ԁ               Y  x   x   <                0     E  T    @  
+        s        Ԁ               t  x   x   <                0     E  T    @  
 
-                                                                       Y        Ԁ               m  T   T               @     E  0     
+                                                                       u        Ԁ               }  T   T               @     E  0     
 
       
    
-          x  @   @               P            
+          <  @   @               P            
 
-        y  @   @   <                             
+        ?  @   @   <                0            
      
-        y        Ԁ               z  x   x   <                `     E  T    ?  
+        O        Ԁ                 x   x   <                `     E  T    ?  
 
-                                                                       {        Ԁ               |  x   x   <                0     E  T    @  
-
-                                                                        |        Ԁ               &}  x   x   <                p     E  T    ?  
+                                                                               Ԁ               Ɨ  x   x   <                @     E  T    @  
 
-                                                                        ~        Ԁ                 T   T               @     E  0      
+                                                                        ֗        Ԁ               ~  x   x   <                p     E  T    ?  
 
-      
-    
-            x   x   <                P     E  T   @  
+                                                                        r        Ԁ                 x   x   <                P     E  T   @  
 
                                                                               Ԁ                x   x   <                     E  T   ?  
 
@@ -54,55 +54,55 @@
 
                                                                               Ԁ              y  x   x   <                     E  T   ?  
 
-                                                                      n        Ԁ              0  T   T                    E  0     
+                                                                      n        Ԁ              '  T   T               `     E  0     
+
+      
+    
+         F  T   T                    E  0     
 
       
     
-         m  T   T               `     E  0     
+         H^  T   T               `     E  0     
 
       
    
-           T   T               `     E  0     
-
-      
-    
-         #  @   @               p            
+         #  @   @               p            
 
        #  @   @   <                            
      
        g$        Ԁ              %  x   x   <                     E  T   @  
 
-                                                                     %        Ԁ              p/  T   T                    E  0     
+                                                                     %        Ԁ              '  T   T                    E  0     
 
       
     
-         D  @   @                           
+         +  T   T               p     E  0     
+
+      
+    
+         D  @   @                           
 
-       E  @   @   <                p            
+       E  @   @   <                            
      
        	F        Ԁ              F  x   x   <                     E  T   ?  
 
-                                                                     G        Ԁ              N  T   T                    E  0     
-
-      
-   
-         [  @   @                           
+                                                                     G        Ԁ              [  @   @                           
 
        [  @   @   <                            
      
-       T\        Ԁ              I]  x   x   <                     E  T   @  
+       T\        Ԁ              ]  x   x   <                     E  T   @  
 
-                                                                      Y]        Ԁ              |  @   @                           
+                                                                      ]        Ԁ              q  T   T                    E  0     
+
+      
+   
+         |  @   @                           
 
-       }  @   @   <                            
+       }  @   @   <                            
      
-       }        Ԁ              2~  x   x   <                    E  T   ?  
+       }        Ԁ              h~  x   x   <                    E  T   ?  
 
-                                                                      '        Ԁ                T   T                    E  0     
-
-      
-    
-            x   x   <                     E  T   @  
+                                                                      ]        Ԁ                 x   x   <                     E  T   @  
 
                                                                               Ԁ                x   x   <                     E  T   ?  
 
@@ -110,39 +110,39 @@
 
                                                                               Ԁ              L  x   x   <                0    E  T   ?  
 
-                                                                      A        Ԁ              0  T   T               @    E  0     
+                                                                      A        Ԁ              '  T   T               @    E  0     
 
       
     
-         0b  T   T                    E  0     
-
-      
-   
-           T   T                    E  0     
+         F  T   T                    E  0     
 
       
     
-         0  T   T               P    E  0     
+         p  T   T                    E  0     
+
+      
+   
+         ?  T   T               P    E  0     
 
       
     
-         '  T   T               `    E  0     
+         ?  T   T               `    E  0     
 
       
     
-         '  T   T               p    E  0     
+         +  T   T               p    E  0     
 
       
     
-           T   T                   E  0     
+         F  T   T                   E  0     
 
       
     
-         p/  T   T                   E  0     
+         B  T   T                   E  0     
 
       
     
-      	   +  T   T                   E  0 	    
+      	     T   T                   E  0 	    
 
       
     
diff -Naur ns-3.22/src/aodv/test/bug-606-test-2-0.pcap ns-3.23/src/aodv/test/bug-606-test-2-0.pcap
--- ns-3.22/src/aodv/test/bug-606-test-2-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/bug-606-test-2-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,112 +1,112 @@
-ò            i         X   X                     E  4      
+ò            i       0(  X   X                     E  4      
 
     (    
     
-           0(  @   @                            
+           C  @   @                            
 
-        3)  @   @   <                            
+        D  @   @   <                            
      
-        C)        Ԁ               )  T   T   <                     E  0      
+        D        Ԁ               D  T   T   <                     E  0      
 
       
     
-  +        V*        Ԁ               I  @   @                            
+  +        E        Ԁ               8J  T   T                     E  0      
+
+      
+    
+          "e  @   @                            
 
-        J        Ԁ               yK  T   T   <                0     E  0      
+        e        Ԁ               f  T   T   <                0     E  0      
 
      
     
-  +        4X  @   @   <                @            
+  +        s  @   @   <                @            
      
-        Y        Ԁ               Ty  @   @               P            
+        8u        Ԁ                 @   @               P            
 
-        vy  @   @   <                             
+        Δ  @   @   <                0            
      
-        #z        Ԁ               W{  x   x   <                `     E  T    ?  
+        {        Ԁ                 x   x   <                `     E  T    ?  
 
-                                                                       g{        Ԁ               {  x   x   <                0     E  T    @  
+                                                                               Ԁ                 x   x   <                @     E  T    @  
 
-                                                                        |        Ԁ               }  x   x   <                p     E  T    ?  
+                                                                                Ԁ               6  x   x   <                p     E  T    ?  
 
-                                                                        (  T   T               @     E  0      
-
-      
-    
-                  Ԁ                x   x   <                     E  T   ?  
+                                                                                Ԁ                x   x   <                     E  T   ?  
 
                                                                              Ԁ              ,  x   x   <                P     E  T   @  
 
                                                                       !        Ԁ              1  x   x   <                     E  T   ?  
 
-                                                                        T   T                    E  0     
-
-      
-    
-         8  T   T               `     E  0     
+                                                                      '  T   T               `     E  0     
 
       
     
-         *$  @   @   <                            
+         hG  T   T                    E  0     
+
+      
+    
+         *$  @   @   <                            
      
-       %        Ԁ              /  T   T                    E  0     
+       %        Ԁ              ((  T   T                    E  0     
 
       
     
-         fE  @   @                           
+         *  T   T               p     E  0     
+
+      
+    
+         fE  @   @                           
 
-       E  @   @   <                p            
+       E  @   @   <                            
      
        5F        Ԁ              G  x   x   <                     E  T   ?  
 
-                                                                     G        Ԁ              [  @   @                           
+                                                                     G        Ԁ              [  @   @                           
 
        \  @   @   <                            
      
-       (\        Ԁ              \  x   x   <                     E  T   @  
+       (\        Ԁ              \  x   x   <                     E  T   @  
 
-                                                                      ]        Ԁ              |  @   @                           
+                                                                      ]        Ԁ              0}  @   @                           
 
-       }        Ԁ              ~  x   x   <                    E  T   ?  
-
-                                                                        T   T                    E  0     
+       }        Ԁ                 x   x   <                    E  T   ?  
 
-      
-    
-                  Ԁ                x   x   <                     E  T   ?  
+                                                                               Ԁ                x   x   <                     E  T   ?  
 
                                                                              Ԁ              ,  x   x   <                     E  T   @  
 
                                                                       !        Ԁ                x   x   <                0    E  T   ?  
 
-                                                                        T   T               @    E  0     
+                                                                      ((  T   T               @    E  0     
 
       
     
-           T   T                    E  0     
+         PF  T   T                    E  0     
 
       
     
-         P  T   T                    E  0     
+         2  T   T                    E  0     
 
       
     
-         ȯ  T   T                    E  0     
+         (#  T   T                    E  0     
 
       
     
-         (  T   T                    E  0     
+         8J  T   T                    E  0     
 
       
     
-         8  T   T                    E  0     
+         .  T   T                    E  0     
 
       
     
-           T   T                   E  0     
+         2  T   T                   E  0     
 
       
     
-      	   ȯ  T   T                    E  0 	    
+      	   6  T   T                    E  0 	    
 
       
     
diff -Naur ns-3.22/src/aodv/test/bug-772.cc ns-3.23/src/aodv/test/bug-772.cc
--- ns-3.22/src/aodv/test/bug-772.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/bug-772.cc	2015-05-13 11:05:27.000000000 -0700
@@ -133,9 +133,12 @@
   InternetStackHelper internetStack;
   internetStack.SetRoutingHelper (aodv);
   internetStack.Install (*m_nodes);
+  streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
+  // Expect to use (3*m_size) more streams for internet stack random variables
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (3*m_size)), "Stream assignment mismatch");
   streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
   // Expect to use m_size more streams for AODV
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + m_size), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (3*m_size) + m_size), "Stream assignment mismatch");
   Ipv4AddressHelper address;
   address.SetBase ("10.1.1.0", "255.255.255.0");
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
diff -Naur ns-3.22/src/aodv/test/tcp-chain-test-0-0.pcap ns-3.23/src/aodv/test/tcp-chain-test-0-0.pcap
--- ns-3.22/src/aodv/test/tcp-chain-test-0-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/tcp-chain-test-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,68 +1,67 @@
-ò            i       Y  T   T                     E  0      
+ò            i       .  T   T                     E  0      
 
       
     
-          x  T   T                     E  0      
+          H T   T                     E  0      
 
       
     
-         @  X   X                    E  4     
+             X   X                    E  4     
 
     (     
 
     
-          pG  X   X                    E  4     
+          `   X   X                    E  4     
 
     (    
 
     
-          &8 @   @   <                             
+           @   @   <                             
      
-       9       Ԁ              5Q @   @               0            
+              Ԁ               @   @               0            
 
-       WQ @   @   <                             
+       4 @   @   <                             
      
-       R       Ԁ              4S T   T   <                @     E  0      
+              Ԁ               T   T   <                @     E  0      
 
      
 
     
-         DS       Ԁ              f @   @               0            
+         !       Ԁ              o @   @               0            
 
-       g @   @   <                P            
+        @   @   <                P            
      
-       g       Ԁ              h \   \   <                @     E  8    @  
+              Ԁ               \   \   <                @     E  8    @  
 
 
  	             
-                h       Ԁ              
-m @   @               `            
+                       Ԁ              ' @   @               `            
 
-       m       Ԁ              n \   \   <                p     E  8    ?  
+       (       Ԁ              ) \   \   <                p     E  8    ?  
 
 
  	             
-                       Ԁ              Z \   \   <                     E  8    8  
+                	       Ԁ               \   \   <                     E  8    8  
 
 
  	            
-  X            j       Ԁ               X   X   <                P     E  4   @  
+  J            Ϟ       Ԁ               X   X   <                P     E  4   @  
 
 
  	           
-  ]  X                Ԁ              m X   X   <                     E  4   ?  
+  R  J                Ԁ              Ҡ X   X   <                     E  4   ?  
 
 
  	           
-  ]  X         H p  p  <                `     E L   @  
+  R  J         H p  p  <                `     E L   @  
 
 
  	           
-  e  X                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              V p  p  <                     E L   ?  
+  e  J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              V p  p  <                     E L   ?  
 
 
  	           
-  e  X                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '       Ԁ               X   X   <                     E  4   8  
+  e  J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '       Ԁ               X   X   <                     E  4   8  
 
 
  	     z    
@@ -106,349 +105,155 @@
 
 
  	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           r (  (  <                     E    @  
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               p  p  <                     E L   ?  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               (  (  <                    E    ?  
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    (  (  <                    E    ?  
 
 
  	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ              ` X   X   <                     E  4   8  
-
-
- 	     	z    
-  g  _         p       Ԁ                p  p  <                     E L   @  
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           % (  (  <                    E    ?  
 
 
- 	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              . p  p  <                0    E L   ?  
-
-
- 	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <                     E  	  @  
+ 	  	        
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (  (  <                    E    ?  
 
 
- 	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          (  (  <                     E  	  @  
+ 	  	        
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (  (  <                    E    ?  
 
 
- 	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              3 (  (  <                @    E  	  ?  
+ 	  	        
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ; (  (  <                    E    ?  
 
 
- 	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         o       Ԁ              ! X   X   <                P    E  4   8  
+ 	  	        
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   Ԁ               X   X   <                     E  4   8  
 
 
- 	     рz    
-             1       Ԁ              h	 p  p  <                     E L 
-  @  
-
-
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              v	 p  p  <                `    E L 
-  ?  
-
-
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   .	 (  (  <                     E    @  
-
-
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           Y	 (  (  <                     E    @  
-
-
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           	       Ԁ              	 (  (  <                p    E    ?  
-
-
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           t	       Ԁ              &	 X   X   <                    E  4   8  
+ 	     	z    
+  r  _                Ԁ              | T   T   <                0    E  0     
+
+     
+    
 
-
- 	     z    
-  a  Y         6	       Ԁ              q p  p  <                     E L   @  
+                  Ԁ               X   X                    E  4     
 
+          
 
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Du       Ԁ              x p  p  <                    E L   ?  
-
+    
+           X   X               @    E  4     
+
+         
 
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Iy (  (  <                    E    @  
-
+    
+          ߮       Ԁ              ȯ T   T   <                P    E  0     
+
+     
 
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         t} (  (  <                    E    @  
+    
+  L       د       Ԁ              & p  p  <                     E L   @  
 
 
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              Ã (  (  <                    E    ?  
+ 	          
+    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              P p  p  <                `    E L   ?  
 
 
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         6       Ԁ               X   X   <                    E  4   8  
+ 	          
+    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ;       Ԁ               X   X   <                p    E  4   8  
 
 
- 	     z    
-                    Ԁ              Y p  p  <                     E L   @  
-
-
- 	  q        
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   ]       Ԁ              a p  p  <                    E L   ?  
-
-
- 	  q        
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   a (  (  <                0    E    @  
-
-
- 	          
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           f (  (  <                0    E    @  
+ 	     	z    
+                    Ԁ              h	 p  p  <                     E L 
+  @  
 
 
- 	          
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           Bi       Ԁ              \l (  (  <                    E    ?  
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              v	 p  p  <                    E L 
+  ?  
 
 
- 	          
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ              E X   X   <                    E  4   8  
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   >	       Ԁ              	 X   X   <                    E  4   8  
 
 
- 	     z    
-  [  S         U       Ԁ                  p  p  <                @    E L   @  
-
-
- 	  Y        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ԁ                (  (  <                P    E    @  
-
-
- 	  q        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         0  (  (  <                P    E    @  
-
-
- 	  q        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
-  (  (  <                P    E    @  
+ 	     	~    
+  a  Y          	       Ԁ              0 @   @                           
+
+       1 @   @   <                           
+     
+       1       Ԁ              L2 p  p  <                     E L   @  
 
 
- 	  q        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ?        Ԁ                (  (  <                     E    ?  
+ 	  	        
+  	\  a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 5       Ԁ              UU @   @                          
+
+       $V       Ԁ              Y p  p  <                    E L   ?  
 
 
- 	  q        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           T   T               `    E  0     
+ 	  	        
+  	\  a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  T   T                   E  0     
 
       
-   
-         =        Ԁ              7>  X   X   <                    E  4   8  
-
-
- 	     qz    
-             G>        Ԁ              ?  T   T                    E  0     
+   
+         ` T   T                   E  0     
 
       
     
-         H @   @               p           
-
-       J @   @   <                0           
-     
-       Z       Ԁ               p  p  <                    E L   @  
-
-
- 	  A        
-  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   a       Ԁ               (  (  <                    E    @  
-
-
- 	  !Y        
-  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ              e @   @               @           
-
-       4       Ԁ               p  p  <                P    E L   ?  
-
-
- 	  A        
-  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   z (  (  <                `    E    ?  
-
-
- 	  !Y        
-  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            @   @   <                p           
+          @   @   <                           
      
-       M       Ԁ               @   @                          
+       U       Ԁ              ) @   @                          
 
-        @   @   <                           
+       K @   @   <                            
      
-              Ԁ               X   X   <                    E  4 	  8  
+              Ԁ               X   X   <                     E  4   8  
 
 
- 	     !Yz    
-  r  M         	       Ԁ               p  p  <                    E L   @  
-
-
- 	  #)        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 $       Ԁ               p  p  <                    E L   ?  
-
-
- 	  #)        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 M (  (  <                    E    @  
-
-
- 	  %A        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         T (  (  <                    E    @  
-
-
- 	  %A        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               (  (  <                    E    ?  
-
-
- 	  %A        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         z       Ԁ              , X   X   <                    E  4 
-  8  
-
-
- 	     %Az    
-             <       Ԁ              ظ p  p  <                    E L   @  
-
-
- 	  '        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   l       Ԁ               p  p  <                    E L   ?  
-
-
- 	  '        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   h (  (  <                    E    @  
-
-
- 	  ))        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (  (  <                    E    @  
-
-
- 	  ))        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               (  (  <                    E    ?  
-
-
- 	  ))        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               X   X   <                    E  4   8  
-
-
- 	     ))z    
-  	O  	G                Ԁ                p  p  <                    E L   @  
-
-
- 	  *        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              . p  p  <                     E L   ?  
+ 	     р~    
+  	  	\                Ԁ              P p  p  <                0    E L   @  
 
 
- 	  *        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <                     E    @  
-
-
- 	  -        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Y (  (  <                     E    @  
-
-
- 	  -        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               (  (  <                    E    ?  
-
-
- 	  -        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         j       Ԁ               X   X   <                     E  4   8  
-
-
- 	     -z    
-  	  	         ,       Ԁ              h	 p  p  <                    E L   @  
-
-
- 	  .        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 	       Ԁ              v	 p  p  <                0    E L   ?  
-
-
- 	  .        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
-	 (  (  <                     E    @  
-
-
- 	  0        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         t	 (  (  <                     E    @  
-
-
- 	  0        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	       Ԁ              Û	 (  (  <                @    E    ?  
-
-
- 	  0        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	       Ԁ              _	 X   X   <                P    E  4   8  
-
-
- 	     0z    
-  
-I  
-A         o	       Ԁ              q p  p  <                0    E L   @  
-
-
- 	  2        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Du       Ԁ              x p  p  <                `    E L   ?  
-
-
- 	  2        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Iy (  (  <                @    E    @  
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              4 p  p  <                @    E L   @  
 
 
- 	  4        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         } (  (  <                @    E    @  
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              y p  p  <                    E L   ?  
 
 
- 	  4        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ր       Ԁ               (  (  <                p    E    ?  
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  p  p  <                     E L   ?  
 
 
- 	  4        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         U       Ԁ               X   X   <                    E  4   8  
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 T       Ԁ              V X   X   <                0    E  4   8  
 
 
- 	     4z    
-  
-  
-                Ԁ              Y p  p  <                P    E L   @  
+ 	         
+  	  	         V       Ԁ              V p  p  <                P    E L   @  
 
 
- 	  6        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ]       Ԁ              a p  p  <                    E L   ?  
-
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Z       Ԁ              [ L   L   <                @    E  (     
+
+     
 
- 	  6        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 a (  (  <                `    E    @  
+           [       Ԁ              \ p  p  <                `    E L   @  
 
 
- 	  8        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         e (  (  <                `    E    @  
-
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 _       Ԁ              ` T   T   <                P    E  0     
+
+     
+    
 
- 	  8        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         i       Ԁ              8l (  (  <                    E    ?  
-
+           `       Ԁ              a L   L   <                `    E  (     
+
+     
 
- 	  8        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              a X   X   <                    E  4   8  
+           a       Ԁ              q       Ԁ               L   L   <                p    E  (     
+
+     
 
-
- 	     8ɀz    
-  C  ;         q       Ԁ           
\ No newline at end of file
+           .       Ԁ           
\ No newline at end of file
diff -Naur ns-3.22/src/aodv/test/tcp-chain-test-9-0.pcap ns-3.23/src/aodv/test/tcp-chain-test-9-0.pcap
--- ns-3.22/src/aodv/test/tcp-chain-test-9-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/tcp-chain-test-9-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,73 +1,73 @@
-ò            i       e  T   T                     E  0      
+ò            i         T   T                     E  0      
 
 
       
 
     
 
-          xP T   T                     E  0      
+            T   T                     E  0      
 	
       
 	    
-	         PF  T   T                    E  0     
+	         (  T   T                    E  0     
 
 
       
 
     
 
-           @   @                           
+           @   @                           
 	
 
-       %  @   @   <                             
+       	  @   @   <                             
 
      
-	       Җ        Ԁ              |  T   T   <                      E  0      
+	               Ԁ              `  T   T   <                      E  0      
 	
 
      
    
 
-  _               Ԁ                @   @               0            
+  _       p        Ԁ              e  @   @               0            
 	
-               Ԁ              r  T   T   <                @     E  0      
+       4        Ԁ              &  T   T   <                @     E  0      
 	
    @ 
 
     
-           @   @   <                P            
-	     
-               Ԁ              81 T   T               `     E  0     
+         H  T   T               P     E  0     
 	
       
 	    
-	         @       Ԁ               \   \   <                p     E  8    8  
+	           @   @   <                `            
+	     
+               Ԁ              Հ       Ԁ               \   \   <                p     E  8    8  
 
 
  	             
-                       Ԁ               @   @               0            
+                       Ԁ               @   @               0            
 
 
-	        @   @   <                            
+	        @   @   <                            
 	     
 
-              Ԁ               \   \   <                @     E  8    @  
+       %       Ԁ              s \   \   <                @     E  8    @  
 
 
  	            
-  X                   Ԁ               \   \   <                     E  8    ?  
+  J            D       Ԁ               \   \   <                     E  8    ?  
 
 
  	            
-  X            @       Ԁ               X   X   <                     E  4   8  
+  J                   Ԁ              W X   X   <                     E  4   8  
 
 
  	           
-  ]  X                Ԁ                     Ԁ              S	 p  p  <                     E L   8  
+  R  J         g       Ԁ                     Ԁ              S	 p  p  <                     E L   8  
 
 
  	           
-  e  X                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 c	       Ԁ              	 X   X   <                P     E  4   @  
+  e  J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 c	       Ԁ              	 X   X   <                P     E  4   @  
 
 
  	     z    
@@ -96,394 +96,98 @@
 
 
  	          
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             y       Ԁ              i       Ԁ               p  p  <                    E L   8  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             y       Ԁ              s       Ԁ               p  p  <                    E L   8  
 
 
  	          
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              A X   X   <                p     E  4   @  
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              K X   X   <                p     E  4   @  
 
 
  	     	z    
-  g  _                Ԁ              # X   X   <                     E  4   ?  
+  r  _                Ԁ              - X   X   <                     E  4   ?  
 
 
  	     	z    
-  g  _          X   X   <                     E  4   ?  
+  r  _                Ԁ              R T   T   <                0    E  0     
+	
 
-
- 	     	z    
-  g  _                Ԁ               (  (  <                0    E    8  
-
+     
+   
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ                     Ԁ              + p  p  <                @    E L   8  
+  ?       b       Ԁ                     Ԁ              q p  p  <                @    E L   8  
 
 
  	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ;       Ԁ               X   X   <                     E  4   @  
-
-
- 	     рz    
-             V       Ԁ              > X   X   <                P    E  4   ?  
-
-
- 	     рz    
-             z X   X   <                P    E  4   ?  
-
-
- 	     рz    
-              X   X   <                P    E  4   ?  
+    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ               X   X   <                     E  4   @  
 
 
- 	     рz    
-              X   X   <                P    E  4   ?  
+ 	     	z    
+                    Ԁ              i X   X   <                P    E  4   ?  
 
 
- 	     рz    
-                    Ԁ               (  (  <                `    E  	  8  
-
-
- 	          
-    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              	       Ԁ              s	 p  p  <                p    E L 
+ 	     	z    
+             	       Ԁ              s	 p  p  <                `    E L 
   8  
 
 
  	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              Ѫ	 X   X   <                     E  4   @  
-
-
- 	     z    
-  a  Y         	       Ԁ              Y	 X   X   <                    E  4   ?  
-
-
- 	     z    
-  a  Y         	       Ԁ              	 (  (  <                    E    8  
-
-
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           	       Ԁ              A       Ԁ               p  p  <                    E L   8  
-
-
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ˒       Ԁ               X   X   <                     E  4   @  
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              Ѫ	 X   X   <                     E  4   @  
 
 
- 	     z    
-                    Ԁ               X   X   <                    E  4   ?  
+ 	     	~    
+  a  Y         	       Ԁ              k	 X   X   <                p    E  4   ?  
 
 
- 	     z    
-              X   X   <                    E  4   ?  
-
-
- 	     z    
-             "       Ԁ              < (  (  <                    E    8  
-
-
- 	          
-    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         L       Ԁ              w       Ԁ              { p  p  <                    E L   8  
-
-
- 	  q        
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   {       Ԁ              a{ X   X   <                     E  4   @  
-
-
- 	     z    
-  [  S         .|       Ԁ              } X   X   <                    E  4   ?  
-
-
- 	     z    
-  [  S         ~ X   X   <                    E  4   ?  
-
-
- 	     z    
-  [  S         5 X   X   <                    E  4   ?  
-
-
- 	     z    
-  [  S          X   X   <                    E  4   ?  
-
-
- 	     z    
-  [  S         A       Ԁ              [ (  (  <                    E    8  
-
-
- 	          
-  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           k       Ԁ                      Ԁ              !  p  p  <                     E L   8  
-
-
- 	  Y        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !        Ԁ              i!  X   X   <                     E  4   @  
-
-
- 	     qz    
-             6"        Ԁ              "  X   X   <                    E  4   ?  
-
-
- 	     qz    
-             ?$  X   X   <                    E  4   ?  
-
-
- 	     qz    
-             '  X   X   <                    E  4   ?  
-
-
- 	     qz    
-              *  X   X   <                    E  4   ?  
-
-
- 	     qz    
-             $0  X   X   <                    E  4   ?  
-
-
- 	     qz    
-             8        Ԁ              ;  (  (  <                     E    8  
-
-
- 	  q        
-    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ;        Ԁ              >  T   T                    E  0     
+ 	     	~    
+  a  Y         @  T   T                    E  0     
 
 
       
 
     
 
-         L T   T               0    E  0     
+           T   T                   E  0     
 	
       
 	    
-	         R @   @   <                @           
-	     
-       S @   @   <                @           
-	     
-       V @   @   <                @           
+	          @   @   <                           
 	     
-       WZ       Ԁ              :a       Ԁ              u @   @               P           
+       a       Ԁ               @   @                          
 	
 
-       v @   @   <                            
+        @   @   <                            
 
      
-	       v       Ԁ              ,z p  p  <                `    E L   8  
+	              Ԁ              A  p  p  <                    E L   8  
 
 
- 	  A        
-  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   <z       Ԁ              } (  (  <                p    E    8  
-
-
- 	  !Y        
-  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           }       Ԁ               @   @                           
+ 	  	        
+  	\  a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Q        Ԁ              7 @   @                           
 
 
-	        @   @   <                           
+	       8 @   @   <                           
 	     
 
-              Ԁ              r X   X   <                     E  4 	  @  
+       8       Ԁ              Q9 X   X   <                     E  4   @  
 
 
- 	     !Yz    
-  r  M         ?       Ԁ               @   @                          
+ 	     р~    
+  	  	\         :       Ԁ              z] @   @                          
 	
-       ʜ       Ԁ               X   X   <                    E  4 	  ?  
+       I^       Ԁ              _ X   X   <                    E  4   ?  
 
 
- 	     !Yz    
-  r  M         !       Ԁ               p  p  <                    E L   8  
+ 	     р~    
+  	  	\         >       Ԁ              ZL p  p  <                    E L   8  
 
 
- 	  #)        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ               X   X   <                    E  4 
-  @  
-
-
- 	     %Az    
-                    Ԁ               X   X   <                    E  4 
-  ?  
-
-
- 	     %Az    
-              X   X   <                    E  4 
-  ?  
-
-
- 	     %Az    
-             | X   X   <                    E  4 
-  ?  
-
-
- 	     %Az    
-             { X   X   <                    E  4 
-  ?  
-
-
- 	     %Az    
-             E X   X   <                    E  4 
-  ?  
-
-
- 	     %Az    
-             
-       Ԁ               X   X   <                    E  4 
-  ?  
-
-
- 	     %Az    
-              (  (  <                    E    8  
-
-
- 	  %A        
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Ԁ              i       Ԁ               p  p  <                    E L   8  
-
-
- 	  '        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              A X   X   <                     E  4   @  
-
-
- 	     ))z    
-  	O  	G                Ԁ              5 X   X   <                    E  4   ?  
-
-
- 	     ))z    
-  	O  	G          X   X   <                    E  4   ?  
-
-
- 	     ))z    
-  	O  	G          X   X   <                    E  4   ?  
-
-
- 	     ))z    
-  	O  	G                Ԁ               (  (  <                     E    8  
-
-
- 	  ))        
-  	G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ                     Ԁ              + p  p  <                    E L   8  
-
-
- 	  *        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ;       Ԁ               X   X   <                0    E  4   @  
-
-
- 	     -z    
-  	  	         V       Ԁ              t X   X   <                     E  4   ?  
-
-
- 	     -z    
-  	  	          X   X   <                     E  4   ?  
-
-
- 	     -z    
-  	  	         " X   X   <                     E  4   ?  
-
-
- 	     -z    
-  	  	         M       Ԁ              g (  (  <                0    E    8  
-
-
- 	  -        
-  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         w       Ԁ              	       Ԁ              s	 p  p  <                @    E L   8  
-
-
- 	  .        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 	       Ԁ              Ѫ	 X   X   <                @    E  4   @  
-
-
- 	     0z    
-  
-I  
-A         	       Ԁ              	 X   X   <                P    E  4   ?  
-
-
- 	     0z    
-  
-I  
-A         I	 X   X   <                P    E  4   ?  
-
-
- 	     0z    
-  
-I  
-A         	 X   X   <                P    E  4   ?  
-
-
- 	     0z    
-  
-I  
-A         3	 X   X   <                P    E  4   ?  
-
-
- 	     0z    
-  
-I  
-A         1	 X   X   <                P    E  4   ?  
-
-
- 	     0z    
-  
-I  
-A         Ͽ	       Ԁ              	 (  (  <                `    E    8  
-
-
- 	  0        
-  
-A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	       Ԁ              A       Ԁ               p  p  <                p    E L   8  
-
-
- 	  2        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ˒       Ԁ               X   X   <                P    E  4   @  
-
-
- 	     4z    
-  
-  
-                Ԁ               X   X   <                    E  4   ?  
-
-
- 	     4z    
-  
-  
-          X   X   <                    E  4   ?  
-
-
- 	     4z    
-  
-  
-         T X   X   <                    E  4   ?  
-
-
- 	     4z    
-  
-  
-          X   X   <                    E  4   ?  
-
-
- 	     4z    
-  
-  
-         n       Ԁ               (  (  <                    E    8  
-
-
- 	  4        
-  
-  
-I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              w       Ԁ              { p  p  <                    E L   8  
-
-
- 	  6        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 {       Ԁ              a{ X   X   <                `    E  4   @  
+ 	          
+  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 jL       Ԁ              L X   X   <                     E  4   @  
 
 
- 	     8ɀz    
-  C  ;         .|       Ԁ              } X   X   <                    E  4   ?  
+ 	         
+  	  	         M       Ԁ              N X   X   <                     E  4   ?  
 
 
- 	     8ɀz    
-  C  ;                Ԁ              ъ (  (  <                    E    8  
-
-
- 	  8        
-  ;  
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ           
\ No newline at end of file
+ 	         
+  	  	      
\ No newline at end of file
diff -Naur ns-3.22/src/aodv/test/udp-chain-test-0-0.pcap ns-3.23/src/aodv/test/udp-chain-test-0-0.pcap
--- ns-3.22/src/aodv/test/udp-chain-test-0-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/udp-chain-test-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,84 +1,84 @@
-ò            i       87  T   T          
+ò            i       .  T   T          	     	      E  0      
+
+      
+    
+          H T   T          
      
       E  0      
 
       
     
-          Hq  T   T          	     	      E  0      
+           T   T          	     	     E  0     
 
       
     
-         H^  T   T          
+         xP T   T          
      
      E  0     
 
       
     
-         Є  T   T          	     	     E  0     
-
-      
-    
-          X   X          	     	      E  4     
+          X   X          	     	      E  4     
 
     (     
 
     
-          H X   X          
+            X   X          
      
       E  4     
 
     (    
 
     
-          n @   @   <           
+           @   @   <           
      
 0            
 
      
-       o       Ԁ              ݒ @   @          
+              Ԁ               @   @          
      
 @            
 
 
-        @   @   <      
+        @   @   <      
      	     	0            	
      
 
-              Ԁ       	        T   T   <      	     
+              Ԁ       	        T   T   <      	     
      
 P     E  0      
 
      
 
     
-                Ԁ       
-        @   @          	     	@            	
+  C              Ԁ       
+        @   @          	     	@            	
 
-        @   @   <      	     
+       j @   @   <      	     
      
 `            
 
      	
-              Ԁ       
-       _ (  (  <      
+       z       Ԁ       
+        (  (  <      
      	     	P     E     @  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 @       Ԁ       	        (  (  <      
-     	     	`     E    @  
-
-
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 p       Ԁ       	        @   @          
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ       	        @   @          
      
 p            
 
 
-       k       Ԁ              C (  (  <           
+       |       Ԁ              T (  (  <           
      
      E     ?  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | (  (  <           
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <      
+     	     	`     E    @  
+
+
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 p       Ԁ       	       6 (  (  <           
      
      E    ?  
 
@@ -146,34 +146,34 @@
      E    ?  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  T   T          	     	     E  0     
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 g T   T          	     	     E  0     
 
       
    
-          T   T          
+          T   T          
      
     E  0     
 
       
     
-         x @   @          	     	            	
+          @   @          	     	            	
 
-       z @   @   <      	     
+        @   @   <      	     
      
             
 
      	
-              Ԁ       
-       D (  (  <      
+              Ԁ       
+        (  (  <      
      	     	     E  	  @  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %       Ԁ       	        @   @          
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 e       Ԁ       	        @   @          
      
 0           
 
 
-              Ԁ               (  (  <           
+              Ԁ              ! (  (  <           
      
 @    E  	  ?  
 
diff -Naur ns-3.22/src/aodv/test/udp-chain-test-9-0.pcap ns-3.23/src/aodv/test/udp-chain-test-9-0.pcap
--- ns-3.22/src/aodv/test/udp-chain-test-9-0.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/udp-chain-test-9-0.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,53 +1,53 @@
-ò            i       Y  T   T                     E  0      
+ò            i         T   T                     E  0      
 
 
       
 
     
 
-           T   T                     E  0      
+            T   T                     E  0      
 	
       
 	    
-	         :  T   T                    E  0     
+	         (  T   T                    E  0     
 
 
       
 
     
 
-         @ T   T                    E  0     
+         H  T   T                    E  0     
 	
       
 	    
-	         Ӥ @   @                            
-	
-              Ԁ               T   T   <                0     E  0      
-	
-   @ 
-
-    
-         s @   @               @            
+	         f @   @                            
 	
 
-        @   @   <                             
+       f @   @   <                             
 
      
-	       B       Ԁ               T   T   <                P     E  0      
+	       fg       Ԁ              jh T   T   <                0     E  0      
 	
 
      
    
 
-  _              Ԁ               @   @   <                `            
+  _       zh       Ԁ              v @   @               @            
+	
+       v       Ԁ              w T   T   <                P     E  0      
+	
+   @ 
+
+    
+  C        @   @   <                `            
 	     
-              Ԁ                     Ԁ              Ë (  (  <                p     E     8  
+       *       Ԁ              W       Ԁ              v] (  (  <                p     E     8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Ӌ       Ԁ              q       Ԁ              7 (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ]       Ԁ                      Ԁ              G (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 G       Ԁ                     Ԁ               (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 W       Ԁ                     Ԁ               (  (  <                     E    8  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                     E    8  
@@ -65,36 +65,37 @@
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              /        Ԁ              5  (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 5        Ԁ              6  T   T               0     E  0     
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 5        Ԁ              @  T   T               0     E  0     
 
 
       
 
     
 
-          T   T                    E  0     
+           T   T                    E  0     
 	
       
 	    
 	         9       Ԁ               (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              g> @   @   <                           
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              w @   @   <                           
 	     
-       D       Ԁ              T @   @                           
+              Ԁ              < @   @                           
 	
 
-       T @   @   <                @            
+       ^ @   @   <                @            
 
      
-	       uU       Ԁ              q[ (  (  <                0    E  	  8  
+	       
+       Ԁ               (  (  <                0    E  	  8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 [       Ԁ              3       Ԁ              9 (  (  <                @    E  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                @    E  
   8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 9       Ԁ                     Ԁ               (  (  <                P    E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                P    E    8  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              Y	       Ԁ              	 (  (  <                `    E    8  
diff -Naur ns-3.22/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.23/src/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/applications/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -1721,11 +1721,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/applications/bindings/modulegen__gcc_LP64.py ns-3.23/src/applications/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/applications/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -1721,11 +1721,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/applications/model/application-packet-probe.cc ns-3.23/src/applications/model/application-packet-probe.cc
--- ns-3.22/src/applications/model/application-packet-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/application-packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::ApplicationPacketProbe")
     .SetParent<Probe> ()
+    .SetGroupName("Applications")
     .AddConstructor<ApplicationPacketProbe> ()
     .AddTraceSource ( "Output",
                       "The packet plus its socket address that serve "
diff -Naur ns-3.22/src/applications/model/bulk-send-application.cc ns-3.23/src/applications/model/bulk-send-application.cc
--- ns-3.22/src/applications/model/bulk-send-application.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/bulk-send-application.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::BulkSendApplication")
     .SetParent<Application> ()
+    .SetGroupName("Applications") 
     .AddConstructor<BulkSendApplication> ()
     .AddAttribute ("SendSize", "The amount of data to send each time.",
                    UintegerValue (512),
@@ -224,7 +225,7 @@
 
   if (m_connected)
     { // Only send new data if the connection has completed
-      Simulator::ScheduleNow (&BulkSendApplication::SendData, this);
+      SendData ();
     }
 }
 
diff -Naur ns-3.22/src/applications/model/onoff-application.cc ns-3.23/src/applications/model/onoff-application.cc
--- ns-3.22/src/applications/model/onoff-application.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/onoff-application.cc	2015-05-13 11:05:27.000000000 -0700
@@ -53,6 +53,7 @@
 {
   static TypeId tid = TypeId ("ns3::OnOffApplication")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<OnOffApplication> ()
     .AddAttribute ("DataRate", "The data rate in on state.",
                    DataRateValue (DataRate ("500kb/s")),
diff -Naur ns-3.22/src/applications/model/packet-sink.cc ns-3.23/src/applications/model/packet-sink.cc
--- ns-3.22/src/applications/model/packet-sink.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/packet-sink.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketSink")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<PacketSink> ()
     .AddAttribute ("Local",
                    "The Address on which to Bind the rx socket.",
diff -Naur ns-3.22/src/applications/model/ping6.cc ns-3.23/src/applications/model/ping6.cc
--- ns-3.22/src/applications/model/ping6.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/ping6.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,6 +46,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ping6")
     .SetParent<Application>()
+    .SetGroupName("Applications")
     .AddConstructor<Ping6>()
     .AddAttribute ("MaxPackets", 
                    "The maximum number of packets the application will send",
diff -Naur ns-3.22/src/applications/model/radvd.cc ns-3.23/src/applications/model/radvd.cc
--- ns-3.22/src/applications/model/radvd.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/radvd.cc	2015-05-13 11:05:27.000000000 -0700
@@ -52,6 +52,7 @@
 {
   static TypeId tid = TypeId ("ns3::Radvd")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<Radvd> ()
     .AddAttribute ("AdvertisementJitter",
                    "Uniform variable to provide jitter between min and max values of AdvInterval",
diff -Naur ns-3.22/src/applications/model/seq-ts-header.cc ns-3.23/src/applications/model/seq-ts-header.cc
--- ns-3.22/src/applications/model/seq-ts-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/seq-ts-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -62,6 +62,7 @@
 {
   static TypeId tid = TypeId ("ns3::SeqTsHeader")
     .SetParent<Header> ()
+    .SetGroupName("Applications")
     .AddConstructor<SeqTsHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/applications/model/udp-client.cc ns-3.23/src/applications/model/udp-client.cc
--- ns-3.22/src/applications/model/udp-client.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/udp-client.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpClient")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<UdpClient> ()
     .AddAttribute ("MaxPackets",
                    "The maximum number of packets the application will send",
diff -Naur ns-3.22/src/applications/model/udp-echo-client.cc ns-3.23/src/applications/model/udp-echo-client.cc
--- ns-3.22/src/applications/model/udp-echo-client.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/udp-echo-client.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpEchoClient")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<UdpEchoClient> ()
     .AddAttribute ("MaxPackets", 
                    "The maximum number of packets the application will send",
diff -Naur ns-3.22/src/applications/model/udp-echo-server.cc ns-3.23/src/applications/model/udp-echo-server.cc
--- ns-3.22/src/applications/model/udp-echo-server.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/udp-echo-server.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpEchoServer")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<UdpEchoServer> ()
     .AddAttribute ("Port", "Port on which we listen for incoming packets.",
                    UintegerValue (9),
diff -Naur ns-3.22/src/applications/model/udp-server.cc ns-3.23/src/applications/model/udp-server.cc
--- ns-3.22/src/applications/model/udp-server.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/udp-server.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,6 +46,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpServer")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<UdpServer> ()
     .AddAttribute ("Port",
                    "Port on which we listen for incoming packets.",
diff -Naur ns-3.22/src/applications/model/udp-trace-client.cc ns-3.23/src/applications/model/udp-trace-client.cc
--- ns-3.22/src/applications/model/udp-trace-client.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/udp-trace-client.cc	2015-05-13 11:05:27.000000000 -0700
@@ -62,6 +62,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpTraceClient")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<UdpTraceClient> ()
     .AddAttribute ("RemoteAddress",
                    "The destination Address of the outbound packets",
diff -Naur ns-3.22/src/applications/model/v4ping.cc ns-3.23/src/applications/model/v4ping.cc
--- ns-3.22/src/applications/model/v4ping.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/applications/model/v4ping.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::V4Ping")
     .SetParent<Application> ()
+    .SetGroupName("Applications")
     .AddConstructor<V4Ping> ()
     .AddAttribute ("Remote", 
                    "The address of the machine we want to ping.",
diff -Naur ns-3.22/src/bridge/model/bridge-channel.cc ns-3.23/src/bridge/model/bridge-channel.cc
--- ns-3.22/src/bridge/model/bridge-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/bridge/model/bridge-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::BridgeChannel")
     .SetParent<Channel> ()
+    .SetGroupName("Bridge")
     .AddConstructor<BridgeChannel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/bridge/model/bridge-net-device.cc ns-3.23/src/bridge/model/bridge-net-device.cc
--- ns-3.22/src/bridge/model/bridge-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/bridge/model/bridge-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,7 @@
 {
   static TypeId tid = TypeId ("ns3::BridgeNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName("Bridge")
     .AddConstructor<BridgeNetDevice> ()
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (1500),
@@ -398,11 +399,13 @@
 
   // data was not unicast or no state has been learned for that mac
   // address => flood through all ports.
+  Ptr<Packet> pktCopy;
   for (std::vector< Ptr<NetDevice> >::iterator iter = m_ports.begin ();
        iter != m_ports.end (); iter++)
     {
+      pktCopy = packet->Copy ();
       Ptr<NetDevice> port = *iter;
-      port->SendFrom (packet, src, dest, protocolNumber);
+      port->SendFrom (pktCopy, src, dest, protocolNumber);
     }
 
   return true;
diff -Naur ns-3.22/src/buildings/helper/building-allocator.cc ns-3.23/src/buildings/helper/building-allocator.cc
--- ns-3.22/src/buildings/helper/building-allocator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/helper/building-allocator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,6 +51,7 @@
   static TypeId tid = TypeId ("ns3::GridBuildingAllocator")
     .SetParent<Object> ()
     .AddConstructor<GridBuildingAllocator> ()
+    .SetGroupName ("Buildings")
     .AddAttribute ("GridWidth", "The number of objects layed out on a line.",
                    UintegerValue (10),
                    MakeUintegerAccessor (&GridBuildingAllocator::m_n),
diff -Naur ns-3.22/src/buildings/helper/building-position-allocator.cc ns-3.23/src/buildings/helper/building-position-allocator.cc
--- ns-3.22/src/buildings/helper/building-position-allocator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/helper/building-position-allocator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -50,7 +50,7 @@
 {
   static TypeId tid = TypeId ("ns3::RandomBuildingPositionAllocator")
     .SetParent<PositionAllocator> ()
-    .SetGroupName ("Mobility")
+    .SetGroupName ("Buildings")
     .AddConstructor<RandomBuildingPositionAllocator> ()
     .AddAttribute ("WithReplacement",
                    "If true, the building will be randomly selected with replacement. "
@@ -117,7 +117,7 @@
 {
   static TypeId tid = TypeId ("ns3::RandomRoomPositionAllocator")
     .SetParent<PositionAllocator> ()
-    .SetGroupName ("Mobility")
+    .SetGroupName ("Buildings")
     .AddConstructor<RandomRoomPositionAllocator> ();
   return tid;
 }
@@ -221,7 +221,7 @@
 {
   static TypeId tid = TypeId ("ns3::SameRoomPositionAllocator")
     .SetParent<PositionAllocator> ()
-    .SetGroupName ("Mobility")
+    .SetGroupName ("Buildings")
     .AddConstructor<SameRoomPositionAllocator> ();
   return tid;
 }
@@ -303,7 +303,7 @@
 {
   static TypeId tid = TypeId ("ns3::FixedRoomPositionAllocator")
     .SetParent<PositionAllocator> ()
-    .SetGroupName ("Mobility")
+    .SetGroupName ("Buildings")
     .AddConstructor<SameRoomPositionAllocator> ();
   return tid;
 }
diff -Naur ns-3.22/src/buildings/model/building.cc ns-3.23/src/buildings/model/building.cc
--- ns-3.22/src/buildings/model/building.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/building.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
   static TypeId tid = TypeId ("ns3::Building")
     .SetParent<Object> ()
     .AddConstructor<Building> ()
+    .SetGroupName ("Buildings")
     .AddAttribute ("NRoomsX", "The number of rooms in the X axis.",
                    UintegerValue (1),
                    MakeUintegerAccessor (&Building::GetNRoomsX, &Building::SetNRoomsX),
diff -Naur ns-3.22/src/buildings/model/building-list.cc ns-3.23/src/buildings/model/building-list.cc
--- ns-3.22/src/buildings/model/building-list.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/building-list.cc	2015-05-13 11:05:27.000000000 -0700
@@ -64,6 +64,7 @@
 {
   static TypeId tid = TypeId ("ns3::BuildingListPriv")
     .SetParent<Object> ()
+    .SetGroupName ("Buildings")
     .AddAttribute ("BuildingList", "The list of all buildings created during the simulation.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&BuildingListPriv::m_buildings),
diff -Naur ns-3.22/src/buildings/model/buildings-propagation-loss-model.cc ns-3.23/src/buildings/model/buildings-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/buildings-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/buildings-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -65,6 +65,7 @@
   static TypeId tid = TypeId ("ns3::BuildingsPropagationLossModel")
 
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Buildings")
 
 
     .AddAttribute ("ShadowSigmaOutdoor",
diff -Naur ns-3.22/src/buildings/model/hybrid-buildings-propagation-loss-model.cc ns-3.23/src/buildings/model/hybrid-buildings-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/hybrid-buildings-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/hybrid-buildings-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -66,6 +66,7 @@
     .SetParent<BuildingsPropagationLossModel> ()
     
     .AddConstructor<HybridBuildingsPropagationLossModel> ()
+    .SetGroupName ("Buildings")
     
     .AddAttribute ("Frequency",
                    "The Frequency  (default is 2.106 GHz).",
diff -Naur ns-3.22/src/buildings/model/itu-r-1238-propagation-loss-model.cc ns-3.23/src/buildings/model/itu-r-1238-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/itu-r-1238-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/itu-r-1238-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
   static TypeId tid = TypeId ("ns3::ItuR1238PropagationLossModel")
 
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Buildings")
 
     .AddAttribute ("Frequency",
                    "The Frequency  (default is 2.106 GHz).",
diff -Naur ns-3.22/src/buildings/model/mobility-building-info.cc ns-3.23/src/buildings/model/mobility-building-info.cc
--- ns-3.22/src/buildings/model/mobility-building-info.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/mobility-building-info.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,7 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::MobilityBuildingInfo")
     .SetParent<Object> ()
-    .SetGroupName ("Building")
+    .SetGroupName ("Buildings")
     .AddConstructor<MobilityBuildingInfo> ();
 
   return tid;
diff -Naur ns-3.22/src/buildings/model/oh-buildings-propagation-loss-model.cc ns-3.23/src/buildings/model/oh-buildings-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/oh-buildings-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/oh-buildings-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -54,6 +54,7 @@
   static TypeId tid = TypeId ("ns3::OhBuildingsPropagationLossModel")
   
   .SetParent<BuildingsPropagationLossModel> ()
+  .SetGroupName ("Buildings")
   
   .AddConstructor<OhBuildingsPropagationLossModel> ();
   
diff -Naur ns-3.22/src/click/model/ipv4-click-routing.cc ns-3.23/src/click/model/ipv4-click-routing.cc
--- ns-3.22/src/click/model/ipv4-click-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/click/model/ipv4-click-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -55,6 +55,7 @@
   static TypeId tid = TypeId ("ns3::Ipv4ClickRouting")
     .SetParent<Ipv4RoutingProtocol> ()
     .AddConstructor<Ipv4ClickRouting> ()
+    .SetGroupName ("Click")
   ;
 
   return tid;
diff -Naur ns-3.22/src/click/model/ipv4-l3-click-protocol.cc ns-3.23/src/click/model/ipv4-l3-click-protocol.cc
--- ns-3.22/src/click/model/ipv4-l3-click-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/click/model/ipv4-l3-click-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -52,6 +52,7 @@
   static TypeId tid = TypeId ("ns3::Ipv4L3ClickProtocol")
     .SetParent<Ipv4> ()
     .AddConstructor<Ipv4L3ClickProtocol> ()
+    .SetGroupName ("Click")
     .AddAttribute ("DefaultTtl", "The TTL value set by default on all outgoing packets generated on this node.",
                    UintegerValue (64),
                    MakeUintegerAccessor (&Ipv4L3ClickProtocol::m_defaultTtl),
diff -Naur ns-3.22/src/config-store/model/config-store.cc ns-3.23/src/config-store/model/config-store.cc
--- ns-3.22/src/config-store/model/config-store.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/config-store/model/config-store.cc	2015-05-13 11:05:27.000000000 -0700
@@ -29,6 +29,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConfigStore")
     .SetParent<ObjectBase> ()
+    .SetGroupName ("ConfigStore")
     .AddAttribute ("Mode", 
                    "Configuration mode",
                    EnumValue (ConfigStore::NONE),
diff -Naur ns-3.22/src/core/bindings/modulegen__gcc_ILP32.py ns-3.23/src/core/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/core/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -3926,10 +3926,10 @@
     cls.add_constructor([param('ns3::RealtimeSimulatorImpl const &', 'arg0')])
     ## realtime-simulator-impl.h (module 'core'): ns3::RealtimeSimulatorImpl::RealtimeSimulatorImpl() [constructor]
     cls.add_constructor([])
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Cancel(ns3::EventId const & id) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Cancel(ns3::EventId const & ev) [member function]
     cls.add_method('Cancel', 
                    'void', 
-                   [param('ns3::EventId const &', 'id')], 
+                   [param('ns3::EventId const &', 'ev')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Destroy() [member function]
     cls.add_method('Destroy', 
@@ -3971,10 +3971,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorImpl::IsExpired(ns3::EventId const & id) const [member function]
+    ## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorImpl::IsExpired(ns3::EventId const & ev) const [member function]
     cls.add_method('IsExpired', 
                    'bool', 
-                   [param('ns3::EventId const &', 'id')], 
+                   [param('ns3::EventId const &', 'ev')], 
                    is_const=True, is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorImpl::IsFinished() const [member function]
     cls.add_method('IsFinished', 
@@ -3991,10 +3991,10 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Remove(ns3::EventId const & id) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Remove(ns3::EventId const & ev) [member function]
     cls.add_method('Remove', 
                    'void', 
-                   [param('ns3::EventId const &', 'id')], 
+                   [param('ns3::EventId const &', 'ev')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Run() [member function]
     cls.add_method('Run', 
diff -Naur ns-3.22/src/core/bindings/modulegen__gcc_LP64.py ns-3.23/src/core/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/core/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -3926,10 +3926,10 @@
     cls.add_constructor([param('ns3::RealtimeSimulatorImpl const &', 'arg0')])
     ## realtime-simulator-impl.h (module 'core'): ns3::RealtimeSimulatorImpl::RealtimeSimulatorImpl() [constructor]
     cls.add_constructor([])
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Cancel(ns3::EventId const & id) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Cancel(ns3::EventId const & ev) [member function]
     cls.add_method('Cancel', 
                    'void', 
-                   [param('ns3::EventId const &', 'id')], 
+                   [param('ns3::EventId const &', 'ev')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Destroy() [member function]
     cls.add_method('Destroy', 
@@ -3971,10 +3971,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorImpl::IsExpired(ns3::EventId const & id) const [member function]
+    ## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorImpl::IsExpired(ns3::EventId const & ev) const [member function]
     cls.add_method('IsExpired', 
                    'bool', 
-                   [param('ns3::EventId const &', 'id')], 
+                   [param('ns3::EventId const &', 'ev')], 
                    is_const=True, is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorImpl::IsFinished() const [member function]
     cls.add_method('IsFinished', 
@@ -3991,10 +3991,10 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Remove(ns3::EventId const & id) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Remove(ns3::EventId const & ev) [member function]
     cls.add_method('Remove', 
                    'void', 
-                   [param('ns3::EventId const &', 'id')], 
+                   [param('ns3::EventId const &', 'ev')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Run() [member function]
     cls.add_method('Run', 
diff -Naur ns-3.22/src/core/model/assert.h ns-3.23/src/core/model/assert.h
--- ns-3.22/src/core/model/assert.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/assert.h	2015-05-13 11:05:27.000000000 -0700
@@ -22,6 +22,12 @@
 #define NS_ASSERT_H
 
 /**
+ * \file
+ * \ingroup assert
+ * Definition of assertion macros NS_ASSERT() and NS_ASSERT_MSG().
+ */
+
+/**
  * \ingroup debugging
  * \defgroup assert Assertions
  *
diff -Naur ns-3.22/src/core/model/breakpoint.cc ns-3.23/src/core/model/breakpoint.cc
--- ns-3.22/src/core/model/breakpoint.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/breakpoint.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,12 @@
 
 namespace ns3 {
 
+/**
+ * \file
+ * \ingroup breakpoint
+ * ns3::BreakpointFallback function implementation.
+ */
+
 NS_LOG_COMPONENT_DEFINE ("Breakpoint");
 
 #if defined (HAVE_SIGNAL_H) && defined (SIGTRAP)
diff -Naur ns-3.22/src/core/model/breakpoint.h ns-3.23/src/core/model/breakpoint.h
--- ns-3.22/src/core/model/breakpoint.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/breakpoint.h	2015-05-13 11:05:27.000000000 -0700
@@ -21,6 +21,13 @@
 #ifndef BREAKPOINT_H
 #define BREAKPOINT_H
 
+/**
+ * \file
+ * \ingroup breakpoint
+ * Definition of NS_BREAKPOINT() macro and ns3::BreakpointFallback
+ * function declaration.
+ */
+
 namespace ns3 {
 
 /* Hacker macro to place breakpoints for selected machines.
diff -Naur ns-3.22/src/core/model/cairo-wideint.c ns-3.23/src/core/model/cairo-wideint.c
--- ns-3.22/src/core/model/cairo-wideint.c	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/cairo-wideint.c	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
 
 #include "cairo-wideint-private.h"
 
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the cairo_x functions which implement high precision arithmetic.
+ */
+
 #if HAVE_UINT64_T
 
 const char * cairo_impl64 = "uint64_t";
diff -Naur ns-3.22/src/core/model/cairo-wideint-private.h ns-3.23/src/core/model/cairo-wideint-private.h
--- ns-3.22/src/core/model/cairo-wideint-private.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/cairo-wideint-private.h	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,12 @@
 #ifndef CAIRO_WIDEINT_H
 #define CAIRO_WIDEINT_H
 
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the cairo_x functions which implement high precision arithmetic.
+ */
+
 // Adapt to ns-3 environment
 #include "ns3/core-config.h"
 #define cairo_private 
diff -Naur ns-3.22/src/core/model/calendar-scheduler.cc ns-3.23/src/core/model/calendar-scheduler.cc
--- ns-3.22/src/core/model/calendar-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/calendar-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -26,6 +26,12 @@
 #include "assert.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Implementation of ns3::CalendarScheduler class.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("CalendarScheduler");
@@ -37,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::CalendarScheduler")
     .SetParent<Scheduler> ()
+    .SetGroupName ("Core")
     .AddConstructor<CalendarScheduler> ()
   ;
   return tid;
diff -Naur ns-3.22/src/core/model/calendar-scheduler.h ns-3.23/src/core/model/calendar-scheduler.h
--- ns-3.22/src/core/model/calendar-scheduler.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/calendar-scheduler.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include <stdint.h>
 #include <list>
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::CalendarScheduler class.
+ */
+
 namespace ns3 {
 
 class EventImpl;
diff -Naur ns-3.22/src/core/model/callback.h ns-3.23/src/core/model/callback.h
--- ns-3.22/src/core/model/callback.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/callback.h	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
 #include "simple-ref-count.h"
 #include <typeinfo>
 
+/**
+ * \file
+ * \ingroup callback
+ * Declaration of the various callback functions.
+ */
+
 namespace ns3 {
 
 // Define the doxygen subgroups all at once,
diff -Naur ns-3.22/src/core/model/config.cc ns-3.23/src/core/model/config.cc
--- ns-3.22/src/core/model/config.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/config.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,12 @@
 
 #include <sstream>
 
+/**
+ * \file
+ * \ingroup config
+ * Imlementation of the various ns3::Config functions and classes.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("Config");
diff -Naur ns-3.22/src/core/model/config.h ns-3.23/src/core/model/config.h
--- ns-3.22/src/core/model/config.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/config.h	2015-05-13 11:05:27.000000000 -0700
@@ -24,6 +24,12 @@
 #include <string>
 #include <vector>
 
+/**
+ * \file
+ * \ingroup config
+ * Declaration of the various ns3::Config functions and classes.
+ */
+
 namespace ns3 {
 
 class AttributeValue;
@@ -31,18 +37,26 @@
 class CallbackBase;
 
 /**
- * \brief Configuration of simulation parameters and tracing
  * \ingroup core
+ * \defgroup config Configuration
+ * \brief Configuration of simulation parameters and tracing.
+ */
+
+/**
+ * \ingroup config
+ * Namespace for the various functions implementing the Config system.
  */
 namespace Config {
 
 /**
+ * \ingroup config
  * Reset the initial value of every attribute as well as the value of every
  * global to what they were before any call to SetDefault and SetGlobal.
  */
 void Reset (void);
 
 /**
+ * \ingroup config
  * \param path a path to match attributes.
  * \param value the value to set in all matching attributes.
  *
@@ -52,6 +66,7 @@
  */
 void Set (std::string path, const AttributeValue &value);
 /**
+ * \ingroup config
  * \param name the full name of the attribute
  * \param value the value to set.
  *
@@ -61,6 +76,7 @@
  */
 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.
@@ -70,6 +86,7 @@
  */
 bool SetDefaultFailSafe (std::string name, const AttributeValue &value);
 /**
+ * \ingroup config
  * \param name the name of the requested GlobalValue.
  * \param value the value to set
  *
@@ -77,6 +94,7 @@
  */
 void SetGlobal (std::string name, const AttributeValue &value);
 /**
+ * \ingroup config
  * \param name the name of the requested GlobalValue.
  * \param value the value to set
  *
@@ -84,6 +102,7 @@
  */
 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.
  *
@@ -93,6 +112,7 @@
  */
 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.
  *
@@ -100,6 +120,7 @@
  */
 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.
  *
@@ -110,6 +131,7 @@
  */
 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.
  *
@@ -118,6 +140,7 @@
 void Disconnect (std::string path, const CallbackBase &cb);
 
 /**
+ * \ingroup config
  * \brief hold a set of objects which match a specific search string.
  *
  * This class also allows you to perform a set of configuration operations
@@ -216,6 +239,7 @@
 };
 
 /**
+ * \ingroup config
  * \param path the path to perform a match against
  * \returns a container which contains all the objects which match the input
  *          path.
@@ -223,6 +247,7 @@
 MatchContainer LookupMatches (std::string path);
 
 /**
+ * \ingroup config
  * \param obj a new root object
  *
  * Each root object is used during path matching as
@@ -230,6 +255,7 @@
  */
 void RegisterRootNamespaceObject (Ptr<Object> obj);
 /**
+ * \ingroup config
  * \param obj a new root object
  *
  * This function undoes the work of Config::RegisterRootNamespaceObject.
@@ -237,11 +263,13 @@
 void UnregisterRootNamespaceObject (Ptr<Object> obj);
 
 /**
+ * \ingroup config
  * \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
  */
diff -Naur ns-3.22/src/core/model/default-simulator-impl.cc ns-3.23/src/core/model/default-simulator-impl.cc
--- ns-3.22/src/core/model/default-simulator-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/default-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,12 @@
 #include <cmath>
 
 
+/**
+ * \file
+ * \ingroup simulator
+ * Implementation of class ns3::DefaultSimulatorImpl.
+ */
+
 namespace ns3 {
 
 // Note:  Logging in this file is largely avoided due to the
@@ -45,6 +51,7 @@
 {
   static TypeId tid = TypeId ("ns3::DefaultSimulatorImpl")
     .SetParent<SimulatorImpl> ()
+    .SetGroupName ("Core")
     .AddConstructor<DefaultSimulatorImpl> ()
   ;
   return tid;
diff -Naur ns-3.22/src/core/model/default-simulator-impl.h ns-3.23/src/core/model/default-simulator-impl.h
--- ns-3.22/src/core/model/default-simulator-impl.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/default-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,12 @@
 
 #include <list>
 
+/**
+ * \file
+ * \ingroup simulator
+ * Declaration of class ns3::DefaultSimulatorImpl.
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/deprecated.h ns-3.23/src/core/model/deprecated.h
--- ns-3.22/src/core/model/deprecated.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/deprecated.h	2015-05-13 11:05:27.000000000 -0700
@@ -1,6 +1,22 @@
 #ifndef NS3_DEPRECATED_H
 #define NS3_DEPRECATED_H
 
+/**
+ * \file
+ * \ingroup core
+ * Definition of the NS_DEPRECATED macro.
+ */
+
+/**
+ * \ingroup core
+ * \def NS_DEPRECATED
+ * Mark a function as deprecated.
+ *
+ * Users should expect deprecated features to be removed eventually.
+ *
+ * When deprecating a feature, please update the documentation
+ * with information for users on how to update their code.
+ */
 #if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ > 1)
 #define NS_DEPRECATED __attribute__ ((deprecated))
 #else
diff -Naur ns-3.22/src/core/model/empty.h ns-3.23/src/core/model/empty.h
--- ns-3.22/src/core/model/empty.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/empty.h	2015-05-13 11:05:27.000000000 -0700
@@ -20,6 +20,12 @@
 #ifndef EMPTY_H
 #define EMPTY_H
 
+/**
+ * \file
+ * \ingroup callback
+ * Definition of class ns3::empty, used by callbacks.
+ */
+
 namespace ns3 {
 /**
  * \brief make Callback use a separate empty type
diff -Naur ns-3.22/src/core/model/global-value.cc ns-3.23/src/core/model/global-value.cc
--- ns-3.22/src/core/model/global-value.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/global-value.cc	2015-05-13 11:05:27.000000000 -0700
@@ -29,6 +29,12 @@
 #include <cstdlib>
 #endif
 
+/**
+ * \file
+ * \ingroup core
+ * ns3::GlobalValue implementation.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("GlobalValue");
diff -Naur ns-3.22/src/core/model/global-value.h ns-3.23/src/core/model/global-value.h
--- ns-3.22/src/core/model/global-value.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/global-value.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include "ptr.h"
 #include "attribute.h"
 
+/**
+ * \file
+ * \ingroup core
+ * ns3::GlobalValue declaration.
+ */
+
 class GlobalValueTestCase;
 
 namespace ns3 {
diff -Naur ns-3.22/src/core/model/heap-scheduler.cc ns-3.23/src/core/model/heap-scheduler.cc
--- ns-3.22/src/core/model/heap-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/heap-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include "assert.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Implementation of ns3::HeapScheduler class.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("HeapScheduler");
@@ -36,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::HeapScheduler")
     .SetParent<Scheduler> ()
+    .SetGroupName ("Core")
     .AddConstructor<HeapScheduler> ()
   ;
   return tid;
diff -Naur ns-3.22/src/core/model/heap-scheduler.h ns-3.23/src/core/model/heap-scheduler.h
--- ns-3.22/src/core/model/heap-scheduler.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/heap-scheduler.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include <stdint.h>
 #include <vector>
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::HeapScheduler class.
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/int64x64-128.cc ns-3.23/src/core/model/int64x64-128.cc
--- ns-3.22/src/core/model/int64x64-128.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64-128.cc	2015-05-13 11:05:27.000000000 -0700
@@ -22,6 +22,12 @@
 #include "assert.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the ns3::int64x64_t type using a native int128_t type..
+ */
+
 namespace ns3 {
 
 // Note:  Logging in this file is largely avoided due to the
diff -Naur ns-3.22/src/core/model/int64x64-128.h ns-3.23/src/core/model/int64x64-128.h
--- ns-3.22/src/core/model/int64x64-128.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64-128.h	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
 typedef __int128_t int128_t;
 #endif
 
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the ns3::int64x64_t type using a native int128_t type..
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/int64x64-cairo.cc ns-3.23/src/core/model/int64x64-cairo.cc
--- ns-3.22/src/core/model/int64x64-cairo.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64-cairo.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
 #include "cairo-wideint.c"
 }
 
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the ns3::int64x64_t type using the Cairo implementation.
+ */
+
 namespace ns3 {
 
 // Note:  Logging in this file is largely avoided due to the
diff -Naur ns-3.22/src/core/model/int64x64-cairo.h ns-3.23/src/core/model/int64x64-cairo.h
--- ns-3.22/src/core/model/int64x64-cairo.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64-cairo.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,11 @@
 
 #include "cairo-wideint-private.h"
 
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the ns3::int64x64_t type using the Cairo implementation.
+ */
 
 namespace ns3 {
 
diff -Naur ns-3.22/src/core/model/int64x64.cc ns-3.23/src/core/model/int64x64.cc
--- ns-3.22/src/core/model/int64x64.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64.cc	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include "assert.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the streaming input and output operators for
+ * the ns3::int64x64_t type.
+ */
 
 namespace ns3 {
 
diff -Naur ns-3.22/src/core/model/int64x64-double.h ns-3.23/src/core/model/int64x64-double.h
--- ns-3.22/src/core/model/int64x64-double.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64-double.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include <cmath>  // pow
 #include <utility>  // pair
 
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration and implementation of the ns3::int64x64_t type
+ * using the double type.
+ */
 
 namespace ns3 {
 
diff -Naur ns-3.22/src/core/model/int64x64.h ns-3.23/src/core/model/int64x64.h
--- ns-3.22/src/core/model/int64x64.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64.h	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,12 @@
 
 #include <iostream>
 
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the ns3::int64x64_t type and associated operators.
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/list-scheduler.cc ns-3.23/src/core/model/list-scheduler.cc
--- ns-3.22/src/core/model/list-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/list-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include <string>
 #include "assert.h"
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Implementation of ns3::ListScheduler class.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("ListScheduler");
@@ -36,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::ListScheduler")
     .SetParent<Scheduler> ()
+    .SetGroupName ("Core")
     .AddConstructor<ListScheduler> ()
   ;
   return tid;
diff -Naur ns-3.22/src/core/model/list-scheduler.h ns-3.23/src/core/model/list-scheduler.h
--- ns-3.22/src/core/model/list-scheduler.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/list-scheduler.h	2015-05-13 11:05:27.000000000 -0700
@@ -26,6 +26,12 @@
 #include <utility>
 #include <stdint.h>
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::ListScheduler class.
+ */
+
 namespace ns3 {
 
 class EventImpl;
diff -Naur ns-3.22/src/core/model/log-macros-disabled.h ns-3.23/src/core/model/log-macros-disabled.h
--- ns-3.22/src/core/model/log-macros-disabled.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/log-macros-disabled.h	2015-05-13 11:05:27.000000000 -0700
@@ -18,11 +18,22 @@
  * Author: Andrey Mazo <ahippo@yandex.com>
  */
 
+/**
+ * \file
+ * \ingroup logging
+ * Definition of empty logging macros and the NS_LOG_NOOP_INTERNAL macro.
+ */
+
+
 #ifndef NS3_LOG_MACROS_DISABLED_H
 #define NS3_LOG_MACROS_DISABLED_H
 
 #ifndef NS3_LOG_ENABLE
 
+/**
+ * \ingroup logging
+ * Empty logging macro implementation, used when logging is disabled.
+ */
 #define NS_LOG_NOOP_INTERNAL(msg)           \
   do                                        \
     {                                       \
diff -Naur ns-3.22/src/core/model/log-macros-enabled.h ns-3.23/src/core/model/log-macros-enabled.h
--- ns-3.22/src/core/model/log-macros-enabled.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/log-macros-enabled.h	2015-05-13 11:05:27.000000000 -0700
@@ -21,6 +21,12 @@
 #ifndef NS3_LOG_MACROS_ENABLED_H
 #define NS3_LOG_MACROS_ENABLED_H
 
+/**
+ * \file
+ * \ingroup logging
+ * Definition of logging macros.
+ */
+
 #ifdef NS3_LOG_ENABLE
 
 
diff -Naur ns-3.22/src/core/model/map-scheduler.cc ns-3.23/src/core/model/map-scheduler.cc
--- ns-3.22/src/core/model/map-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/map-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 #include "log.h"
 #include <string>
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Implementation of ns3::MapScheduler class.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("MapScheduler");
@@ -36,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::MapScheduler")
     .SetParent<Scheduler> ()
+    .SetGroupName ("Core")
     .AddConstructor<MapScheduler> ()
   ;
   return tid;
diff -Naur ns-3.22/src/core/model/map-scheduler.h ns-3.23/src/core/model/map-scheduler.h
--- ns-3.22/src/core/model/map-scheduler.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/map-scheduler.h	2015-05-13 11:05:27.000000000 -0700
@@ -26,6 +26,12 @@
 #include <map>
 #include <utility>
 
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::MapScheduler class.
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/math.h ns-3.23/src/core/model/math.h
--- ns-3.22/src/core/model/math.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/math.h	2015-05-13 11:05:27.000000000 -0700
@@ -24,6 +24,12 @@
 #ifndef MATH_H
 #define MATH_H
 
+/**
+ * \file
+ * \ingroup core
+ * Custom version of log2() to deal with \bugid{1467}.
+ */
+
 #include <cmath>
 
 #ifdef __FreeBSD__
diff -Naur ns-3.22/src/core/model/names.cc ns-3.23/src/core/model/names.cc
--- ns-3.22/src/core/model/names.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/names.cc	2015-05-13 11:05:27.000000000 -0700
@@ -23,6 +23,13 @@
 #include "abort.h"
 #include "names.h"
 
+/**
+ * \file
+ * \ingroup config
+ * Implementation of class ns3::Names, and declaration of classes
+ * ns3::NamesNode and ns3::NamePriv.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("Names");
diff -Naur ns-3.22/src/core/model/names.h ns-3.23/src/core/model/names.h
--- ns-3.22/src/core/model/names.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/names.h	2015-05-13 11:05:27.000000000 -0700
@@ -22,6 +22,12 @@
 #include "ptr.h"
 #include "object.h"
 
+/**
+ * \file
+ * \ingroup config
+ * Declaration of class ns3::Names.
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/nstime.h ns-3.23/src/core/model/nstime.h
--- ns-3.22/src/core/model/nstime.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/nstime.h	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,13 @@
 #include <ostream>
 #include <set>
 
+/**
+ * \file
+ * \ingroup time
+ * Declaration of classes ns3::Time and ns3::TimeWithUnit,
+ * and the TimeValue implementation classes.
+ */
+
 namespace ns3 {
 
 class TimeWithUnit;
diff -Naur ns-3.22/src/core/model/object.cc ns-3.23/src/core/model/object.cc
--- ns-3.22/src/core/model/object.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/object.cc	2015-05-13 11:05:27.000000000 -0700
@@ -87,6 +87,7 @@
 {
   static TypeId tid = TypeId ("ns3::Object")
     .SetParent<ObjectBase> ()
+    .SetGroupName ("Core")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/core/model/object-factory.cc ns-3.23/src/core/model/object-factory.cc
--- ns-3.22/src/core/model/object-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/object-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -21,6 +21,12 @@
 #include "log.h"
 #include <sstream>
 
+/**
+ * \file
+ * \ingroup object
+ * ns3::ObjectFactory class implementation.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE("ObjectFactory");
diff -Naur ns-3.22/src/core/model/random-variable-stream.cc ns-3.23/src/core/model/random-variable-stream.cc
--- ns-3.22/src/core/model/random-variable-stream.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/random-variable-stream.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,12 @@
 #include <cmath>
 #include <iostream>
 
+/**
+ * \file
+ * \ingroup randomvariable
+ * Implementation of ns3::RandomVariableStream and derivatives.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("RandomVariableStream");
@@ -47,6 +53,7 @@
 {
   static TypeId tid = TypeId ("ns3::RandomVariableStream")
     .SetParent<Object> ()
+    .SetGroupName ("Core")
     .AddAttribute("Stream",
 		  "The stream number for this RNG stream. -1 means \"allocate a stream automatically\". "
 		  "Note that if -1 is set, Get will return -1 so that it is not possible to know which "
@@ -137,6 +144,7 @@
 {
   static TypeId tid = TypeId ("ns3::UniformRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<UniformRandomVariable> ()
     .AddAttribute("Min", "The lower bound on the values returned by this RNG stream.",
 		  DoubleValue(0),
@@ -207,6 +215,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<ConstantRandomVariable> ()
     .AddAttribute("Constant", "The constant value returned by this RNG stream.",
 		  DoubleValue(0),
@@ -261,6 +270,7 @@
 {
   static TypeId tid = TypeId ("ns3::SequentialRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<SequentialRandomVariable> ()
     .AddAttribute("Min", "The first value of the sequence.",
 		  DoubleValue(0),
@@ -360,6 +370,7 @@
 {
   static TypeId tid = TypeId ("ns3::ExponentialRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<ExponentialRandomVariable> ()
     .AddAttribute("Mean", "The mean of the values returned by this RNG stream.",
 		  DoubleValue(1.0),
@@ -441,6 +452,7 @@
 {
   static TypeId tid = TypeId ("ns3::ParetoRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<ParetoRandomVariable> ()
     .AddAttribute("Mean", "The mean parameter for the Pareto distribution returned by this RNG stream.",
 		  DoubleValue(1.0),
@@ -536,6 +548,7 @@
 {
   static TypeId tid = TypeId ("ns3::WeibullRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<WeibullRandomVariable> ()
     .AddAttribute("Scale", "The scale parameter for the Weibull distribution returned by this RNG stream.",
 		  DoubleValue(1.0),
@@ -631,6 +644,7 @@
 {
   static TypeId tid = TypeId ("ns3::NormalRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<NormalRandomVariable> ()
     .AddAttribute("Mean", "The mean value for the normal distribution returned by this RNG stream.",
 		  DoubleValue(0.0),
@@ -748,6 +762,7 @@
 {
   static TypeId tid = TypeId ("ns3::LogNormalRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<LogNormalRandomVariable> ()
     .AddAttribute("Mu", "The mu value for the log-normal distribution returned by this RNG stream.",
 		  DoubleValue(0.0),
@@ -867,6 +882,7 @@
 {
   static TypeId tid = TypeId ("ns3::GammaRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<GammaRandomVariable> ()
     .AddAttribute("Alpha", "The alpha value for the gamma distribution returned by this RNG stream.",
 		  DoubleValue(1.0),
@@ -1042,6 +1058,7 @@
 {
   static TypeId tid = TypeId ("ns3::ErlangRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<ErlangRandomVariable> ()
     .AddAttribute("K", "The k value for the Erlang distribution returned by this RNG stream.",
 		  IntegerValue(1),
@@ -1153,6 +1170,7 @@
 {
   static TypeId tid = TypeId ("ns3::TriangularRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<TriangularRandomVariable> ()
     .AddAttribute("Mean", "The mean value for the triangular distribution returned by this RNG stream.",
 		  DoubleValue(0.5),
@@ -1247,6 +1265,7 @@
 {
   static TypeId tid = TypeId ("ns3::ZipfRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<ZipfRandomVariable> ()
     .AddAttribute("N", "The n value for the Zipf distribution returned by this RNG stream.",
 		  IntegerValue(1),
@@ -1337,6 +1356,7 @@
 {
   static TypeId tid = TypeId ("ns3::ZetaRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<ZetaRandomVariable> ()
     .AddAttribute("Alpha", "The alpha value for the zeta distribution returned by this RNG stream.",
 		  DoubleValue(3.14),
@@ -1420,6 +1440,7 @@
 {
   static TypeId tid = TypeId ("ns3::DeterministicRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<DeterministicRandomVariable> ()
     ;
   return tid;
@@ -1512,6 +1533,7 @@
 {
   static TypeId tid = TypeId ("ns3::EmpiricalRandomVariable")
     .SetParent<RandomVariableStream>()
+    .SetGroupName ("Core")
     .AddConstructor<EmpiricalRandomVariable> ()
     ;
   return tid;
@@ -1594,7 +1616,7 @@
 void EmpiricalRandomVariable::Validate ()
 {
   NS_LOG_FUNCTION (this);
-  ValueCDF prior;
+  ValueCDF prior = emp[0];
   for (std::vector<ValueCDF>::size_type i = 0; i < emp.size (); ++i)
     {
       ValueCDF& current = emp[i];
diff -Naur ns-3.22/src/core/model/realtime-simulator-impl.cc ns-3.23/src/core/model/realtime-simulator-impl.cc
--- ns-3.22/src/core/model/realtime-simulator-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/realtime-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -56,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::RealtimeSimulatorImpl")
     .SetParent<SimulatorImpl> ()
+    .SetGroupName ("Core")
     .AddConstructor<RealtimeSimulatorImpl> ()
     .AddAttribute ("SynchronizationMode", 
                    "What to do if the simulation cannot keep up with real time.",
diff -Naur ns-3.22/src/core/model/realtime-simulator-impl.h ns-3.23/src/core/model/realtime-simulator-impl.h
--- ns-3.22/src/core/model/realtime-simulator-impl.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/realtime-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
@@ -33,28 +33,62 @@
 
 #include <list>
 
+/**
+ * \file
+ * \ingroup realtime
+ * ns3::RealTimeSimulatorImpl declaration.
+ */
+
 namespace ns3 {
 
 /**
  * \ingroup simulator
+ * \defgroup realtime Realtime Simulator
+ *
+ * Realtime simulator implementation.
+ */
+  
+/**
+ * \ingroup realtime
+ *
+ * Realtime version of SimulatorImpl.
  */
 class RealtimeSimulatorImpl : public SimulatorImpl
 {
 public:
+  /**
+   * Get the registered TypeId for this class.
+   * \returns The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * Enumeration of the types of packets supported in the class.
-   *
+   * What to do when we can't maintain real time synchrony.
    */
   enum SynchronizationMode {
-    SYNC_BEST_EFFORT, /** Make a best effort to keep synced to real-time */
-    SYNC_HARD_LIMIT, /** Keep to real-time within a tolerance or die trying */
+    /**
+     * Make a best effort to keep synced to real-time.
+     *
+     * If we fall behind, keep going.
+     */
+    SYNC_BEST_EFFORT, 
+    /**
+     * Keep to real time within the hard limit tolerance configured
+     * with SetHardLimit, or die trying.
+     *
+     * Falling behind by more than the hard limit tolerance triggers
+     * a fatal error.
+     * \see SetHardLimit
+     */
+    SYNC_HARD_LIMIT,  
   };
 
+  /** Constructor. */
   RealtimeSimulatorImpl ();
+  /** Destructor. */
   ~RealtimeSimulatorImpl ();
 
+  // Inherited from SimulatorImpl
   virtual void Destroy ();
   virtual bool IsFinished (void) const;
   virtual void Stop (void);
@@ -63,9 +97,9 @@
   virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
   virtual EventId ScheduleNow (EventImpl *event);
   virtual EventId ScheduleDestroy (EventImpl *event);
-  virtual void Remove (const EventId &id);
-  virtual void Cancel (const EventId &id);
-  virtual bool IsExpired (const EventId &id) const;
+  virtual void Remove (const EventId &ev);
+  virtual void Cancel (const EventId &ev);
+  virtual bool IsExpired (const EventId &ev) const;
   virtual void Run (void);
   virtual Time Now (void) const;
   virtual Time GetDelayLeft (const EventId &id) const;
@@ -74,52 +108,115 @@
   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);
+  /**
+   * \copybrief ScheduleNow
+   *
+   * \param context Event context.
+   * \param event The event to schedule.
+   */
   void ScheduleRealtimeNowWithContext (uint32_t context, EventImpl *event);
+  /** \copydoc ScheduleNow */
   void ScheduleRealtimeNow (EventImpl *event);
+  /**
+   * Get the current real time from the synchronizer.
+   * \returns The current real time.
+   */
   Time RealtimeNow (void) const;
 
+  /**
+   * Set the SynchronizationMode.
+   *
+   * \param mode The new SynchronizationMode.
+   */
   void SetSynchronizationMode (RealtimeSimulatorImpl::SynchronizationMode mode);
+  /**
+   * Get the SynchronizationMode.
+   * \returns The current SynchronizationMode.
+   */
   RealtimeSimulatorImpl::SynchronizationMode GetSynchronizationMode (void) const;
 
+  /**
+   * Set the fatal error threshold for SynchronizationMode SYNC_HARD_LIMIT.
+   *
+   * \param limit The maximum amount of real time we are allowed to fall
+   *     behind before we trigger a fatal error.
+   */
   void SetHardLimit (Time limit);
+  /**
+   * Get the current fatal error threshold for SynchronizationMode
+   * SYNC_HARD_LIMIT.
+   *
+   * \returns The hard limit threshold.
+   */
   Time GetHardLimit (void) const;
 
 private:
+  /**
+   * Is the simulator running?
+   * \returns \c true if we are running.
+   */
   bool Running (void) const;
+  /**
+   * Check that the Synchronizer is locked to the real time clock.
+   * \return \c true if the Synchronizer is locked.
+   */
   bool Realtime (void) const;
+  /**
+   * Get the timestep of the next event.
+   * \returns The timestep of the next event.
+   */
   uint64_t NextTs (void) const;
+  /** Process the next event. */
   void ProcessOneEvent (void);
+  /** Destructor implementation. */
   virtual void DoDispose (void);
 
+  /** Container type for events to be run at destroy time. */
   typedef std::list<EventId> DestroyEvents;
+  /** Container for events to be run at destroy time. */
   DestroyEvents m_destroyEvents;
+  /** Has the stopping condition been reached? */
   bool m_stop;
+  /** Is the simulator currently running. */
   bool m_running;
 
-  // The following variables are protected using the m_mutex
+  /**
+   * \name Mutex-protected variables.
+   *
+   * These variables are protected by #m_mutex.
+   */
+  /**@{*/
+  /** The event list. */
   Ptr<Scheduler> m_events;
+  /**< Number of events in the event list. */
   int m_unscheduledEvents;
+  /**< Unique id for the next event to be scheduled. */
   uint32_t m_uid;
+  /**< Unique id of the current event. */
   uint32_t m_currentUid;
+  /**< Timestep of the current event. */
   uint64_t m_currentTs;
-  uint32_t m_currentContext;
+  /**< Execution context. */
+  uint32_t m_currentContext;  
+  /**@}*/
 
-  mutable SystemMutex m_mutex;
+  /** Mutex to control access to key state. */  
+  mutable SystemMutex m_mutex;  
 
+  /** The synchronizer in use to track real time. */
   Ptr<Synchronizer> m_synchronizer;
 
-  /**
-   * The policy to use if the simulation cannot keep synchronized to real-time.
-   */
+  /** SynchronizationMode policy. */
   SynchronizationMode m_synchronizationMode;
 
-  /**
-   * The maximum allowable drift from real-time in SYNC_HARD_LIMIT mode.
-   */
+  /** The maximum allowable drift from real-time in SYNC_HARD_LIMIT mode. */
   Time m_hardLimit;
 
+  /** Main SystemThread. */
   SystemThread::ThreadId m_main;
 };
 
diff -Naur ns-3.22/src/core/model/ref-count-base.cc ns-3.23/src/core/model/ref-count-base.cc
--- ns-3.22/src/core/model/ref-count-base.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/ref-count-base.cc	2015-05-13 11:05:27.000000000 -0700
@@ -24,6 +24,12 @@
 #include "ref-count-base.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup ptr
+ * (Deprecated) ns3::RefCountBase implementation.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("RefCountBase");
diff -Naur ns-3.22/src/core/model/ref-count-base.h ns-3.23/src/core/model/ref-count-base.h
--- ns-3.22/src/core/model/ref-count-base.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/ref-count-base.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
 
 #include "simple-ref-count.h"
 
+/**
+ * \file
+ * \ingroup ptr
+ * (Deprecated) ns3::RefCountBase declaration.
+ */
+
 namespace ns3 {
 
 /**
diff -Naur ns-3.22/src/core/model/rng-seed-manager.cc ns-3.23/src/core/model/rng-seed-manager.cc
--- ns-3.22/src/core/model/rng-seed-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/rng-seed-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -24,6 +24,12 @@
 #include "config.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup randomvariable
+ * ns3::RngSeedManager implementation.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("RngSeedManager");
diff -Naur ns-3.22/src/core/model/scheduler.cc ns-3.23/src/core/model/scheduler.cc
--- ns-3.22/src/core/model/scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::Scheduler")
     .SetParent<Object> ()
+    .SetGroupName ("Core")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/core/model/simulator-impl.cc ns-3.23/src/core/model/simulator-impl.cc
--- ns-3.22/src/core/model/simulator-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -20,6 +20,12 @@
 #include "simulator-impl.h"
 #include "log.h"
 
+/**
+ * \file
+ * \ingroup simulator
+ * Implementation of class ns3::SimulatorImpl.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("SimulatorImpl");
@@ -31,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::SimulatorImpl")
     .SetParent<Object> ()
+    .SetGroupName ("Core")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/core/model/simulator-impl.h ns-3.23/src/core/model/simulator-impl.h
--- ns-3.22/src/core/model/simulator-impl.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,12 @@
 #include "object-factory.h"
 #include "ptr.h"
 
+/**
+ * \file
+ * \ingroup simulator
+ * Declaration of class ns3::SimulatorImpl.
+ */
+
 namespace ns3 {
 
 class Scheduler;
diff -Naur ns-3.22/src/core/model/synchronizer.cc ns-3.23/src/core/model/synchronizer.cc
--- ns-3.22/src/core/model/synchronizer.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/synchronizer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,7 @@
 {
   static TypeId tid = TypeId ("ns3::Synchronizer")
     .SetParent<Object> ()
+    .SetGroupName ("Core")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/core/model/test.cc ns-3.23/src/core/model/test.cc
--- ns-3.22/src/core/model/test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,12 @@
 #include <map>
 
 
+/**
+ * \file
+ * \ingroup testing
+ * Implementation of the testing classes and functions
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("Test");
diff -Naur ns-3.22/src/core/model/test.h ns-3.23/src/core/model/test.h
--- ns-3.22/src/core/model/test.h	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/test.h	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,12 @@
 #include "system-wall-clock-ms.h"
 
 /**
+ * \file
+ * \ingroup testing
+ * Definition of the testing macros and declaration of the testing classes.
+ */
+
+/**
  * \ingroup core
  * \defgroup testing Testing
  * \brief Tools to define and execute unit tests.
diff -Naur ns-3.22/src/core/model/time.cc ns-3.23/src/core/model/time.cc
--- ns-3.22/src/core/model/time.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/time.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,6 +27,13 @@
 #include <iomanip>  // showpos
 #include <sstream>
 
+/**
+ * \file
+ * \ingroup time
+ * Implementation of classes ns3::Time and ns3::TimeWithUnit,
+ * and the TimeValue implementation classes.
+ */
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE_MASK ("Time", ns3::LOG_PREFIX_TIME);
diff -Naur ns-3.22/src/core/model/type-id.cc ns-3.23/src/core/model/type-id.cc
--- ns-3.22/src/core/model/type-id.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/type-id.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,13 @@
 #include <sstream>
 #include <iomanip>
 
+/**
+ * \file
+ * \ingroup object
+ * ns3::TypeId and ns3::IidManager implementations.
+ */
+
+
 /*********************************************************************
  *         Helper code
  *********************************************************************/
diff -Naur ns-3.22/src/core/model/type-id.h ns-3.23/src/core/model/type-id.h
--- ns-3.22/src/core/model/type-id.h	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/type-id.h	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
 #include <string>
 #include <stdint.h>
 
+/**
+ * \file
+ * \ingroup object
+ * ns3::TypeId declaration; inline and template implementations.
+ */
+
 namespace ns3 {
 
 class ObjectBase;
diff -Naur ns-3.22/src/core/model/type-traits.h ns-3.23/src/core/model/type-traits.h
--- ns-3.22/src/core/model/type-traits.h	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/type-traits.h	2015-05-13 11:05:27.000000000 -0700
@@ -20,6 +20,12 @@
 #ifndef TYPE_TRAITS_H
 #define TYPE_TRAITS_H
 
+/**
+ * \file
+ * \ingroup object
+ * TypeTraits introspection template.
+ */
+
 /** Type trait reference values */
 template <typename T>
 struct TypeTraits
diff -Naur ns-3.22/src/core/model/unused.h ns-3.23/src/core/model/unused.h
--- ns-3.22/src/core/model/unused.h	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/unused.h	2015-05-13 11:05:27.000000000 -0700
@@ -1,10 +1,26 @@
 #ifndef UNUSED_H
 #define UNUSED_H
 
+/**
+ * \file
+ * \ingroup core
+ * Definition of the NS_UNUSED NS_UNUSED_GLOBAL macros.
+ */
+
+/**
+ * \ingroup core
+ * \def NS_UNUSED()
+ * Mark a local variable as unused.
+ */
 #ifndef NS_UNUSED
 # define NS_UNUSED(x) ((void)(x))
 #endif
 
+/**
+ * \ingroup core
+ * \def NS_UNUSED_GLOBAL()
+ * Mark a variable at file scope as unused.
+ */
 #ifndef NS_UNUSED_GLOBAL
 #if defined(__GNUC__)
 # define NS_UNUSED_GLOBAL(x) x __attribute__((unused))
diff -Naur ns-3.22/src/core/model/wall-clock-synchronizer.cc ns-3.23/src/core/model/wall-clock-synchronizer.cc
--- ns-3.22/src/core/model/wall-clock-synchronizer.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/wall-clock-synchronizer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::WallClockSynchronizer")
     .SetParent<Synchronizer> ()
+    .SetGroupName ("Core")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/core/test/random-variable-stream-test-suite.cc ns-3.23/src/core/test/random-variable-stream-test-suite.cc
--- ns-3.22/src/core/test/random-variable-stream-test-suite.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/test/random-variable-stream-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
@@ -2754,6 +2754,13 @@
   // Test that values have approximately the right mean value.
   double TOLERANCE = expectedMean * 1e-2;
   NS_TEST_ASSERT_MSG_EQ_TOL (valueMean, expectedMean, TOLERANCE, "Wrong mean value."); 
+
+  // Bug 2082: Create the RNG with a uniform distribution between -1 and 1.
+  Ptr<EmpiricalRandomVariable> y = CreateObject<EmpiricalRandomVariable> ();
+  y->CDF (-1.0,  0.0);
+  y->CDF (0.0,  0.5);
+  y->CDF (1.0,  1.0);
+  NS_TEST_ASSERT_MSG_LT (y->GetValue (), 2, "Empirical variable with negative domain");
 }
 
 // ===========================================================================
diff -Naur ns-3.22/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.23/src/csma/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/csma/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -1157,11 +1157,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/csma/bindings/modulegen__gcc_LP64.py ns-3.23/src/csma/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/csma/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -1157,11 +1157,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/csma/model/backoff.cc ns-3.23/src/csma/model/backoff.cc
--- ns-3.22/src/csma/model/backoff.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma/model/backoff.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
   m_maxSlots = 1000;
   m_ceiling = 10;
   m_maxRetries = 1000;
+  m_numBackoffRetries = 0;
   m_rng = CreateObject<UniformRandomVariable> ();
 
   ResetBackoffTime ();
@@ -44,6 +45,7 @@
   m_maxSlots = maxSlots;
   m_ceiling = ceiling;
   m_maxRetries = maxRetries;
+  m_numBackoffRetries = 0;
   m_rng = CreateObject<UniformRandomVariable> ();
 }
 
diff -Naur ns-3.22/src/csma/model/csma-channel.cc ns-3.23/src/csma/model/csma-channel.cc
--- ns-3.22/src/csma/model/csma-channel.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma/model/csma-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::CsmaChannel")
     .SetParent<Channel> ()
+    .SetGroupName ("Csma")
     .AddConstructor<CsmaChannel> ()
     .AddAttribute ("DataRate", 
                    "The transmission data rate to be provided to devices connected to the channel",
diff -Naur ns-3.22/src/csma/model/csma-net-device.cc ns-3.23/src/csma/model/csma-net-device.cc
--- ns-3.22/src/csma/model/csma-net-device.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma/model/csma-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::CsmaNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Csma")
     .AddConstructor<CsmaNetDevice> ()
     .AddAttribute ("Address", 
                    "The MAC address of this device.",
@@ -520,7 +521,7 @@
           m_txMachineState = BUSY;
           m_phyTxBeginTrace (m_currentPkt);
 
-          Time tEvent = Seconds (m_bps.CalculateTxTime (m_currentPkt->GetSize ()));
+          Time tEvent = m_bps.CalculateBytesTxTime (m_currentPkt->GetSize ());
           NS_LOG_LOGIC ("Schedule TransmitCompleteEvent in " << tEvent.GetSeconds () << "sec");
           Simulator::Schedule (tEvent, &CsmaNetDevice::TransmitCompleteEvent, this);
         }
@@ -656,7 +657,7 @@
   //
   // We use the Ethernet interframe gap of 96 bit times.
   //
-  m_tInterframeGap = Seconds (m_bps.CalculateTxTime (96/8));
+  m_tInterframeGap = m_bps.CalculateBytesTxTime (96/8);
 
   //
   // This device is up whenever a channel is attached to it.
diff -Naur ns-3.22/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.23/src/csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -1340,11 +1340,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.23/src/csma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/csma-layout/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma-layout/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -1340,11 +1340,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/dsdv/model/dsdv-packet.cc ns-3.23/src/dsdv/model/dsdv-packet.cc
--- ns-3.22/src/dsdv/model/dsdv-packet.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsdv/model/dsdv-packet.cc	2015-05-13 11:05:26.000000000 -0700
@@ -53,6 +53,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsdv::DsdvHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Dsdv")
     .AddConstructor<DsdvHeader> ();
   return tid;
 }
diff -Naur ns-3.22/src/dsdv/model/dsdv-routing-protocol.cc ns-3.23/src/dsdv/model/dsdv-routing-protocol.cc
--- ns-3.22/src/dsdv/model/dsdv-routing-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsdv/model/dsdv-routing-protocol.cc	2015-05-13 11:05:26.000000000 -0700
@@ -66,7 +66,7 @@
   static TypeId
   GetTypeId ()
   {
-    static TypeId tid = TypeId ("ns3::dsdv::DeferredRouteOutputTag").SetParent<Tag> ();
+    static TypeId tid = TypeId ("ns3::dsdv::DeferredRouteOutputTag").SetParent<Tag> ().SetGroupName ("Dsdv");
     return tid;
   }
 
@@ -106,6 +106,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsdv::RoutingProtocol")
     .SetParent<Ipv4RoutingProtocol> ()
+    .SetGroupName ("Dsdv")
     .AddConstructor<RoutingProtocol> ()
     .AddAttribute ("PeriodicUpdateInterval","Periodic interval between exchange of full routing tables among nodes. ",
                    TimeValue (Seconds (15)),
diff -Naur ns-3.22/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.23/src/dsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/dsr/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
@@ -6042,6 +6042,10 @@
                    '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', 
@@ -6515,10 +6519,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -6692,10 +6696,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
diff -Naur ns-3.22/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.23/src/dsr/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/dsr/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
@@ -6042,6 +6042,10 @@
                    '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', 
@@ -6515,10 +6519,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -6692,10 +6696,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
diff -Naur ns-3.22/src/dsr/model/dsr-fs-header.cc ns-3.23/src/dsr/model/dsr-fs-header.cc
--- ns-3.22/src/dsr/model/dsr-fs-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-fs-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -47,6 +47,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrFsHeader")
     .AddConstructor<DsrFsHeader> ()
     .SetParent<Header> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/dsr/model/dsr-gratuitous-reply-table.cc ns-3.23/src/dsr/model/dsr-gratuitous-reply-table.cc
--- ns-3.22/src/dsr/model/dsr-gratuitous-reply-table.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-gratuitous-reply-table.cc	2015-05-13 11:05:26.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::GraReply")
     .SetParent<Object> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<GraReply> ()
   ;
   return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-network-queue.cc ns-3.23/src/dsr/model/dsr-network-queue.cc
--- ns-3.22/src/dsr/model/dsr-network-queue.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-network-queue.cc	2015-05-13 11:05:26.000000000 -0700
@@ -51,6 +51,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrNetworkQueue")
     .SetParent<Object> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrNetworkQueue>  ()
   ;
   return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-option-header.cc ns-3.23/src/dsr/model/dsr-option-header.cc
--- ns-3.22/src/dsr/model/dsr-option-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-option-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -51,6 +51,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionHeader")
     .AddConstructor<DsrOptionHeader> ()
     .SetParent<Header> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -139,6 +140,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionPad1Header")
     .AddConstructor<DsrOptionPad1Header> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -190,6 +192,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionPadnHeader")
     .AddConstructor<DsrOptionPadnHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -250,6 +253,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRreqHeader")
     .AddConstructor<DsrOptionRreqHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -397,6 +401,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRrepHeader")
     .AddConstructor<DsrOptionRrepHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -518,6 +523,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionSRHeader")
     .AddConstructor<DsrOptionSRHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -660,6 +666,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerrHeader")
     .AddConstructor<DsrOptionRerrHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -782,6 +789,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerrUnreachHeader")
     .AddConstructor<DsrOptionRerrUnreachHeader> ()
     .SetParent<DsrOptionRerrHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -910,6 +918,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerrUnsupportHeader")
     .AddConstructor<DsrOptionRerrUnsupportHeader> ()
     .SetParent<DsrOptionRerrHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -1028,6 +1037,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckReqHeader")
     .AddConstructor<DsrOptionAckReqHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
@@ -1103,6 +1113,7 @@
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckHeader")
     .AddConstructor<DsrOptionAckHeader> ()
     .SetParent<DsrOptionHeader> ()
+    .SetGroupName ("Dsr")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/dsr/model/dsr-options.cc ns-3.23/src/dsr/model/dsr-options.cc
--- ns-3.22/src/dsr/model/dsr-options.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-options.cc	2015-05-13 11:05:26.000000000 -0700
@@ -72,6 +72,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptions")
     .SetParent<Object> ()
+    .SetGroupName ("Dsr")
     .AddAttribute ("OptionNumber", "The Dsr option number.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&DsrOptions::GetOptionNumber),
@@ -384,6 +385,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionPad1")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionPad1> ()
   ;
   return tid;
@@ -424,6 +426,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionPadn")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionPadn> ()
   ;
   return tid;
@@ -464,6 +467,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRreq")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionRreq> ()
   ;
   return tid;
@@ -963,6 +967,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRrep")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionRrep> ()
   ;
   return tid;
@@ -1163,6 +1168,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionSR")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionSR> ()
   ;
   return tid;
@@ -1404,6 +1410,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerr")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionRerr> ()
   ;
   return tid;
@@ -1583,6 +1590,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckReq")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionAckReq> ()
   ;
   return tid;
@@ -1638,6 +1646,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrOptionAck")
     .SetParent<DsrOptions> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrOptionAck> ()
   ;
   return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-passive-buff.cc ns-3.23/src/dsr/model/dsr-passive-buff.cc
--- ns-3.22/src/dsr/model/dsr-passive-buff.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-passive-buff.cc	2015-05-13 11:05:26.000000000 -0700
@@ -48,6 +48,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::PassiveBuffer")
     .SetParent<Object> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<PassiveBuffer> ()
   ;
   return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-rcache.cc ns-3.23/src/dsr/model/dsr-rcache.cc
--- ns-3.22/src/dsr/model/dsr-rcache.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-rcache.cc	2015-05-13 11:05:26.000000000 -0700
@@ -138,6 +138,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::RouteCache")
     .SetParent<Object> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<RouteCache> ()
   ;
   return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-routing.cc ns-3.23/src/dsr/model/dsr-routing.cc
--- ns-3.22/src/dsr/model/dsr-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-routing.cc	2015-05-13 11:05:26.000000000 -0700
@@ -108,6 +108,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrRouting")
     .SetParent<IpL4Protocol> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<DsrRouting> ()
     .AddAttribute ("RouteCache",
                    "The route cache for saving routes from "
diff -Naur ns-3.22/src/dsr/model/dsr-rreq-table.cc ns-3.23/src/dsr/model/dsr-rreq-table.cc
--- ns-3.22/src/dsr/model/dsr-rreq-table.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-rreq-table.cc	2015-05-13 11:05:26.000000000 -0700
@@ -46,6 +46,7 @@
 {
   static TypeId tid = TypeId ("ns3::dsr::RreqTable")
     .SetParent<Object> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<RreqTable> ()
   ;
   return tid;
diff -Naur ns-3.22/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.23/src/energy/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/energy/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
@@ -3564,6 +3564,10 @@
                    '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', 
@@ -4037,10 +4041,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -4214,10 +4218,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
diff -Naur ns-3.22/src/energy/bindings/modulegen__gcc_LP64.py ns-3.23/src/energy/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/energy/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
@@ -3564,6 +3564,10 @@
                    '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', 
@@ -4037,10 +4041,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -4214,10 +4218,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
diff -Naur ns-3.22/src/energy/doc/energy.rst ns-3.23/src/energy/doc/energy.rst
--- ns-3.22/src/energy/doc/energy.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/doc/energy.rst	2015-05-13 11:05:26.000000000 -0700
@@ -186,6 +186,11 @@
    Energy Framework for Network Simulator 3 (ns-3). Workshop on ns-3
    (WNS3), Poster Session, Atlanta, GA, USA. May, 2014.
 
+.. [7] C. Tapparello, H. Ayatollahi and W. Heinzelman. Energy Harvesting 
+   Framework for Network Simulator 3 (ns-3). 2nd International Workshop on
+   Energy Neutral Sensing Systems (ENSsys), Memphis, TN, USA. November 6,
+   2014.
+
 Usage
 =====
 
diff -Naur ns-3.22/src/energy/helper/energy-harvester-container.cc ns-3.23/src/energy/helper/energy-harvester-container.cc
--- ns-3.22/src/energy/helper/energy-harvester-container.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/helper/energy-harvester-container.cc	2015-05-13 11:05:26.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::EnergyHarvesterContainer")
     .SetParent<Object> ()
+    .SetGroupName ("Energy")
     .AddConstructor<EnergyHarvesterContainer> ()
   ;
   return tid;
diff -Naur ns-3.22/src/energy/helper/energy-source-container.cc ns-3.23/src/energy/helper/energy-source-container.cc
--- ns-3.22/src/energy/helper/energy-source-container.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/helper/energy-source-container.cc	2015-05-13 11:05:26.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::EnergySourceContainer")
     .SetParent<Object> ()
+    .SetGroupName ("Energy")
     .AddConstructor<EnergySourceContainer> ()
   ;
   return tid;
diff -Naur ns-3.22/src/energy/helper/li-ion-energy-source-helper.cc ns-3.23/src/energy/helper/li-ion-energy-source-helper.cc
--- ns-3.22/src/energy/helper/li-ion-energy-source-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/energy/helper/li-ion-energy-source-helper.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,53 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Wireless Communications and Networking Group (WCNG),
+ * University of Rochester, Rochester, NY, USA.
+ *
+ * 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: Hoda Ayatollahi <hayatoll@ur.rochester.edu>
+ *          Cristiano Tapparello <cristiano.tapparello@rochester.edu>
+ */
+
+#include "li-ion-energy-source-helper.h"
+#include "ns3/energy-source.h"
+
+namespace ns3 {
+
+LiIonEnergySourceHelper::LiIonEnergySourceHelper ()
+{
+  m_liIonEnergySource.SetTypeId ("ns3::LiIonEnergySource");
+}
+
+LiIonEnergySourceHelper::~LiIonEnergySourceHelper ()
+{
+}
+
+void 
+LiIonEnergySourceHelper::Set (std::string name, const AttributeValue &v)
+{
+  m_liIonEnergySource.Set (name, v);
+}
+
+Ptr<EnergySource> 
+LiIonEnergySourceHelper::DoInstall (Ptr<Node> node) const
+{
+  NS_ASSERT (node != NULL);
+  Ptr<EnergySource> source = m_liIonEnergySource.Create<EnergySource> ();
+  NS_ASSERT (source != NULL);
+  source->SetNode (node);
+  return source;
+}
+
+} // namespace ns3
diff -Naur ns-3.22/src/energy/helper/li-ion-energy-source-helper.h ns-3.23/src/energy/helper/li-ion-energy-source-helper.h
--- ns-3.22/src/energy/helper/li-ion-energy-source-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/energy/helper/li-ion-energy-source-helper.h	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,54 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Wireless Communications and Networking Group (WCNG),
+ * University of Rochester, Rochester, NY, USA.
+ *
+ * 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: Hoda Ayatollahi <hayatoll@ur.rochester.edu>
+ *          Cristiano Tapparello <cristiano.tapparello@rochester.edu>
+ */
+
+#ifndef LI_ION_ENERGY_SOURCE_HELPER_H_
+#define LI_ION_ENERGY_SOURCE_HELPER_H_
+
+#include "energy-model-helper.h"
+#include "ns3/node.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup energy
+ * \brief Creates a LiIonEnergySource  object.
+ *
+ */
+class LiIonEnergySourceHelper: public EnergySourceHelper
+{
+public:
+  LiIonEnergySourceHelper ();
+  ~LiIonEnergySourceHelper ();
+
+  void Set (std::string name, const AttributeValue &v);
+
+private:
+  virtual Ptr<EnergySource> DoInstall (Ptr<Node> node) const;
+
+private:
+  ObjectFactory m_liIonEnergySource;
+
+};
+
+} // namespace ns3
+
+#endif /* LI_ION_ENERGY_SOURCE_HELPER_H_ */
diff -Naur ns-3.22/src/energy/model/basic-energy-harvester.cc ns-3.23/src/energy/model/basic-energy-harvester.cc
--- ns-3.22/src/energy/model/basic-energy-harvester.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/basic-energy-harvester.cc	2015-05-13 11:05:26.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::BasicEnergyHarvester")
   .SetParent<EnergyHarvester> ()
+  .SetGroupName ("Energy")
   .AddConstructor<BasicEnergyHarvester> ()
   .AddAttribute ("PeriodicHarvestedPowerUpdateInterval",
                  "Time between two consecutive periodic updates of the harvested power. By default, the value is updated every 1 s",
diff -Naur ns-3.22/src/energy/model/basic-energy-source.cc ns-3.23/src/energy/model/basic-energy-source.cc
--- ns-3.22/src/energy/model/basic-energy-source.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/basic-energy-source.cc	2015-05-13 11:05:26.000000000 -0700
@@ -36,6 +36,7 @@
 {
   static TypeId tid = TypeId ("ns3::BasicEnergySource")
     .SetParent<EnergySource> ()
+    .SetGroupName ("Energy")
     .AddConstructor<BasicEnergySource> ()
     .AddAttribute ("BasicEnergySourceInitialEnergyJ",
                    "Initial energy stored in basic energy source.",
diff -Naur ns-3.22/src/energy/model/device-energy-model.cc ns-3.23/src/energy/model/device-energy-model.cc
--- ns-3.22/src/energy/model/device-energy-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/device-energy-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::DeviceEnergyModel")
     .SetParent<Object> ()
+    .SetGroupName ("Energy")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/energy/model/energy-harvester.cc ns-3.23/src/energy/model/energy-harvester.cc
--- ns-3.22/src/energy/model/energy-harvester.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/energy-harvester.cc	2015-05-13 11:05:26.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::EnergyHarvester")
     .SetParent<Object> ()
+    .SetGroupName ("Energy")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/energy/model/energy-source.cc ns-3.23/src/energy/model/energy-source.cc
--- ns-3.22/src/energy/model/energy-source.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/energy-source.cc	2015-05-13 11:05:26.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::EnergySource")
     .SetParent<Object> ()
+    .SetGroupName ("Energy")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/energy/model/li-ion-energy-source.cc ns-3.23/src/energy/model/li-ion-energy-source.cc
--- ns-3.22/src/energy/model/li-ion-energy-source.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/li-ion-energy-source.cc	2015-05-13 11:05:26.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::LiIonEnergySource")
     .SetParent<EnergySource> ()
+    .SetGroupName ("Energy")
     .AddConstructor<LiIonEnergySource> ()
     .AddAttribute ("LiIonEnergySourceInitialEnergyJ",
                    "Initial energy stored in basic energy source.",
diff -Naur ns-3.22/src/energy/model/rv-battery-model.cc ns-3.23/src/energy/model/rv-battery-model.cc
--- ns-3.22/src/energy/model/rv-battery-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/rv-battery-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::RvBatteryModel")
     .SetParent<EnergySource> ()
+    .SetGroupName ("Energy")
     .AddConstructor<RvBatteryModel> ()
     .AddAttribute ("RvBatteryModelPeriodicEnergyUpdateInterval",
                    "RV battery model sampling interval.",
@@ -94,8 +95,9 @@
 RvBatteryModel::RvBatteryModel ()
 {
   NS_LOG_FUNCTION (this);
-  m_lastSampleTime = Seconds (0.0);
-  m_previousLoad = 0.0;
+  m_lastSampleTime = Simulator::Now ();
+  m_timeStamps.push_back (m_lastSampleTime);
+  m_previousLoad = -1.0;
   m_batteryLevel = 1; // fully charged
   m_lifetime = Seconds (0.0);
 }
@@ -170,13 +172,12 @@
       m_batteryLevel = 0;
     }
 
-  // check if battery is dead.
+  // check if battery level is below the low battery threshold.
   if (m_batteryLevel <= m_lowBatteryTh)
     {
-      m_lifetime = Simulator::Now ();
-      NS_LOG_DEBUG ("RvBatteryModel:Battery is dead!");
+      m_lifetime = Simulator::Now () - m_timeStamps[0];
+      NS_LOG_DEBUG ("RvBatteryModel:Battery level below threshold!");
       HandleEnergyDrainedEvent ();
-      return; // stop periodic sampling
     }
 
   m_previousLoad = currentLoad;
@@ -326,19 +327,15 @@
     {
       m_load.push_back (load);
       m_previousLoad = load;
-      if (t != Seconds (0.0))
-        {
-          m_timeStamps[m_timeStamps.size () - 1] = m_lastSampleTime;
-        }
-      else
-        {
-          m_timeStamps.push_back (Seconds (0.0));
-        }
+      m_timeStamps[m_timeStamps.size () - 1] = m_lastSampleTime;
       m_timeStamps.push_back (t);
     }
   else
     {
-      m_timeStamps[m_timeStamps.size () - 1] = t;
+      if  (!m_timeStamps.empty())
+      {
+        m_timeStamps[m_timeStamps.size () - 1] = t;
+      }
     }
 
   m_lastSampleTime = t;
diff -Naur ns-3.22/src/energy/model/rv-battery-model.h ns-3.23/src/energy/model/rv-battery-model.h
--- ns-3.22/src/energy/model/rv-battery-model.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/rv-battery-model.h	2015-05-13 11:05:26.000000000 -0700
@@ -55,7 +55,7 @@
   virtual ~RvBatteryModel ();
 
   /**
-   * \return Initial energy stored (theoretical capacity) in the battery.
+   * \return Initial energy stored (theoretical capacity) in the battery, in Joules.
    *
    * Implements GetInitialEnergy.
    */
diff -Naur ns-3.22/src/energy/model/simple-device-energy-model.cc ns-3.23/src/energy/model/simple-device-energy-model.cc
--- ns-3.22/src/energy/model/simple-device-energy-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/simple-device-energy-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::SimpleDeviceEnergyModel")
     .SetParent<DeviceEnergyModel> ()
+    .SetGroupName ("Energy")
     .AddConstructor<SimpleDeviceEnergyModel> ()
     .AddTraceSource ("TotalEnergyConsumption",
                      "Total energy consumption of the radio device.",
diff -Naur ns-3.22/src/energy/model/wifi-radio-energy-model.cc ns-3.23/src/energy/model/wifi-radio-energy-model.cc
--- ns-3.22/src/energy/model/wifi-radio-energy-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/wifi-radio-energy-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiRadioEnergyModel")
     .SetParent<DeviceEnergyModel> ()
+    .SetGroupName ("Energy")
     .AddConstructor<WifiRadioEnergyModel> ()
     .AddAttribute ("IdleCurrentA",
                    "The default radio Idle current in Ampere.",
diff -Naur ns-3.22/src/energy/model/wifi-tx-current-model.cc ns-3.23/src/energy/model/wifi-tx-current-model.cc
--- ns-3.22/src/energy/model/wifi-tx-current-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/model/wifi-tx-current-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiTxCurrentModel")
     .SetParent<Object> ()
+    .SetGroupName ("Energy")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.23/src/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
@@ -1053,11 +1053,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.23/src/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
@@ -1053,11 +1053,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/fd-net-device/doc/fd-net-device.rst ns-3.23/src/fd-net-device/doc/fd-net-device.rst
--- ns-3.22/src/fd-net-device/doc/fd-net-device.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/doc/fd-net-device.rst	2015-05-13 11:05:26.000000000 -0700
@@ -131,7 +131,7 @@
 DIX for Ethernet II frames, LLC for 802.2 LLC/SNAP frames, 
 and DIXPI for Ethernet II frames with an additional TAP PI header.
 This means that traffic traversing the file descriptor is expected to be 
-Ethernet II compatible. 
+Ethernet II compatible.  IEEE 802.1q (VLAN) tagging is not supported.
 Attaching an FdNetDevice to a wireless interface is possible as long as the 
 driver provides Ethernet II frames to the socket API. 
 Note that to associate a FdNetDevice to a wireless card in ad-hoc mode, 
diff -Naur ns-3.22/src/fd-net-device/examples/fd2fd-onoff.cc ns-3.23/src/fd-net-device/examples/fd2fd-onoff.cc
--- ns-3.22/src/fd-net-device/examples/fd2fd-onoff.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/examples/fd2fd-onoff.cc	2015-05-13 11:05:26.000000000 -0700
@@ -38,6 +38,7 @@
 // Steps to run the experiment:
 //
 // $ ./waf --run="fd2fd-onoff"
+// $ ./waf --run="fd2fd-onoff --tcpMode=1"
 //
 
 #include <sys/socket.h>
@@ -56,6 +57,24 @@
 int
 main (int argc, char *argv[])
 {
+
+  // Command-line arguments
+  //
+  bool tcpMode = false;
+  CommandLine cmd;
+  cmd.AddValue ("tcpMode", "1:true, 0:false, default mode UDP",tcpMode);
+  cmd.Parse (argc, argv);
+   
+  std::string factory;
+  if (tcpMode==1)
+    {
+      factory = "ns3::TcpSocketFactory";
+    }
+  else
+    {
+      factory = "ns3::UdpSocketFactory";
+    }
+
   GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
 
   uint16_t sinkPort = 8000;
@@ -100,7 +119,8 @@
 
   // server
   Address sinkLocalAddress (InetSocketAddress (serverIp, sinkPort));
-  PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
+
+  PacketSinkHelper sinkHelper (factory, sinkLocalAddress);
   ApplicationContainer sinkApp = sinkHelper.Install (serverNode);
   sinkApp.Start (Seconds (0.0));
   sinkApp.Stop (Seconds (30.0));
@@ -108,7 +128,7 @@
 
   // client
   AddressValue serverAddress (InetSocketAddress (serverIp, sinkPort));
-  OnOffHelper onoff ("ns3::TcpSocketFactory", Address ());
+  OnOffHelper onoff (factory, Address ());
   onoff.SetAttribute ("Remote", serverAddress);
   onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
   onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
diff -Naur ns-3.22/src/fd-net-device/helper/tap-fd-net-device-helper.cc ns-3.23/src/fd-net-device/helper/tap-fd-net-device-helper.cc
--- ns-3.22/src/fd-net-device/helper/tap-fd-net-device-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/helper/tap-fd-net-device-helper.cc	2015-05-13 11:05:26.000000000 -0700
@@ -112,7 +112,6 @@
 {
   Ptr<NetDevice> d = FdNetDeviceHelper::InstallPriv (node);
   Ptr<FdNetDevice> device = d->GetObject<FdNetDevice> ();
-  Ptr<FdNetDevice> fdnd = device->GetObject<FdNetDevice> ();
 
   //
   // We need to explicitly set the encapsulation mode for the traffic
@@ -122,7 +121,7 @@
   //
   if (m_modePi)
     {
-      fdnd->SetEncapsulationMode (FdNetDevice::DIXPI);
+      device->SetEncapsulationMode (FdNetDevice::DIXPI);
     }
 
   SetFileDescriptor (device);
diff -Naur ns-3.22/src/fd-net-device/model/fd-net-device.cc ns-3.23/src/fd-net-device/model/fd-net-device.cc
--- ns-3.22/src/fd-net-device/model/fd-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/model/fd-net-device.cc	2015-05-13 11:05:26.000000000 -0700
@@ -52,6 +52,7 @@
 void
 FdNetDeviceFdReader::SetBufferSize (uint32_t bufferSize)
 {
+  NS_LOG_FUNCTION (this << bufferSize);
   m_bufferSize = bufferSize;
 }
 
@@ -70,7 +71,7 @@
       buf = 0;
       len = 0;
     }
-
+  NS_LOG_LOGIC ("Read " << len << " bytes on fd " << m_fd);
   return FdReader::Data (buf, len);
 }
 
@@ -81,6 +82,7 @@
 {
   static TypeId tid = TypeId ("ns3::FdNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("FdNetDevice")
     .AddConstructor<FdNetDevice> ()
     .AddAttribute ("Address",
                    "The MAC address of this device.",
@@ -246,7 +248,8 @@
   m_nodeId = GetNode ()->GetId ();
 
   m_fdReader = Create<FdNetDeviceFdReader> ();
-  m_fdReader->SetBufferSize(m_mtu);
+  // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
+  m_fdReader->SetBufferSize(m_mtu + 22);  
   m_fdReader->Start (m_fd, MakeCallback (&FdNetDevice::ReceiveCallback, this));
 
   NotifyLinkUp ();
@@ -280,7 +283,7 @@
     CriticalSection cs (m_pendingReadMutex);
     if (m_pendingReadCount >= m_maxPendingReads)
       {
-        //XXX: Packet dropped!
+        NS_LOG_WARN ("Packet dropped");
         skip = true;
       }
     else
@@ -493,8 +496,7 @@
 FdNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
 {
   NS_LOG_FUNCTION (this << packet << src << dest << protocolNumber);
-  NS_LOG_LOGIC ("packet " << packet);
-  NS_LOG_LOGIC ("UID is " << packet->GetUid ());
+  NS_LOG_LOGIC ("packet: " << packet << " UID: " << packet->GetUid ());
 
   if (IsLinkUp () == false)
     {
@@ -513,6 +515,8 @@
   header.SetSource (source);
   header.SetDestination (destination);
 
+  NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet too big " << packet->GetSize ());
+
   if (m_encapMode == LLC)
     {
       LlcSnapHeader llc;
@@ -540,7 +544,6 @@
 
   NS_LOG_LOGIC ("calling write");
 
-  NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet too big " << packet->GetSize ());
 
   ssize_t len =  (ssize_t) packet->GetSize ();
   uint8_t *buffer = (uint8_t*)malloc (len);
diff -Naur ns-3.22/src/fd-net-device/test/examples-to-run.py ns-3.23/src/fd-net-device/test/examples-to-run.py
--- ns-3.22/src/fd-net-device/test/examples-to-run.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/test/examples-to-run.py	2015-05-13 11:05:26.000000000 -0700
@@ -13,7 +13,7 @@
     ("fd-emu-onoff", "False", "True"),
     ("fd-emu-udp-echo", "False", "True"),
     ("realtime-dummy-network", "False", "True"),
-    ("fd2fd-onoff", "False", "True"),
+    ("fd2fd-onoff", "True", "True"),
     ("fd-tap-ping", "False", "True"),
     ("realtime-fd2fd-onoff", "False", "True"),
 ]
diff -Naur ns-3.22/src/flow-monitor/model/flow-monitor.cc ns-3.23/src/flow-monitor/model/flow-monitor.cc
--- ns-3.22/src/flow-monitor/model/flow-monitor.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/flow-monitor/model/flow-monitor.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::FlowMonitor")
     .SetParent<Object> ()
+    .SetGroupName ("FlowMonitor")
     .AddConstructor<FlowMonitor> ()
     .AddAttribute ("MaxPerHopDelay", ("The maximum per-hop delay that should be considered.  "
                                       "Packets still not received after this delay are to be considered lost."),
diff -Naur ns-3.22/src/flow-monitor/model/ipv4-flow-probe.cc ns-3.23/src/flow-monitor/model/ipv4-flow-probe.cc
--- ns-3.22/src/flow-monitor/model/ipv4-flow-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/flow-monitor/model/ipv4-flow-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -108,6 +108,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4FlowProbeTag")
     .SetParent<Tag> ()
+    .SetGroupName ("FlowMonitor")
     .AddConstructor<Ipv4FlowProbeTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/flow-monitor/model/ipv6-flow-probe.cc ns-3.23/src/flow-monitor/model/ipv6-flow-probe.cc
--- ns-3.22/src/flow-monitor/model/ipv6-flow-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/flow-monitor/model/ipv6-flow-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -109,6 +109,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6FlowProbeTag")
     .SetParent<Tag> ()
+    .SetGroupName ("FlowMonitor")
     .AddConstructor<Ipv6FlowProbeTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.23/src/internet/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/internet/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -8893,6 +8893,11 @@
     cls.add_method('EnableChecksums', 
                    'void', 
                    [])
+    ## tcp-header.h (module 'internet'): static std::string ns3::TcpHeader::FlagsToString(uint8_t flags, std::string const & delimiter="|") [member function]
+    cls.add_method('FlagsToString', 
+                   'std::string', 
+                   [param('uint8_t', 'flags'), param('std::string const &', 'delimiter', default_value='"|"')], 
+                   is_static=True)
     ## tcp-header.h (module 'internet'): ns3::SequenceNumber32 ns3::TcpHeader::GetAckNumber() const [member function]
     cls.add_method('GetAckNumber', 
                    'ns3::SequenceNumber32', 
@@ -9755,6 +9760,11 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ScaleSsThresh(uint8_t scaleFactor) [member function]
+    cls.add_method('ScaleSsThresh', 
+                   'void', 
+                   [param('uint8_t', 'scaleFactor')], 
+                   is_pure_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', 
@@ -9860,11 +9870,16 @@
                    'uint32_t', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::UpdateWindowSize(ns3::TcpHeader const & header) [member function]
+    cls.add_method('UpdateWindowSize', 
+                   'void', 
+                   [param('ns3::TcpHeader const &', 'header')], 
+                   visibility='protected')
     ## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::Window() [member function]
     cls.add_method('Window', 
                    'uint32_t', 
                    [], 
-                   visibility='protected', is_virtual=True)
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpSocketFactory_methods(root_module, cls):
@@ -9929,6 +9944,11 @@
                    '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', 
@@ -10073,6 +10093,11 @@
                    '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', 
@@ -14584,15 +14609,6 @@
                    'ns3::Address', 
                    [], 
                    is_const=True)
-    ## ndisc-cache.h (module 'internet'): uint8_t ns3::NdiscCache::Entry::GetNSRetransmit() const [member function]
-    cls.add_method('GetNSRetransmit', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::IncNSRetransmit() [member function]
-    cls.add_method('IncNSRetransmit', 
-                   'void', 
-                   [])
     ## ndisc-cache.h (module 'internet'): bool ns3::NdiscCache::Entry::IsDelay() const [member function]
     cls.add_method('IsDelay', 
                    'bool', 
@@ -14651,10 +14667,6 @@
     cls.add_method('MarkStale', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::ResetNSRetransmit() [member function]
-    cls.add_method('ResetNSRetransmit', 
-                   'void', 
-                   [])
     ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::SetIpv6Address(ns3::Ipv6Address ipv6Address) [member function]
     cls.add_method('SetIpv6Address', 
                    'void', 
@@ -14683,20 +14695,8 @@
     cls.add_method('StartRetransmitTimer', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopDelayTimer() [member function]
-    cls.add_method('StopDelayTimer', 
-                   'void', 
-                   [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopProbeTimer() [member function]
-    cls.add_method('StopProbeTimer', 
-                   'void', 
-                   [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopReachableTimer() [member function]
-    cls.add_method('StopReachableTimer', 
-                   'void', 
-                   [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopRetransmitTimer() [member function]
-    cls.add_method('StopRetransmitTimer', 
+    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopNudTimer() [member function]
+    cls.add_method('StopNudTimer', 
                    'void', 
                    [])
     ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::UpdateLastReachabilityconfirmation() [member function]
@@ -15640,6 +15640,11 @@
                    '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', 
@@ -15712,6 +15717,11 @@
                    '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', 
@@ -15764,6 +15774,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True, visibility='protected', is_virtual=True)
+    ## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::ScaleSsThresh(uint8_t scaleFactor) [member function]
+    cls.add_method('ScaleSsThresh', 
+                   'void', 
+                   [param('uint8_t', 'scaleFactor')], 
+                   visibility='protected', is_virtual=True)
     ## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::SetInitialCwnd(uint32_t cwnd) [member function]
     cls.add_method('SetInitialCwnd', 
                    'void', 
@@ -15774,6 +15789,11 @@
                    'void', 
                    [param('uint32_t', 'threshold')], 
                    visibility='protected', is_virtual=True)
+    ## tcp-rfc793.h (module 'internet'): uint32_t ns3::TcpRfc793::Window() [member function]
+    cls.add_method('Window', 
+                   'uint32_t', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TimeValue_methods(root_module, cls):
diff -Naur ns-3.22/src/internet/bindings/modulegen__gcc_LP64.py ns-3.23/src/internet/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/internet/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -8893,6 +8893,11 @@
     cls.add_method('EnableChecksums', 
                    'void', 
                    [])
+    ## tcp-header.h (module 'internet'): static std::string ns3::TcpHeader::FlagsToString(uint8_t flags, std::string const & delimiter="|") [member function]
+    cls.add_method('FlagsToString', 
+                   'std::string', 
+                   [param('uint8_t', 'flags'), param('std::string const &', 'delimiter', default_value='"|"')], 
+                   is_static=True)
     ## tcp-header.h (module 'internet'): ns3::SequenceNumber32 ns3::TcpHeader::GetAckNumber() const [member function]
     cls.add_method('GetAckNumber', 
                    'ns3::SequenceNumber32', 
@@ -9755,6 +9760,11 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ScaleSsThresh(uint8_t scaleFactor) [member function]
+    cls.add_method('ScaleSsThresh', 
+                   'void', 
+                   [param('uint8_t', 'scaleFactor')], 
+                   is_pure_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', 
@@ -9860,11 +9870,16 @@
                    'uint32_t', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::UpdateWindowSize(ns3::TcpHeader const & header) [member function]
+    cls.add_method('UpdateWindowSize', 
+                   'void', 
+                   [param('ns3::TcpHeader const &', 'header')], 
+                   visibility='protected')
     ## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::Window() [member function]
     cls.add_method('Window', 
                    'uint32_t', 
                    [], 
-                   visibility='protected', is_virtual=True)
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpSocketFactory_methods(root_module, cls):
@@ -9929,6 +9944,11 @@
                    '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', 
@@ -10073,6 +10093,11 @@
                    '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', 
@@ -14584,15 +14609,6 @@
                    'ns3::Address', 
                    [], 
                    is_const=True)
-    ## ndisc-cache.h (module 'internet'): uint8_t ns3::NdiscCache::Entry::GetNSRetransmit() const [member function]
-    cls.add_method('GetNSRetransmit', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::IncNSRetransmit() [member function]
-    cls.add_method('IncNSRetransmit', 
-                   'void', 
-                   [])
     ## ndisc-cache.h (module 'internet'): bool ns3::NdiscCache::Entry::IsDelay() const [member function]
     cls.add_method('IsDelay', 
                    'bool', 
@@ -14651,10 +14667,6 @@
     cls.add_method('MarkStale', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::ResetNSRetransmit() [member function]
-    cls.add_method('ResetNSRetransmit', 
-                   'void', 
-                   [])
     ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::SetIpv6Address(ns3::Ipv6Address ipv6Address) [member function]
     cls.add_method('SetIpv6Address', 
                    'void', 
@@ -14683,20 +14695,8 @@
     cls.add_method('StartRetransmitTimer', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopDelayTimer() [member function]
-    cls.add_method('StopDelayTimer', 
-                   'void', 
-                   [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopProbeTimer() [member function]
-    cls.add_method('StopProbeTimer', 
-                   'void', 
-                   [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopReachableTimer() [member function]
-    cls.add_method('StopReachableTimer', 
-                   'void', 
-                   [])
-    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopRetransmitTimer() [member function]
-    cls.add_method('StopRetransmitTimer', 
+    ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopNudTimer() [member function]
+    cls.add_method('StopNudTimer', 
                    'void', 
                    [])
     ## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::UpdateLastReachabilityconfirmation() [member function]
@@ -15640,6 +15640,11 @@
                    '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', 
@@ -15712,6 +15717,11 @@
                    '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', 
@@ -15764,6 +15774,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True, visibility='protected', is_virtual=True)
+    ## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::ScaleSsThresh(uint8_t scaleFactor) [member function]
+    cls.add_method('ScaleSsThresh', 
+                   'void', 
+                   [param('uint8_t', 'scaleFactor')], 
+                   visibility='protected', is_virtual=True)
     ## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::SetInitialCwnd(uint32_t cwnd) [member function]
     cls.add_method('SetInitialCwnd', 
                    'void', 
@@ -15774,6 +15789,11 @@
                    'void', 
                    [param('uint32_t', 'threshold')], 
                    visibility='protected', is_virtual=True)
+    ## tcp-rfc793.h (module 'internet'): uint32_t ns3::TcpRfc793::Window() [member function]
+    cls.add_method('Window', 
+                   'uint32_t', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TimeValue_methods(root_module, cls):
diff -Naur ns-3.22/src/internet/helper/ipv4-routing-helper.cc ns-3.23/src/internet/helper/ipv4-routing-helper.cc
--- ns-3.22/src/internet/helper/ipv4-routing-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/helper/ipv4-routing-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -71,19 +71,25 @@
 Ipv4RoutingHelper::Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
   Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
-  Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
-  NS_ASSERT (rp);
-  rp->PrintRoutingTable (stream);
+  if (ipv4)
+    {
+      Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
+      NS_ASSERT (rp);
+      rp->PrintRoutingTable (stream);
+    }
 }
 
 void
 Ipv4RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
   Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
-  Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
-  NS_ASSERT (rp);
-  rp->PrintRoutingTable (stream);
-  Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintEvery, printInterval, node, stream);
+  if (ipv4)
+    {
+      Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
+      NS_ASSERT (rp);
+      rp->PrintRoutingTable (stream);
+      Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintEvery, printInterval, node, stream);
+    }
 }
 
 void
@@ -121,27 +127,30 @@
 void
 Ipv4RoutingHelper::PrintArpCache (Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
-  std::ostream* os = stream->GetStream ();
-
-  *os << "ARP Cache of node ";
-  std::string found = Names::FindName (node);
-  if (Names::FindName (node) != "")
-    {
-      *os << found;
-    }
-  else
-    {
-      *os << static_cast<int> (node->GetId ());
-    }
-  *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
-
   Ptr<Ipv4L3Protocol> ipv4 = node->GetObject<Ipv4L3Protocol> ();
-  for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
+  if (ipv4)
     {
-      Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
-      if (arpCache)
+      std::ostream* os = stream->GetStream ();
+
+      *os << "ARP Cache of node ";
+      std::string found = Names::FindName (node);
+      if (Names::FindName (node) != "")
+        {
+          *os << found;
+        }
+      else
+        {
+          *os << static_cast<int> (node->GetId ());
+        }
+      *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+      for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
         {
-          arpCache->PrintArpCache (stream);
+          Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
+          if (arpCache)
+            {
+              arpCache->PrintArpCache (stream);
+            }
         }
     }
 }
@@ -149,30 +158,33 @@
 void
 Ipv4RoutingHelper::PrintArpCacheEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
-  std::ostream* os = stream->GetStream ();
-
-  *os << "ARP Cache of node ";
-  std::string found = Names::FindName (node);
-  if (Names::FindName (node) != "")
-    {
-      *os << found;
-    }
-  else
-    {
-      *os << static_cast<int> (node->GetId ());
-    }
-  *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
-
   Ptr<Ipv4L3Protocol> ipv4 = node->GetObject<Ipv4L3Protocol> ();
-  for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
+  if (ipv4)
     {
-      Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
-      if (arpCache)
+      std::ostream* os = stream->GetStream ();
+
+      *os << "ARP Cache of node ";
+      std::string found = Names::FindName (node);
+      if (Names::FindName (node) != "")
         {
-          arpCache->PrintArpCache (stream);
+          *os << found;
         }
+      else
+        {
+          *os << static_cast<int> (node->GetId ());
+        }
+      *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+      for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
+        {
+          Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
+          if (arpCache)
+            {
+              arpCache->PrintArpCache (stream);
+            }
+        }
+      Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintArpCacheEvery, printInterval, node, stream);
     }
-  Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintArpCacheEvery, printInterval, node, stream);
 }
 
 } // namespace ns3
diff -Naur ns-3.22/src/internet/helper/ipv6-routing-helper.cc ns-3.23/src/internet/helper/ipv6-routing-helper.cc
--- ns-3.22/src/internet/helper/ipv6-routing-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/helper/ipv6-routing-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -71,19 +71,25 @@
 Ipv6RoutingHelper::Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
   Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
-  Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
-  NS_ASSERT (rp);
-  rp->PrintRoutingTable (stream);
+  if (ipv6)
+    {
+      Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
+      NS_ASSERT (rp);
+      rp->PrintRoutingTable (stream);
+    }
 }
 
 void
 Ipv6RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
   Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
-  Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
-  NS_ASSERT (rp);
-  rp->PrintRoutingTable (stream);
-  Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, printInterval, node, stream);
+  if (ipv6)
+    {
+      Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
+      NS_ASSERT (rp);
+      rp->PrintRoutingTable (stream);
+      Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, printInterval, node, stream);
+    }
 }
 
 void
@@ -121,27 +127,30 @@
 void
 Ipv6RoutingHelper::PrintNdiscCache (Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
-  std::ostream* os = stream->GetStream ();
-
-  *os << "NDISC Cache of node ";
-  std::string found = Names::FindName (node);
-  if (Names::FindName (node) != "")
-    {
-      *os << found;
-    }
-  else
-    {
-      *os << static_cast<int> (node->GetId ());
-    }
-  *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
-
   Ptr<Ipv6L3Protocol> ipv6 = node->GetObject<Ipv6L3Protocol> ();
-  for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
+  if (ipv6)
     {
-      Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ();
-      if (ndiscCache)
+      std::ostream* os = stream->GetStream ();
+
+      *os << "NDISC Cache of node ";
+      std::string found = Names::FindName (node);
+      if (Names::FindName (node) != "")
+        {
+          *os << found;
+        }
+      else
+        {
+          *os << static_cast<int> (node->GetId ());
+        }
+      *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+      for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
         {
-          ndiscCache->PrintNdiscCache (stream);
+          Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ();
+          if (ndiscCache)
+            {
+              ndiscCache->PrintNdiscCache (stream);
+            }
         }
     }
 }
@@ -149,30 +158,33 @@
 void
 Ipv6RoutingHelper::PrintNdiscCacheEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
 {
-  std::ostream* os = stream->GetStream ();
-
-  *os << "NDISC Cache of node ";
-  std::string found = Names::FindName (node);
-  if (Names::FindName (node) != "")
-    {
-      *os << found;
-    }
-  else
-    {
-      *os << static_cast<int> (node->GetId ());
-    }
-  *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
-
   Ptr<Ipv6L3Protocol> ipv6 = node->GetObject<Ipv6L3Protocol> ();
-  for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
+  if (ipv6)
     {
-      Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ();
-      if (ndiscCache)
+      std::ostream* os = stream->GetStream ();
+
+      *os << "NDISC Cache of node ";
+      std::string found = Names::FindName (node);
+      if (Names::FindName (node) != "")
         {
-          ndiscCache->PrintNdiscCache (stream);
+          *os << found;
         }
+      else
+        {
+          *os << static_cast<int> (node->GetId ());
+        }
+      *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+      for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
+        {
+          Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ();
+          if (ndiscCache)
+            {
+              ndiscCache->PrintNdiscCache (stream);
+            }
+        }
+      Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintNdiscCacheEvery, printInterval, node, stream);
     }
-  Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintNdiscCacheEvery, printInterval, node, stream);
 }
 
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/arp-cache.cc ns-3.23/src/internet/model/arp-cache.cc
--- ns-3.22/src/internet/model/arp-cache.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/arp-cache.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::ArpCache")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("AliveTimeout",
                    "When this timeout expires, "
                    "the matching cache entry needs refreshing",
diff -Naur ns-3.22/src/internet/model/arp-header.cc ns-3.23/src/internet/model/arp-header.cc
--- ns-3.22/src/internet/model/arp-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/arp-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -98,6 +98,7 @@
 {
   static TypeId tid = TypeId ("ns3::ArpHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<ArpHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/arp-l3-protocol.cc ns-3.23/src/internet/model/arp-l3-protocol.cc
--- ns-3.22/src/internet/model/arp-l3-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/arp-l3-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,6 +46,7 @@
   static TypeId tid = TypeId ("ns3::ArpL3Protocol")
     .SetParent<Object> ()
     .AddConstructor<ArpL3Protocol> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("CacheList",
                    "The list of ARP caches",
                    ObjectVectorValue (),
diff -Naur ns-3.22/src/internet/model/codel-queue.cc ns-3.23/src/internet/model/codel-queue.cc
--- ns-3.22/src/internet/model/codel-queue.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/codel-queue.cc	2015-05-13 11:05:27.000000000 -0700
@@ -148,6 +148,7 @@
 {
   static TypeId tid = TypeId ("ns3::CoDelQueue")
     .SetParent<Queue> ()
+    .SetGroupName ("Internet")
     .AddConstructor<CoDelQueue> ()
     .AddAttribute ("Mode",
                    "Whether to use Bytes (see MaxBytes) or Packets (see MaxPackets) as the maximum queue size metric.",
@@ -399,6 +400,12 @@
               // hence the while loop.
               NS_LOG_LOGIC ("Sojourn time is still above target and it's time for next drop; dropping " << p);
               Drop (p);
+
+              // p was in queue, trace dequeue and update stats manually
+              m_traceDequeue (p);
+              m_nBytes -= p->GetSize ();
+              m_nPackets--;
+
               ++m_dropCount;
               ++m_count;
               NewtonStep ();
@@ -444,6 +451,12 @@
           NS_LOG_LOGIC ("Sojourn time goes above target, dropping the first packet " << p << " and entering the dropping state");
           ++m_dropCount;
           Drop (p);
+
+          // p was in queue, trace the dequeue and update stats manually
+          m_traceDequeue (p);
+          m_nBytes -= p->GetSize ();
+          m_nPackets--;
+
           if (m_packets.empty ())
             {
               m_dropping = false;
diff -Naur ns-3.22/src/internet/model/global-router-interface.cc ns-3.23/src/internet/model/global-router-interface.cc
--- ns-3.22/src/internet/model/global-router-interface.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/global-router-interface.cc	2015-05-13 11:05:27.000000000 -0700
@@ -510,7 +510,8 @@
 GlobalRouter::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::GlobalRouter")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Internet");
   return tid;
 }
 
diff -Naur ns-3.22/src/internet/model/icmpv4.cc ns-3.23/src/internet/model/icmpv4.cc
--- ns-3.22/src/internet/model/icmpv4.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/icmpv4.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv4Header")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv4Header> ()
   ;
   return tid;
@@ -198,6 +199,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv4Echo")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv4Echo> ()
   ;
   return tid;
@@ -277,6 +279,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv4DestinationUnreachable")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv4DestinationUnreachable> ()
   ;
   return tid;
@@ -400,6 +403,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv4TimeExceeded")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv4TimeExceeded> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/icmpv4-l4-protocol.cc ns-3.23/src/internet/model/icmpv4-l4-protocol.cc
--- ns-3.22/src/internet/model/icmpv4-l4-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/icmpv4-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -23,6 +23,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv4L4Protocol")
     .SetParent<IpL4Protocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv4L4Protocol> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/icmpv6-header.cc ns-3.23/src/internet/model/icmpv6-header.cc
--- ns-3.22/src/internet/model/icmpv6-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/icmpv6-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6Header")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6Header> ()
   ;
   return tid;
@@ -187,6 +188,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6NS")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6NS> ()
   ;
   return tid;
@@ -300,6 +302,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6NA")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6NA> ()
   ;
   return tid;
@@ -483,6 +486,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6RA")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6RA> ()
   ;
   return tid;
@@ -702,6 +706,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6RS")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6RS> ()
   ;
   return tid;
@@ -792,6 +797,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6Redirection")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6Redirection> ()
   ;
   return tid;
@@ -922,6 +928,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6Echo")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6Echo> ()
   ;
   return tid;
@@ -1039,6 +1046,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6DestinationUnreachable")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6DestinationUnreachable> ()
   ;
   return tid;
@@ -1136,6 +1144,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6TooBig")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6TooBig> ()
   ;
   return tid;
@@ -1246,6 +1255,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6TimeExceeded")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6TimeExceeded> ()
   ;
   return tid;
@@ -1345,6 +1355,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6ParameterError")
     .SetParent<Icmpv6Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6ParameterError> ()
   ;
   return tid;
@@ -1455,6 +1466,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6OptionHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6OptionHeader> ()
   ;
   return tid;
@@ -1533,6 +1545,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6OptionMtu")
     .SetParent<Icmpv6OptionHeader> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6OptionMtu> ()
   ;
   return tid;
@@ -1629,6 +1642,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6OptionPrefixInformation")
     .SetParent<Icmpv6OptionHeader> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6OptionPrefixInformation> ()
   ;
   return tid;
@@ -1802,6 +1816,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6OptionLinkLayerAddress")
     .SetParent<Icmpv6OptionHeader> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6OptionLinkLayerAddress> ()
   ;
   return tid;
@@ -1910,6 +1925,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6OptionRedirected")
     .SetParent<Icmpv6OptionHeader> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6OptionRedirected> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/icmpv6-l4-protocol.cc ns-3.23/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.22/src/internet/model/icmpv6-l4-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/icmpv6-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -69,6 +69,7 @@
 {
   static TypeId tid = TypeId ("ns3::Icmpv6L4Protocol")
     .SetParent<IpL4Protocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Icmpv6L4Protocol> ()
     .AddAttribute ("DAD", "Always do DAD check.",
                    BooleanValue (true),
@@ -379,10 +380,9 @@
       std::list<Ptr<Packet> > waiting;
       if (entry->IsIncomplete ())
         {
-          entry->StopRetransmitTimer ();
+          entry->StopNudTimer ();
           // mark it to reachable
           waiting = entry->MarkReachable (lla.GetAddress ());
-          entry->StopReachableTimer ();
           entry->StartReachableTimer ();
           // send out waiting packet
           for (std::list<Ptr<Packet> >::const_iterator it = waiting.begin (); it != waiting.end (); it++)
@@ -403,8 +403,7 @@
             {
               if (!entry->IsReachable ())
                 {
-                  entry->StopProbeTimer ();
-                  entry->StopDelayTimer ();
+                  entry->StopNudTimer ();
                   waiting = entry->MarkReachable (lla.GetAddress ());
                   if (entry->IsProbe ())
                     {
@@ -413,7 +412,6 @@
                           cache->GetInterface ()->Send (*it, src);
                         }
                     }
-                  entry->StopReachableTimer ();
                   entry->StartReachableTimer ();
                 }
             }
@@ -664,13 +662,12 @@
   if (entry->IsIncomplete ())
     {
       /* we receive a NA so stop the retransmission timer */
-      entry->StopRetransmitTimer ();
+      entry->StopNudTimer ();
 
       if (naHeader.GetFlagS ())
         {
           /* mark it to reachable */
           waiting = entry->MarkReachable (lla.GetAddress ());
-          entry->StopReachableTimer ();
           entry->StartReachableTimer ();
           /* send out waiting packet */
           for (std::list<Ptr<Packet> >::const_iterator it = waiting.begin (); it != waiting.end (); it++)
@@ -692,8 +689,7 @@
   else
     {
       /* we receive a NA so stop the probe timer or delay timer if any */
-      entry->StopProbeTimer ();
-      entry->StopDelayTimer ();
+      entry->StopNudTimer ();
 
       /* if the Flag O is clear and mac address differs from the cache */
       if (!naHeader.GetFlagO () && lla.GetAddress () != entry->GetMacAddress ())
@@ -728,7 +724,6 @@
                           entry->MarkReachable (lla.GetAddress ());
                         }
                     }
-                  entry->StopReachableTimer ();
                   entry->StartReachableTimer ();
                 }
               else if (lla.GetAddress () != entry->GetMacAddress ())
@@ -823,7 +818,7 @@
   Ptr<Packet> origPkt = unreach.GetPacket ();
 
   Ipv6Header ipHeader;
-  if ( origPkt->GetSerializedSize () > ipHeader.GetSerializedSize () )
+  if ( origPkt->GetSize () > ipHeader.GetSerializedSize () )
     {
       origPkt->RemoveHeader (ipHeader);
       uint8_t payload[8];
diff -Naur ns-3.22/src/internet/model/ip-l4-protocol.cc ns-3.23/src/internet/model/ip-l4-protocol.cc
--- ns-3.22/src/internet/model/ip-l4-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ip-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,7 +36,8 @@
 {
   static TypeId tid = TypeId ("ns3::IpL4Protocol")
     .SetParent<Object> ()
-    .AddAttribute ("ProtocolNumber", "The Ip protocol number.",
+    .SetGroupName ("Internet")
+    .AddAttribute ("ProtocolNumber", "The IP protocol number.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&IpL4Protocol::GetProtocolNumber),
                    MakeUintegerChecker<int> ())
diff -Naur ns-3.22/src/internet/model/ipv4.cc ns-3.23/src/internet/model/ipv4.cc
--- ns-3.22/src/internet/model/ipv4.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("IpForward", "Globally enable or disable IP forwarding for all current and future Ipv4 devices.",
                    BooleanValue (true),
                    MakeBooleanAccessor (&Ipv4::SetIpForward,
diff -Naur ns-3.22/src/internet/model/ipv4-global-routing.cc ns-3.23/src/internet/model/ipv4-global-routing.cc
--- ns-3.22/src/internet/model/ipv4-global-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-global-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 { 
   static TypeId tid = TypeId ("ns3::Ipv4GlobalRouting")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("RandomEcmpRouting",
                    "Set to true if packets are randomly routed among ECMP; set to false for using only one route consistently",
                    BooleanValue (false),
diff -Naur ns-3.22/src/internet/model/ipv4-header.cc ns-3.23/src/internet/model/ipv4-header.cc
--- ns-3.22/src/internet/model/ipv4-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -320,6 +320,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4Header")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv4Header> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv4-l3-protocol.cc ns-3.23/src/internet/model/ipv4-l3-protocol.cc
--- ns-3.22/src/internet/model/ipv4-l3-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-l3-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -53,6 +53,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4L3Protocol")
     .SetParent<Ipv4> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv4L3Protocol> ()
     .AddAttribute ("DefaultTos",
                    "The TOS value set by default on "
diff -Naur ns-3.22/src/internet/model/ipv4-list-routing.cc ns-3.23/src/internet/model/ipv4-list-routing.cc
--- ns-3.22/src/internet/model/ipv4-list-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-list-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4ListRouting")
     .SetParent<Ipv4RoutingProtocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv4ListRouting> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv4-list-routing.h ns-3.23/src/internet/model/ipv4-list-routing.h
--- ns-3.22/src/internet/model/ipv4-list-routing.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-list-routing.h	2015-05-13 11:05:27.000000000 -0700
@@ -93,8 +93,8 @@
   virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
 
 protected:
-  void DoDispose (void);
-  void DoInitialize (void);
+  virtual void DoDispose (void);
+  virtual void DoInitialize (void);
 private:
   /**
    * \brief Container identifying an IPv4 Routing Protocol entry in the list.
diff -Naur ns-3.22/src/internet/model/ipv4-packet-info-tag.cc ns-3.23/src/internet/model/ipv4-packet-info-tag.cc
--- ns-3.22/src/internet/model/ipv4-packet-info-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-packet-info-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -100,6 +100,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4PacketInfoTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv4PacketInfoTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv4-packet-probe.cc ns-3.23/src/internet/model/ipv4-packet-probe.cc
--- ns-3.22/src/internet/model/ipv4-packet-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4PacketProbe")
     .SetParent<Probe> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv4PacketProbe> ()
     .AddTraceSource ( "Output",
                       "The packet plus its IPv4 object and interface "
diff -Naur ns-3.22/src/internet/model/ipv4-raw-socket-factory.cc ns-3.23/src/internet/model/ipv4-raw-socket-factory.cc
--- ns-3.22/src/internet/model/ipv4-raw-socket-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-raw-socket-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4RawSocketFactory")
     .SetParent<SocketFactory> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv4-raw-socket-impl.cc ns-3.23/src/internet/model/ipv4-raw-socket-impl.cc
--- ns-3.22/src/internet/model/ipv4-raw-socket-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-raw-socket-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -24,6 +24,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4RawSocketImpl")
     .SetParent<Socket> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("Protocol", "Protocol number to match.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&Ipv4RawSocketImpl::m_protocol),
diff -Naur ns-3.22/src/internet/model/ipv4-routing-protocol.cc ns-3.23/src/internet/model/ipv4-routing-protocol.cc
--- ns-3.22/src/internet/model/ipv4-routing-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-routing-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4RoutingProtocol")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv4-static-routing.cc ns-3.23/src/internet/model/ipv4-static-routing.cc
--- ns-3.22/src/internet/model/ipv4-static-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-static-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,6 +47,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4StaticRouting")
     .SetParent<Ipv4RoutingProtocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv4StaticRouting> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv6.cc ns-3.23/src/internet/model/ipv6.cc
--- ns-3.22/src/internet/model/ipv6.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("IpForward", "Globally enable or disable IP forwarding for all current and future IPv6 devices.",
                    BooleanValue (false),
                    MakeBooleanAccessor (&Ipv6::SetIpForward,
diff -Naur ns-3.22/src/internet/model/ipv6-extension.cc ns-3.23/src/internet/model/ipv6-extension.cc
--- ns-3.22/src/internet/model/ipv6-extension.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-extension.cc	2015-05-13 11:05:27.000000000 -0700
@@ -50,6 +50,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6Extension")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("ExtensionNumber", "The IPv6 extension number.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber),
@@ -192,6 +193,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionHopByHop")
     .SetParent<Ipv6Extension> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionHopByHop> ()
   ;
   return tid;
@@ -251,6 +253,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionDestination")
     .SetParent<Ipv6Extension> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionDestination> ()
   ;
   return tid;
@@ -310,6 +313,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionFragment")
     .SetParent<Ipv6Extension> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionFragment> ()
   ;
   return tid;
@@ -735,6 +739,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionRouting")
     .SetParent<Ipv6Extension> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionRouting> ()
   ;
   return tid;
@@ -828,6 +833,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionRoutingDemux")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("Routing Extensions", "The set of IPv6 Routing extensions registered with this demux.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&Ipv6ExtensionRoutingDemux::m_extensionsRouting),
@@ -890,6 +896,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionLooseRouting")
     .SetParent<Ipv6ExtensionRouting> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionLooseRouting> ()
   ;
   return tid;
@@ -1054,6 +1061,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionESP")
     .SetParent<Ipv6Extension> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionESP> ()
   ;
   return tid;
@@ -1099,6 +1107,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionAH")
     .SetParent<Ipv6Extension> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ExtensionAH> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-extension-demux.cc ns-3.23/src/internet/model/ipv6-extension-demux.cc
--- ns-3.22/src/internet/model/ipv6-extension-demux.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-extension-demux.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionDemux")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("Extensions", "The set of IPv6 extensions registered with this demux.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&Ipv6ExtensionDemux::m_extensions),
diff -Naur ns-3.22/src/internet/model/ipv6-extension-header.cc ns-3.23/src/internet/model/ipv6-extension-header.cc
--- ns-3.22/src/internet/model/ipv6-extension-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-extension-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionHeader")
     .AddConstructor<Ipv6ExtensionHeader> ()
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -206,6 +207,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionHopByHopHeader")
     .AddConstructor<Ipv6ExtensionHopByHopHeader> ()
     .SetParent<Ipv6ExtensionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -261,6 +263,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionDestinationHeader")
     .AddConstructor<Ipv6ExtensionDestinationHeader> ()
     .SetParent<Ipv6ExtensionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -316,6 +319,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionFragmentHeader")
     .AddConstructor<Ipv6ExtensionFragmentHeader> ()
     .SetParent<Ipv6ExtensionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -409,6 +413,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionRoutingHeader")
     .AddConstructor<Ipv6ExtensionRoutingHeader> ()
     .SetParent<Ipv6ExtensionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -488,6 +493,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionLooseRoutingHeader")
     .AddConstructor<Ipv6ExtensionLooseRoutingHeader> ()
     .SetParent<Ipv6ExtensionRoutingHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -595,6 +601,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionESPHeader")
     .AddConstructor<Ipv6ExtensionESPHeader> ()
     .SetParent<Ipv6ExtensionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -641,6 +648,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6ExtensionAHHeader")
     .AddConstructor<Ipv6ExtensionAHHeader> ()
     .SetParent<Ipv6ExtensionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv6-header.cc ns-3.23/src/internet/model/ipv6-header.cc
--- ns-3.22/src/internet/model/ipv6-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -117,6 +117,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6Header")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6Header> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-interface.cc ns-3.23/src/internet/model/ipv6-interface.cc
--- ns-3.22/src/internet/model/ipv6-interface.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-interface.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6Interface")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv6-l3-protocol.cc ns-3.23/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.22/src/internet/model/ipv6-l3-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-l3-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6L3Protocol")
     .SetParent<Ipv6> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6L3Protocol> ()
     .AddAttribute ("DefaultTtl",
                    "The TTL value set by default on all "
diff -Naur ns-3.22/src/internet/model/ipv6-list-routing.cc ns-3.23/src/internet/model/ipv6-list-routing.cc
--- ns-3.22/src/internet/model/ipv6-list-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-list-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6ListRouting")
     .SetParent<Ipv6RoutingProtocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6ListRouting> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-option.cc ns-3.23/src/internet/model/ipv6-option.cc
--- ns-3.22/src/internet/model/ipv6-option.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-option.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6Option")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("OptionNumber", "The IPv6 option number.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&Ipv6Option::GetOptionNumber),
@@ -61,6 +62,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6OptionPad1")
     .SetParent<Ipv6Option> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6OptionPad1> ()
   ;
   return tid;
@@ -105,6 +107,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6OptionPadn")
     .SetParent<Ipv6Option> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6OptionPadn> ()
   ;
   return tid;
@@ -149,6 +152,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6OptionJumbogram")
     .SetParent<Ipv6Option> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6OptionJumbogram> ()
   ;
   return tid;
@@ -193,6 +197,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6OptionRouterAlert")
     .SetParent<Ipv6Option> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6OptionRouterAlert> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-option-demux.cc ns-3.23/src/internet/model/ipv6-option-demux.cc
--- ns-3.22/src/internet/model/ipv6-option-demux.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-option-demux.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6OptionDemux")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("Options", "The set of IPv6 options registered with this demux.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&Ipv6OptionDemux::m_options),
diff -Naur ns-3.22/src/internet/model/ipv6-option-header.cc ns-3.23/src/internet/model/ipv6-option-header.cc
--- ns-3.22/src/internet/model/ipv6-option-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-option-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6OptionHeader")
     .AddConstructor<Ipv6OptionHeader> ()
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -123,6 +124,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6OptionPad1Header")
     .AddConstructor<Ipv6OptionPad1Header> ()
     .SetParent<Ipv6OptionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -174,6 +176,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6OptionPadnHeader")
     .AddConstructor<Ipv6OptionPadnHeader> ()
     .SetParent<Ipv6OptionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -234,6 +237,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6OptionJumbogramHeader")
     .AddConstructor<Ipv6OptionJumbogramHeader> ()
     .SetParent<Ipv6OptionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -247,6 +251,7 @@
 {
   SetType (0xC2);
   SetLength (4);
+  m_dataLength = 0;
 }
 
 Ipv6OptionJumbogramHeader::~Ipv6OptionJumbogramHeader ()
@@ -305,6 +310,7 @@
   static TypeId tid = TypeId ("ns3::Ipv6OptionRouterAlertHeader")
     .AddConstructor<Ipv6OptionRouterAlertHeader> ()
     .SetParent<Ipv6OptionHeader> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv6-packet-info-tag.cc ns-3.23/src/internet/model/ipv6-packet-info-tag.cc
--- ns-3.22/src/internet/model/ipv6-packet-info-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-packet-info-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -87,6 +87,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6PacketInfoTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6PacketInfoTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-packet-probe.cc ns-3.23/src/internet/model/ipv6-packet-probe.cc
--- ns-3.22/src/internet/model/ipv6-packet-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
     .SetParent<Probe> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6PacketProbe> ()
     .AddTraceSource ( "Output",
                       "The packet plus its IPv6 object and interface "
diff -Naur ns-3.22/src/internet/model/ipv6-pmtu-cache.cc ns-3.23/src/internet/model/ipv6-pmtu-cache.cc
--- ns-3.22/src/internet/model/ipv6-pmtu-cache.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-pmtu-cache.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6PmtuCache")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("CacheExpiryTime",
                    "Validity time for a Path MTU entry. Default is 10 minutes, minimum is 5 minutes.",
                    TimeValue (Seconds (60 * 10)),
diff -Naur ns-3.22/src/internet/model/ipv6-raw-socket-factory.cc ns-3.23/src/internet/model/ipv6-raw-socket-factory.cc
--- ns-3.22/src/internet/model/ipv6-raw-socket-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-raw-socket-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6RawSocketFactory")
     .SetParent<SocketFactory> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv6-raw-socket-impl.cc ns-3.23/src/internet/model/ipv6-raw-socket-impl.cc
--- ns-3.22/src/internet/model/ipv6-raw-socket-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-raw-socket-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,6 +46,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6RawSocketImpl")
     .SetParent<Socket> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("Protocol", "Protocol number to match.", 
                    UintegerValue (0),
                    MakeUintegerAccessor (&Ipv6RawSocketImpl::m_protocol),
diff -Naur ns-3.22/src/internet/model/ipv6-routing-protocol.cc ns-3.23/src/internet/model/ipv6-routing-protocol.cc
--- ns-3.22/src/internet/model/ipv6-routing-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-routing-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6RoutingProtocol")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/ipv6-static-routing.cc ns-3.23/src/internet/model/ipv6-static-routing.cc
--- ns-3.22/src/internet/model/ipv6-static-routing.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-static-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv6StaticRouting")
     .SetParent<Ipv6RoutingProtocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<Ipv6StaticRouting> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/loopback-net-device.cc ns-3.23/src/internet/model/loopback-net-device.cc
--- ns-3.22/src/internet/model/loopback-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/loopback-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::LoopbackNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Internet")
     .AddConstructor<LoopbackNetDevice> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/ndisc-cache.cc ns-3.23/src/internet/model/ndisc-cache.cc
--- ns-3.22/src/internet/model/ndisc-cache.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ndisc-cache.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::NdiscCache")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("UnresolvedQueueSize",
                    "Size of the queue for packets pending an NA reply.",
                    UintegerValue (DEFAULT_UNRES_QLEN),
@@ -197,10 +198,7 @@
   : m_ndCache (nd),
     m_waiting (),
     m_router (false),
-    m_reachableTimer (Timer::CANCEL_ON_DESTROY),
-    m_retransTimer (Timer::CANCEL_ON_DESTROY),
-    m_probeTimer (Timer::CANCEL_ON_DESTROY),
-    m_delayTimer (Timer::CANCEL_ON_DESTROY),
+    m_nudTimer (Timer::CANCEL_ON_DESTROY),
     m_lastReachabilityConfirmation (Seconds (0.0)),
     m_nsRetransmit (0)
 {
@@ -268,9 +266,9 @@
         }
     }
 
-  if (GetNSRetransmit () < icmpv6->MAX_MULTICAST_SOLICIT)
+  if (m_nsRetransmit < icmpv6->MAX_MULTICAST_SOLICIT)
     {
-      IncNSRetransmit ();
+      m_nsRetransmit++;
 
       icmpv6->SendNS (addr, Ipv6Address::MakeSolicitedAddress (m_ipv6Address), m_ipv6Address, m_ndCache->GetDevice ()->GetAddress ());
       /* arm the timer again */
@@ -323,8 +321,7 @@
   Ptr<Packet> p = icmpv6->ForgeNS (addr, m_ipv6Address, m_ipv6Address, m_ndCache->GetDevice ()->GetAddress ());
   m_ndCache->GetDevice ()->Send (p, this->GetMacAddress (), Ipv6L3Protocol::PROT_NUMBER);
 
-  ResetNSRetransmit ();
-  IncNSRetransmit ();
+  m_nsRetransmit = 1;
   StartProbeTimer ();
 }
 
@@ -334,8 +331,10 @@
   Ptr<Ipv6L3Protocol> ipv6 = m_ndCache->GetDevice ()->GetNode ()->GetObject<Ipv6L3Protocol> ();
   Ptr<Icmpv6L4Protocol> icmpv6 = ipv6->GetIcmpv6 ();
 
-  if (GetNSRetransmit () < icmpv6->MAX_UNICAST_SOLICIT)
+  if (m_nsRetransmit < icmpv6->MAX_UNICAST_SOLICIT)
     {
+      m_nsRetransmit++;
+
       Ipv6Address addr;
 
       if (m_ipv6Address.IsLinkLocal ())
@@ -358,7 +357,6 @@
           return;
         }
 
-      IncNSRetransmit ();
       /* icmpv6->SendNS (m_ndCache->GetInterface ()->GetLinkLocalAddress (), m_ipv6Address, m_ipv6Address, m_ndCache->GetDevice ()->GetAddress ()); */
       Ptr<Packet> p = icmpv6->ForgeNS (addr, m_ipv6Address, m_ipv6Address, m_ndCache->GetDevice ()->GetAddress ());
       m_ndCache->GetDevice ()->Send (p, this->GetMacAddress (), Ipv6L3Protocol::PROT_NUMBER);
@@ -379,24 +377,6 @@
   m_ipv6Address = ipv6Address;
 }
 
-uint8_t NdiscCache::Entry::GetNSRetransmit () const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  return m_nsRetransmit;
-}
-
-void NdiscCache::Entry::IncNSRetransmit ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_nsRetransmit++;
-}
-
-void NdiscCache::Entry::ResetNSRetransmit ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_nsRetransmit = 0;
-}
-
 Time NdiscCache::Entry::GetLastReachabilityConfirmation () const
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -411,77 +391,57 @@
 void NdiscCache::Entry::StartReachableTimer ()
 {
   NS_LOG_FUNCTION_NOARGS ();
-  if (m_reachableTimer.IsRunning ())
+  if (m_nudTimer.IsRunning ())
     {
-      m_reachableTimer.Cancel ();
+      m_nudTimer.Cancel ();
     }
-  m_reachableTimer.SetFunction (&NdiscCache::Entry::FunctionReachableTimeout, this);
-  m_reachableTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::REACHABLE_TIME));
-  m_reachableTimer.Schedule ();
-}
 
-void NdiscCache::Entry::StopReachableTimer ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_reachableTimer.Cancel ();
+  m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionReachableTimeout, this);
+  m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::REACHABLE_TIME));
+  m_nudTimer.Schedule ();
 }
 
 void NdiscCache::Entry::StartProbeTimer ()
 {
   NS_LOG_FUNCTION_NOARGS ();
-  if (m_probeTimer.IsRunning ())
+  if (m_nudTimer.IsRunning ())
     {
-      m_probeTimer.Cancel ();
+      m_nudTimer.Cancel ();
     }
-  m_probeTimer.SetFunction (&NdiscCache::Entry::FunctionProbeTimeout, this);
-  m_probeTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
-  m_probeTimer.Schedule ();
-}
-
-void NdiscCache::Entry::StopProbeTimer ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_probeTimer.Cancel ();
-  ResetNSRetransmit ();
+  m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionProbeTimeout, this);
+  m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
+  m_nudTimer.Schedule ();
 }
 
-
 void NdiscCache::Entry::StartDelayTimer ()
 {
   NS_LOG_FUNCTION_NOARGS ();
-  if (m_delayTimer.IsRunning ())
+  if (m_nudTimer.IsRunning ())
     {
-      m_delayTimer.Cancel ();
+      m_nudTimer.Cancel ();
     }
-  m_delayTimer.SetFunction (&NdiscCache::Entry::FunctionDelayTimeout, this);
-  m_delayTimer.SetDelay (Seconds (Icmpv6L4Protocol::DELAY_FIRST_PROBE_TIME));
-  m_delayTimer.Schedule ();
-}
-
-void NdiscCache::Entry::StopDelayTimer ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_delayTimer.Cancel ();
-  ResetNSRetransmit ();
+  m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionDelayTimeout, this);
+  m_nudTimer.SetDelay (Seconds (Icmpv6L4Protocol::DELAY_FIRST_PROBE_TIME));
+  m_nudTimer.Schedule ();
 }
 
 void NdiscCache::Entry::StartRetransmitTimer ()
 {
   NS_LOG_FUNCTION_NOARGS ();
-  if (m_retransTimer.IsRunning ())
+  if (m_nudTimer.IsRunning ())
     {
-      m_retransTimer.Cancel ();
+      m_nudTimer.Cancel ();
     }
-  m_retransTimer.SetFunction (&NdiscCache::Entry::FunctionRetransmitTimeout, this);
-  m_retransTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
-  m_retransTimer.Schedule ();
+  m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionRetransmitTimeout, this);
+  m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
+  m_nudTimer.Schedule ();
 }
 
-void NdiscCache::Entry::StopRetransmitTimer ()
+void NdiscCache::Entry::StopNudTimer ()
 {
   NS_LOG_FUNCTION_NOARGS ();
-  m_retransTimer.Cancel ();
-  ResetNSRetransmit ();
+  m_nudTimer.Cancel ();
+  m_nsRetransmit = 0;
 }
 
 void NdiscCache::Entry::MarkIncomplete (Ptr<Packet> p)
@@ -573,7 +533,7 @@
 
 void NdiscCache::Entry::SetMacAddress (Address mac)
 {
-  NS_LOG_FUNCTION (this << mac);
+  NS_LOG_FUNCTION (this << mac << int(m_state));
   m_macAddress = mac;
 }
 
diff -Naur ns-3.22/src/internet/model/ndisc-cache.h ns-3.23/src/internet/model/ndisc-cache.h
--- ns-3.22/src/internet/model/ndisc-cache.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ndisc-cache.h	2015-05-13 11:05:27.000000000 -0700
@@ -250,22 +250,6 @@
     void SetRouter (bool router);
 
     /**
-     * \brief Get the number of NS retransmit.
-     * \return number of NS that have been retransmit
-     */
-    uint8_t GetNSRetransmit () const;
-
-    /**
-     * \brief Increment NS retransmit.
-     */
-    void IncNSRetransmit ();
-
-    /**
-     * \brief Reset NS retransmit (=0).
-     */
-    void ResetNSRetransmit ();
-
-    /**
      * \brief Get the time of last reachability confirmation.
      * \return time
      */
@@ -282,39 +266,24 @@
     void StartReachableTimer ();
 
     /**
-     * \brief Stop the reachable timer.
-     */
-    void StopReachableTimer ();
-
-    /**
      * \brief Start retransmit timer.
      */
     void StartRetransmitTimer ();
 
     /**
-     * \brief Stop retransmit timer.
-     */
-    void StopRetransmitTimer ();
-
-    /**
      * \brief Start probe timer.
      */
     void StartProbeTimer ();
 
     /**
-     * \brief Stop probe timer.
-     */
-    void StopProbeTimer ();
-
-    /**
      * \brief Start delay timer.
      */
     void StartDelayTimer ();
 
     /**
-     * \brief Stop delay timer.
+     * \brief Stop NUD timer and reset the NUD retransmission counter
      */
-    void StopDelayTimer ();
+    void StopNudTimer ();
 
     /**
      * \brief Function called when reachable timer timeout.
@@ -388,24 +357,9 @@
     bool m_router;
 
     /**
-     * \brief Reachable timer (used for NUD in REACHABLE state).
-     */
-    Timer m_reachableTimer;
-
-    /**
-     * \brief Retransmission timer (used for NUD in INCOMPLETE state).
-     */
-    Timer m_retransTimer;
-
-    /**
-     * \brief Probe timer (used for NUD in PROBE state).
-     */
-    Timer m_probeTimer;
-
-    /**
-     * \brief Delay timer (used for NUD when in DELAY state).
+     * \brief Timer (used for NUD).
      */
-    Timer m_delayTimer;
+    Timer m_nudTimer;
 
     /**
      * \brief Last time we see a reachability confirmation.
diff -Naur ns-3.22/src/internet/model/nsc-tcp-l4-protocol.cc ns-3.23/src/internet/model/nsc-tcp-l4-protocol.cc
--- ns-3.22/src/internet/model/nsc-tcp-l4-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/nsc-tcp-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -126,6 +126,7 @@
 {
   static TypeId tid = TypeId ("ns3::NscTcpL4Protocol")
     .SetParent<IpL4Protocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<NscTcpL4Protocol>()
     .AddAttribute ("SocketList", "The list of sockets associated to this protocol.",
                    ObjectVectorValue (),
diff -Naur ns-3.22/src/internet/model/nsc-tcp-socket-impl.cc ns-3.23/src/internet/model/nsc-tcp-socket-impl.cc
--- ns-3.22/src/internet/model/nsc-tcp-socket-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/nsc-tcp-socket-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -54,6 +54,7 @@
 {
   static TypeId tid = TypeId ("ns3::NscTcpSocketImpl")
     .SetParent<TcpSocket> ()
+    .SetGroupName ("Internet")
     .AddTraceSource ("CongestionWindow",
                      "The TCP connection's congestion window",
                      MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd),
diff -Naur ns-3.22/src/internet/model/ripng.cc ns-3.23/src/internet/model/ripng.cc
--- ns-3.22/src/internet/model/ripng.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ripng.cc	2015-05-13 11:05:27.000000000 -0700
@@ -57,6 +57,7 @@
 {
   static TypeId tid = TypeId ("ns3::RipNg")
     .SetParent<Ipv6RoutingProtocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<RipNg> ()
     .AddAttribute ("UnsolicitedRoutingUpdate", "The time between two Unsolicited Routing Updates.",
                    TimeValue (Seconds(30)),
@@ -246,6 +247,15 @@
           NS_LOG_LOGIC ("Address " << addr << " not a match");
         }
     }
+
+  if (header.GetDestinationAddress ().IsLinkLocal () ||
+      header.GetSourceAddress ().IsLinkLocal ())
+    {
+      NS_LOG_LOGIC ("Dropping packet not for me and with src or dst LinkLocal");
+      ecb (p, header, Socket::ERROR_NOROUTETOHOST);
+      return false;
+    }
+
   // Check if input device supports IP forwarding
   if (m_ipv6->IsForwarding (iif) == false)
     {
@@ -259,13 +269,13 @@
 
   if (rtentry != 0)
     {
-      NS_LOG_LOGIC ("Found unicast destination- calling unicast callback");
+      NS_LOG_LOGIC ("Found unicast destination - calling unicast callback");
       ucb (idev, rtentry, p, header);  // unicast forwarding callback
       return true;
     }
   else
     {
-      NS_LOG_LOGIC ("Did not find unicast destination- returning false");
+      NS_LOG_LOGIC ("Did not find unicast destination - returning false");
       return false; // Let other routing protocols try to handle this
     }
 }
@@ -282,15 +292,7 @@
 
       if (address != Ipv6Address () && networkMask != Ipv6Prefix ())
         {
-          if (networkMask == Ipv6Prefix (128))
-            {
-              /* host route */
-              AddNetworkRouteTo (networkAddress, Ipv6Prefix::GetOnes (), 0);
-            }
-          else
-            {
-              AddNetworkRouteTo (networkAddress, networkMask, i);
-            }
+          AddNetworkRouteTo (networkAddress, networkMask, i);
         }
     }
 
@@ -320,10 +322,6 @@
     {
       Ipv6InterfaceAddress address = m_ipv6->GetAddress (i, j);
 
-      Ipv6Address networkAddress = address.GetAddress ().CombinePrefix (address.GetPrefix ());
-      Ipv6Prefix networkMask = address.GetPrefix ();
-      AddNetworkRouteTo (networkAddress, networkMask, i);
-
       if (address.GetScope() == Ipv6InterfaceAddress::LINKLOCAL && sendSocketFound == false && activeInterface == true)
         {
           NS_LOG_LOGIC ("RIPng: adding sending socket to " << address.GetAddress ());
diff -Naur ns-3.22/src/internet/model/ripng-header.cc ns-3.23/src/internet/model/ripng-header.cc
--- ns-3.22/src/internet/model/ripng-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ripng-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,7 +35,10 @@
 
 TypeId RipNgRte::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RipNgRte").SetParent<Header> ().AddConstructor<RipNgRte> ();
+  static TypeId tid = TypeId ("ns3::RipNgRte")
+    .SetParent<Header> ()
+    .SetGroupName ("Internet")
+    .AddConstructor<RipNgRte> ();
   return tid;
 }
 
@@ -139,7 +142,10 @@
 
 TypeId RipNgHeader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RipNgHeader").SetParent<Header> ().AddConstructor<RipNgHeader> ();
+  static TypeId tid = TypeId ("ns3::RipNgHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Internet")
+    .AddConstructor<RipNgHeader> ();
   return tid;
 }
 
diff -Naur ns-3.22/src/internet/model/rtt-estimator.cc ns-3.23/src/internet/model/rtt-estimator.cc
--- ns-3.22/src/internet/model/rtt-estimator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/rtt-estimator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::RttEstimator")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("InitialEstimation", 
                    "Initial RTT estimate",
                    TimeValue (Seconds (1.0)),
@@ -129,6 +130,7 @@
 {
   static TypeId tid = TypeId ("ns3::RttMeanDeviation")
     .SetParent<RttEstimator> ()
+    .SetGroupName ("Internet")
     .AddConstructor<RttMeanDeviation> ()
     .AddAttribute ("Alpha",
                    "Gain used in estimating the RTT, must be 0 <= alpha <= 1",
@@ -170,23 +172,23 @@
       return 0;
     }
   // supports 1/32, 1/16, 1/8, 1/4, 1/2
-  if (abs (1/val - 8) < TOLERANCE)
+  if (std::abs (1/val - 8) < TOLERANCE)
     {
       return 3;
     }
-  if (abs (1/val - 4) < TOLERANCE)
+  if (std::abs (1/val - 4) < TOLERANCE)
     {
       return 2;
     }
-  if (abs (1/val - 32) < TOLERANCE)
+  if (std::abs (1/val - 32) < TOLERANCE)
     {
       return 5;
     }
-  if (abs (1/val - 16) < TOLERANCE)
+  if (std::abs (1/val - 16) < TOLERANCE)
     {
       return 4;
     }
-  if (abs (1/val - 2) < TOLERANCE)
+  if (std::abs (1/val - 2) < TOLERANCE)
     {
       return 1;
     }
diff -Naur ns-3.22/src/internet/model/tcp-header.cc ns-3.23/src/internet/model/tcp-header.cc
--- ns-3.22/src/internet/model/tcp-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,6 +51,34 @@
 {
 }
 
+std::string
+TcpHeader::FlagsToString (uint8_t flags, const std::string& delimiter)
+{
+  static const char* flagNames[8] = {
+    "FIN",
+    "SYN",
+    "RST",
+    "PSH",
+    "ACK",
+    "URG",
+    "ECE",
+    "CWR"
+  };
+  std::string flagsDescription = "";
+  for (uint8_t i = 0; i < 8; ++i)
+    {
+      if (flags & (1 << i))
+        {
+          if (flagsDescription.length() > 0) 
+            {
+              flagsDescription += delimiter;
+            }
+          flagsDescription.append (flagNames[i]);
+        }
+    }
+  return flagsDescription;
+}
+
 void
 TcpHeader::EnableChecksums (void)
 {
@@ -231,6 +259,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpHeader> ()
   ;
   return tid;
@@ -249,41 +278,7 @@
 
   if (m_flags != 0)
     {
-      os<<" [";
-      if ((m_flags & FIN) != 0)
-        {
-          os<<" FIN ";
-        }
-      if ((m_flags & SYN) != 0)
-        {
-          os<<" SYN ";
-        }
-      if ((m_flags & RST) != 0)
-        {
-          os<<" RST ";
-        }
-      if ((m_flags & PSH) != 0)
-        {
-          os<<" PSH ";
-        }
-      if ((m_flags & ACK) != 0)
-        {
-          os<<" ACK ";
-        }
-      if ((m_flags & URG) != 0)
-        {
-          os<<" URG ";
-        }
-      if ((m_flags & ECE) != 0)
-        {
-          os<<" ECE ";
-        }
-      if ((m_flags & CWR) != 0)
-        {
-          os<<" CWR ";
-        }
-
-      os<<"]";
+      os<<" [" << FlagsToString(m_flags) <<"]";
     }
 
   os<<" Seq="<<m_sequenceNumber<<" Ack="<<m_ackNumber<<" Win="<<m_windowSize;
diff -Naur ns-3.22/src/internet/model/tcp-header.h ns-3.23/src/internet/model/tcp-header.h
--- ns-3.22/src/internet/model/tcp-header.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-header.h	2015-05-13 11:05:27.000000000 -0700
@@ -41,13 +41,30 @@
  * as methods for serialization to and deserialization from a byte buffer.
  */
 
-class TcpHeader : public Header 
+class TcpHeader : public Header
 {
 public:
   TcpHeader ();
   virtual ~TcpHeader ();
 
   /**
+   * \brief Converts an integer into a human readable list of Tcp flags
+   *
+   * \param flags Bitfield of TCP flags to convert to a readable string
+   * \param delimiter String to insert between flags
+   *
+   * FIN=0x1, SYN=0x2, RST=0x4, PSH=0x8, ACK=0x10, URG=0x20, ECE=0x40, CWR=0x80
+   * TcpHeader::FlagsToString (0x1) should return the following string;
+   *     "FIN"
+   *
+   * TcpHeader::FlagsToString (0xff) should return the following string;
+   *     "FIN|SYN|RST|PSH|ACK|URG|ECE|CWR";
+   *
+   * \return the generated string
+   **/
+  static std::string FlagsToString (uint8_t flags, const std::string& delimiter = "|");
+
+  /**
    * \brief Enable checksum calculation for TCP
    *
    * \todo currently has no effect
diff -Naur ns-3.22/src/internet/model/tcp-l4-protocol.cc ns-3.23/src/internet/model/tcp-l4-protocol.cc
--- ns-3.22/src/internet/model/tcp-l4-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -67,6 +67,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpL4Protocol")
     .SetParent<IpL4Protocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpL4Protocol> ()
     .AddAttribute ("RttEstimatorType",
                    "Type of RttEstimator objects.",
diff -Naur ns-3.22/src/internet/model/tcp-newreno.cc ns-3.23/src/internet/model/tcp-newreno.cc
--- ns-3.22/src/internet/model/tcp-newreno.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-newreno.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpNewReno")
     .SetParent<TcpSocketBase> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpNewReno> ()
     .AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
                     UintegerValue (3),
@@ -182,7 +183,10 @@
     { // Increase cwnd for every additional dupack (RFC2582, sec.3 bullet #3)
       m_cWnd += m_segmentSize;
       NS_LOG_INFO ("Dupack in fast recovery mode. Increase cwnd to " << m_cWnd);
-      SendPendingData (m_connected);
+      if (!m_sendPendingDataEvent.IsRunning ())
+        {
+          SendPendingData (m_connected);
+        }
     }
   else if (!m_inFastRec && m_limitedTx && m_txBuffer->SizeFromSequence (m_nextTxSequence) > 0)
     { // RFC3042 Limited transmit: Send a new packet for each duplicated ACK before fast retransmit
@@ -261,4 +265,10 @@
   m_ssThresh = m_initialSsThresh;
 }
 
+void
+TcpNewReno::ScaleSsThresh (uint8_t scaleFactor)
+{
+  m_ssThresh <<= scaleFactor;
+}
+
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-newreno.h ns-3.23/src/internet/model/tcp-newreno.h
--- ns-3.22/src/internet/model/tcp-newreno.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-newreno.h	2015-05-13 11:05:27.000000000 -0700
@@ -69,6 +69,8 @@
   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
diff -Naur ns-3.22/src/internet/model/tcp-option.cc ns-3.23/src/internet/model/tcp-option.cc
--- ns-3.22/src/internet/model/tcp-option.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-option.cc	2015-05-13 11:05:27.000000000 -0700
@@ -48,6 +48,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOption")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
@@ -125,6 +126,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOptionUnknown")
     .SetParent<TcpOption> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpOptionUnknown> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/tcp-option-rfc793.cc ns-3.23/src/internet/model/tcp-option-rfc793.cc
--- ns-3.22/src/internet/model/tcp-option-rfc793.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-option-rfc793.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOptionEnd")
     .SetParent<TcpOption> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpOptionEnd> ()
   ;
   return tid;
@@ -114,6 +115,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOptionNOP")
     .SetParent<TcpOption> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpOptionNOP> ()
   ;
   return tid;
@@ -184,6 +186,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOptionMSS")
     .SetParent<TcpOption> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpOptionMSS> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/tcp-option-ts.cc ns-3.23/src/internet/model/tcp-option-ts.cc
--- ns-3.22/src/internet/model/tcp-option-ts.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-option-ts.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOptionTS")
     .SetParent<TcpOption> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpOptionTS> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/tcp-option-winscale.cc ns-3.23/src/internet/model/tcp-option-winscale.cc
--- ns-3.22/src/internet/model/tcp-option-winscale.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-option-winscale.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpOptionWinScale")
     .SetParent<TcpOption> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpOptionWinScale> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/tcp-reno.cc ns-3.23/src/internet/model/tcp-reno.cc
--- ns-3.22/src/internet/model/tcp-reno.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-reno.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpReno")
     .SetParent<TcpSocketBase> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpReno> ()
     .AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
                     UintegerValue (3),
@@ -164,7 +165,10 @@
     { // In fast recovery, inc cwnd for every additional dupack (RFC2581, sec.3.2)
       m_cWnd += m_segmentSize;
       NS_LOG_INFO ("Increased cwnd to " << m_cWnd);
-      SendPendingData (m_connected);
+      if (!m_sendPendingDataEvent.IsRunning ())
+        {
+          SendPendingData (m_connected);
+        }
     };
 }
 
@@ -236,4 +240,11 @@
   m_ssThresh = m_initialSsThresh;
 }
 
+void
+TcpReno::ScaleSsThresh (uint8_t scaleFactor)
+{
+  m_ssThresh <<= scaleFactor;
+}
+
+
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-reno.h ns-3.23/src/internet/model/tcp-reno.h
--- ns-3.22/src/internet/model/tcp-reno.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-reno.h	2015-05-13 11:05:27.000000000 -0700
@@ -71,6 +71,8 @@
   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
diff -Naur ns-3.22/src/internet/model/tcp-rfc793.cc ns-3.23/src/internet/model/tcp-rfc793.cc
--- ns-3.22/src/internet/model/tcp-rfc793.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-rfc793.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpRfc793")
     .SetParent<TcpSocketBase> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpRfc793> ()
   ;
   return tid;
@@ -88,4 +89,19 @@
   return 0;
 }
 
+uint32_t
+TcpRfc793::Window ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_rWnd;
+}
+
+void
+TcpRfc793::ScaleSsThresh (uint8_t scaleFactor)
+{
+  NS_LOG_WARN ("DoD TCP does not perform slow start");
+  return;
+}
+
+
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-rfc793.h ns-3.23/src/internet/model/tcp-rfc793.h
--- ns-3.22/src/internet/model/tcp-rfc793.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-rfc793.h	2015-05-13 11:05:27.000000000 -0700
@@ -62,6 +62,10 @@
   virtual uint32_t GetInitialSSThresh (void) const;
   virtual void     SetInitialCwnd (uint32_t cwnd);
   virtual uint32_t GetInitialCwnd (void) const;
+
+  virtual uint32_t Window (void);
+  virtual void ScaleSsThresh (uint8_t scaleFactor);
+
 };
 
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-rx-buffer.cc ns-3.23/src/internet/model/tcp-rx-buffer.cc
--- ns-3.22/src/internet/model/tcp-rx-buffer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-rx-buffer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpRxBuffer")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpRxBuffer> ()
     .AddTraceSource ("NextRxSequence",
                      "Next sequence number expected (RCV.NXT)",
diff -Naur ns-3.22/src/internet/model/tcp-socket-base.cc ns-3.23/src/internet/model/tcp-socket-base.cc
--- ns-3.22/src/internet/model/tcp-socket-base.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-socket-base.cc	2015-05-13 11:05:27.000000000 -0700
@@ -65,6 +65,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpSocketBase")
     .SetParent<TcpSocket> ()
+    .SetGroupName ("Internet")
 //    .AddAttribute ("TcpState", "State in TCP state machine",
 //                   TypeId::ATTR_GET,
 //                   EnumValue (CLOSED),
@@ -97,7 +98,7 @@
                    MakeBooleanChecker ())
     .AddAttribute ("MinRto",
                    "Minimum retransmit timeout value",
-                   TimeValue (Seconds (0.2)), // RFC2988 says min RTO=1 sec, but Linux uses 200ms. See http://www.postel.org/pipermail/end2end-interest/2004-November/004402.html
+                   TimeValue (Seconds (1.0)), // RFC 6298 says min RTO=1 sec, but Linux uses 200ms. See http://www.postel.org/pipermail/end2end-interest/2004-November/004402.html
                    MakeTimeAccessor (&TcpSocketBase::SetMinRto,
                                      &TcpSocketBase::GetMinRto),
                                      MakeTimeChecker ())
@@ -141,6 +142,14 @@
                      "Remote side's flow control window",
                      MakeTraceSourceAccessor (&TcpSocketBase::m_rWnd),
                      "ns3::TracedValue::Uint32Callback")
+    .AddTraceSource ("HighestRxSequence",
+                     "Highest sequence number received from peer",
+                     MakeTraceSourceAccessor (&TcpSocketBase::m_highRxMark),
+                     "ns3::SequenceNumber32TracedValueCallback")
+    .AddTraceSource ("HighestRxAck",
+                     "Highest ack received from peer",
+                     MakeTraceSourceAccessor (&TcpSocketBase::m_highRxAckMark),
+                     "ns3::SequenceNumber32TracedValueCallback")
   ;
   return tid;
 }
@@ -168,6 +177,8 @@
     m_segmentSize (0),
     // For attribute initialization consistency (quiet valgrind)
     m_rWnd (0),
+    m_highRxMark (0),
+    m_highRxAckMark (0),
     m_sndScaleFactor (0),
     m_rcvScaleFactor (0),
     m_timestampEnabled (true),
@@ -208,6 +219,8 @@
     m_segmentSize (sock.m_segmentSize),
     m_maxWinSize (sock.m_maxWinSize),
     m_rWnd (sock.m_rWnd),
+    m_highRxMark (sock.m_highRxMark),
+    m_highRxAckMark (sock.m_highRxAckMark),
     m_winScalingEnabled (sock.m_winScalingEnabled),
     m_sndScaleFactor (sock.m_sndScaleFactor),
     m_rcvScaleFactor (sock.m_rcvScaleFactor),
@@ -600,7 +613,10 @@
       NS_LOG_LOGIC ("txBufSize=" << m_txBuffer->Size () << " state " << TcpStateName[m_state]);
       if (m_state == ESTABLISHED || m_state == CLOSE_WAIT)
         { // Try to send the data out
-          SendPendingData (m_connected);
+          if (!m_sendPendingDataEvent.IsRunning ())
+            {
+              m_sendPendingDataEvent = Simulator::Schedule ( TimeStep (1), &TcpSocketBase::SendPendingData, this, m_connected);
+            }
         }
       return p->GetSize ();
     }
@@ -941,15 +957,6 @@
       EstimateRtt (tcpHeader);
     }
 
-  // Update Rx window size, i.e. the flow control window
-  if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0)
-    { // persist probes end
-      NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
-      m_persistEvent.Cancel ();
-    }
-  m_rWnd = tcpHeader.GetWindowSize ();
-  m_rWnd <<= m_rcvScaleFactor;
-
   // Discard fully out of range data packets
   if (packet->GetSize ()
       && OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumber () + packet->GetSize ()))
@@ -967,6 +974,17 @@
       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);
+    }
+
   // TCP state machine code in different process functions
   // C.f.: tcp_rcv_state_process() in tcp_input.c in Linux kernel
   switch (m_state)
@@ -1045,15 +1063,6 @@
       EstimateRtt (tcpHeader);
     }
 
-  // Update Rx window size, i.e. the flow control window
-  if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0)
-    { // persist probes end
-      NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
-      m_persistEvent.Cancel ();
-    }
-  m_rWnd = tcpHeader.GetWindowSize ();
-  m_rWnd <<= m_rcvScaleFactor;
-
   // Discard fully out of range packets
   if (packet->GetSize ()
       && OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumber () + packet->GetSize ()))
@@ -1071,6 +1080,18 @@
       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);
+    }
+
   // TCP state machine code in different process functions
   // C.f.: tcp_rcv_state_process() in tcp_input.c in Linux kernel
   switch (m_state)
@@ -1712,7 +1733,7 @@
   header.SetWindowSize (AdvertisedWindowSize ());
 
   // RFC 6298, clause 2.4
-  m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVariation ()*4), Time::FromDouble (1,  Time::S));
+  m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVariation ()*4), m_minRto);
 
   bool hasSyn = flags & TcpHeader::SYN;
   bool hasFin = flags & TcpHeader::FIN;
@@ -2063,7 +2084,6 @@
   if (m_txBuffer->Size () == 0)
     {
       return false;                           // Nothing to send
-
     }
   if (m_endPoint == 0 && m_endPoint6 == 0)
     {
@@ -2074,17 +2094,10 @@
   while (m_txBuffer->SizeFromSequence (m_nextTxSequence))
     {
       uint32_t w = AvailableWindow (); // Get available window size
-      NS_LOG_LOGIC ("TcpSocketBase " << this << " SendPendingData" <<
-                    " w " << w <<
-                    " rxwin " << m_rWnd <<
-                    " segsize " << m_segmentSize <<
-                    " nextTxSeq " << m_nextTxSequence <<
-                    " highestRxAck " << m_txBuffer->HeadSequence () <<
-                    " pd->Size " << m_txBuffer->Size () <<
-                    " pd->SFS " << m_txBuffer->SizeFromSequence (m_nextTxSequence));
       // Stop sending if we need to wait for a larger Tx window (prevent silly window syndrome)
       if (w < m_segmentSize && m_txBuffer->SizeFromSequence (m_nextTxSequence) > w)
         {
+          NS_LOG_LOGIC ("Preventing Silly Window Syndrome. Wait to send.");
           break; // No more
         }
       // Nagle's algorithm (RFC896): Hold off sending if there is unacked data
@@ -2095,6 +2108,14 @@
           NS_LOG_LOGIC ("Invoking Nagle's algorithm. Wait to send.");
           break;
         }
+      NS_LOG_LOGIC ("TcpSocketBase " << this << " SendPendingData" <<
+                    " w " << w <<
+                    " rxwin " << m_rWnd <<
+                    " segsize " << m_segmentSize <<
+                    " nextTxSeq " << m_nextTxSequence <<
+                    " highestRxAck " << m_txBuffer->HeadSequence () <<
+                    " pd->Size " << m_txBuffer->Size () <<
+                    " pd->SFS " << m_txBuffer->SizeFromSequence (m_nextTxSequence));
       uint32_t s = std::min (w, m_segmentSize);  // Send no more than window
       uint32_t sz = SendDataPacket (m_nextTxSequence, s, withAck);
       nPacketsSent++;                             // Count sent this loop
@@ -2119,13 +2140,6 @@
 }
 
 uint32_t
-TcpSocketBase::Window ()
-{
-  NS_LOG_FUNCTION (this);
-  return m_rWnd;
-}
-
-uint32_t
 TcpSocketBase::AvailableWindow ()
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -2254,7 +2268,7 @@
     {
       m_rtt->Measurement (m);                // Log the measurement
       // RFC 6298, clause 2.4
-      m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVariation ()*4), Time::FromDouble (1,  Time::S));
+      m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVariation ()*4), m_minRto);
       m_lastRtt = m_rtt->GetEstimate ();
       NS_LOG_FUNCTION(this << m_lastRtt);
     }
@@ -2275,7 +2289,7 @@
       m_retxEvent.Cancel ();
       // On receiving a "New" ack we restart retransmission timer .. RFC 6298
       // RFC 6298, clause 2.4
-      m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVariation ()*4), Time::FromDouble (1,  Time::S));
+      m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVariation ()*4), m_minRto);
 
       NS_LOG_LOGIC (this << " Schedule ReTxTimeout at time " <<
                     Simulator::Now ().GetSeconds () << " to expire at time " <<
@@ -2313,7 +2327,10 @@
       m_retxEvent.Cancel ();
     }
   // Try to send more data
-  SendPendingData (m_connected);
+  if (!m_sendPendingDataEvent.IsRunning ())
+    {
+      m_sendPendingDataEvent = Simulator::Schedule ( TimeStep (1), &TcpSocketBase::SendPendingData, this, m_connected);
+    }
 }
 
 // Retransmit timeout
@@ -2450,6 +2467,7 @@
   m_delAckEvent.Cancel ();
   m_lastAckEvent.Cancel ();
   m_timewaitEvent.Cancel ();
+  m_sendPendingDataEvent.Cancel ();
 }
 
 /* Move TCP to Time_Wait state and schedule a transition to Closed state */
@@ -2604,6 +2622,7 @@
             {
               m_winScalingEnabled = true;
               ProcessOptionWScale (header.GetOption (TcpOption::WINSCALE));
+              ScaleSsThresh (m_sndScaleFactor);
             }
         }
     }
@@ -2726,6 +2745,50 @@
                option->GetTimestamp () << " echo=" << m_timestampToEcho);
 }
 
+void TcpSocketBase::UpdateWindowSize (const TcpHeader &header)
+{
+  NS_LOG_FUNCTION (this << header);
+  //  If the connection is not established, the window size is always
+  //  updated
+  uint32_t receivedWindow = header.GetWindowSize ();
+  receivedWindow <<= m_rcvScaleFactor;
+  NS_LOG_DEBUG ("Received (scaled) window is " << receivedWindow << " bytes");
+  if (m_state < ESTABLISHED)
+    {
+      m_rWnd = receivedWindow;
+      NS_LOG_DEBUG ("State less than ESTABLISHED; updating rWnd to " << m_rWnd);
+      return;
+    }
+
+  // Test for conditions that allow updating of the window
+  // 1) segment contains new data (advancing the right edge of the receive 
+  // buffer), 
+  // 2) segment does not contain new data but the segment acks new data 
+  // (highest sequence number acked advances), or
+  // 3) the advertised window is larger than the current send window
+  bool update = false;
+  if (header.GetAckNumber () == m_highRxAckMark && receivedWindow > m_rWnd)
+    {
+      // right edge of the send window is increased (window update)
+      update = true;
+    }
+  if (header.GetAckNumber () > m_highRxAckMark)
+    {
+      m_highRxAckMark = header.GetAckNumber ();
+      update = true;
+    }
+  if (header.GetSequenceNumber () > m_highRxMark)
+    {
+      m_highRxMark = header.GetSequenceNumber ();
+      update = true;
+    }
+  if (update == true)
+    {
+      m_rWnd = receivedWindow;
+      NS_LOG_DEBUG ("updating rWnd to " << m_rWnd);
+    }
+}
+
 void
 TcpSocketBase::SetMinRto (Time minRto)
 {
diff -Naur ns-3.22/src/internet/model/tcp-socket-base.h ns-3.23/src/internet/model/tcp-socket-base.h
--- ns-3.22/src/internet/model/tcp-socket-base.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-socket-base.h	2015-05-13 11:05:27.000000000 -0700
@@ -518,7 +518,7 @@
    * \brief Return the max possible number of unacked bytes
    * \returns the max possible number of unacked bytes
    */
-  virtual uint32_t Window (void);
+  virtual uint32_t Window (void) = 0;
 
   /**
    * \brief Return unfilled portion of window
@@ -532,6 +532,20 @@
    */
   virtual uint16_t AdvertisedWindowSize (void);
 
+  /**
+   * \brief Update the receiver window (RWND) based on the value of the 
+   * window field in the header.
+   *
+   * This method suppresses updates unless one of the following three 
+   * conditions holds:  1) segment contains new data (advancing the right
+   * edge of the receive buffer), 2) segment does not contain new data
+   * but the segment acks new data (highest sequence number acked advances),
+   * or 3) the advertised window is larger than the current send window
+   *
+   * \param header TcpHeader from which to extract the new window value
+   */
+  void UpdateWindowSize (const TcpHeader& header);
+
 
   // Manage data tx/rx
 
@@ -675,6 +689,15 @@
    */
   void AddOptionTimestamp (TcpHeader& header);
 
+  /**
+   * \brief Scale the initial SsThresh value to the correct one
+   *
+   * Set the initial SsThresh to the largest possible advertised window
+   * according to the sender scale factor.
+   *
+   * \param scaleFactor the sender scale factor
+   */
+  virtual void ScaleSsThresh (uint8_t scaleFactor) = 0;
 
 protected:
   // Counters and events
@@ -727,7 +750,9 @@
   // Window management
   uint32_t              m_segmentSize; //!< Segment size
   uint16_t              m_maxWinSize;  //!< Maximum window size to advertise
-  TracedValue<uint32_t> m_rWnd;        //!< Flow control window at remote side
+  TracedValue<uint32_t> m_rWnd;        //!< Receiver window (RCV.WND in RFC793)
+  TracedValue<SequenceNumber32> m_highRxMark;     //!< Highest seqno received
+  TracedValue<SequenceNumber32> m_highRxAckMark;  //!< Highest ack received
 
   // Options
   bool    m_winScalingEnabled;    //!< Window Scale option enabled
@@ -736,6 +761,8 @@
 
   bool     m_timestampEnabled;    //!< Timestamp option enabled
   uint32_t m_timestampToEcho;     //!< Timestamp to echo
+
+  EventId m_sendPendingDataEvent; //!< micro-delay event to send pending data
 };
 
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-socket.cc ns-3.23/src/internet/model/tcp-socket.cc
--- ns-3.22/src/internet/model/tcp-socket.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-socket.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpSocket")
     .SetParent<Socket> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("SndBufSize",
                    "TcpSocket maximum transmit buffer size (bytes)",
                    UintegerValue (131072), // 128k
diff -Naur ns-3.22/src/internet/model/tcp-socket-factory.cc ns-3.23/src/internet/model/tcp-socket-factory.cc
--- ns-3.22/src/internet/model/tcp-socket-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-socket-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpSocketFactory")
     .SetParent<SocketFactory> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/tcp-tahoe.cc ns-3.23/src/internet/model/tcp-tahoe.cc
--- ns-3.22/src/internet/model/tcp-tahoe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-tahoe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpTahoe")
     .SetParent<TcpSocketBase> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpTahoe> ()
     .AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
                     UintegerValue (3),
@@ -214,4 +215,11 @@
   m_ssThresh = m_initialSsThresh;
 }
 
+void
+TcpTahoe::ScaleSsThresh (uint8_t scaleFactor)
+{
+  m_ssThresh <<= scaleFactor;
+}
+
+
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-tahoe.h ns-3.23/src/internet/model/tcp-tahoe.h
--- ns-3.22/src/internet/model/tcp-tahoe.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-tahoe.h	2015-05-13 11:05:27.000000000 -0700
@@ -75,6 +75,7 @@
   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
diff -Naur ns-3.22/src/internet/model/tcp-tx-buffer.cc ns-3.23/src/internet/model/tcp-tx-buffer.cc
--- ns-3.22/src/internet/model/tcp-tx-buffer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-tx-buffer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::TcpTxBuffer")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddConstructor<TcpTxBuffer> ()
     .AddTraceSource ("UnackSequence",
                      "First unacknowledged sequence number (SND.UNA)",
diff -Naur ns-3.22/src/internet/model/tcp-westwood.cc ns-3.23/src/internet/model/tcp-westwood.cc
--- ns-3.22/src/internet/model/tcp-westwood.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-westwood.cc	2015-05-13 11:05:27.000000000 -0700
@@ -53,6 +53,7 @@
 {
   static TypeId tid = TypeId("ns3::TcpWestwood")
       .SetParent<TcpSocketBase>()
+      .SetGroupName ("Internet")
       .AddConstructor<TcpWestwood>()
       .AddTraceSource("CongestionWindow", "The TCP connection's congestion window",
                       MakeTraceSourceAccessor(&TcpWestwood::m_cWnd),
@@ -292,7 +293,10 @@
     {// Increase cwnd for every additional DUPACK as in Reno
       m_cWnd += m_segmentSize;
       NS_LOG_INFO ("Dupack in fast recovery mode. Increase cwnd to " << m_cWnd);
-      SendPendingData (m_connected);
+      if (!m_sendPendingDataEvent.IsRunning ())
+        {
+          SendPendingData (m_connected);
+        }
     }
 }
 
@@ -425,4 +429,11 @@
   m_ssThresh = m_initialSsThresh;
 }
 
+void
+TcpWestwood::ScaleSsThresh (uint8_t scaleFactor)
+{
+  m_ssThresh <<= scaleFactor;
+}
+
+
 } // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-westwood.h ns-3.23/src/internet/model/tcp-westwood.h
--- ns-3.22/src/internet/model/tcp-westwood.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/tcp-westwood.h	2015-05-13 11:05:27.000000000 -0700
@@ -126,6 +126,7 @@
   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:
   /**
diff -Naur ns-3.22/src/internet/model/udp-header.cc ns-3.23/src/internet/model/udp-header.cc
--- ns-3.22/src/internet/model/udp-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/udp-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -155,6 +155,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Internet")
     .AddConstructor<UdpHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/internet/model/udp-l4-protocol.cc ns-3.23/src/internet/model/udp-l4-protocol.cc
--- ns-3.22/src/internet/model/udp-l4-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/udp-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -54,6 +54,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpL4Protocol")
     .SetParent<IpL4Protocol> ()
+    .SetGroupName ("Internet")
     .AddConstructor<UdpL4Protocol> ()
     .AddAttribute ("SocketList", "The list of sockets associated to this protocol.",
                    ObjectVectorValue (),
diff -Naur ns-3.22/src/internet/model/udp-socket.cc ns-3.23/src/internet/model/udp-socket.cc
--- ns-3.22/src/internet/model/udp-socket.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/udp-socket.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpSocket")
     .SetParent<Socket> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("RcvBufSize",
                    "UdpSocket maximum receive buffer size (bytes)",
                    UintegerValue (131072),
diff -Naur ns-3.22/src/internet/model/udp-socket-factory.cc ns-3.23/src/internet/model/udp-socket-factory.cc
--- ns-3.22/src/internet/model/udp-socket-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/udp-socket-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpSocketFactory")
     .SetParent<SocketFactory> ()
+    .SetGroupName ("Internet")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/internet/model/udp-socket-impl.cc ns-3.23/src/internet/model/udp-socket-impl.cc
--- ns-3.22/src/internet/model/udp-socket-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/udp-socket-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -56,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::UdpSocketImpl")
     .SetParent<UdpSocket> ()
+    .SetGroupName ("Internet")
     .AddConstructor<UdpSocketImpl> ()
     .AddTraceSource ("Drop",
                      "Drop UDP packet due to receive buffer overflow",
diff -Naur ns-3.22/src/internet/test/codel-queue-test-suite.cc ns-3.23/src/internet/test/codel-queue-test-suite.cc
--- ns-3.22/src/internet/test/codel-queue-test-suite.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/test/codel-queue-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
@@ -61,6 +61,21 @@
 public:
   CoDelQueueBasicEnqueueDequeue (std::string mode);
   virtual void DoRun (void);
+
+  void QueueTestSize (Ptr<CoDelQueue> queue, uint32_t size, std::string error)
+  {
+    if (queue->GetMode () == CoDelQueue::QUEUE_MODE_BYTES)
+      {
+        NS_TEST_EXPECT_MSG_EQ (queue->GetNBytes (), size, error);
+      }
+    else if (queue->GetMode () == CoDelQueue::QUEUE_MODE_PACKETS)
+      {
+        NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), size, error);
+      }
+
+    NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), size, error);
+  }
+
 private:
   StringValue m_mode;
 };
@@ -109,19 +124,19 @@
   p5 = Create<Packet> (pktSize);
   p6 = Create<Packet> (pktSize);
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 0 * modeSize, "There should be no packets in queue");
+  QueueTestSize (queue, 0 * modeSize, "There should be no packets in queue");
   queue->Enqueue (p1);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 1 * modeSize, "There should be one packet in queue");
+  QueueTestSize (queue, 1 * modeSize, "There should be one packet in queue");
   queue->Enqueue (p2);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 2 * modeSize, "There should be two packets in queue");
+  QueueTestSize (queue, 2 * modeSize, "There should be two packets in queue");
   queue->Enqueue (p3);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 3 * modeSize, "There should be three packets in queue");
+  QueueTestSize (queue, 3 * modeSize, "There should be three packets in queue");
   queue->Enqueue (p4);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 4 * modeSize, "There should be four packets in queue");
+  QueueTestSize (queue, 4 * modeSize, "There should be four packets in queue");
   queue->Enqueue (p5);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 5 * modeSize, "There should be five packets in queue");
+  QueueTestSize (queue, 5 * modeSize, "There should be five packets in queue");
   queue->Enqueue (p6);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 6 * modeSize, "There should be six packets in queue");
+  QueueTestSize (queue, 6 * modeSize, "There should be six packets in queue");
 
   NS_TEST_EXPECT_MSG_EQ (queue->GetDropOverLimit (), 0, "There should be no packets being dropped due to full queue");
 
@@ -129,32 +144,32 @@
 
   p = queue->Dequeue ();
   NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the first packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 5 * modeSize, "There should be five packets in queue");
+  QueueTestSize (queue, 5 * modeSize, "There should be five packets in queue");
   NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p1->GetUid (), "was this the first packet ?");
 
   p = queue->Dequeue ();
   NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the second packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 4 * modeSize, "There should be four packets in queue");
+  QueueTestSize (queue, 4 * modeSize, "There should be four packets in queue");
   NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p2->GetUid (), "Was this the second packet ?");
 
   p = queue->Dequeue ();
   NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the third packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 3 * modeSize, "There should be three packets in queue");
+  QueueTestSize (queue, 3 * modeSize, "There should be three packets in queue");
   NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p3->GetUid (), "Was this the third packet ?");
 
   p = queue->Dequeue ();
   NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the forth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 2 * modeSize, "There should be two packets in queue");
+  QueueTestSize (queue, 2 * modeSize, "There should be two packets in queue");
   NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
 
   p = queue->Dequeue ();
   NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the fifth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 1 * modeSize, "There should be one packet in queue");
+  QueueTestSize (queue, 1 * modeSize, "There should be one packet in queue");
   NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p5->GetUid (), "Was this the fifth packet ?");
 
   p = queue->Dequeue ();
   NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the last packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 0 * modeSize, "There should be zero packet in queue");
+  QueueTestSize (queue, 0 * modeSize, "There should be zero packet in queue");
   NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p6->GetUid (), "Was this the sixth packet ?");
 
   p = queue->Dequeue ();
@@ -169,6 +184,21 @@
 public:
   CoDelQueueBasicOverflow (std::string mode);
   virtual void DoRun (void);
+
+  void QueueTestSize (Ptr<CoDelQueue> queue, uint32_t size, std::string error)
+  {
+    if (queue->GetMode () == CoDelQueue::QUEUE_MODE_BYTES)
+      {
+        NS_TEST_EXPECT_MSG_EQ (queue->GetNBytes (), size, error);
+      }
+    else if (queue->GetMode () == CoDelQueue::QUEUE_MODE_PACKETS)
+      {
+        NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), size, error);
+      }
+
+    NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), size, error);
+  }
+
 private:
   void Enqueue (Ptr<CoDelQueue> queue, uint32_t size, uint32_t nPkt);
   StringValue m_mode;
@@ -216,7 +246,7 @@
   queue->Enqueue (p2);
   queue->Enqueue (p3);
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 500 * modeSize, "There should be 500 packets in queue");
+  QueueTestSize (queue, 500 * modeSize, "There should be 500 packets in queue");
   NS_TEST_EXPECT_MSG_EQ (queue->GetDropOverLimit (), 3, "There should be three packets being dropped due to full queue");
 }
 
@@ -321,6 +351,21 @@
 public:
   CoDelQueueBasicDrop (std::string mode);
   virtual void DoRun (void);
+
+  void QueueTestSize (Ptr<CoDelQueue> queue, uint32_t size, std::string error)
+  {
+    if (queue->GetMode () == CoDelQueue::QUEUE_MODE_BYTES)
+      {
+        NS_TEST_EXPECT_MSG_EQ (queue->GetNBytes (), size, error);
+      }
+    else if (queue->GetMode () == CoDelQueue::QUEUE_MODE_PACKETS)
+      {
+        NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), size, error);
+      }
+
+    NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), size, error);
+  }
+
 private:
   void Enqueue (Ptr<CoDelQueue> queue, uint32_t size, uint32_t nPkt);
   void Dequeue (Ptr<CoDelQueue> queue, uint32_t modeSize);
@@ -419,13 +464,13 @@
               NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "We are not in dropping state."
                                      "Sojourn time has just gone above target from below."
                                      "Hence, there should be no packet drops");
-              NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - modeSize, "There should be 1 packet dequeued.");
+              QueueTestSize (queue, initialQSize - modeSize, "There should be 1 packet dequeued.");
 
             }
           else if (currentTime >= queue->GetInterval ())
             {
               currentDropCount = queue->GetDropCount ();
-              NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - 2 * modeSize, "Sojourn time has been above target for at least interval."
+              QueueTestSize (queue, initialQSize - 2 * modeSize, "Sojourn time has been above target for at least interval."
                                      "We enter the dropping state, perform initial packet drop, and dequeue the next."
                                      "So there should be 2 more packets dequeued.");
               NS_TEST_EXPECT_MSG_EQ (currentDropCount, 1, "There should be 1 packet drop");
@@ -436,7 +481,7 @@
           if (currentTime.GetMicroSeconds () < initialDropNext)
             {
               currentDropCount = queue->GetDropCount ();
-              NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - modeSize, "We are in dropping state."
+              QueueTestSize (queue, initialQSize - modeSize, "We are in dropping state."
                                      "Sojourn is still above target."
                                      "However, it's not time for next drop."
                                      "So there should be only 1 more packet dequeued");
@@ -446,7 +491,7 @@
           else if (currentTime.GetMicroSeconds () >= initialDropNext)
             {
               currentDropCount = queue->GetDropCount ();
-              NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - (m_dropNextCount + 1) * modeSize, "We are in dropping state."
+              QueueTestSize (queue, initialQSize - (m_dropNextCount + 1) * modeSize, "We are in dropping state."
                                      "It's time for next drop."
                                      "The number of packets dequeued equals to the number of times m_dropNext is updated plus initial dequeue");
               NS_TEST_EXPECT_MSG_EQ (currentDropCount, 1 + m_dropNextCount, "The number of drops equals to the number of times m_dropNext is updated plus 1 from last dequeue");
diff -Naur ns-3.22/src/internet/test/tcp-header-test.cc ns-3.23/src/internet/test/tcp-header-test.cc
--- ns-3.22/src/internet/test/tcp-header-test.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/test/tcp-header-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,97 +27,106 @@
 
 namespace ns3 {
 
+#define GET_RANDOM_UINT32(RandomVariable) \
+  static_cast<uint32_t> (RandomVariable->GetInteger (0, UINT32_MAX))
+
+#define GET_RANDOM_UINT16(RandomVariable) \
+  static_cast<uint16_t> (RandomVariable->GetInteger (0, UINT16_MAX))
+
+#define GET_RANDOM_UINT8(RandomVariable) \
+  static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX))
+
+#define GET_RANDOM_UINT6(RandomVariable) \
+  static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX >> 2))
+
 class TcpHeaderGetSetTestCase : public TestCase
 {
 public:
-  TcpHeaderGetSetTestCase (uint16_t sourcePort, uint16_t destinationPort,
-                           SequenceNumber32 sequenceNumber, SequenceNumber32 ackNumber,
-                           uint8_t flags, uint16_t m_windowSize, uint16_t m_urgentPointer,
-                           std::string name);
+  TcpHeaderGetSetTestCase (std::string name);
 protected:
-  uint16_t m_sourcePort;        //!< Source port
-  uint16_t m_destinationPort;   //!< Destination port
-  SequenceNumber32 m_sequenceNumber;  //!< Sequence number
-  SequenceNumber32 m_ackNumber;       //!< ACK number
-  uint8_t m_flags;              //!< Flags (really a uint6_t)
-  uint16_t m_windowSize;        //!< Window size
-  uint16_t m_urgentPointer;     //!< Urgent pointer
-
 private:
   virtual void DoRun (void);
   virtual void DoTeardown (void);
 
-  TcpHeader m_header;
-  Buffer m_buffer;
 };
 
-TcpHeaderGetSetTestCase::TcpHeaderGetSetTestCase (
-  uint16_t sourcePort, uint16_t destinationPort,
-  SequenceNumber32 sequenceNumber, SequenceNumber32 ackNumber,
-  uint8_t flags, uint16_t windowSize, uint16_t urgentPointer,
-  std::string name) : TestCase (name)
-{
-  m_sourcePort = sourcePort;
-  m_destinationPort = destinationPort;
-  m_sequenceNumber = sequenceNumber;
-  m_ackNumber = ackNumber;
-  m_flags = flags;
-  m_windowSize = windowSize;
-  m_urgentPointer = urgentPointer;
-
-  m_header.SetSourcePort (m_sourcePort);
-  m_header.SetDestinationPort (m_destinationPort);
-  m_header.SetSequenceNumber (m_sequenceNumber);
-  m_header.SetAckNumber (m_ackNumber);
-  m_header.SetFlags (m_flags);
-  m_header.SetWindowSize (m_windowSize);
-  m_header.SetUrgentPointer (m_urgentPointer);
+TcpHeaderGetSetTestCase::TcpHeaderGetSetTestCase (std::string name) : TestCase (name)
+{
+}
+void TcpHeaderGetSetTestCase::DoRun (void)
+{
+  uint16_t sourcePort;        //!< Source port
+  uint16_t destinationPort;   //!< Destination port
+  SequenceNumber32 sequenceNumber;  //!< Sequence number
+  SequenceNumber32 ackNumber;       //!< ACK number
+  uint8_t flags;              //!< Flags (really a uint6_t)
+  uint16_t windowSize;        //!< Window size
+  uint16_t urgentPointer;     //!< Urgent pointer
+  TcpHeader header;
+  Buffer buffer;
+
+  Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
+  for (uint32_t i = 0; i < 1000; ++i)
+    {
+      sourcePort = GET_RANDOM_UINT16 (x);
+      destinationPort = GET_RANDOM_UINT16 (x);
+      sequenceNumber = SequenceNumber32 (GET_RANDOM_UINT32 (x));
+      ackNumber = SequenceNumber32 (GET_RANDOM_UINT32 (x));
+      flags = GET_RANDOM_UINT6 (x);
+      windowSize = GET_RANDOM_UINT16 (x);
+      urgentPointer = GET_RANDOM_UINT16 (x);
+
+      header.SetSourcePort (sourcePort);
+      header.SetDestinationPort (destinationPort);
+      header.SetSequenceNumber (sequenceNumber);
+      header.SetAckNumber (ackNumber);
+      header.SetFlags (flags);
+      header.SetWindowSize (windowSize);
+      header.SetUrgentPointer (urgentPointer);
 
-  NS_TEST_ASSERT_MSG_EQ (m_header.GetLength (), 5, "TcpHeader without option is"
+      NS_TEST_ASSERT_MSG_EQ (header.GetLength (), 5, "TcpHeader without option is"
                          " not 5 word");
 
-  m_buffer.AddAtStart (m_header.GetSerializedSize ());
-  m_header.Serialize (m_buffer.Begin ());
-}
+      buffer.AddAtStart (header.GetSerializedSize ());
+      header.Serialize (buffer.Begin ());
 
-void TcpHeaderGetSetTestCase::DoRun (void)
-{
-  NS_TEST_ASSERT_MSG_EQ (m_sourcePort, m_header.GetSourcePort (),
+      NS_TEST_ASSERT_MSG_EQ (sourcePort, header.GetSourcePort (),
                          "Different source port found");
-  NS_TEST_ASSERT_MSG_EQ (m_destinationPort, m_header.GetDestinationPort (),
+      NS_TEST_ASSERT_MSG_EQ (destinationPort, header.GetDestinationPort (),
                          "Different destination port found");
-  NS_TEST_ASSERT_MSG_EQ (m_sequenceNumber, m_header.GetSequenceNumber (),
+      NS_TEST_ASSERT_MSG_EQ (sequenceNumber, header.GetSequenceNumber (),
                          "Different sequence number found");
-  NS_TEST_ASSERT_MSG_EQ (m_ackNumber, m_header.GetAckNumber (),
+      NS_TEST_ASSERT_MSG_EQ (ackNumber, header.GetAckNumber (),
                          "Different ack number found");
-  NS_TEST_ASSERT_MSG_EQ (m_flags, m_header.GetFlags (),
+      NS_TEST_ASSERT_MSG_EQ (flags, header.GetFlags (),
                          "Different flags found");
-  NS_TEST_ASSERT_MSG_EQ (m_windowSize, m_header.GetWindowSize (),
+      NS_TEST_ASSERT_MSG_EQ (windowSize, header.GetWindowSize (),
                          "Different window size found");
-  NS_TEST_ASSERT_MSG_EQ (m_urgentPointer, m_header.GetUrgentPointer (),
+      NS_TEST_ASSERT_MSG_EQ (urgentPointer, header.GetUrgentPointer (),
                          "Different urgent pointer found");
 
-  NS_TEST_ASSERT_MSG_EQ (m_header.GetLength (), 5, "TcpHeader without option is"
+      NS_TEST_ASSERT_MSG_EQ (header.GetLength (), 5, "TcpHeader without option is"
                          " not 5 word");
 
-  TcpHeader copyHeader;
+      TcpHeader copyHeader;
 
-  copyHeader.Deserialize (m_buffer.Begin ());
+      copyHeader.Deserialize (buffer.Begin ());
 
-  NS_TEST_ASSERT_MSG_EQ (m_sourcePort, copyHeader.GetSourcePort (),
+      NS_TEST_ASSERT_MSG_EQ (sourcePort, copyHeader.GetSourcePort (),
                          "Different source port found in deserialized header");
-  NS_TEST_ASSERT_MSG_EQ (m_destinationPort, copyHeader.GetDestinationPort (),
+      NS_TEST_ASSERT_MSG_EQ (destinationPort, copyHeader.GetDestinationPort (),
                          "Different destination port found in deserialized header");
-  NS_TEST_ASSERT_MSG_EQ (m_sequenceNumber, copyHeader.GetSequenceNumber (),
+      NS_TEST_ASSERT_MSG_EQ (sequenceNumber, copyHeader.GetSequenceNumber (),
                          "Different sequence number found in deserialized header");
-  NS_TEST_ASSERT_MSG_EQ (m_ackNumber, copyHeader.GetAckNumber (),
+      NS_TEST_ASSERT_MSG_EQ (ackNumber, copyHeader.GetAckNumber (),
                          "Different ack number found in deserialized header");
-  NS_TEST_ASSERT_MSG_EQ (m_flags, copyHeader.GetFlags (),
+      NS_TEST_ASSERT_MSG_EQ (flags, copyHeader.GetFlags (),
                          "Different flags found in deserialized header");
-  NS_TEST_ASSERT_MSG_EQ (m_windowSize, copyHeader.GetWindowSize (),
+      NS_TEST_ASSERT_MSG_EQ (windowSize, copyHeader.GetWindowSize (),
                          "Different window size found in deserialized header");
-  NS_TEST_ASSERT_MSG_EQ (m_urgentPointer, copyHeader.GetUrgentPointer (),
+      NS_TEST_ASSERT_MSG_EQ (urgentPointer, copyHeader.GetUrgentPointer (),
                          "Different urgent pointer found in deserialized header");
+    }
 }
 
 void TcpHeaderGetSetTestCase::DoTeardown (void)
@@ -313,17 +322,64 @@
 
 }
 
-#define GET_RANDOM_UINT32(RandomVariable) \
-  static_cast<uint32_t> (RandomVariable->GetInteger (0, UINT32_MAX))
+class TcpHeaderFlagsToString : public TestCase
+{
+public:
+  TcpHeaderFlagsToString (std::string name);
 
-#define GET_RANDOM_UINT16(RandomVariable) \
-  static_cast<uint16_t> (RandomVariable->GetInteger (0, UINT16_MAX))
+private:
+  virtual void DoRun (void);
+};
 
-#define GET_RANDOM_UINT8(RandomVariable) \
-  static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX))
+TcpHeaderFlagsToString::TcpHeaderFlagsToString (std::string name)
+  : TestCase (name)
+{
+}
 
-#define GET_RANDOM_UINT6(RandomVariable) \
-  static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX >> 2))
+void
+TcpHeaderFlagsToString::DoRun (void)
+{
+  std::string str, target;
+  str = TcpHeader::FlagsToString (0x0);
+  target = "";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x1);
+  target = "FIN";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x2);
+  target = "SYN";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x4);
+  target = "RST";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x8);
+  target = "PSH";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x10);
+  target = "ACK";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x20);
+  target = "URG";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x40);
+  target = "ECE";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x80);
+  target = "CWR";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x3);
+  target = "FIN|SYN";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0x5);
+  target = "FIN|RST";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0xff);
+  target = "FIN|SYN|RST|PSH|ACK|URG|ECE|CWR";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+  str = TcpHeader::FlagsToString (0xff, ":");
+  target = "FIN:SYN:RST:PSH:ACK:URG:ECE:CWR";
+  NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<  " does not equal target " << target);
+}
 
 static class TcpHeaderTestSuite : public TestSuite
 {
@@ -331,26 +387,9 @@
   TcpHeaderTestSuite ()
     : TestSuite ("tcp-header", UNIT)
   {
-    Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
-
-    for (uint32_t i = 0; i < 1000; ++i)
-      {
-        std::stringstream ss;
-        ss << i;
-
-        AddTestCase (new TcpHeaderGetSetTestCase (GET_RANDOM_UINT16 (x),
-                                                  GET_RANDOM_UINT16 (x),
-                                                  SequenceNumber32 (GET_RANDOM_UINT32 (x)),
-                                                  SequenceNumber32 (GET_RANDOM_UINT32 (x)),
-                                                  GET_RANDOM_UINT6 (x),
-                                                  GET_RANDOM_UINT16 (x),
-                                                  GET_RANDOM_UINT16 (x),
-                                                  "Case number " + ss.str ()),
-                     TestCase::QUICK);
-      }
-
-    AddTestCase (new TcpHeaderWithRFC793OptionTestCase ("Test for options in RFC 793"),
-                 TestCase::QUICK);
+    AddTestCase (new TcpHeaderGetSetTestCase ("GetSet test cases"), TestCase::QUICK);
+    AddTestCase (new TcpHeaderWithRFC793OptionTestCase ("Test for options in RFC 793"), TestCase::QUICK);
+    AddTestCase (new TcpHeaderFlagsToString ("Test flags to string function"), TestCase::QUICK);
   }
 
 } g_TcpHeaderTestSuite;
diff -Naur ns-3.22/src/internet/test/tcp-option-test.cc ns-3.23/src/internet/test/tcp-option-test.cc
--- ns-3.22/src/internet/test/tcp-option-test.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/test/tcp-option-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -93,7 +93,7 @@
 class TcpOptionTSTestCase : public TestCase
 {
 public:
-  TcpOptionTSTestCase (std::string name, uint32_t timestamp, uint32_t echo);
+  TcpOptionTSTestCase (std::string name);
 
   void TestSerialize ();
   void TestDeserialize ();
@@ -108,19 +108,23 @@
 };
 
 
-TcpOptionTSTestCase::TcpOptionTSTestCase (std::string name, uint32_t timestamp,
-                                          uint32_t echo)
+TcpOptionTSTestCase::TcpOptionTSTestCase (std::string name)
   : TestCase (name)
 {
-  m_timestamp = timestamp;
-  m_echo = echo;
 }
 
 void
 TcpOptionTSTestCase::DoRun ()
 {
-  TestSerialize ();
-  TestDeserialize ();
+  Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
+
+  for (uint32_t i = 0; i < 1000; ++i)
+    {
+      m_timestamp = x->GetInteger ();
+      m_echo = x->GetInteger ();
+      TestSerialize ();
+      TestDeserialize ();
+    }
 }
 
 void
@@ -171,17 +175,7 @@
         AddTestCase (new TcpOptionWSTestCase ("Testing window "
                                               "scale value", i), TestCase::QUICK);
       }
-
-    Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
-
-    for (uint32_t i = 0; i < 1000; ++i)
-      {
-        AddTestCase (new TcpOptionTSTestCase ("Testing serialization of random "
-                                              "values for timestamp",
-                                              x->GetInteger (),
-                                              x->GetInteger ()), TestCase::QUICK);
-      }
-
+    AddTestCase (new TcpOptionTSTestCase ("Testing serialization of random values for timestamp"), TestCase::QUICK);
   }
 
 } g_TcpOptionTestSuite;
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-csmaca.cc ns-3.23/src/lr-wpan/model/lr-wpan-csmaca.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-csmaca.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-csmaca.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanCsmaCa")
     .SetParent<Object> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanCsmaCa> ()
   ;
   return tid;
@@ -239,7 +240,7 @@
 
 
   symbolRate = (uint64_t) m_mac->GetPhy ()->GetDataOrSymbolRate (isData); //symbols per second
-  backoffPeriod = (uint64_t)m_random->GetValue (0, upperBound); //num backoff periods
+  backoffPeriod = (uint64_t)m_random->GetValue (0, upperBound+1); // num backoff periods
   randomBackoff = MicroSeconds (backoffPeriod * GetUnitBackoffPeriod () * 1000 * 1000 / symbolRate);
 
   if (IsUnSlottedCsmaCa ())
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-error-model.cc ns-3.23/src/lr-wpan/model/lr-wpan-error-model.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-error-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-error-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanErrorModel")
     .SetParent<Object> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanErrorModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-lqi-tag.cc ns-3.23/src/lr-wpan/model/lr-wpan-lqi-tag.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-lqi-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-lqi-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanLqiTag")
     .SetParent<Tag> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanLqiTag> ()
     .AddAttribute ("Lqi", "The lqi of the last packet received",
                    IntegerValue (0),
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-mac.cc ns-3.23/src/lr-wpan/model/lr-wpan-mac.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,6 +51,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanMac")
     .SetParent<Object> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanMac> ()
     .AddAttribute ("PanId", "16-bit identifier of the associated PAN",
                    UintegerValue (),
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-mac-header.cc ns-3.23/src/lr-wpan/model/lr-wpan-mac-header.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-mac-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -485,6 +485,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanMacHeader")
     .SetParent<Header> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanMacHeader> ();
   return tid;
 }
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-mac-trailer.cc ns-3.23/src/lr-wpan/model/lr-wpan-mac-trailer.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-mac-trailer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-mac-trailer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanMacTrailer")
     .SetParent<Trailer> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanMacTrailer> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-net-device.cc ns-3.23/src/lr-wpan/model/lr-wpan-net-device.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanNetDevice> ()
     .AddAttribute ("Channel", "The channel attached to this device",
                    PointerValue (),
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-phy.cc ns-3.23/src/lr-wpan/model/lr-wpan-phy.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-phy.cc	2015-05-13 11:05:27.000000000 -0700
@@ -75,6 +75,7 @@
 {
   static TypeId tid = TypeId ("ns3::LrWpanPhy")
     .SetParent<Object> ()
+    .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanPhy> ()
     .AddTraceSource ("TrxState",
                      "The state of the transceiver",
@@ -284,7 +285,7 @@
 
   Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams);
 
-  if ( lrWpanRxParams == 0)
+  if (lrWpanRxParams == 0)
     {
       CheckInterference ();
       m_signal->AddSignal (spectrumRxParams->psd);
@@ -449,7 +450,11 @@
       m_edPower.lastUpdate = now;
     }
 
-  CheckInterference ();
+  Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first;
+  if (currentRxParams == params)
+    {
+      CheckInterference ();
+    }
 
   // Update the interference.
   m_signal->RemoveSignal (par->psd);
@@ -461,7 +466,6 @@
     }
 
   // If this is the end of the currently received packet, check if reception was successful.
-  Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first;
   if (currentRxParams == params)
     {
       Ptr<Packet> currentPacket = currentRxParams->packetBurst->GetPackets ().front ();
@@ -898,7 +902,7 @@
           }
         if (m_phyPIBAttributes.phyCurrentChannel != attribute->phyCurrentChannel)
           {
-            // Cancel a pending tranceiver state change.
+            // Cancel a pending transceiver state change.
             // Switch off the transceiver.
             // TODO: Is switching off the transceiver the right choice?
             m_trxState = IEEE_802_15_4_PHY_TRX_OFF;
@@ -928,6 +932,8 @@
                   }
               }
             m_phyPIBAttributes.phyCurrentChannel = attribute->phyCurrentChannel;
+            LrWpanSpectrumValueHelper psdHelper;
+            m_txPsd = psdHelper.CreateTxPowerSpectralDensity (m_phyPIBAttributes.phyTransmitPower, m_phyPIBAttributes.phyCurrentChannel);
           }
         break;
       }
diff -Naur ns-3.22/src/lr-wpan/test/lr-wpan-collision-test.cc ns-3.23/src/lr-wpan/test/lr-wpan-collision-test.cc
--- ns-3.22/src/lr-wpan/test/lr-wpan-collision-test.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lr-wpan/test/lr-wpan-collision-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -189,7 +189,7 @@
   Simulator::Run ();
 
   std::cout << "m_rxPackets = " << int(m_rxPackets) << std::endl;
-  NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 0, "Received a packet (as expected)");
+  NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 1, "Received a packet (as expected)");
 
   // Fourth case: two concurrent tx and ACKs
   std::cout << "*** Fourth test " << std::endl;
diff -Naur ns-3.22/src/lte/bindings/callbacks_list.py ns-3.23/src/lte/bindings/callbacks_list.py
--- ns-3.22/src/lte/bindings/callbacks_list.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/bindings/callbacks_list.py	2015-05-13 11:05:27.000000000 -0700
@@ -1,5 +1,4 @@
 callback_classes = [
-    ['void', 'ns3::Ptr<ns3::Packet const>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', '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'],
diff -Naur ns-3.22/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.23/src/lte/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/lte/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -562,6 +562,8 @@
     module.add_class('ThresholdEutra', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ThresholdEutra [enumeration]
     module.add_enum('', ['THRESHOLD_RSRP', 'THRESHOLD_RSRQ'], outer_class=root_module['ns3::LteRrcSap::ThresholdEutra'])
+    ## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher [class]
+    module.add_class('LteSpectrumValueCatcher')
     ## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper [class]
     module.add_class('LteSpectrumValueHelper')
     ## lte-ue-cmac-sap.h (module 'lte'): ns3::LteUeCmacSapProvider [class]
@@ -1119,7 +1121,7 @@
     ## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy [class]
     module.add_class('LteSpectrumPhy', parent=root_module['ns3::SpectrumPhy'])
     ## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy::State [enumeration]
-    module.add_enum('State', ['IDLE', 'TX', 'RX_DATA', 'RX_CTRL'], outer_class=root_module['ns3::LteSpectrumPhy'])
+    module.add_enum('State', ['IDLE', 'TX_DL_CTRL', 'TX_DATA', 'TX_UL_SRS', 'RX_DL_CTRL', 'RX_DATA', 'RX_UL_SRS'], outer_class=root_module['ns3::LteSpectrumPhy'])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters [struct]
     module.add_class('LteSpectrumSignalParameters', parent=root_module['ns3::SpectrumSignalParameters'])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame [struct]
@@ -1790,6 +1792,7 @@
     register_Ns3LteRrcSapSystemInformationBlockType1_methods(root_module, root_module['ns3::LteRrcSap::SystemInformationBlockType1'])
     register_Ns3LteRrcSapSystemInformationBlockType2_methods(root_module, root_module['ns3::LteRrcSap::SystemInformationBlockType2'])
     register_Ns3LteRrcSapThresholdEutra_methods(root_module, root_module['ns3::LteRrcSap::ThresholdEutra'])
+    register_Ns3LteSpectrumValueCatcher_methods(root_module, root_module['ns3::LteSpectrumValueCatcher'])
     register_Ns3LteSpectrumValueHelper_methods(root_module, root_module['ns3::LteSpectrumValueHelper'])
     register_Ns3LteUeCmacSapProvider_methods(root_module, root_module['ns3::LteUeCmacSapProvider'])
     register_Ns3LteUeCmacSapProviderLogicalChannelConfig_methods(root_module, root_module['ns3::LteUeCmacSapProvider::LogicalChannelConfig'])
@@ -2822,11 +2825,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
@@ -6876,6 +6889,21 @@
     cls.add_instance_attribute('range', 'uint8_t', is_const=False)
     return
 
+def register_Ns3LteSpectrumValueCatcher_methods(root_module, cls):
+    ## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteSpectrumValueCatcher() [constructor]
+    cls.add_constructor([])
+    ## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteSpectrumValueCatcher(ns3::LteSpectrumValueCatcher const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteSpectrumValueCatcher const &', 'arg0')])
+    ## lte-chunk-processor.h (module 'lte'): ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueCatcher::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [])
+    ## lte-chunk-processor.h (module 'lte'): void ns3::LteSpectrumValueCatcher::ReportValue(ns3::SpectrumValue const & value) [member function]
+    cls.add_method('ReportValue', 
+                   'void', 
+                   [param('ns3::SpectrumValue const &', 'value')])
+    return
+
 def register_Ns3LteSpectrumValueHelper_methods(root_module, cls):
     ## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper::LteSpectrumValueHelper() [constructor]
     cls.add_constructor([])
@@ -9699,6 +9727,14 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::IsNackPresent(ns3::SequenceNumber10 nack) [member function]
+    cls.add_method('IsNackPresent', 
+                   'bool', 
+                   [param('ns3::SequenceNumber10', 'nack')])
+    ## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::OneMoreNackWouldFitIn(uint16_t bytes) [member function]
+    cls.add_method('OneMoreNackWouldFitIn', 
+                   'bool', 
+                   [param('uint16_t', 'bytes')])
     ## lte-rlc-am-header.h (module 'lte'): uint8_t ns3::LteRlcAmHeader::PopExtensionBit() [member function]
     cls.add_method('PopExtensionBit', 
                    'uint8_t', 
@@ -9707,6 +9743,10 @@
     cls.add_method('PopLengthIndicator', 
                    'uint16_t', 
                    [])
+    ## lte-rlc-am-header.h (module 'lte'): int ns3::LteRlcAmHeader::PopNack() [member function]
+    cls.add_method('PopNack', 
+                   'int', 
+                   [])
     ## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9720,6 +9760,10 @@
     cls.add_method('PushLengthIndicator', 
                    'void', 
                    [param('uint16_t', 'lengthIndicator')])
+    ## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::PushNack(int nack) [member function]
+    cls.add_method('PushNack', 
+                   'void', 
+                   [param('int', 'nack')])
     ## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
@@ -16875,10 +16919,14 @@
     cls.add_method('StartRxData', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteSpectrumSignalParametersDataFrame >', 'params')])
-    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxCtrl(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
-    cls.add_method('StartRxCtrl', 
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxDlCtrl(ns3::Ptr<ns3::LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams) [member function]
+    cls.add_method('StartRxDlCtrl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::LteSpectrumSignalParametersDlCtrlFrame >', 'lteDlCtrlRxParams')])
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxUlSrs(ns3::Ptr<ns3::LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams) [member function]
+    cls.add_method('StartRxUlSrs', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')])
+                   [param('ns3::Ptr< ns3::LteSpectrumSignalParametersUlSrsFrame >', 'lteUlSrsRxParams')])
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::SetHarqPhyModule(ns3::Ptr<ns3::LteHarqPhy> harq) [member function]
     cls.add_method('SetHarqPhyModule', 
                    'void', 
diff -Naur ns-3.22/src/lte/bindings/modulegen__gcc_LP64.py ns-3.23/src/lte/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/lte/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -562,6 +562,8 @@
     module.add_class('ThresholdEutra', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ThresholdEutra [enumeration]
     module.add_enum('', ['THRESHOLD_RSRP', 'THRESHOLD_RSRQ'], outer_class=root_module['ns3::LteRrcSap::ThresholdEutra'])
+    ## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher [class]
+    module.add_class('LteSpectrumValueCatcher')
     ## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper [class]
     module.add_class('LteSpectrumValueHelper')
     ## lte-ue-cmac-sap.h (module 'lte'): ns3::LteUeCmacSapProvider [class]
@@ -1119,7 +1121,7 @@
     ## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy [class]
     module.add_class('LteSpectrumPhy', parent=root_module['ns3::SpectrumPhy'])
     ## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy::State [enumeration]
-    module.add_enum('State', ['IDLE', 'TX', 'RX_DATA', 'RX_CTRL'], outer_class=root_module['ns3::LteSpectrumPhy'])
+    module.add_enum('State', ['IDLE', 'TX_DL_CTRL', 'TX_DATA', 'TX_UL_SRS', 'RX_DL_CTRL', 'RX_DATA', 'RX_UL_SRS'], outer_class=root_module['ns3::LteSpectrumPhy'])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters [struct]
     module.add_class('LteSpectrumSignalParameters', parent=root_module['ns3::SpectrumSignalParameters'])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame [struct]
@@ -1790,6 +1792,7 @@
     register_Ns3LteRrcSapSystemInformationBlockType1_methods(root_module, root_module['ns3::LteRrcSap::SystemInformationBlockType1'])
     register_Ns3LteRrcSapSystemInformationBlockType2_methods(root_module, root_module['ns3::LteRrcSap::SystemInformationBlockType2'])
     register_Ns3LteRrcSapThresholdEutra_methods(root_module, root_module['ns3::LteRrcSap::ThresholdEutra'])
+    register_Ns3LteSpectrumValueCatcher_methods(root_module, root_module['ns3::LteSpectrumValueCatcher'])
     register_Ns3LteSpectrumValueHelper_methods(root_module, root_module['ns3::LteSpectrumValueHelper'])
     register_Ns3LteUeCmacSapProvider_methods(root_module, root_module['ns3::LteUeCmacSapProvider'])
     register_Ns3LteUeCmacSapProviderLogicalChannelConfig_methods(root_module, root_module['ns3::LteUeCmacSapProvider::LogicalChannelConfig'])
@@ -2822,11 +2825,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
@@ -6876,6 +6889,21 @@
     cls.add_instance_attribute('range', 'uint8_t', is_const=False)
     return
 
+def register_Ns3LteSpectrumValueCatcher_methods(root_module, cls):
+    ## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteSpectrumValueCatcher() [constructor]
+    cls.add_constructor([])
+    ## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteSpectrumValueCatcher(ns3::LteSpectrumValueCatcher const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteSpectrumValueCatcher const &', 'arg0')])
+    ## lte-chunk-processor.h (module 'lte'): ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueCatcher::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [])
+    ## lte-chunk-processor.h (module 'lte'): void ns3::LteSpectrumValueCatcher::ReportValue(ns3::SpectrumValue const & value) [member function]
+    cls.add_method('ReportValue', 
+                   'void', 
+                   [param('ns3::SpectrumValue const &', 'value')])
+    return
+
 def register_Ns3LteSpectrumValueHelper_methods(root_module, cls):
     ## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper::LteSpectrumValueHelper() [constructor]
     cls.add_constructor([])
@@ -9699,6 +9727,14 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::IsNackPresent(ns3::SequenceNumber10 nack) [member function]
+    cls.add_method('IsNackPresent', 
+                   'bool', 
+                   [param('ns3::SequenceNumber10', 'nack')])
+    ## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::OneMoreNackWouldFitIn(uint16_t bytes) [member function]
+    cls.add_method('OneMoreNackWouldFitIn', 
+                   'bool', 
+                   [param('uint16_t', 'bytes')])
     ## lte-rlc-am-header.h (module 'lte'): uint8_t ns3::LteRlcAmHeader::PopExtensionBit() [member function]
     cls.add_method('PopExtensionBit', 
                    'uint8_t', 
@@ -9707,6 +9743,10 @@
     cls.add_method('PopLengthIndicator', 
                    'uint16_t', 
                    [])
+    ## lte-rlc-am-header.h (module 'lte'): int ns3::LteRlcAmHeader::PopNack() [member function]
+    cls.add_method('PopNack', 
+                   'int', 
+                   [])
     ## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9720,6 +9760,10 @@
     cls.add_method('PushLengthIndicator', 
                    'void', 
                    [param('uint16_t', 'lengthIndicator')])
+    ## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::PushNack(int nack) [member function]
+    cls.add_method('PushNack', 
+                   'void', 
+                   [param('int', 'nack')])
     ## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
@@ -16875,10 +16919,14 @@
     cls.add_method('StartRxData', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteSpectrumSignalParametersDataFrame >', 'params')])
-    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxCtrl(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
-    cls.add_method('StartRxCtrl', 
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxDlCtrl(ns3::Ptr<ns3::LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams) [member function]
+    cls.add_method('StartRxDlCtrl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::LteSpectrumSignalParametersDlCtrlFrame >', 'lteDlCtrlRxParams')])
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxUlSrs(ns3::Ptr<ns3::LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams) [member function]
+    cls.add_method('StartRxUlSrs', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')])
+                   [param('ns3::Ptr< ns3::LteSpectrumSignalParametersUlSrsFrame >', 'lteUlSrsRxParams')])
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::SetHarqPhyModule(ns3::Ptr<ns3::LteHarqPhy> harq) [member function]
     cls.add_method('SetHarqPhyModule', 
                    'void', 
diff -Naur ns-3.22/src/lte/doc/source/lte-design.rst ns-3.23/src/lte/doc/source/lte-design.rst
--- ns-3.22/src/lte/doc/source/lte-design.rst	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/doc/source/lte-design.rst	2015-05-13 11:05:27.000000000 -0700
@@ -503,7 +503,7 @@
 of periodic wideband CQI (i.e., a single value of channel state that is deemed representative of all RBs
 in use) and inband CQIs (i.e., a set of value representing the channel state for each RB).
 
-The CQI index to be reported is obtained by first obtaining a SINR measurement and then passing this SINR measurement  the :ref:`Adaptive Modulation and Coding` which will map it to the CQI index. 
+The CQI index to be reported is obtained by first obtaining a SINR measurement and then passing this SINR measurement to the `Adaptive Modulation and Coding`_ module which will map it to the CQI index. 
 
 In downlink, the SINR used to generate CQI feedback can be calculated in two different ways:
 
diff -Naur ns-3.22/src/lte/doc/source/lte-testing.rst ns-3.23/src/lte/doc/source/lte-testing.rst
--- ns-3.22/src/lte/doc/source/lte-testing.rst	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/doc/source/lte-testing.rst	2015-05-13 11:05:27.000000000 -0700
@@ -113,12 +113,6 @@
 each element in the test vector.
 
 
-
-
-
-
-
-
 System Tests
 ~~~~~~~~~~~~
 
@@ -130,25 +124,26 @@
 Attach UE -> Create Default+Dedicated Bearer -> Deactivate one of the Dedicated bearer
 
 Test case further deactivates dedicated bearer having bearer ID 2(LCID=BearerId+2) of First UE (UE_ID=1) 
-User can schedule bearer deactivation after specific time delay using Simulator::Schedule () method.
+User can schedule bearer deactivation after specific time delay using Simulator::Schedule () method. 
+
+Once the test case execution ends it will create ``DlRlcStats.txt`` and ``UlRlcStats.txt``. Key fields that need to be checked in statistics are:
 
-Once the test case execution ends it will create DlRlcStats.txt and UlRlcStats.txt. 
-Key fields that need to be checked in statistics are:
-|Start | end | Cell ID | IMSI | RNTI | LCID | TxBytes | RxBytes |
-
-Test case executes in three epoch’s.
-1) In first Epoch (0.04s-1.04s) All UE’s and corresponding bearers gets attached 
-   and packet flow over the dedicated bearers activated.
-2) In second Epoch (1.04s-2.04s), bearer deactivation is instantiated, hence User can see 
-   relatively less number of TxBytes on UE_ID=1 and LCID=4 as compared to other bearers.
-3) In third Epoch (2.04s-3.04s) since bearer deactivation of UE_ID=1 and LCID=4 is completed, 
-   user will not see any logging related to LCID=4.
+:: 
+
+  |Start | end | Cell ID | IMSI | RNTI | LCID | TxBytes | RxBytes |
+
+Test case executes in three epochs:
+
+ #. In first Epoch (0.04s-1.04s) All UE’s and corresponding bearers gets attached and packet flow over the dedicated bearers activated.
+ #. In second Epoch (1.04s-2.04s), bearer deactivation is instantiated, hence User can see relatively less number of TxBytes on UE_ID=1 and LCID=4 as compared to other bearers.
+ #. In third Epoch (2.04s-3.04s) since bearer deactivation of UE_ID=1 and LCID=4 is completed, user will not see any logging related to LCID=4.
 
 Test case passes if and only if 
-1) IMSI=1 and LCID=4 completely removed in third epoch 
-2) No packets seen in TxBytes and RxBytes corresponding to IMSI=1 and LCID=4
-If above criterion does not match test case considered to be failed
 
+ #. IMSI=1 and LCID=4 completely removed in third epoch 
+ #. No packets seen in TxBytes and RxBytes corresponding to IMSI=1 and LCID=4
+
+If above criteria do not match, the test case is considered to be failed
 
 .. _sec-lte-amc-tests:
 
@@ -1025,6 +1020,17 @@
 PDU are verified to check for an exact match with the test vector.
 
 
+The AM RLC implementation features an additional test suite,
+``lte-rlc-am-e2e``, which test the correct retransmission of RLC PDUs
+in presence of channel losses. The test instantiates an RLC AM
+transmitter and a receiver, and interposes a channel that randomly
+drops packet according to a fixed loss probability. Different test
+cases are instantiated using different ``RngRun`` values and different
+loss probability values. Each test case passes if at the end of the
+simulation all SDUs are correctly delivered to the upper layers of the
+receiving RLC AM entity.
+
+
 RRC
 ---
 
diff -Naur ns-3.22/src/lte/helper/emu-epc-helper.cc ns-3.23/src/lte/helper/emu-epc-helper.cc
--- ns-3.22/src/lte/helper/emu-epc-helper.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/emu-epc-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -69,6 +69,7 @@
 {
   static TypeId tid = TypeId ("ns3::EmuEpcHelper")
     .SetParent<EpcHelper> ()
+    .SetGroupName("Lte")
     .AddConstructor<EmuEpcHelper> ()
     .AddAttribute ("sgwDeviceName", 
                    "The name of the device used for the S1-U interface of the SGW",
diff -Naur ns-3.22/src/lte/helper/epc-helper.cc ns-3.23/src/lte/helper/epc-helper.cc
--- ns-3.22/src/lte/helper/epc-helper.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/epc-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,6 +47,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcHelper")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     ;
   return tid;
 }
diff -Naur ns-3.22/src/lte/helper/lte-stats-calculator.cc ns-3.23/src/lte/helper/lte-stats-calculator.cc
--- ns-3.22/src/lte/helper/lte-stats-calculator.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/lte-stats-calculator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -52,6 +52,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteStatsCalculator")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteStatsCalculator> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/helper/mac-stats-calculator.cc ns-3.23/src/lte/helper/mac-stats-calculator.cc
--- ns-3.22/src/lte/helper/mac-stats-calculator.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/mac-stats-calculator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,6 +47,7 @@
 {
   static TypeId tid = TypeId ("ns3::MacStatsCalculator")
     .SetParent<LteStatsCalculator> ()
+    .SetGroupName("Lte")
     .AddConstructor<MacStatsCalculator> ()
     .AddAttribute ("DlOutputFilename",
                    "Name of the file where the downlink results will be saved.",
diff -Naur ns-3.22/src/lte/helper/phy-rx-stats-calculator.cc ns-3.23/src/lte/helper/phy-rx-stats-calculator.cc
--- ns-3.22/src/lte/helper/phy-rx-stats-calculator.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/phy-rx-stats-calculator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::PhyRxStatsCalculator")
     .SetParent<LteStatsCalculator> ()
+    .SetGroupName("Lte")
     .AddConstructor<PhyRxStatsCalculator> ()
     .AddAttribute ("DlRxOutputFilename",
                    "Name of the file where the downlink results will be saved.",
diff -Naur ns-3.22/src/lte/helper/phy-stats-calculator.cc ns-3.23/src/lte/helper/phy-stats-calculator.cc
--- ns-3.22/src/lte/helper/phy-stats-calculator.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/phy-stats-calculator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -48,6 +48,7 @@
 {
   static TypeId tid = TypeId ("ns3::PhyStatsCalculator")
     .SetParent<LteStatsCalculator> ()
+    .SetGroupName("Lte")
     .AddConstructor<PhyStatsCalculator> ()
     .AddAttribute ("DlRsrpSinrFilename",
                    "Name of the file where the RSRP/SINR statistics will be saved.",
diff -Naur ns-3.22/src/lte/helper/phy-tx-stats-calculator.cc ns-3.23/src/lte/helper/phy-tx-stats-calculator.cc
--- ns-3.22/src/lte/helper/phy-tx-stats-calculator.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/phy-tx-stats-calculator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::PhyTxStatsCalculator")
     .SetParent<LteStatsCalculator> ()
+    .SetGroupName("Lte")
     .AddConstructor<PhyTxStatsCalculator> ()
     .AddAttribute ("DlTxOutputFilename",
                    "Name of the file where the downlink results will be saved.",
diff -Naur ns-3.22/src/lte/helper/point-to-point-epc-helper.cc ns-3.23/src/lte/helper/point-to-point-epc-helper.cc
--- ns-3.22/src/lte/helper/point-to-point-epc-helper.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/point-to-point-epc-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -112,6 +112,7 @@
 {
   static TypeId tid = TypeId ("ns3::PointToPointEpcHelper")
     .SetParent<EpcHelper> ()
+    .SetGroupName("Lte")
     .AddConstructor<PointToPointEpcHelper> ()
     .AddAttribute ("S1uLinkDataRate", 
                    "The data rate to be used for the next S1-U link to be created",
diff -Naur ns-3.22/src/lte/helper/radio-bearer-stats-calculator.cc ns-3.23/src/lte/helper/radio-bearer-stats-calculator.cc
--- ns-3.22/src/lte/helper/radio-bearer-stats-calculator.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/radio-bearer-stats-calculator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
   static TypeId tid =
     TypeId ("ns3::RadioBearerStatsCalculator")
     .SetParent<LteStatsCalculator> ().AddConstructor<RadioBearerStatsCalculator> ()
+    .SetGroupName("Lte")
     .AddAttribute ("StartTime", "Start time of the on going epoch.", 
                    TimeValue (Seconds (0.)),
                    MakeTimeAccessor (&RadioBearerStatsCalculator::SetStartTime,
diff -Naur ns-3.22/src/lte/helper/radio-environment-map-helper.cc ns-3.23/src/lte/helper/radio-environment-map-helper.cc
--- ns-3.22/src/lte/helper/radio-environment-map-helper.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/helper/radio-environment-map-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -70,6 +70,7 @@
   NS_LOG_FUNCTION ("RadioEnvironmentMapHelper::GetTypeId");
   static TypeId tid = TypeId ("ns3::RadioEnvironmentMapHelper")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<RadioEnvironmentMapHelper> ()
     .AddAttribute ("ChannelPath", "The path to the channel for which the Radio Environment Map is to be generated",
                    StringValue ("/ChannelList/0"),
diff -Naur ns-3.22/src/lte/model/a2-a4-rsrq-handover-algorithm.cc ns-3.23/src/lte/model/a2-a4-rsrq-handover-algorithm.cc
--- ns-3.22/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2015-05-13 11:05:27.000000000 -0700
@@ -64,6 +64,7 @@
 {
   static TypeId tid = TypeId ("ns3::A2A4RsrqHandoverAlgorithm")
     .SetParent<LteHandoverAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<A2A4RsrqHandoverAlgorithm> ()
     .AddAttribute ("ServingCellThreshold",
                    "If the RSRQ of the serving cell is worse than this "
diff -Naur ns-3.22/src/lte/model/a3-rsrp-handover-algorithm.cc ns-3.23/src/lte/model/a3-rsrp-handover-algorithm.cc
--- ns-3.22/src/lte/model/a3-rsrp-handover-algorithm.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/a3-rsrp-handover-algorithm.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,6 +51,7 @@
 {
   static TypeId tid = TypeId ("ns3::A3RsrpHandoverAlgorithm")
     .SetParent<LteHandoverAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<A3RsrpHandoverAlgorithm> ()
     .AddAttribute ("Hysteresis",
                    "Handover margin (hysteresis) in dB "
diff -Naur ns-3.22/src/lte/model/cqa-ff-mac-scheduler.cc ns-3.23/src/lte/model/cqa-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/cqa-ff-mac-scheduler.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/cqa-ff-mac-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -300,6 +300,7 @@
 {
   static TypeId tid = TypeId ("ns3::CqaFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<CqaFfMacScheduler>()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/epc-enb-application.cc ns-3.23/src/lte/model/epc-enb-application.cc
--- ns-3.22/src/lte/model/epc-enb-application.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-enb-application.cc	2015-05-13 11:05:27.000000000 -0700
@@ -62,7 +62,8 @@
 EpcEnbApplication::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::EpcEnbApplication")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Lte");
   return tid;
 }
 
diff -Naur ns-3.22/src/lte/model/epc-gtpu-header.cc ns-3.23/src/lte/model/epc-gtpu-header.cc
--- ns-3.22/src/lte/model/epc-gtpu-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-gtpu-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,9 +35,9 @@
 TypeId
 GtpuHeader::GetTypeId (void)
 {
-  static TypeId tid =
-    TypeId ("ns3::GtpuHeader")
+  static TypeId tid = TypeId ("ns3::GtpuHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<GtpuHeader> ();
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/epc-mme.cc ns-3.23/src/lte/model/epc-mme.cc
--- ns-3.22/src/lte/model/epc-mme.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-mme.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcMme")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcMme> ()
     ;
   return tid;
diff -Naur ns-3.22/src/lte/model/epc-sgw-pgw-application.cc ns-3.23/src/lte/model/epc-sgw-pgw-application.cc
--- ns-3.22/src/lte/model/epc-sgw-pgw-application.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-sgw-pgw-application.cc	2015-05-13 11:05:27.000000000 -0700
@@ -100,7 +100,8 @@
 EpcSgwPgwApplication::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::EpcSgwPgwApplication")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Lte");
   return tid;
 }
 
diff -Naur ns-3.22/src/lte/model/epc-ue-nas.cc ns-3.23/src/lte/model/epc-ue-nas.cc
--- ns-3.22/src/lte/model/epc-ue-nas.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-ue-nas.cc	2015-05-13 11:05:27.000000000 -0700
@@ -85,6 +85,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcUeNas")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcUeNas> ()
     .AddTraceSource ("StateTransition",
                      "fired upon every UE NAS state transition",
diff -Naur ns-3.22/src/lte/model/epc-x2.cc ns-3.23/src/lte/model/epc-x2.cc
--- ns-3.22/src/lte/model/epc-x2.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-x2.cc	2015-05-13 11:05:27.000000000 -0700
@@ -109,7 +109,8 @@
 EpcX2::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::EpcX2")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Lte");
   return tid;
 }
 
diff -Naur ns-3.22/src/lte/model/epc-x2-header.cc ns-3.23/src/lte/model/epc-x2-header.cc
--- ns-3.22/src/lte/model/epc-x2-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-x2-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2Header")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2Header> ()
   ;
   return tid;
@@ -173,6 +174,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2HandoverRequestHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2HandoverRequestHeader> ()
   ;
   return tid;
@@ -457,6 +459,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2HandoverRequestAckHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2HandoverRequestAckHeader> ()
   ;
   return tid;
@@ -682,6 +685,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2HandoverPreparationFailureHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2HandoverPreparationFailureHeader> ()
   ;
   return tid;
@@ -807,6 +811,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2SnStatusTransferHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2SnStatusTransferHeader> ()
   ;
   return tid;
@@ -997,6 +1002,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2UeContextReleaseHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2UeContextReleaseHeader> ()
   ;
   return tid;
@@ -1102,6 +1108,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2LoadInformationHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2LoadInformationHeader> ()
   ;
   return tid;
@@ -1330,6 +1337,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcX2ResourceStatusUpdateHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpcX2ResourceStatusUpdateHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/eps-bearer-tag.cc ns-3.23/src/lte/model/eps-bearer-tag.cc
--- ns-3.22/src/lte/model/eps-bearer-tag.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/eps-bearer-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpsBearerTag")
     .SetParent<Tag> ()
+    .SetGroupName("Lte")
     .AddConstructor<EpsBearerTag> ()
     .AddAttribute ("rnti", "The rnti that indicates the UE which packet belongs",
                    UintegerValue (0),
diff -Naur ns-3.22/src/lte/model/fdbet-ff-mac-scheduler.cc ns-3.23/src/lte/model/fdbet-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/fdbet-ff-mac-scheduler.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/fdbet-ff-mac-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -249,6 +249,7 @@
 {
   static TypeId tid = TypeId ("ns3::FdBetFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<FdBetFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/fdmt-ff-mac-scheduler.cc ns-3.23/src/lte/model/fdmt-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/fdmt-ff-mac-scheduler.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/fdmt-ff-mac-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -248,6 +248,7 @@
 {
   static TypeId tid = TypeId ("ns3::FdMtFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<FdMtFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/fdtbfq-ff-mac-scheduler.cc ns-3.23/src/lte/model/fdtbfq-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -253,6 +253,7 @@
 {
   static TypeId tid = TypeId ("ns3::FdTbfqFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<FdTbfqFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/ff-mac-scheduler.cc ns-3.23/src/lte/model/ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/ff-mac-scheduler.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/ff-mac-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -54,6 +54,7 @@
 {
   static TypeId tid = TypeId ("ns3::FfMacScheduler")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddAttribute ("UlCqiFilter",
                    "The filter to apply on UL CQIs received",
                    EnumValue (FfMacScheduler::ALL_UL_CQI),
diff -Naur ns-3.22/src/lte/model/lte-amc.cc ns-3.23/src/lte/model/lte-amc.cc
--- ns-3.22/src/lte/model/lte-amc.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-amc.cc	2015-05-13 11:05:27.000000000 -0700
@@ -234,6 +234,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteAmc")
   .SetParent<Object> ()
+  .SetGroupName("Lte")
   .AddConstructor<LteAmc> ()
   .AddAttribute ("Ber",
                  "The requested BER in assigning MCS (default is 0.00005).",
diff -Naur ns-3.22/src/lte/model/lte-anr.cc ns-3.23/src/lte/model/lte-anr.cc
--- ns-3.22/src/lte/model/lte-anr.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-anr.cc	2015-05-13 11:05:27.000000000 -0700
@@ -58,6 +58,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteAnr")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddAttribute ("Threshold",
                    "Minimum RSRQ range value required for detecting a neighbour cell",
                    UintegerValue (0),
diff -Naur ns-3.22/src/lte/model/lte-asn1-header.cc ns-3.23/src/lte/model/lte-asn1-header.cc
--- ns-3.22/src/lte/model/lte-asn1-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-asn1-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,7 @@
 {
   static TypeId tid = TypeId ("ns3::Asn1Header")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-chunk-processor.cc ns-3.23/src/lte/model/lte-chunk-processor.cc
--- ns-3.22/src/lte/model/lte-chunk-processor.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-chunk-processor.cc	2015-05-13 11:05:27.000000000 -0700
@@ -86,4 +86,18 @@
 }
 
 
+  
+void
+LteSpectrumValueCatcher::ReportValue (const SpectrumValue& value)
+{
+  m_value = value.Copy ();
+}
+
+Ptr<SpectrumValue> 
+LteSpectrumValueCatcher::GetValue ()
+{
+  return m_value;
+}
+
+
 } // namespace ns3
diff -Naur ns-3.22/src/lte/model/lte-chunk-processor.h ns-3.23/src/lte/model/lte-chunk-processor.h
--- ns-3.22/src/lte/model/lte-chunk-processor.h	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-chunk-processor.h	2015-05-13 11:05:27.000000000 -0700
@@ -88,6 +88,34 @@
   std::vector<LteChunkProcessorCallback> m_lteChunkProcessorCallbacks;
 };
 
+
+/**
+ * A sink to be plugged to the callback of LteChunkProcessor allowing
+ * to save and later retrieve the latest reported value 
+ * 
+ */
+class LteSpectrumValueCatcher
+{
+public:
+
+  /** 
+   * function to be plugged to LteChunkProcessor::AddCallback ()
+   * 
+   * \param value 
+   */
+  void ReportValue (const SpectrumValue& value);
+
+  /** 
+   * 
+   * 
+   * \return the latest value reported by the LteChunkProcessor
+   */
+  Ptr<SpectrumValue> GetValue ();
+  
+private:
+  Ptr<SpectrumValue> m_value;
+};
+
 } // namespace ns3
 
 
diff -Naur ns-3.22/src/lte/model/lte-enb-mac.cc ns-3.23/src/lte/model/lte-enb-mac.cc
--- ns-3.22/src/lte/model/lte-enb-mac.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-enb-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -314,6 +314,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteEnbMac")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteEnbMac> ()
     .AddAttribute ("NumberOfRaPreambles",
                    "how many random access preambles are available for the contention based RACH process",
diff -Naur ns-3.22/src/lte/model/lte-enb-phy.cc ns-3.23/src/lte/model/lte-enb-phy.cc
--- ns-3.22/src/lte/model/lte-enb-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-enb-phy.cc	2015-05-13 11:05:27.000000000 -0700
@@ -152,7 +152,6 @@
   m_harqPhyModule = Create <LteHarqPhy> ();
   m_downlinkSpectrumPhy->SetHarqPhyModule (m_harqPhyModule);
   m_uplinkSpectrumPhy->SetHarqPhyModule (m_harqPhyModule);
-  Simulator::ScheduleNow (&LteEnbPhy::StartFrame, this);
 }
 
 TypeId
@@ -160,6 +159,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteEnbPhy")
     .SetParent<LtePhy> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteEnbPhy> ()
     .AddAttribute ("TxPower",
                    "Transmission power in dBm",
@@ -249,6 +249,25 @@
 LteEnbPhy::DoInitialize ()
 {
   NS_LOG_FUNCTION (this);
+  bool haveNodeId = false;
+  uint32_t nodeId = 0;
+  if (m_netDevice != 0)
+    {
+      Ptr<Node> node = m_netDevice->GetNode ();
+      if (node != 0)
+        {
+          nodeId = node->GetId ();
+          haveNodeId = true;
+        }
+    }
+  if (haveNodeId)
+    {
+      Simulator::ScheduleWithContext (nodeId, Seconds (0), &LteEnbPhy::StartFrame, this);
+    }
+  else
+    {
+      Simulator::ScheduleNow (&LteEnbPhy::StartFrame, this);
+    }
   Ptr<SpectrumValue> noisePsd = LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (m_ulEarfcn, m_ulBandwidth, m_noiseFigure);
   m_uplinkSpectrumPhy->SetNoisePowerSpectralDensity (noisePsd);
   LtePhy::DoInitialize ();
diff -Naur ns-3.22/src/lte/model/lte-enb-rrc.cc ns-3.23/src/lte/model/lte-enb-rrc.cc
--- ns-3.22/src/lte/model/lte-enb-rrc.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-enb-rrc.cc	2015-05-13 11:05:26.000000000 -0700
@@ -1344,6 +1344,7 @@
   NS_LOG_FUNCTION ("LteEnbRrc::GetTypeId");
   static TypeId tid = TypeId ("ns3::LteEnbRrc")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteEnbRrc> ()
     .AddAttribute ("UeMap", "List of UeManager by C-RNTI.",
                    ObjectMapValue (),
diff -Naur ns-3.22/src/lte/model/lte-ffr-algorithm.cc ns-3.23/src/lte/model/lte-ffr-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -54,6 +54,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFfrAlgorithm")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddAttribute ("FrCellTypeId",
                    "Downlink FR cell type ID for automatic configuration,"
                    "default value is 0 and it means that user needs to configure FR algorithm manually,"
diff -Naur ns-3.22/src/lte/model/lte-ffr-distributed-algorithm.cc ns-3.23/src/lte/model/lte-ffr-distributed-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-distributed-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-distributed-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFfrDistributedAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFfrDistributedAlgorithm> ()
     .AddAttribute ("CalculationInterval",
                    "Time interval between calculation of Edge sub-band, Default value 1 second",
diff -Naur ns-3.22/src/lte/model/lte-ffr-enhanced-algorithm.cc ns-3.23/src/lte/model/lte-ffr-enhanced-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-enhanced-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-enhanced-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -120,6 +120,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFfrEnhancedAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFfrEnhancedAlgorithm> ()
     .AddAttribute ("UlSubBandOffset",
                    "Uplink SubBand Offset for this cell in number of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-ffr-soft-algorithm.cc ns-3.23/src/lte/model/lte-ffr-soft-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-soft-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-soft-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -118,6 +118,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFfrSoftAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFfrSoftAlgorithm> ()
     .AddAttribute ("UlCommonSubBandwidth",
                    "Uplink Medium (Common) SubBandwidth Configuration in number of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-fr-hard-algorithm.cc ns-3.23/src/lte/model/lte-fr-hard-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-hard-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-fr-hard-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -113,6 +113,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFrHardAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFrHardAlgorithm> ()
     .AddAttribute ("UlSubBandOffset",
                    "Uplink Offset in number of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-fr-no-op-algorithm.cc ns-3.23/src/lte/model/lte-fr-no-op-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-no-op-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-fr-no-op-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -58,6 +58,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFrNoOpAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFrNoOpAlgorithm> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-fr-soft-algorithm.cc ns-3.23/src/lte/model/lte-fr-soft-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-soft-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-fr-soft-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -116,6 +116,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFrSoftAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFrSoftAlgorithm> ()
     .AddAttribute ("UlEdgeSubBandOffset",
                    "Uplink Edge SubBand Offset in number of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-fr-strict-algorithm.cc ns-3.23/src/lte/model/lte-fr-strict-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-strict-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-fr-strict-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -118,6 +118,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteFrStrictAlgorithm")
     .SetParent<LteFfrAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteFrStrictAlgorithm> ()
     .AddAttribute ("UlCommonSubBandwidth",
                    "Uplink Common SubBandwidth Configuration in number of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-handover-algorithm.cc ns-3.23/src/lte/model/lte-handover-algorithm.cc
--- ns-3.22/src/lte/model/lte-handover-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-handover-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteHandoverAlgorithm")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-interference.cc ns-3.23/src/lte/model/lte-interference.cc
--- ns-3.22/src/lte/model/lte-interference.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-interference.cc	2015-05-13 11:05:26.000000000 -0700
@@ -62,6 +62,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteInterference")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-pdcp.cc ns-3.23/src/lte/model/lte-pdcp.cc
--- ns-3.22/src/lte/model/lte-pdcp.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-pdcp.cc	2015-05-13 11:05:26.000000000 -0700
@@ -85,6 +85,7 @@
 {
   static TypeId tid = TypeId ("ns3::LtePdcp")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddTraceSource ("TxPDU",
                      "PDU transmission notified to the RLC.",
                      MakeTraceSourceAccessor (&LtePdcp::m_txPdu),
diff -Naur ns-3.22/src/lte/model/lte-pdcp-header.cc ns-3.23/src/lte/model/lte-pdcp-header.cc
--- ns-3.22/src/lte/model/lte-pdcp-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-pdcp-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -70,6 +70,7 @@
 {
   static TypeId tid = TypeId ("ns3::LtePdcpHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<LtePdcpHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-pdcp-tag.cc ns-3.23/src/lte/model/lte-pdcp-tag.cc
--- ns-3.22/src/lte/model/lte-pdcp-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-pdcp-tag.cc	2015-05-13 11:05:26.000000000 -0700
@@ -46,6 +46,7 @@
 {
   static TypeId tid = TypeId ("ns3::PdcpTag")
     .SetParent<Tag> ()
+    .SetGroupName("Lte")
     .AddConstructor<PdcpTag> ();
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-phy.cc ns-3.23/src/lte/model/lte-phy.cc
--- ns-3.22/src/lte/model/lte-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-phy.cc	2015-05-13 11:05:26.000000000 -0700
@@ -60,6 +60,7 @@
 {
   static TypeId tid = TypeId ("ns3::LtePhy")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-phy-tag.cc ns-3.23/src/lte/model/lte-phy-tag.cc
--- ns-3.22/src/lte/model/lte-phy-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-phy-tag.cc	2015-05-13 11:05:26.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::LtePhyTag")
     .SetParent<Tag> ()
+    .SetGroupName("Lte")
     .AddConstructor<LtePhyTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-radio-bearer-tag.cc ns-3.23/src/lte/model/lte-radio-bearer-tag.cc
--- ns-3.22/src/lte/model/lte-radio-bearer-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-radio-bearer-tag.cc	2015-05-13 11:05:26.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRadioBearerTag")
     .SetParent<Tag> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRadioBearerTag> ()
     .AddAttribute ("rnti", "The rnti that indicates the UE to which packet belongs",
                    UintegerValue (0),
diff -Naur ns-3.22/src/lte/model/lte-rlc-am.cc ns-3.23/src/lte/model/lte-rlc-am.cc
--- ns-3.22/src/lte/model/lte-rlc-am.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-am.cc	2015-05-13 11:05:26.000000000 -0700
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Manuel Requena <manuel.requena@cttc.es>
+ *         Nicola Baldo <nbaldo@cttc.es>
  */
 
 #include "ns3/simulator.h"
@@ -26,12 +27,14 @@
 #include "ns3/lte-rlc-sdu-status-tag.h"
 #include "ns3/lte-rlc-tag.h"
 
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("LteRlcAm");
 
 NS_OBJECT_ENSURE_REGISTERED (LteRlcAm);
 
+
 LteRlcAm::LteRlcAm ()
 {
   NS_LOG_FUNCTION (this);
@@ -73,8 +76,7 @@
   m_reassemblingState = WAITING_S0_FULL;
   m_expectedSeqNumber = 0;
 
-  // Timers
-  m_pollRetransmitTimerValue = MilliSeconds (100);
+  m_pollRetransmitTimerJustExpired = false;
 }
 
 LteRlcAm::~LteRlcAm ()
@@ -87,12 +89,29 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcAm")
     .SetParent<LteRlc> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcAm> ()
     .AddAttribute ("PollRetransmitTimer",
-                   "Value of the t-PollRetransmit (See section 7.3 of 3GPP TS 36.322)",
-                   TimeValue (MilliSeconds (100)),
+                   "Value of the t-PollRetransmit timer (See section 7.3 of 3GPP TS 36.322)",
+                   TimeValue (MilliSeconds (20)),
                    MakeTimeAccessor (&LteRlcAm::m_pollRetransmitTimerValue),
                    MakeTimeChecker ())
+    .AddAttribute ("ReorderingTimer",
+                   "Value of the t-Reordering timer (See section 7.3 of 3GPP TS 36.322)",
+                   TimeValue (MilliSeconds (10)),
+                   MakeTimeAccessor (&LteRlcAm::m_reorderingTimerValue),
+                   MakeTimeChecker ())
+    .AddAttribute ("StatusProhibitTimer",
+                   "Value of the t-StatusProhibit timer (See section 7.3 of 3GPP TS 36.322)",
+                   TimeValue (MilliSeconds (10)),
+                   MakeTimeAccessor (&LteRlcAm::m_statusProhibitTimerValue),
+                   MakeTimeChecker ())
+    .AddAttribute ("ReportBufferStatusTimer",
+                   "How much to wait to issue a new Report Buffer Status since the last time "
+                   "a new SDU was received",     
+                   TimeValue (MilliSeconds (20)),
+                   MakeTimeAccessor (&LteRlcAm::m_rbsTimerValue),
+                   MakeTimeChecker ())
     .AddAttribute ("TxOpportunityForRetxAlwaysBigEnough",
                    "If true, always pretend that the size of a TxOpportunity is big enough "
                    "for retransmission. If false (default and realistic behavior), no retx "
@@ -112,6 +131,7 @@
   m_pollRetransmitTimer.Cancel ();
   m_reorderingTimer.Cancel ();
   m_statusProhibitTimer.Cancel ();
+  m_rbsTimer.Cancel ();
 
   m_txonBuffer.clear ();
   m_txonBufferSize = 0;
@@ -156,6 +176,8 @@
 
   /** Report Buffer Status */
   DoReportBufferStatus ();
+  m_rbsTimer.Cancel ();
+  m_rbsTimer = Simulator::Schedule (m_rbsTimerValue, &LteRlcAm::ExpireRbsTimer, this);
 }
 
 
@@ -194,7 +216,42 @@
       Ptr<Packet> packet = Create<Packet> ();
       LteRlcAmHeader rlcAmHeader;
       rlcAmHeader.SetControlPdu (LteRlcAmHeader::STATUS_PDU);
-      rlcAmHeader.SetAckSn (m_vrR);
+     
+      NS_LOG_LOGIC ("Check for SNs to NACK from " << m_vrR.GetValue() << " to " << m_vrMs.GetValue());
+      SequenceNumber10 sn;
+      sn.SetModulusBase (m_vrR);
+      std::map<uint16_t, PduBuffer>::iterator pduIt;
+      for (sn = m_vrR; sn < m_vrMs; sn++) 
+        {
+          NS_LOG_LOGIC ("SN = " << sn);          
+          if (!rlcAmHeader.OneMoreNackWouldFitIn (bytes))
+            {
+              NS_LOG_LOGIC ("Can't fit more NACKs in STATUS PDU");
+              break;
+            }          
+          pduIt = m_rxonBuffer.find (sn.GetValue ());
+          if (pduIt == m_rxonBuffer.end () || (!(pduIt->second.m_pduComplete)))
+            {
+              NS_LOG_LOGIC ("adding NACK_SN " << sn.GetValue ());
+              rlcAmHeader.PushNack (sn.GetValue ());              
+            }          
+        }
+      NS_LOG_LOGIC ("SN at end of NACK loop = " << sn);
+      // 3GPP TS 36.322 section 6.2.2.1.4 ACK SN
+      // find the  SN of the next not received RLC Data PDU 
+      // which is not reported as missing in the STATUS PDU. 
+      pduIt = m_rxonBuffer.find (sn.GetValue ());
+      while ((sn < m_vrMs) && (pduIt != m_rxonBuffer.end ()) && (pduIt->second.m_pduComplete))            
+        {
+          NS_LOG_LOGIC ("SN = " << sn << " < " << m_vrMs << " = " << (sn < m_vrMs));
+          sn++;
+          NS_LOG_LOGIC ("SN = " << sn);
+          pduIt = m_rxonBuffer.find (sn.GetValue ());
+        }
+      
+      NS_ASSERT_MSG (sn <= m_vrMs, "first SN not reported as missing = " << sn << ", VR(MS) = " << m_vrMs);      
+      rlcAmHeader.SetAckSn (sn); 
+
 
       NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
       packet->AddHeader (rlcAmHeader);
@@ -211,38 +268,114 @@
 
       m_statusPduRequested = false;
       m_statusPduBufferSize = 0;
+      m_statusProhibitTimer = Simulator::Schedule (m_statusProhibitTimerValue,
+                                                   &LteRlcAm::ExpireStatusProhibitTimer, this);
       return;
     }
   else if ( m_retxBufferSize > 0 )
     {
+      NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);      
       NS_LOG_LOGIC ("Sending data from Retransmission Buffer");
+      NS_ASSERT (m_vtA < m_vtS);
+      SequenceNumber10 sn;
+      sn.SetModulusBase (m_vtA);
+      bool found = false;
+      for (sn = m_vtA; sn < m_vtS; sn++) 
+        {
+          uint16_t seqNumberValue = sn.GetValue ();
+          NS_LOG_LOGIC ("SN = " << seqNumberValue << " m_pdu " << m_retxBuffer.at (seqNumberValue).m_pdu);
+
+          if (m_retxBuffer.at (seqNumberValue).m_pdu != 0)
+            {            
+
+              Ptr<Packet> packet = m_retxBuffer.at (seqNumberValue).m_pdu->Copy ();
+              
+              if (( packet->GetSize () <= bytes )
+                  || m_txOpportunityForRetxAlwaysBigEnough)
+                {
+                  found = true;
+                  // According to 5.2.1, the data field is left as is, but we rebuild the header
+                  LteRlcAmHeader rlcAmHeader;
+                  packet->RemoveHeader (rlcAmHeader);
+                  NS_LOG_LOGIC ("old AM RLC header: " << rlcAmHeader);
+
+                  // Calculate the Polling Bit (5.2.2.1)
+                  rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_NOT_REQUESTED);
+
+                  NS_LOG_LOGIC ("polling conditions: m_txonBuffer.empty=" << m_txonBuffer.empty () 
+                                << " retxBufferSize="  << m_retxBufferSize
+                                << " packet->GetSize ()=" << packet->GetSize ());
+                  if (((m_txonBuffer.empty ()) && (m_retxBufferSize == packet->GetSize () + rlcAmHeader.GetSerializedSize ())) 
+                      || (m_vtS >= m_vtMs)
+                      || m_pollRetransmitTimerJustExpired)
+                    {
+                      m_pollRetransmitTimerJustExpired = false;
+                      rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED);
+                      m_pduWithoutPoll = 0;
+                      m_byteWithoutPoll = 0;
+
+                      m_pollSn = m_vtS - 1;
+                      NS_LOG_LOGIC ("New POLL_SN = " << m_pollSn);
+
+                      if (! m_pollRetransmitTimer.IsRunning () )
+                        {
+                          NS_LOG_LOGIC ("Start PollRetransmit timer");
+
+                          m_pollRetransmitTimer = Simulator::Schedule (m_pollRetransmitTimerValue,
+                                                                       &LteRlcAm::ExpirePollRetransmitTimer, this);
+                        }
+                      else
+                        {
+                          NS_LOG_LOGIC ("Restart PollRetransmit timer");
+
+                          m_pollRetransmitTimer.Cancel ();
+                          m_pollRetransmitTimer = Simulator::Schedule (m_pollRetransmitTimerValue,
+                                                                       &LteRlcAm::ExpirePollRetransmitTimer, this);
+                        }
+                    }
 
-      Ptr<Packet> packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->Copy ();
+                  packet->AddHeader (rlcAmHeader);
+                  NS_LOG_LOGIC ("new AM RLC header: " << rlcAmHeader);
+                  
+                  // Send RLC PDU to MAC layer
+                  LteMacSapProvider::TransmitPduParameters params;
+                  params.pdu = packet;
+                  params.rnti = m_rnti;
+                  params.lcid = m_lcid;
+                  params.layer = layer;
+                  params.harqProcessId = harqId;
+                  
+                  m_macSapProvider->TransmitPdu (params);
+
+                  m_retxBuffer.at (seqNumberValue).m_retxCount++;
+                  NS_LOG_INFO ("Incr RETX_COUNT for SN = " << seqNumberValue);
+                  if (m_retxBuffer.at (seqNumberValue).m_retxCount >= m_maxRetxThreshold)
+                    {
+                      NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumberValue);
+                    }
 
-      if (( packet->GetSize () <= bytes )
-          || m_txOpportunityForRetxAlwaysBigEnough)
-        {
-          LteRlcAmHeader rlcAmHeader;
-          packet->PeekHeader (rlcAmHeader);
-          NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
-
-          // Send RLC PDU to MAC layer
-          LteMacSapProvider::TransmitPduParameters params;
-          params.pdu = packet;
-          params.rnti = m_rnti;
-          params.lcid = m_lcid;
-          params.layer = layer;
-          params.harqProcessId = harqId;
+                  NS_LOG_INFO ("Move SN = " << seqNumberValue << " back to txedBuffer");
+                  m_txedBuffer.at (seqNumberValue).m_pdu = m_retxBuffer.at (seqNumberValue).m_pdu->Copy ();
+                  m_txedBuffer.at (seqNumberValue).m_retxCount = m_retxBuffer.at (seqNumberValue).m_retxCount;
+                  m_txedBufferSize += m_txedBuffer.at (seqNumberValue).m_pdu->GetSize ();
+
+                  m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
+                  m_retxBuffer.at (seqNumberValue).m_pdu = 0;
+                  m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
+                  
+                  NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
 
-          m_macSapProvider->TransmitPdu (params);
-          return;
-        }
-      else
-        {
-          NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for retransmission of the packet (size = " << packet->GetSize () << ")");
-          NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
-          return;
+                  return;
+                }
+              else
+                {
+                  NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for retransmission of the packet (size = " << packet->GetSize () << ")");
+                  NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
+                  return;
+                }
+            }
         }
+      NS_ASSERT_MSG (found, "m_retxBufferSize > 0, but no PDU considered for retx found");
     }
   else if ( m_txonBufferSize > 0 )
     {
@@ -255,50 +388,14 @@
         return;
       }
 
-      NS_LOG_LOGIC ("Sending data from Transmission Buffer");
-    }
-  else if ( m_txedBufferSize > 0 )
-    {
-      NS_LOG_LOGIC ("Sending data from Transmitted Buffer");
-
-      NS_LOG_INFO ("VT(A)     = " << m_vtA);
-      NS_LOG_INFO ("VT(S)     = " << m_vtS);
-
-      uint16_t vta = m_vtA.GetValue ();
-      Ptr<Packet> packet = m_txedBuffer.at (vta)->Copy ();
-
-      if (( packet->GetSize () <= bytes )
-          || m_txOpportunityForRetxAlwaysBigEnough)
-        {
-          NS_LOG_INFO ("Move SN = " << vta << " to retxBuffer");
-          m_retxBuffer.at (vta).m_pdu = m_txedBuffer.at (vta)->Copy ();
-          m_retxBuffer.at (vta).m_retxCount = 1;
-          m_retxBufferSize += m_retxBuffer.at (vta).m_pdu->GetSize ();
-
-          m_txedBufferSize -= m_txedBuffer.at (vta)->GetSize ();
-          m_txedBuffer.at (vta) = 0;
-
-          LteRlcAmHeader rlcAmHeader;
-          packet->PeekHeader (rlcAmHeader);
-          NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
-
-          // Send RLC PDU to MAC layer
-          LteMacSapProvider::TransmitPduParameters params;
-          params.pdu = packet;
-          params.rnti = m_rnti;
-          params.lcid = m_lcid;
-          params.layer = layer;
-          params.harqProcessId = harqId;
-
-          m_macSapProvider->TransmitPdu (params);
-          return;
-        }
-      else
+      NS_ASSERT (m_vtS <= m_vtMs);
+      if (m_vtS == m_vtMs)
         {
-          NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for retransmission of the packet (size = " << packet->GetSize () << ")");
-          NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
+          NS_LOG_INFO ("cannot transmit new RLC PDU due to window stalling");
           return;
         }
+
+      NS_LOG_LOGIC ("Sending data from Transmission Buffer");
     }
   else
     {
@@ -430,7 +527,7 @@
 
           // nextSegmentSize MUST be zero (only if segment is smaller or equal to 2047)
 
-          // (NO more segments) → exit
+          // (NO more segments) ? exit
           // break;
         }
       else if ( (nextSegmentSize - firstSegment->GetSize () <= 2) || (m_txonBuffer.size () == 0) )
@@ -461,7 +558,7 @@
 
           // nextSegmentSize <= 2 (only if txBuffer is not empty)
 
-          // (NO more segments) → exit
+          // (NO more segments) ? exit
           // break;
         }
       else // (firstSegment->GetSize () < m_nextSegmentSize) && (m_txBuffer.size () > 0)
@@ -508,6 +605,9 @@
   rlcAmHeader.SetLastSegmentFlag (LteRlcAmHeader::LAST_PDU_SEGMENT);
   rlcAmHeader.SetSegmentOffset (0);
 
+  NS_ASSERT_MSG(rlcAmHeader.GetSequenceNumber () < m_vtMs, "SN above TX window");
+  NS_ASSERT_MSG(rlcAmHeader.GetSequenceNumber () >= m_vtA, "SN below TX window");
+
   // Calculate FramingInfo flag according the status of the SDUs in the DataField
   uint8_t framingInfo = 0;
   std::vector< Ptr<Packet> >::iterator it;
@@ -564,10 +664,12 @@
   NS_LOG_LOGIC ("BYTE_WITHOUT_POLL = " << m_byteWithoutPoll);
 
   if ( (m_pduWithoutPoll >= m_pollPdu) || (m_byteWithoutPoll >= m_pollByte) ||
-       ( (m_txonBuffer.empty ()) && (m_retxBuffer.empty ()) ) ||
+       ( (m_txonBuffer.empty ()) && (m_retxBufferSize == 0) ) ||
        (m_vtS >= m_vtMs)
+       || m_pollRetransmitTimerJustExpired
      )
     {
+      m_pollRetransmitTimerJustExpired = false;
       rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED);
       m_pduWithoutPoll = 0;
       m_byteWithoutPoll = 0;
@@ -600,7 +702,8 @@
   // Store new PDU into the Transmitted PDU Buffer
   NS_LOG_LOGIC ("Put transmitted PDU in the txedBuffer");
   m_txedBufferSize += packet->GetSize ();
-  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet->Copy ();
+  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ).m_pdu = packet->Copy ();
+  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ).m_retxCount = 0;
 
   // Sender timestamp
   RlcTag rlcTag (Simulator::Now ());
@@ -624,6 +727,7 @@
   NS_LOG_FUNCTION (this);
 }
 
+
 void
 LteRlcAm::DoReceivePdu (Ptr<Packet> p)
 {
@@ -697,6 +801,7 @@
 
 
       SequenceNumber10 seqNumber = rlcAmHeader.GetSequenceNumber ();
+      seqNumber.SetModulusBase (m_vrR);
 
       if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::SEGMENT )
         {
@@ -751,12 +856,25 @@
         }
       else
         {
-          NS_LOG_LOGIC ("Place PDU in the reception buffer ( SN = " << seqNumber << " )");
-          m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p);
-          m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true;
-
           // - if some byte segments of the AMD PDU contained in the RLC data PDU have been received before:
           //         - discard the duplicate byte segments.
+          // note: re-segmentation of AMD PDU is currently not supported, 
+          // so we just check that the segment was not received before
+          std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (seqNumber.GetValue ());
+          if (it != m_rxonBuffer.end () )
+            {
+              NS_ASSERT (it->second.m_byteSegments.size () > 0);
+              NS_ASSERT_MSG (it->second.m_byteSegments.size () == 1, "re-segmentation not supported");
+              NS_LOG_LOGIC ("PDU segment already received, discarded");
+            }
+          else
+            {
+              NS_LOG_LOGIC ("Place PDU in the reception buffer ( SN = " << seqNumber << " )");
+              m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p);
+              m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true;
+            }
+
+
         }
 
       // 5.1.3.2.3 Actions when a RLC data PDU is placed in the reception buffer
@@ -778,11 +896,11 @@
 
       std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (m_vrMs.GetValue ());
       if ( it != m_rxonBuffer.end () &&
-           m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
+           it->second.m_pduComplete )
         {
           int firstVrMs = m_vrMs.GetValue ();
           while ( it != m_rxonBuffer.end () &&
-                  m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
+                  it->second.m_pduComplete )
             {
               m_vrMs++;
               it = m_rxonBuffer.find (m_vrMs.GetValue ());
@@ -803,34 +921,34 @@
         {
           std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (seqNumber.GetValue ());
           if ( it != m_rxonBuffer.end () &&
-               m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete )
+               it->second.m_pduComplete )
             {
               it = m_rxonBuffer.find (m_vrR.GetValue ());
               int firstVrR = m_vrR.GetValue ();
               while ( it != m_rxonBuffer.end () &&
-                      m_rxonBuffer[ m_vrR.GetValue () ].m_pduComplete )
+                      it->second.m_pduComplete )
                 {
                   NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << m_vrR << " )");
-                  NS_ASSERT_MSG (m_rxonBuffer[ m_vrR.GetValue () ].m_byteSegments.size () == 1,
+                  NS_ASSERT_MSG (it->second.m_byteSegments.size () == 1,
                                 "Too many segments. PDU Reassembly process didn't work");
-                  ReassembleAndDeliver (m_rxonBuffer[ m_vrR.GetValue () ].m_byteSegments.front ());
+                  ReassembleAndDeliver (it->second.m_byteSegments.front ());
                   m_rxonBuffer.erase (m_vrR.GetValue ());
 
                   m_vrR++;
+                  m_vrR.SetModulusBase (m_vrR);
+                  m_vrX.SetModulusBase (m_vrR);
+                  m_vrMs.SetModulusBase (m_vrR);
+                  m_vrH.SetModulusBase (m_vrR);
                   it = m_rxonBuffer.find (m_vrR.GetValue ());
 
                   NS_ASSERT_MSG (firstVrR != m_vrR.GetValue (), "Infinite loop in RxonBuffer");
                 }
               NS_LOG_LOGIC ("New VR(R)  = " << m_vrR);
               m_vrMr = m_vrR + m_windowSize;
+
               NS_LOG_LOGIC ("New VR(MR) = " << m_vrMr);
             }
 
-//           NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << seqNumber << " )");
-//           NS_ASSERT_MSG (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.size () == 1,
-//                          "Too many segments. PDU Reassembly process didn't work");
-//           ReassembleAndDeliver (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.front ());
-//           m_rxonBuffer.erase (seqNumber.GetValue ());
         }
 
       // - if t-Reordering is running:
@@ -862,185 +980,109 @@
           if ( m_vrH > m_vrR )
             {
               NS_LOG_LOGIC ("Start reordering timer");
-              m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
+              m_reorderingTimer = Simulator::Schedule (m_reorderingTimerValue,
                                                        &LteRlcAm::ExpireReorderingTimer ,this);
               m_vrX = m_vrH;
               NS_LOG_LOGIC ("New VR(X) = " << m_vrX);
             }
         }
-
-
-
-      /// \todo To remove
-
-      // 5.1.2.2.3 Actions when an UMD PDU is placed in the reception buffer
-      // When an UMD PDU with SN = x is placed in the reception buffer, the receiving UM RLC entity shall:
-
-      // - if x falls outside of the reordering window:
-      //    - update VR(UH) to x + 1;
-      //    - reassemble RLC SDUs from any UMD PDUs with SN that falls outside of the reordering window, remove
-      //      RLC headers when doing so and deliver the reassembled RLC SDUs to upper layer in ascending order of the
-      //      RLC SN if not delivered before;
-      //    - if VR(UR) falls outside of the reordering window:
-      //        - set VR(UR) to (VR(UH) - UM_Window_Size);
-
-//       if ( ! IsInsideReorderingWindow (seqNumber))
-//         {
-//           NS_LOG_LOGIC ("SN outside the reordering window");
-// 
-//           m_vrUh = seqNumber + 1;
-//           NS_LOG_LOGIC ("New VR(UH) = " << m_vrUh);
-// 
-//           ReassembleOutsideWindow ();
-// 
-//           if ( ! IsInsideReorderingWindow (m_vrUr) )
-//             {
-//               m_vrUr = m_vrUh - m_windowSize;
-//               NS_LOG_LOGIC ("VR(UR) outside the reordering window");
-//               NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
-//             }
-//         }
-
-      // - if the reception buffer contains an UMD PDU with SN = VR(UR):
-      //    - update VR(UR) to the SN of the first UMD PDU with SN > current VR(UR) that has not been received;
-      //    - reassemble RLC SDUs from any UMD PDUs with SN < updated VR(UR), remove RLC headers when doing
-      //      so and deliver the reassembled RLC SDUs to upper layer in ascending order of the RLC SN if not delivered
-      //      before;
-
-//       if ( m_rxBuffer.count (m_vrUr) > 0 )
-//         {
-//           NS_LOG_LOGIC ("Reception buffer contains SN = " << m_vrUr);
-// 
-//           std::map <uint16_t, Ptr<Packet> >::iterator it;
-//           uint16_t newVrUr;
-// 
-//           it = m_rxBuffer.find (m_vrUr);
-//           newVrUr = (it->first) + 1;
-//           while ( m_rxBuffer.count (newVrUr) > 0 )
-//             {
-//               newVrUr++;
-//             }
-//           m_vrUr = newVrUr;
-//           NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
-// 
-//           ReassembleSnLessThan (m_vrUr);
-//         }
-
-      // - if t-Reordering is running:
-      //    - if VR(UX) <= VR(UR); or
-      //    - if VR(UX) falls outside of the reordering window and VR(UX) is not equal to VR(UH)::
-      //        - stop and reset t-Reordering;
-//       if ( m_reorderingTimer.IsRunning () )
-//         {
-//           NS_LOG_LOGIC ("Reordering timer is running");
-// 
-//           if ( (m_vrUx <= m_vrUr) ||
-//               ((! IsInsideReorderingWindow (m_vrUx)) && (m_vrUx != m_vrUh)) )
-//             {
-//               NS_LOG_LOGIC ("Stop reordering timer");
-//               m_reorderingTimer.Cancel ();
-//             }
-//         }
-
-      // - if t-Reordering is not running (includes the case when t-Reordering is stopped due to actions above):
-      //    - if VR(UH) > VR(UR):
-      //        - start t-Reordering;
-      //        - set VR(UX) to VR(UH).
-//       if ( ! m_reorderingTimer.IsRunning () )
-//         {
-//           NS_LOG_LOGIC ("Reordering timer is not running");
-// 
-//           if ( m_vrUx > m_vrUr )
-//             {
-//               NS_LOG_LOGIC ("VR(UX) > VR(UR). " << m_vrUx << " > " << m_vrUr);
-//               NS_LOG_LOGIC ("Start reordering timer");
-//               m_reorderingTimer = Simulator::Schedule (Time ("1.0s"),
-//                                                       &LteRlcAm::ExpireReorderingTimer ,this);
-//               m_vrUx = m_vrUh;
-//               NS_LOG_LOGIC ("New VR(UX) = " << m_vrUx);
-//             }
-//         }
-
     }
   else if ( rlcAmHeader.IsControlPdu () )
     {
       NS_LOG_INFO ("Control AM RLC PDU");
 
       SequenceNumber10 ackSn = rlcAmHeader.GetAckSn ();
-//       SequenceNumber10 seqNumber = m_vtA;
+      SequenceNumber10 sn;
 
       NS_LOG_INFO ("ackSn     = " << ackSn);
       NS_LOG_INFO ("VT(A)     = " << m_vtA);
       NS_LOG_INFO ("VT(S)     = " << m_vtS);
+      NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
+      NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);
 
       m_vtA.SetModulusBase (m_vtA);
       m_vtS.SetModulusBase (m_vtA);
+      m_vtMs.SetModulusBase (m_vtA);
       ackSn.SetModulusBase (m_vtA);
-      while (m_vtA < ackSn && m_vtA < m_vtS)
+      sn.SetModulusBase (m_vtA);
+
+      bool incrementVtA = true; 
+
+      for (sn = m_vtA; sn < ackSn && sn < m_vtS; sn++)
         {
-//           NS_LOG_INFO ("seqNumber = " << seqNumber);
-//           NS_LOG_INFO ("m_txedBuffer( VT(A) ).size = " << m_txedBuffer.size ());
+          NS_LOG_LOGIC ("sn = " << sn);
+
+          uint16_t seqNumberValue = sn.GetValue ();
 
-          uint16_t seqNumberValue = m_vtA.GetValue ();
           if (m_pollRetransmitTimer.IsRunning () 
               && (seqNumberValue == m_pollSn.GetValue ()))
             {
               m_pollRetransmitTimer.Cancel ();
             }
 
-          if (m_txedBuffer.at (seqNumberValue))
-            {
-              NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from txedBuffer");
-//               NS_LOG_INFO ("m_txedBuffer( " << m_vtA << " )->GetSize = " << m_txedBuffer.at (m_vtA.GetValue ())->GetSize ());
-              m_txedBufferSize -= m_txedBuffer.at (seqNumberValue)->GetSize ();
-              m_txedBuffer.at (seqNumberValue) = 0;
-            }
-
-          if (m_retxBuffer.at (seqNumberValue).m_pdu)
+          if (rlcAmHeader.IsNackPresent (sn))
             {
-              NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from retxBuffer");
-              m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
-              m_retxBuffer.at (seqNumberValue).m_pdu = 0;
-              m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
-            }
+              NS_LOG_LOGIC ("sn " << sn << " is NACKed");
 
-          m_vtA++;
-          m_vtA.SetModulusBase (m_vtA);
-          m_vtS.SetModulusBase (m_vtA);
-          ackSn.SetModulusBase (m_vtA);
-        }
+              incrementVtA = false;
 
-      NS_LOG_INFO ("New VT(A) = " << m_vtA);
-
-      SequenceNumber10 seqNumber = m_vtA;
-      uint16_t seqNumberValue;
-      while (seqNumber < m_vtS)
-        {
-          seqNumberValue = seqNumber.GetValue ();
-          if (m_txedBuffer.at (seqNumberValue))
-            {
-              NS_LOG_INFO ("Move SN = " << seqNumberValue << " to retxBuffer");
-              m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seqNumberValue)->Copy ();
-              m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
-              m_retxBufferSize += m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
+              if (m_txedBuffer.at (seqNumberValue).m_pdu != 0)
+                {
+                  NS_LOG_INFO ("Move SN = " << seqNumberValue << " to retxBuffer");
+                  m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seqNumberValue).m_pdu->Copy ();
+                  m_retxBuffer.at (seqNumberValue).m_retxCount = m_txedBuffer.at (seqNumberValue).m_retxCount;
+                  m_retxBufferSize += m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
+
+                  m_txedBufferSize -= m_txedBuffer.at (seqNumberValue).m_pdu->GetSize ();
+                  m_txedBuffer.at (seqNumberValue).m_pdu = 0;
+                  m_txedBuffer.at (seqNumberValue).m_retxCount = 0;
+                }
 
-              m_txedBufferSize -= m_txedBuffer.at (seqNumberValue)->GetSize ();
-              m_txedBuffer.at (seqNumberValue) = 0;
+              NS_ASSERT (m_retxBuffer.at (seqNumberValue).m_pdu != 0);
+              
             }
-          else if (m_retxBuffer.at (seqNumberValue).m_pdu)
+          else
             {
-              m_retxBuffer.at (seqNumberValue).m_retxCount++;
-              NS_LOG_INFO ("Incr RETX_COUNT for SN = " << seqNumberValue);
-              if (m_retxBuffer.at (seqNumberValue).m_retxCount >= m_maxRetxThreshold)
+              NS_LOG_LOGIC ("sn " << sn << " is ACKed");
+
+              if (m_txedBuffer.at (seqNumberValue).m_pdu)
+                {
+                  NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from txedBuffer");
+                  //               NS_LOG_INFO ("m_txedBuffer( " << m_vtA << " )->GetSize = " << m_txedBuffer.at (m_vtA.GetValue ())->GetSize ());
+                  m_txedBufferSize -= m_txedBuffer.at (seqNumberValue).m_pdu->GetSize ();
+                  m_txedBuffer.at (seqNumberValue).m_pdu = 0;
+                  NS_ASSERT (m_retxBuffer.at (seqNumberValue).m_pdu == 0);
+                }
+
+              if (m_retxBuffer.at (seqNumberValue).m_pdu)
                 {
-                  NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumberValue);
+                  NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from retxBuffer");
+                  m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
+                  m_retxBuffer.at (seqNumberValue).m_pdu = 0;
+                  m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
                 }
+
             }
 
-          seqNumber++;
-        }
+          NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
+          NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);      
 
+          if (incrementVtA)
+            {
+              m_vtA++;
+              m_vtMs = m_vtA + m_windowSize;
+              NS_LOG_INFO ("New VT(A) = " << m_vtA);
+              m_vtA.SetModulusBase (m_vtA);
+              m_vtMs.SetModulusBase (m_vtA);
+              m_vtS.SetModulusBase (m_vtA);
+              ackSn.SetModulusBase (m_vtA);
+              sn.SetModulusBase (m_vtA);
+            }
+          
+        } // loop over SN : VT(A) <= SN < ACK SN
+      
       return;
+
     }
   else
     {
@@ -1493,59 +1535,6 @@
 
 }
 
-
-/// \todo To remove
-// void
-// LteRlcAm::ReassembleOutsideWindow (void)
-// {
-//   NS_LOG_LOGIC ("Reassemble Outside Window");
-// 
-//   std::map <uint16_t, Ptr<Packet> >::iterator it;
-//   it = m_rxBuffer.begin ();
-// 
-//   while ( (it != m_rxBuffer.end ()) && ! IsInsideReorderingWindow (it->first) )
-//     {
-//       NS_LOG_LOGIC ("SN = " << it->first);
-// 
-//       // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
-//       ReassembleAndDeliver (it->second);
-//       m_rxBuffer.erase (it);
-//       it++;
-//     }
-// 
-//   if (it != m_rxBuffer.end ())
-//     {
-//       NS_LOG_LOGIC ("(SN = " << it->first << ") is inside the reordering window");
-//     }
-// }
-
-
-/// \todo To remove
-// void
-// LteRlcAm::ReassembleSnLessThan (uint16_t seqNumber)
-// {
-//   NS_LOG_LOGIC ("Reassemble SN < updated VR(UR)" );
-// 
-//   std::map <uint16_t, Ptr<Packet> >::iterator it;
-//   it = m_rxBuffer.begin ();
-// 
-//   while ( (it != m_rxBuffer.end ()) && (it->first < seqNumber) )
-//     {
-//       NS_LOG_LOGIC ("SN = " << it->first);
-// 
-//       // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
-//       ReassembleAndDeliver (it->second);
-//       m_rxBuffer.erase (it);
-//       it++;
-//     }
-// 
-//   if (it != m_rxBuffer.end ())
-//     {
-//       NS_LOG_LOGIC ("(SN = " << it->first << ") >= " << m_vrUr);
-//     }
-// }
-
-
 void
 LteRlcAm::DoReportBufferStatus (void)
 {
@@ -1569,17 +1558,23 @@
     }
 
   // Retransmission Queue HOL time
-  Time retxQueueHolDelay (0);
+  Time retxQueueHolDelay;
   RlcTag retxQueueHolTimeTag;
   if ( m_retxBufferSize > 0 )
     {
-      m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHolTimeTag);
+      if (m_retxBuffer.at (m_vtA.GetValue ()).m_pdu != 0)
+        {
+          m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHolTimeTag);
+        }
+      else
+        {
+          m_txedBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHolTimeTag);
+        }      
       retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
     }
-  else if ( m_txedBufferSize > 0 )
-    {
-      m_txedBuffer.at (m_vtA.GetValue ())->PeekPacketTag (retxQueueHolTimeTag);
-      retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
+  else 
+    {      
+      retxQueueHolDelay = Seconds (0);
     }
 
   LteMacSapProvider::ReportBufferStatusParameters r;
@@ -1631,7 +1626,7 @@
   int firstVrMs = m_vrMs.GetValue ();
   std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (m_vrMs.GetValue ());
   while ( it != m_rxonBuffer.end () &&
-          m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
+          it->second.m_pduComplete )
     {
       m_vrMs++;
       it = m_rxonBuffer.find (m_vrMs.GetValue ());
@@ -1643,11 +1638,16 @@
   if ( m_vrH > m_vrMs )
     {
       NS_LOG_LOGIC ("Start reordering timer");
-      m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
+      m_reorderingTimer = Simulator::Schedule (m_reorderingTimerValue,
                                               &LteRlcAm::ExpireReorderingTimer ,this);
       m_vrX = m_vrH;
       NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
     }
+
+    // Section 5.2.3 Status Reporting:
+    //   - The receiving side of an AM RLC entity shall trigger a
+    //     STATUS report when T_reordering expires. 
+  m_statusPduRequested = true;
 }
 
 void
@@ -1661,9 +1661,54 @@
   NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);
   NS_LOG_LOGIC ("statusPduRequested = " << m_statusPduRequested);
 
-  DoReportBufferStatus ();
+  m_pollRetransmitTimerJustExpired = true;
+
+  // see section 5.2.2.3
+  // note the difference between Rel 8 and Rel 11 specs; we follow Rel 11 here
+  NS_ASSERT (m_vtS <= m_vtMs);
+  if ((m_txonBufferSize == 0 && m_retxBufferSize == 0)
+      || (m_vtS == m_vtMs))
+    {
+      NS_LOG_INFO ("txonBuffer and retxBuffer empty. Move PDUs up to = " << m_vtS.GetValue () - 1 << " to retxBuffer");
+      uint16_t sn = 0;
+      for ( sn = m_vtA.GetValue(); sn < m_vtS.GetValue (); sn++ )
+        {
+          bool pduAvailable = m_txedBuffer.at (sn).m_pdu != 0;
+
+           if ( pduAvailable )
+             {
+               NS_LOG_INFO ("Move PDU " << sn << " from txedBuffer to retxBuffer");
+               m_retxBuffer.at (sn).m_pdu = m_txedBuffer.at (sn).m_pdu->Copy ();
+               m_retxBuffer.at (sn).m_retxCount = m_txedBuffer.at (sn).m_retxCount;
+               m_retxBufferSize += m_retxBuffer.at (sn).m_pdu->GetSize ();
+
+               m_txedBufferSize -= m_txedBuffer.at (sn).m_pdu->GetSize ();
+               m_txedBuffer.at (sn).m_pdu = 0;
+               m_txedBuffer.at (sn).m_retxCount = 0;
+             }
+        }
+    }
+
+  DoReportBufferStatus ();  
 }
 
 
+void 
+LteRlcAm::ExpireStatusProhibitTimer (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteRlcAm::ExpireRbsTimer (void)
+{
+  NS_LOG_LOGIC ("RBS Timer expires");
+
+  if (m_txonBufferSize + m_txedBufferSize + m_retxBufferSize > 0)
+    {
+      DoReportBufferStatus ();
+      m_rbsTimer = Simulator::Schedule (m_rbsTimerValue, &LteRlcAm::ExpireRbsTimer, this);
+    }
+}
 
 } // namespace ns3
diff -Naur ns-3.22/src/lte/model/lte-rlc-am.h ns-3.23/src/lte/model/lte-rlc-am.h
--- ns-3.22/src/lte/model/lte-rlc-am.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-am.h	2015-05-13 11:05:26.000000000 -0700
@@ -61,6 +61,13 @@
    */
   void ExpireReorderingTimer (void);
   void ExpirePollRetransmitTimer (void);
+  void ExpireRbsTimer (void);
+
+  /** 
+   * method called when the T_status_prohibit timer expires
+   * 
+   */
+  void ExpireStatusProhibitTimer (void);
 
   bool IsInsideReceivingWindow (SequenceNumber10 seqNumber);
 // 
@@ -73,15 +80,17 @@
 
 private:
     std::vector < Ptr<Packet> > m_txonBuffer;       // Transmission buffer
-    std::vector < Ptr<Packet> > m_txedBuffer;       // Transmitted packets buffer
 
-    struct RetxBuffer
+    struct RetxPdu
     {
       Ptr<Packet> m_pdu;
       uint16_t    m_retxCount;
     };
 
-    std::vector < RetxBuffer > m_retxBuffer;       // Retransmission buffer
+  std::vector <RetxPdu> m_txedBuffer;  ///< Buffer for transmitted and retransmitted PDUs 
+                                       ///< that have not been acked but are not considered 
+                                       ///< for retransmission 
+  std::vector <RetxPdu> m_retxBuffer;  ///< Buffer for PDUs considered for retransmission
 
     uint32_t m_txonBufferSize;
     uint32_t m_retxBufferSize;
@@ -96,8 +105,6 @@
       std::list < Ptr<Packet> >  m_byteSegments;
 
       bool      m_pduComplete;
-      uint16_t  m_totalSize;
-      uint16_t  m_currSize;
     };
 
     std::map <uint16_t, PduBuffer > m_rxonBuffer; // Reception buffer
@@ -142,7 +149,11 @@
   EventId m_pollRetransmitTimer;
   Time    m_pollRetransmitTimerValue;
   EventId m_reorderingTimer;
+  Time    m_reorderingTimerValue;
   EventId m_statusProhibitTimer;
+  Time    m_statusProhibitTimerValue;
+  EventId m_rbsTimer;
+  Time    m_rbsTimerValue;
 
   /**
    * Configurable parameters. See section 7.4 in TS 36.322
@@ -152,6 +163,7 @@
   uint16_t m_pollByte;
   
   bool m_txOpportunityForRetxAlwaysBigEnough;
+  bool m_pollRetransmitTimerJustExpired;
 
   /**
    * SDU Reassembling state
diff -Naur ns-3.22/src/lte/model/lte-rlc-am-header.cc ns-3.23/src/lte/model/lte-rlc-am-header.cc
--- ns-3.22/src/lte/model/lte-rlc-am-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-am-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -38,8 +38,7 @@
     m_segmentOffset (0xffff),
     m_lastOffset (0xffff),
     m_controlPduType (0xff),
-    m_ackSn (0xffff),
-    m_nackSn (0xffff)
+    m_ackSn (0xffff)
 {
 }
 
@@ -55,7 +54,6 @@
     m_lastOffset = 0xffff;
     m_controlPduType = 0xff;
     m_ackSn = 0xffff;
-    m_nackSn = 0xffff;
 }
 
 void
@@ -214,6 +212,76 @@
   m_ackSn = ackSn;
 }
 
+bool
+LteRlcAmHeader::OneMoreNackWouldFitIn (uint16_t bytes)
+{
+  NS_LOG_FUNCTION (this << bytes);
+  NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcAmHeader::STATUS_PDU,
+                 "method allowed only for STATUS PDUs");
+  if (m_nackSnList.size () % 2 == 0)
+    {
+      return (m_headerLength < bytes);
+    }
+  else
+    {
+      return (m_headerLength < (bytes - 1));
+    }
+}
+
+void
+LteRlcAmHeader::PushNack (int nack)
+{
+  NS_LOG_FUNCTION (this << nack);
+  NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcAmHeader::STATUS_PDU,
+                 "method allowed only for STATUS PDUs");
+  m_nackSnList.push_back (nack);
+
+  if (m_nackSnList.size () % 2 == 0)
+    {
+      m_headerLength++;
+    }
+  else
+    {
+      m_headerLength+=2;
+    }
+}
+
+bool
+LteRlcAmHeader::IsNackPresent (SequenceNumber10 nack)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcAmHeader::STATUS_PDU,
+                 "method allowed only for STATUS PDUs");
+  for (std::list<int>::iterator nackIt = m_nackSnList.begin ();
+       nackIt != m_nackSnList.end ();
+       ++nackIt)
+    {
+      if ((*nackIt) == nack.GetValue ())
+        {
+          return true;
+        }
+    }
+  return false;  
+}
+
+int
+LteRlcAmHeader::PopNack (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcAmHeader::STATUS_PDU,
+                 "method allowed only for STATUS PDUs");
+  if ( m_nackSnList.empty () )
+    {
+      return -1;
+    }
+
+  int nack = m_nackSnList.front ();
+  m_nackSnList.pop_front ();
+
+  return nack;
+}
+
+
 SequenceNumber10
 LteRlcAmHeader::GetAckSn (void) const
 {
@@ -226,6 +294,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcAmHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcAmHeader> ()
   ;
   return tid;
@@ -242,6 +311,7 @@
 {
   std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
   std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
+  std::list <int>::const_iterator it3 = m_nackSnList.begin ();
 
   os << "Len=" << m_headerLength;
   os << " D/C=" << (uint16_t)m_dataControlBit;
@@ -280,7 +350,14 @@
   else // if ( m_dataControlBit == CONTROL_PDU )
     {
       os << " ACK_SN=" << m_ackSn;
-      os << " NACK_SN=" << m_nackSn;
+
+       while ( it3 != m_nackSnList.end () )
+        {
+          os << " NACK_SN=" << (int)(*it3);
+          it3++;
+        }
+
+ 
     }
 }
 
@@ -295,6 +372,7 @@
 
   std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
   std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
+  std::list <int>::const_iterator it3 = m_nackSnList.begin ();
 
   if ( m_dataControlBit == DATA_PDU )
     {
@@ -347,7 +425,77 @@
       i.WriteU8 ( ((CONTROL_PDU << 7) & 0x80) |
                   ((m_controlPduType << 4) & 0x70) |
                   ((m_ackSn.GetValue () >> 6) & 0x0F) );
-      i.WriteU8 ( ((m_ackSn.GetValue () << 2) & 0xFC) );
+      // note: second part of ackSn will be written later
+
+      // serialize the NACKs
+      if ( it3 == m_nackSnList.end () ) 
+        {
+          NS_LOG_LOGIC (this << " no NACKs");
+           // If there are no NACKs then this line adds the rest of the ACK
+           // along with 0x00, indicating an E1 value of 0 or no NACKs follow.
+           i.WriteU8 ( ((m_ackSn.GetValue () << 2) & 0xFC) );
+        }
+      else
+        {
+          int oddNack = *it3;
+          int evenNack = -1;
+          // Else write out a series of E1 = 1 and NACK values. Note since we
+          // are not supporting SO start/end the value of E2 will always be 0.
+
+
+          // First write out the ACK along with the very first NACK
+          // And the remaining NACK with 0x02 or 10 in binary to set
+          // E1 to 1, then Or in the first bit of the NACK
+          i.WriteU8 ( ((m_ackSn.GetValue () << 2) & 0xFC)
+            | (0x02)
+            | ((*it3 >> 9) & 0x01));
+
+          while ( it3 != m_nackSnList.end () )
+            {
+              // The variable oddNack has the current NACK value to write, also
+              // either the setup to enter this loop or the previous loop would
+              // have written the highest order bit to the previouse octet.
+              // Write the next set of bits (2 - 9) into the next octet
+              i.WriteU8( ((oddNack >> 1) & 0xFF) );
+
+              // Next check to see if there is going to be another NACK after
+              // this
+              it3++;
+              if ( it3 != m_nackSnList.end () )
+                {
+                  // Yes there will be another NACK after this, so E1 will be 1
+                  evenNack = *it3;
+                  i.WriteU8( ((oddNack << 7) & 0x80)
+                   | (0x40)  // E1 = 1 E2 = 0, more NACKs
+                   | ( (evenNack >> 5) & 0x1F) );
+
+                  // The final octet of this loop will have the rest of the
+                  // NACK and another E1, E2. Check to see if there will be
+                  // one more NACK after this.
+                  it3++;
+                  if ( it3 != m_nackSnList.end () )
+                    {
+                      // Yes there is at least one more NACK. Finish writing
+                      // this octet and the next iteration will do the rest.
+                      oddNack = *it3;
+                      i.WriteU8 ( ((evenNack << 3) & 0xF8)
+                        | (0x04)
+                        | ((oddNack >> 9) & 0x01));
+                    }
+                  else
+                    {
+                      // No, there are no more NACKs
+                      i.WriteU8 ( ((evenNack << 3) & 0xF8) );
+                    }
+                }
+              else
+                {
+                  // No, this is the last NACK so E1 will be 0
+                  i.WriteU8 ( ((oddNack << 7) & 0x80) );
+                }
+            }
+        }
+
     }
 }
 
@@ -431,7 +579,65 @@
       m_controlPduType = (byte_1 & 0x70) >> 4;
       m_ackSn = ((byte_1 & 0x0F) << 6 ) | ((byte_2 & 0xFC) >> 2);
 
-      m_headerLength++;
+      int moreNacks = (byte_2 & 0x02) >> 1;
+      // Get the first NACK outside the loop as it is not preceded by an E2
+      // field but all following NACKs will.
+      if ( moreNacks == 1 )
+        {
+          byte_3 = i.ReadU8 ();
+          byte_4 = i.ReadU8 ();
+          m_headerLength = 4;
+
+          m_nackSnList.push_back (
+            ((byte_2 & 0x01) << 9)
+            | (byte_3 << 1)
+            | ((byte_4 & 0x80) >> 7)
+          );
+
+         // Loop until all NACKs are found
+         moreNacks = ((byte_4 & 0x40) >> 6);
+         uint8_t byte = byte_4;
+         uint8_t nextByte;
+         uint8_t finalByte;
+         while (moreNacks == 1)
+           {
+             // Ignore E2, read next NACK
+             nextByte = i.ReadU8 ();
+             m_nackSnList.push_back (
+              ((byte & 0x1F) << 5)
+              | ((nextByte & 0xF8) >> 3)
+            );
+
+            // Check for another NACK, after this any following NACKs will
+            // be aligned properly for the next iteration of this loop.
+            moreNacks = (nextByte & 0x04) >> 2;
+            byte = nextByte;
+            if (moreNacks == 1)
+              {
+                nextByte = i.ReadU8 ();
+                finalByte = i.ReadU8 ();
+
+                 m_nackSnList.push_back (
+                   ((byte & 0x01) << 9)
+                   | (nextByte << 1)
+                   | ((finalByte & 0x80) >> 7)
+                 );
+
+                moreNacks = ((finalByte & 0x40) >> 6);
+                byte = finalByte;
+                m_headerLength+=3;
+              }
+            else
+              {
+                m_headerLength++;
+              }
+
+           }
+        }
+      else
+        {
+          m_headerLength++;
+        }
     }
 
   return GetSerializedSize ();
diff -Naur ns-3.22/src/lte/model/lte-rlc-am-header.h ns-3.23/src/lte/model/lte-rlc-am-header.h
--- ns-3.22/src/lte/model/lte-rlc-am-header.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-am-header.h	2015-05-13 11:05:26.000000000 -0700
@@ -136,6 +136,41 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+  /** 
+   * 
+   * 
+   * \param bytes max allowed CONTROL PDU size
+   * 
+   * \return true if one more NACK would fit in the CONTROL PDU; false otherwise
+   */
+  bool OneMoreNackWouldFitIn (uint16_t bytes);
+
+  /** 
+   * Add one more NACK to the CONTROL PDU
+   * 
+   * \param nack 
+   */
+  void PushNack (int nack);
+
+  /** 
+   * 
+   * 
+   * \param nack SN of the NACK
+   * 
+   * \return true if the NACK is present in the STATUS PDU, false otherwise
+   */
+  bool IsNackPresent (SequenceNumber10 nack);
+
+
+  /** 
+   * Retrieve one NACK from the CONTROL PDU
+   * 
+   * 
+   * \return the SN  >= 0 of the next nack; returns -1 if no NACK is left
+   */
+  int PopNack (void);
+
+
 private:
   uint16_t m_headerLength;
   uint8_t  m_dataControlBit;
@@ -157,7 +192,7 @@
 
   // Status PDU fields
   SequenceNumber10 m_ackSn;
-  SequenceNumber10 m_nackSn;
+  std::list <int> m_nackSnList;
 
   std::list <uint8_t> m_extensionBits1; // Includes E1 after ACK_SN
   std::list <uint8_t> m_extensionBits2;
diff -Naur ns-3.22/src/lte/model/lte-rlc.cc ns-3.23/src/lte/model/lte-rlc.cc
--- ns-3.22/src/lte/model/lte-rlc.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc.cc	2015-05-13 11:05:26.000000000 -0700
@@ -102,6 +102,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlc")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddTraceSource ("TxPDU",
                      "PDU transmission notified to the MAC.",
                      MakeTraceSourceAccessor (&LteRlc::m_txPdu),
@@ -185,6 +186,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcSm")
     .SetParent<LteRlc> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcSm> ()
     ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-rlc-header.cc ns-3.23/src/lte/model/lte-rlc-header.cc
--- ns-3.22/src/lte/model/lte-rlc-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -116,6 +116,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-rlc-sdu-status-tag.cc ns-3.23/src/lte/model/lte-rlc-sdu-status-tag.cc
--- ns-3.22/src/lte/model/lte-rlc-sdu-status-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-sdu-status-tag.cc	2015-05-13 11:05:26.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcSduStatusTag")
     .SetParent<Tag> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcSduStatusTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-rlc-sequence-number.h ns-3.23/src/lte/model/lte-rlc-sequence-number.h
--- ns-3.22/src/lte/model/lte-rlc-sequence-number.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-sequence-number.h	2015-05-13 11:05:26.000000000 -0700
@@ -79,6 +79,7 @@
   {
     SequenceNumber10 retval (m_value);
     m_value = ((uint32_t)m_value + 1) % 1024;
+    retval.SetModulusBase (m_modulusBase);
     return retval;
   }
 
diff -Naur ns-3.22/src/lte/model/lte-rlc-tag.cc ns-3.23/src/lte/model/lte-rlc-tag.cc
--- ns-3.22/src/lte/model/lte-rlc-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-tag.cc	2015-05-13 11:05:26.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::RlcTag")
     .SetParent<Tag> ()
+    .SetGroupName("Lte")
     .AddConstructor<RlcTag> ();
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-rlc-tm.cc ns-3.23/src/lte/model/lte-rlc-tm.cc
--- ns-3.22/src/lte/model/lte-rlc-tm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-tm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -48,6 +48,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcTm")
     .SetParent<LteRlc> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcTm> ()
     .AddAttribute ("MaxTxBufferSize",
                    "Maximum Size of the Transmission Buffer (in Bytes)",
diff -Naur ns-3.22/src/lte/model/lte-rlc-um.cc ns-3.23/src/lte/model/lte-rlc-um.cc
--- ns-3.22/src/lte/model/lte-rlc-um.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-um.cc	2015-05-13 11:05:26.000000000 -0700
@@ -56,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteRlcUm")
     .SetParent<LteRlc> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteRlcUm> ()
     .AddAttribute ("MaxTxBufferSize",
                    "Maximum Size of the Transmission Buffer (in Bytes)",
diff -Naur ns-3.22/src/lte/model/lte-rrc-header.cc ns-3.23/src/lte/model/lte-rrc-header.cc
--- ns-3.22/src/lte/model/lte-rrc-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rrc-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -50,6 +50,7 @@
 {
   static TypeId tid = TypeId ("ns3::RrcAsn1Header")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
   ;
   return tid;
 }
@@ -3905,6 +3906,7 @@
 {
   static TypeId tid = TypeId ("ns3::RrcConnectionRequestHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-rrc-protocol-ideal.cc ns-3.23/src/lte/model/lte-rrc-protocol-ideal.cc
--- ns-3.22/src/lte/model/lte-rrc-protocol-ideal.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rrc-protocol-ideal.cc	2015-05-13 11:05:26.000000000 -0700
@@ -63,6 +63,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteUeRrcProtocolIdeal")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteUeRrcProtocolIdeal> ()
     ;
   return tid;
@@ -230,6 +231,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolIdeal")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteEnbRrcProtocolIdeal> ()
     ;
   return tid;
@@ -459,6 +461,7 @@
 {
   static TypeId tid = TypeId ("ns3::IdealHandoverPreparationInfoHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<IdealHandoverPreparationInfoHeader> ()
   ;
   return tid;
@@ -565,6 +568,7 @@
 {
   static TypeId tid = TypeId ("ns3::IdealHandoverCommandHeader")
     .SetParent<Header> ()
+    .SetGroupName("Lte")
     .AddConstructor<IdealHandoverCommandHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-rrc-protocol-real.cc ns-3.23/src/lte/model/lte-rrc-protocol-real.cc
--- ns-3.22/src/lte/model/lte-rrc-protocol-real.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rrc-protocol-real.cc	2015-05-13 11:05:26.000000000 -0700
@@ -68,6 +68,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteUeRrcProtocolReal")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteUeRrcProtocolReal> ()
   ;
   return tid;
@@ -383,6 +384,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolReal")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteEnbRrcProtocolReal> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/lte-spectrum-phy.cc ns-3.23/src/lte/model/lte-spectrum-phy.cc
--- ns-3.22/src/lte/model/lte-spectrum-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-spectrum-phy.cc	2015-05-13 11:05:26.000000000 -0700
@@ -148,7 +148,6 @@
   m_interferenceData = 0;
   m_interferenceCtrl->Dispose ();
   m_interferenceCtrl = 0;
-  m_ltePhyTxEndCallback      = MakeNullCallback< void, Ptr<const Packet> > ();
   m_ltePhyRxDataEndErrorCallback = MakeNullCallback< void > ();
   m_ltePhyRxDataEndOkCallback    = MakeNullCallback< void, Ptr<Packet> >  ();
   m_ltePhyRxCtrlEndOkCallback = MakeNullCallback< void, std::list<Ptr<LteControlMessage> > > ();
@@ -169,11 +168,17 @@
     case LteSpectrumPhy::RX_DATA:
       os << "RX_DATA";
       break;
-    case LteSpectrumPhy::RX_CTRL:
-      os << "RX_CTRL";
+    case LteSpectrumPhy::RX_DL_CTRL:
+      os << "RX_DL_CTRL";
       break;
-    case LteSpectrumPhy::TX:
-      os << "TX";
+    case LteSpectrumPhy::TX_DATA:
+      os << "TX_DATA";
+      break;
+    case LteSpectrumPhy::TX_DL_CTRL:
+      os << "TX_DL_CTRL";
+      break;
+    case LteSpectrumPhy::TX_UL_SRS:
+      os << "TX_UL_SRS";
       break;
     default:
       os << "UNKNOWN";
@@ -187,6 +192,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteSpectrumPhy")
     .SetParent<SpectrumPhy> ()
+    .SetGroupName("Lte")
     .AddTraceSource ("TxStart",
                      "Trace fired when a new transmission is started",
                      MakeTraceSourceAccessor (&LteSpectrumPhy::m_phyTxStartTrace),
@@ -324,15 +330,6 @@
 }
 
 
-
-void
-LteSpectrumPhy::SetLtePhyTxEndCallback (LtePhyTxEndCallback c)
-{
-  NS_LOG_FUNCTION (this);
-  m_ltePhyTxEndCallback = c;
-}
-
-
 void
 LteSpectrumPhy::SetLtePhyRxDataEndErrorCallback (LtePhyRxDataEndErrorCallback c)
 {
@@ -431,13 +428,16 @@
   m_phyTxStartTrace (pb);
   
   switch (m_state)
-  {
+    {
     case RX_DATA:
-    case RX_CTRL:
+    case RX_DL_CTRL:
+    case RX_UL_SRS:
       NS_FATAL_ERROR ("cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
       break;
-      
-    case TX:
+
+    case TX_DATA:
+    case TX_DL_CTRL:      
+    case TX_UL_SRS:
       NS_FATAL_ERROR ("cannot TX while already TX: the MAC should avoid this");
       break;
       
@@ -455,7 +455,7 @@
       // to be used for simulation purposes (e.g., the CellId). This
       // is done by setting the ctrlMsgList parameter of
       // LteSpectrumSignalParametersDataFrame
-      ChangeState (TX);
+      ChangeState (TX_DATA);
       NS_ASSERT (m_channel);
       Ptr<LteSpectrumSignalParametersDataFrame> txParams = Create<LteSpectrumSignalParametersDataFrame> ();
       txParams->duration = duration;
@@ -466,7 +466,7 @@
       txParams->ctrlMsgList = ctrlMsgList;
       txParams->cellId = m_cellId;
       m_channel->StartTx (txParams);
-      m_endTxEvent = Simulator::Schedule (duration, &LteSpectrumPhy::EndTx, this);
+      m_endTxEvent = Simulator::Schedule (duration, &LteSpectrumPhy::EndTxData, this);
     }
     return false;
     break;
@@ -484,17 +484,17 @@
   NS_LOG_FUNCTION (this << " PSS " << (uint16_t)pss);
   NS_LOG_LOGIC (this << " state: " << m_state);
   
-  
-//   m_phyTxStartTrace (pb);
-  
   switch (m_state)
   {
     case RX_DATA:
-    case RX_CTRL:
+    case RX_DL_CTRL:
+    case RX_UL_SRS:
       NS_FATAL_ERROR ("cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
       break;
       
-    case TX:
+    case TX_DATA:
+    case TX_DL_CTRL:
+    case TX_UL_SRS:
       NS_FATAL_ERROR ("cannot TX while already TX: the MAC should avoid this");
       break;
       
@@ -511,7 +511,7 @@
       // to be used for simulation purposes (e.g., the CellId). This
       // is done by setting the cellId parameter of
       // LteSpectrumSignalParametersDlCtrlFrame
-      ChangeState (TX);
+      ChangeState (TX_DL_CTRL);
       NS_ASSERT (m_channel);
 
       Ptr<LteSpectrumSignalParametersDlCtrlFrame> txParams = Create<LteSpectrumSignalParametersDlCtrlFrame> ();
@@ -523,7 +523,7 @@
       txParams->pss = pss;
       txParams->ctrlMsgList = ctrlMsgList;
       m_channel->StartTx (txParams);
-      m_endTxEvent = Simulator::Schedule (DL_CTRL_DURATION, &LteSpectrumPhy::EndTx, this);
+      m_endTxEvent = Simulator::Schedule (DL_CTRL_DURATION, &LteSpectrumPhy::EndTxDlCtrl, this);
     }
     return false;
     break;
@@ -542,16 +542,17 @@
   NS_LOG_FUNCTION (this);
   NS_LOG_LOGIC (this << " state: " << m_state);
   
-  //   m_phyTxStartTrace (pb);
-  
   switch (m_state)
-  {
+    {
     case RX_DATA:
-    case RX_CTRL:
+    case RX_DL_CTRL:
+    case RX_UL_SRS:
       NS_FATAL_ERROR ("cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
       break;
       
-    case TX:
+    case TX_DL_CTRL:
+    case TX_DATA:
+    case TX_UL_SRS:
       NS_FATAL_ERROR ("cannot TX while already TX: the MAC should avoid this");
       break;
       
@@ -569,7 +570,7 @@
       // to be used for simulation purposes (e.g., the CellId). This
       // is done by setting the cellId parameter of 
       // LteSpectrumSignalParametersDlCtrlFrame
-      ChangeState (TX);
+      ChangeState (TX_UL_SRS);
       NS_ASSERT (m_channel);
       Ptr<LteSpectrumSignalParametersUlSrsFrame> txParams = Create<LteSpectrumSignalParametersUlSrsFrame> ();
       txParams->duration = UL_SRS_DURATION;
@@ -578,7 +579,7 @@
       txParams->psd = m_txPsd;
       txParams->cellId = m_cellId;
       m_channel->StartTx (txParams);
-      m_endTxEvent = Simulator::Schedule (UL_SRS_DURATION, &LteSpectrumPhy::EndTx, this);
+      m_endTxEvent = Simulator::Schedule (UL_SRS_DURATION, &LteSpectrumPhy::EndTxUlSrs, this);
     }
     return false;
     break;
@@ -593,30 +594,42 @@
 
 
 void
-LteSpectrumPhy::EndTx ()
+LteSpectrumPhy::EndTxData ()
 {
   NS_LOG_FUNCTION (this);
   NS_LOG_LOGIC (this << " state: " << m_state);
 
-  NS_ASSERT (m_state == TX);
-
+  NS_ASSERT (m_state == TX_DATA);
   m_phyTxEndTrace (m_txPacketBurst);
+  m_txPacketBurst = 0;
+  ChangeState (IDLE);
+}
 
-  if (!m_ltePhyTxEndCallback.IsNull ())
-    {
-      for (std::list<Ptr<Packet> >::const_iterator iter = m_txPacketBurst->Begin (); iter
-           != m_txPacketBurst->End (); ++iter)
-        {
-          Ptr<Packet> packet = (*iter)->Copy ();
-          m_ltePhyTxEndCallback (packet);
-        }
-    }
+void
+LteSpectrumPhy::EndTxDlCtrl ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC (this << " state: " << m_state);
 
-  m_txPacketBurst = 0;
+  NS_ASSERT (m_state == TX_DL_CTRL);
+  NS_ASSERT (m_txPacketBurst == 0);
+  ChangeState (IDLE);
+}
+
+void
+LteSpectrumPhy::EndTxUlSrs ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC (this << " state: " << m_state);
+
+  NS_ASSERT (m_state == TX_UL_SRS);
+  NS_ASSERT (m_txPacketBurst == 0);
   ChangeState (IDLE);
 }
 
 
+
+
 void
 LteSpectrumPhy::StartRx (Ptr<SpectrumSignalParameters> spectrumRxParams)
 {
@@ -629,28 +642,29 @@
   // the device might start RX only if the signal is of a type
   // understood by this device - in this case, an LTE signal.
   Ptr<LteSpectrumSignalParametersDataFrame> lteDataRxParams = DynamicCast<LteSpectrumSignalParametersDataFrame> (spectrumRxParams);
+  Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = DynamicCast<LteSpectrumSignalParametersDlCtrlFrame> (spectrumRxParams);
+  Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = DynamicCast<LteSpectrumSignalParametersUlSrsFrame> (spectrumRxParams);
   if (lteDataRxParams != 0)
     {
       m_interferenceData->AddSignal (rxPsd, duration);
       StartRxData (lteDataRxParams);
     }
-  else
+  else if (lteDlCtrlRxParams!=0)
     {
-      Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = DynamicCast<LteSpectrumSignalParametersDlCtrlFrame> (spectrumRxParams);
-      Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = DynamicCast<LteSpectrumSignalParametersUlSrsFrame> (spectrumRxParams);
-      if ((lteDlCtrlRxParams!=0)||(lteUlSrsRxParams!=0))
-        {
-          m_interferenceCtrl->AddSignal (rxPsd, duration);
-          StartRxCtrl (spectrumRxParams);
-        }
-      else
-        {
-          // other type of signal (could be 3G, GSM, whatever) -> interference
-          m_interferenceData->AddSignal (rxPsd, duration);
-          m_interferenceCtrl->AddSignal (rxPsd, duration);
-        }
+      m_interferenceCtrl->AddSignal (rxPsd, duration);
+      StartRxDlCtrl (lteDlCtrlRxParams);
     }
-
+  else if (lteUlSrsRxParams!=0)
+    {
+      m_interferenceCtrl->AddSignal (rxPsd, duration);
+      StartRxUlSrs (lteUlSrsRxParams);
+    }
+  else
+    {
+      // other type of signal (could be 3G, GSM, whatever) -> interference
+      m_interferenceData->AddSignal (rxPsd, duration);
+      m_interferenceCtrl->AddSignal (rxPsd, duration);
+    }    
 }
 
 void
@@ -659,10 +673,12 @@
   NS_LOG_FUNCTION (this);
   switch (m_state)
     {
-      case TX:
+      case TX_DATA:
+      case TX_DL_CTRL:
+      case TX_UL_SRS:
         NS_FATAL_ERROR ("cannot RX while TX: according to FDD channel access, the physical layer for transmission cannot be used for reception");
         break;
-      case RX_CTRL:
+      case RX_DL_CTRL:
         NS_FATAL_ERROR ("cannot RX Data while receiving control");
         break;
       case IDLE:
@@ -730,101 +746,155 @@
 
 
 void
-LteSpectrumPhy::StartRxCtrl (Ptr<SpectrumSignalParameters> params)
+LteSpectrumPhy::StartRxDlCtrl (Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams)
 {
   NS_LOG_FUNCTION (this);
+
+  // To check if we're synchronized to this signal, we check
+  // for the CellId which is reported in the
+  // LteSpectrumSignalParametersDlCtrlFrame
+  uint16_t cellId;        
+  NS_ASSERT (lteDlCtrlRxParams != 0);
+  cellId = lteDlCtrlRxParams->cellId;
+
   switch (m_state)
-  {
-    case TX:
+    {
+    case TX_DATA:
+    case TX_DL_CTRL:
+    case TX_UL_SRS:
+    case RX_DATA:
+    case RX_UL_SRS:
+      NS_FATAL_ERROR ("unexpected event in state " << m_state);
+      break;
+
+    case RX_DL_CTRL:
+    case IDLE:
+
+      // common code for the two states
+      // check presence of PSS for UE measuerements
+      if (lteDlCtrlRxParams->pss == true)
+        {
+          if (!m_ltePhyRxPssCallback.IsNull ())
+              {
+                m_ltePhyRxPssCallback (cellId, lteDlCtrlRxParams->psd);
+              }
+        }   
+
+      // differentiated code for the two states
+      switch (m_state)
+        {
+        case RX_DL_CTRL:
+          NS_ASSERT_MSG (m_cellId != cellId, "any other DlCtrl should be from a different cell");
+          NS_LOG_LOGIC (this << " ignoring other DlCtrl (cellId=" 
+                        << cellId  << ", m_cellId=" << m_cellId << ")");      
+          break;
+          
+        case IDLE:
+          if (cellId  == m_cellId)
+            {
+              NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" << cellId << ")");
+              
+              NS_ASSERT (m_rxControlMessageList.empty ());
+              m_firstRxStart = Simulator::Now ();
+              m_firstRxDuration = lteDlCtrlRxParams->duration;
+              NS_LOG_LOGIC (this << " scheduling EndRx with delay " << lteDlCtrlRxParams->duration);
+              
+              // store the DCIs
+              m_rxControlMessageList = lteDlCtrlRxParams->ctrlMsgList;
+              m_endRxDlCtrlEvent = Simulator::Schedule (lteDlCtrlRxParams->duration, &LteSpectrumPhy::EndRxDlCtrl, this);
+              ChangeState (RX_DL_CTRL);
+              m_interferenceCtrl->StartRx (lteDlCtrlRxParams->psd);            
+            }
+          else
+            {
+              NS_LOG_LOGIC (this << " not synchronizing with this signal (cellId=" 
+                            << cellId  << ", m_cellId=" << m_cellId << ")");          
+            }
+          break;
+          
+        default:
+          NS_FATAL_ERROR ("unexpected event in state " << m_state);
+          break;
+        }
+      break; // case RX_DL_CTRL or IDLE
+      
+    default:
+      NS_FATAL_ERROR ("unknown state");
+      break;
+    }
+  
+  NS_LOG_LOGIC (this << " state: " << m_state);
+}
+
+
+
+
+void
+LteSpectrumPhy::StartRxUlSrs (Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams)
+{
+  NS_LOG_FUNCTION (this);
+  switch (m_state)
+    {
+    case TX_DATA:
+    case TX_DL_CTRL:
+    case TX_UL_SRS:
       NS_FATAL_ERROR ("cannot RX while TX: according to FDD channel access, the physical layer for transmission cannot be used for reception");
       break;
+
     case RX_DATA:
-      NS_FATAL_ERROR ("cannot RX data while receing control");
+    case RX_DL_CTRL:
+      NS_FATAL_ERROR ("cannot RX SRS while receiving something else");
       break;
+
     case IDLE:
-    case RX_CTRL:
+    case RX_UL_SRS:
       // the behavior is similar when
-      // we're IDLE or RX because we can receive more signals
-      // simultaneously (e.g., at the eNB).
+      // we're IDLE or RX_UL_SRS because we can receive more signals
+      // simultaneously at the eNB
       {
         // To check if we're synchronized to this signal, we check
         // for the CellId which is reported in the
         // LteSpectrumSignalParametersDlCtrlFrame
         uint16_t cellId;
-        bool dl;
-        Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = DynamicCast<LteSpectrumSignalParametersDlCtrlFrame> (params);
-        if (lteDlCtrlRxParams!=0)
-          {
-            cellId = lteDlCtrlRxParams->cellId;
-            dl = true;
-          }
-        else
-          {
-            Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = DynamicCast<LteSpectrumSignalParametersUlSrsFrame> (params);
-            cellId = lteUlSrsRxParams->cellId;
-            dl = false;
-          }
-        if (dl)
-            {
-              // check presence of PSS for UE measuerements
-              if (lteDlCtrlRxParams->pss == true)
-                {
-                  SpectrumValue pssPsd = *params->psd;
-                  if (!m_ltePhyRxPssCallback.IsNull ())
-                    {
-                      m_ltePhyRxPssCallback (cellId, params->psd);
-                    }
-                }
-            }
+        cellId = lteUlSrsRxParams->cellId;
         if (cellId  == m_cellId)
-        {
-          NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" << cellId << ")");
-          if (m_state == IDLE)
           {
-            // first transmission, i.e., we're IDLE and we
-            // start RX
-            NS_ASSERT (m_rxControlMessageList.empty ());
-            m_firstRxStart = Simulator::Now ();
-            m_firstRxDuration = params->duration;
-            NS_LOG_LOGIC (this << " scheduling EndRx with delay " << params->duration);
-            if (dl==true)
+            NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" << cellId << ")");
+            if (m_state == IDLE)
               {
-                // store the DCIs
-                m_rxControlMessageList = lteDlCtrlRxParams->ctrlMsgList;
-                m_endRxDlCtrlEvent = Simulator::Schedule (params->duration, &LteSpectrumPhy::EndRxDlCtrl, this);
+                // first transmission, i.e., we're IDLE and we
+                // start RX
+                NS_ASSERT (m_rxControlMessageList.empty ());
+                m_firstRxStart = Simulator::Now ();
+                m_firstRxDuration = lteUlSrsRxParams->duration;
+                NS_LOG_LOGIC (this << " scheduling EndRx with delay " << lteUlSrsRxParams->duration);
+
+                m_endRxUlSrsEvent = Simulator::Schedule (lteUlSrsRxParams->duration, &LteSpectrumPhy::EndRxUlSrs, this);
               }
-            else
+            else if (m_state == RX_UL_SRS)
               {
-                m_endRxUlSrsEvent = Simulator::Schedule (params->duration, &LteSpectrumPhy::EndRxUlSrs, this);
-              }
+                // sanity check: if there are multiple RX events, they
+                // should occur at the same time and have the same
+                // duration, otherwise the interference calculation
+                // won't be correct
+                NS_ASSERT ((m_firstRxStart == Simulator::Now ()) 
+                           && (m_firstRxDuration == lteUlSrsRxParams->duration));
+              }            
+            ChangeState (RX_UL_SRS);
+            m_interferenceCtrl->StartRx (lteUlSrsRxParams->psd);          
           }
-          else if (m_state == RX_CTRL)
+        else
           {
-            // sanity check: if there are multiple RX events, they
-            // should occur at the same time and have the same
-            // duration, otherwise the interference calculation
-            // won't be correct
-            NS_ASSERT ((m_firstRxStart == Simulator::Now ()) 
-            && (m_firstRxDuration == params->duration));
+            NS_LOG_LOGIC (this << " not in sync with this signal (cellId=" 
+                          << cellId  << ", m_cellId=" << m_cellId << ")");          
           }
-          
-          ChangeState (RX_CTRL);
-          m_interferenceCtrl->StartRx (params->psd);
-          
-//           NS_LOG_LOGIC (this << " numSimultaneousRxEvents = " << m_rxPacketBurstList.size ());
-        }
-        else
-        {
-          NS_LOG_LOGIC (this << " not in sync with this signal (cellId=" 
-          << cellId  << ", m_cellId=" << m_cellId << ")");          
-        }
       }
       break;
       
-      default:
-        NS_FATAL_ERROR ("unknown state");
-        break;
-  }
+    default:
+      NS_FATAL_ERROR ("unknown state");
+      break;
+    }
   
   NS_LOG_LOGIC (this << " state: " << m_state);
 }
@@ -1062,7 +1132,7 @@
   NS_LOG_FUNCTION (this);
   NS_LOG_LOGIC (this << " state: " << m_state);
   
-  NS_ASSERT (m_state == RX_CTRL);
+  NS_ASSERT (m_state == RX_DL_CTRL);
   
   // this will trigger CQI calculation and Error Model evaluation
   // as a side effect, the error model should update the error status of all TBs
@@ -1108,7 +1178,7 @@
 void
 LteSpectrumPhy::EndRxUlSrs ()
 {
-  NS_ASSERT (m_state == RX_CTRL);
+  NS_ASSERT (m_state == RX_UL_SRS);
   ChangeState (IDLE);
   m_interferenceCtrl->EndRx ();
   // nothing to do (used only for SRS at this stage)
diff -Naur ns-3.22/src/lte/model/lte-spectrum-phy.h ns-3.23/src/lte/model/lte-spectrum-phy.h
--- ns-3.22/src/lte/model/lte-spectrum-phy.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-spectrum-phy.h	2015-05-13 11:05:26.000000000 -0700
@@ -162,7 +162,7 @@
    */
   enum State
   {
-    IDLE, TX, RX_DATA, RX_CTRL
+    IDLE, TX_DL_CTRL, TX_DATA, TX_UL_SRS, RX_DL_CTRL, RX_DATA, RX_UL_SRS
   };
 
   // inherited from Object
@@ -179,7 +179,8 @@
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
   void StartRxData (Ptr<LteSpectrumSignalParametersDataFrame> params);
-  void StartRxCtrl (Ptr<SpectrumSignalParameters> params);
+  void StartRxDlCtrl (Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams);
+  void StartRxUlSrs (Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams);
 
   void SetHarqPhyModule (Ptr<LteHarqPhy> harq);
 
@@ -420,7 +421,9 @@
 
 private:
   void ChangeState (State newState);
-  void EndTx ();
+  void EndTxData ();
+  void EndTxDlCtrl ();
+  void EndTxUlSrs ();
   void EndRxData ();
   void EndRxDlCtrl ();
   void EndRxUlSrs ();
@@ -453,7 +456,6 @@
   TracedCallback<Ptr<const Packet> > m_phyRxEndOkTrace;
   TracedCallback<Ptr<const Packet> > m_phyRxEndErrorTrace;
 
-  LtePhyTxEndCallback        m_ltePhyTxEndCallback;
   LtePhyRxDataEndErrorCallback   m_ltePhyRxDataEndErrorCallback;
   LtePhyRxDataEndOkCallback      m_ltePhyRxDataEndOkCallback;
   
diff -Naur ns-3.22/src/lte/model/lte-ue-mac.cc ns-3.23/src/lte/model/lte-ue-mac.cc
--- ns-3.22/src/lte/model/lte-ue-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-mac.cc	2015-05-13 11:05:26.000000000 -0700
@@ -195,6 +195,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteUeMac")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteUeMac> ();
   return tid;
 }
diff -Naur ns-3.22/src/lte/model/lte-ue-phy.cc ns-3.23/src/lte/model/lte-ue-phy.cc
--- ns-3.22/src/lte/model/lte-ue-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-phy.cc	2015-05-13 11:05:26.000000000 -0700
@@ -22,6 +22,7 @@
 
 #include <ns3/object-factory.h>
 #include <ns3/log.h>
+#include <ns3/node.h>
 #include <cfloat>
 #include <cmath>
 #include <ns3/simulator.h>
@@ -162,7 +163,6 @@
 
   NS_ASSERT_MSG (Simulator::Now ().GetNanoSeconds () == 0,
                  "Cannot create UE devices after simulation started");
-  Simulator::ScheduleNow (&LteUePhy::SubframeIndication, this, 1, 1);
   Simulator::Schedule (m_ueMeasurementsFilterPeriod, &LteUePhy::ReportUeMeasurements, this);
 
   DoReset ();
@@ -190,6 +190,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteUePhy")
     .SetParent<LtePhy> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteUePhy> ()
     .AddAttribute ("TxPower",
                    "Transmission power in dBm",
@@ -301,6 +302,25 @@
 LteUePhy::DoInitialize ()
 {
   NS_LOG_FUNCTION (this);
+  bool haveNodeId = false;
+  uint32_t nodeId = 0;
+  if (m_netDevice != 0)
+    {
+      Ptr<Node> node = m_netDevice->GetNode ();
+      if (node != 0)
+        {
+          nodeId = node->GetId ();
+          haveNodeId = true;
+        }
+    }
+  if (haveNodeId)
+    {
+      Simulator::ScheduleWithContext (nodeId, Seconds (0), &LteUePhy::SubframeIndication, this, 1, 1);
+    }
+  else
+    {
+      Simulator::ScheduleNow (&LteUePhy::SubframeIndication, this, 1, 1);
+    }  
   LtePhy::DoInitialize ();
 }
 
@@ -558,9 +578,15 @@
               // store measurements
               std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap;
               itMeasMap = m_ueMeasurementsMap.find ((*itPss).cellId);
-              NS_ASSERT (itMeasMap != m_ueMeasurementsMap.end ());
-              (*itMeasMap).second.rsrqSum += rsrq_dB;
-              (*itMeasMap).second.rsrqNum++;
+              if (itMeasMap != m_ueMeasurementsMap.end ())
+                {
+                  (*itMeasMap).second.rsrqSum += rsrq_dB;
+                  (*itMeasMap).second.rsrqNum++;
+                }
+              else
+                {
+                  NS_LOG_WARN ("race condition of bug 2091 occurred");
+                }
             }
 
           itPss++;
diff -Naur ns-3.22/src/lte/model/lte-ue-power-control.cc ns-3.23/src/lte/model/lte-ue-power-control.cc
--- ns-3.22/src/lte/model/lte-ue-power-control.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-power-control.cc	2015-05-13 11:05:26.000000000 -0700
@@ -72,6 +72,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteUePowerControl")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteUePowerControl> ()
     .AddAttribute ("ClosedLoop",
                    "If true Closed Loop mode will be active, otherwise Open Loop",
diff -Naur ns-3.22/src/lte/model/lte-ue-rrc.cc ns-3.23/src/lte/model/lte-ue-rrc.cc
--- ns-3.22/src/lte/model/lte-ue-rrc.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-rrc.cc	2015-05-13 11:05:26.000000000 -0700
@@ -169,6 +169,7 @@
 {
   static TypeId tid = TypeId ("ns3::LteUeRrc")
     .SetParent<Object> ()
+    .SetGroupName("Lte")
     .AddConstructor<LteUeRrc> ()
     .AddAttribute ("DataRadioBearerMap", "List of UE RadioBearerInfo for Data Radio Bearers by LCID.",
                    ObjectMapValue (),
diff -Naur ns-3.22/src/lte/model/no-op-handover-algorithm.cc ns-3.23/src/lte/model/no-op-handover-algorithm.cc
--- ns-3.22/src/lte/model/no-op-handover-algorithm.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/no-op-handover-algorithm.cc	2015-05-13 11:05:26.000000000 -0700
@@ -56,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::NoOpHandoverAlgorithm")
     .SetParent<LteHandoverAlgorithm> ()
+    .SetGroupName("Lte")
     .AddConstructor<NoOpHandoverAlgorithm> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/pf-ff-mac-scheduler.cc ns-3.23/src/lte/model/pf-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/pf-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/pf-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -252,6 +252,7 @@
 {
   static TypeId tid = TypeId ("ns3::PfFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<PfFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/pss-ff-mac-scheduler.cc ns-3.23/src/lte/model/pss-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/pss-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/pss-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -255,6 +255,7 @@
 {
   static TypeId tid = TypeId ("ns3::PssFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<PssFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/rem-spectrum-phy.cc ns-3.23/src/lte/model/rem-spectrum-phy.cc
--- ns-3.22/src/lte/model/rem-spectrum-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/rem-spectrum-phy.cc	2015-05-13 11:05:26.000000000 -0700
@@ -68,6 +68,7 @@
 {
   static TypeId tid = TypeId ("ns3::RemSpectrumPhy")
     .SetParent<SpectrumPhy> ()
+    .SetGroupName("Lte")
     .AddConstructor<RemSpectrumPhy> ()
   ;
   return tid;
diff -Naur ns-3.22/src/lte/model/rr-ff-mac-scheduler.cc ns-3.23/src/lte/model/rr-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/rr-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/rr-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -251,6 +251,7 @@
 {
   static TypeId tid = TypeId ("ns3::RrFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<RrFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/tdbet-ff-mac-scheduler.cc ns-3.23/src/lte/model/tdbet-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tdbet-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/tdbet-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -249,6 +249,7 @@
 {
   static TypeId tid = TypeId ("ns3::TdBetFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<TdBetFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/tdmt-ff-mac-scheduler.cc ns-3.23/src/lte/model/tdmt-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tdmt-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/tdmt-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -248,6 +248,7 @@
 {
   static TypeId tid = TypeId ("ns3::TdMtFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<TdMtFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/tdtbfq-ff-mac-scheduler.cc ns-3.23/src/lte/model/tdtbfq-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -253,6 +253,7 @@
 {
   static TypeId tid = TypeId ("ns3::TdTbfqFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<TdTbfqFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/trace-fading-loss-model.cc ns-3.23/src/lte/model/trace-fading-loss-model.cc
--- ns-3.22/src/lte/model/trace-fading-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/trace-fading-loss-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::TraceFadingLossModel")
     .SetParent<SpectrumPropagationLossModel> ()
+    .SetGroupName("Lte")
     .AddConstructor<TraceFadingLossModel> ()
     .AddAttribute ("TraceFilename",
                    "Name of file to load a trace from.",
diff -Naur ns-3.22/src/lte/model/tta-ff-mac-scheduler.cc ns-3.23/src/lte/model/tta-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tta-ff-mac-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/tta-ff-mac-scheduler.cc	2015-05-13 11:05:26.000000000 -0700
@@ -248,6 +248,7 @@
 {
   static TypeId tid = TypeId ("ns3::TtaFfMacScheduler")
     .SetParent<FfMacScheduler> ()
+    .SetGroupName("Lte")
     .AddConstructor<TtaFfMacScheduler> ()
     .AddAttribute ("CqiTimerThreshold",
                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/test/lte-simple-helper.cc ns-3.23/src/lte/test/lte-simple-helper.cc
--- ns-3.22/src/lte/test/lte-simple-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-simple-helper.cc	2015-05-13 11:05:26.000000000 -0700
@@ -149,6 +149,8 @@
   m_enbMac = CreateObject<LteTestMac> ();
   m_enbMac->SetDevice (enbDev);
 
+  m_enbRrc->SetDevice (enbDev);
+
   enbDev->SetReceiveCallback (MakeCallback (&LteTestMac::Receive, m_enbMac));
 
   // Connect SAPs: RRC <-> PDCP <-> RLC <-> MAC
diff -Naur ns-3.22/src/lte/test/lte-test-downlink-power-control.cc ns-3.23/src/lte/test/lte-test-downlink-power-control.cc
--- ns-3.22/src/lte/test/lte-test-downlink-power-control.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-downlink-power-control.cc	2015-05-13 11:05:26.000000000 -0700
@@ -41,9 +41,11 @@
 #include <ns3/lte-ue-rrc.h>
 
 #include "lte-ffr-simple.h"
-#include "lte-test-sinr-chunk-processor.h"
 #include <ns3/lte-common.h>
 
+
+#include <ns3/lte-chunk-processor.h>
+
 #include "lte-test-downlink-power-control.h"
 #include <ns3/lte-rrc-sap.h>
 
@@ -441,17 +443,21 @@
 
   Ptr<LtePhy> ue1Phy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
 
-  Ptr<LteTestSinrChunkProcessor> testDlDataPowerReceived = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlDataPowerReceived = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlDataPowerReceivedCatcher;
+  testDlDataPowerReceived->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlDataPowerReceivedCatcher));
   ue1Phy->GetDownlinkSpectrumPhy ()->AddDataPowerChunkProcessor (testDlDataPowerReceived);
 
-  Ptr<LteTestSinrChunkProcessor> testDlCtrlPowerReceived = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlCtrlPowerReceived = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlCtrlPowerReceivedCatcher;
+  testDlCtrlPowerReceived->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlCtrlPowerReceivedCatcher));
   ue1Phy->GetDownlinkSpectrumPhy ()->AddRsPowerChunkProcessor (testDlCtrlPowerReceived);
 
   Simulator::Stop (Seconds (0.400));
   Simulator::Run ();
 
-  double dataPower = 10.0 * std::log10 (testDlDataPowerReceived->GetSinr ()->operator[] (0));
-  double ctrlPower = 10.0 * std::log10 (testDlCtrlPowerReceived->GetSinr ()->operator[] (0));
+  double dataPower = 10.0 * std::log10 (dlDataPowerReceivedCatcher.GetValue ()->operator[] (0));
+  double ctrlPower = 10.0 * std::log10 (dlCtrlPowerReceivedCatcher.GetValue ()->operator[] (0));
   double powerDiff = (-1.0)*ctrlPower + dataPower;
 
   NS_LOG_DEBUG ("DataPower: " << dataPower);
diff -Naur ns-3.22/src/lte/test/lte-test-downlink-sinr.cc ns-3.23/src/lte/test/lte-test-downlink-sinr.cc
--- ns-3.22/src/lte/test/lte-test-downlink-sinr.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-downlink-sinr.cc	2015-05-13 11:05:26.000000000 -0700
@@ -28,12 +28,12 @@
 #include "ns3/boolean.h"
 #include "ns3/lte-phy-tag.h"
 #include "lte-test-ue-phy.h"
-#include "lte-test-sinr-chunk-processor.h"
 #include "ns3/lte-spectrum-signal-parameters.h"
 
 #include "lte-test-downlink-sinr.h"
 #include <ns3/lte-control-messages.h>
 #include "ns3/lte-helper.h"
+#include <ns3/lte-chunk-processor.h>
 
 using namespace ns3;
 
@@ -112,7 +112,7 @@
   : TestCase ("SINR calculation in downlink Data frame: " + name),
     m_sv (sv),
     m_sm (sv->GetSpectrumModel ()),
-    m_sinr (sinr)
+    m_expectedSinr (sinr)
 {
   NS_LOG_INFO ("Creating LenaDownlinkSinrTestCase");
 }
@@ -121,6 +121,7 @@
 {
 }
 
+
 void
 LteDownlinkDataSinrTestCase::DoRun (void)
 {
@@ -135,7 +136,9 @@
   dlPhy->SetCellId (cellId);
   ulPhy->SetCellId (cellId);
 
-  Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher actualSinrCatcher;
+  chunkProcessor->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &actualSinrCatcher));
   dlPhy->AddDataSinrChunkProcessor (chunkProcessor);
 
   /**
@@ -260,16 +263,10 @@
   Simulator::Stop (Seconds (5.0));
   Simulator::Run ();
 
-  /**
-   * Check that the values passed to LteChunkProcessor::EvaluateChunk () correspond
-   * to known values which have been calculated offline (with octave) for the generated signals
-   */
-  Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
-
-  NS_LOG_INFO ("Data Frame - Theoretical SINR: " << *m_sinr);
-  NS_LOG_INFO ("Data Frame - Calculated SINR: " << *calculatedSinr);
+  NS_LOG_INFO ("Data Frame - Theoretical SINR: " << *m_expectedSinr);
+  NS_LOG_INFO ("Data Frame - Calculated SINR: " << *(actualSinrCatcher.GetValue ()));
  
-  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*calculatedSinr, *m_sinr, 0.0000001, "Data Frame - Wrong SINR !");
+  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*(actualSinrCatcher.GetValue ()), *m_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
   dlPhy->Dispose ();
   Simulator::Destroy ();
 }
@@ -284,7 +281,7 @@
 : TestCase ("SINR calculation in downlink Ctrl Frame: " + name),
 m_sv (sv),
 m_sm (sv->GetSpectrumModel ()),
-m_sinr (sinr)
+m_expectedSinr (sinr)
 {
   NS_LOG_INFO ("Creating LenaDownlinkCtrlSinrTestCase");
 }
@@ -307,9 +304,11 @@
   dlPhy->SetCellId (cellId);
   ulPhy->SetCellId (cellId);
   
-  Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher actualSinrCatcher;
+  chunkProcessor->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &actualSinrCatcher));
   dlPhy->AddCtrlSinrChunkProcessor (chunkProcessor);
-  
+
   /**
   * Generate several calls to LteSpectrumPhy::StartRx corresponding to several signals. One will be the signal of interest, i.e., the
   *  LteSpectrumSignalParametersDlCtrlFrame of the first signal will have the
@@ -432,16 +431,10 @@
   Simulator::Stop (Seconds (5.0));
   Simulator::Run ();
   
-  /**
-  * Check that the values passed to LteChunkProcessor::EvaluateChunk () correspond
-  * to known values which have been calculated offline (with octave) for the generated signals
-  */
-  Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
-  
-  NS_LOG_INFO ("Ctrl Frame - Theoretical SINR: " << *m_sinr);
-  NS_LOG_INFO ("Ctrl Frame - Calculated SINR: " << *calculatedSinr);
+  NS_LOG_INFO ("Ctrl Frame - Theoretical SINR: " << *m_expectedSinr);
+  NS_LOG_INFO ("Ctrl Frame - Calculated SINR: " << *(actualSinrCatcher.GetValue ()));
   
-  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*calculatedSinr, *m_sinr, 0.0000001, "Data Frame - Wrong SINR !");
+  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*(actualSinrCatcher.GetValue ()), *m_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
   dlPhy->Dispose ();
   Simulator::Destroy ();
 }
diff -Naur ns-3.22/src/lte/test/lte-test-downlink-sinr.h ns-3.23/src/lte/test/lte-test-downlink-sinr.h
--- ns-3.22/src/lte/test/lte-test-downlink-sinr.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-downlink-sinr.h	2015-05-13 11:05:27.000000000 -0700
@@ -50,7 +50,7 @@
 
   Ptr<SpectrumValue> m_sv;
   Ptr<const SpectrumModel> m_sm;
-  Ptr<SpectrumValue> m_sinr;
+  Ptr<SpectrumValue> m_expectedSinr;
 };
 
 
@@ -59,13 +59,13 @@
   public:
     LteDownlinkCtrlSinrTestCase (Ptr<SpectrumValue> sv, Ptr<SpectrumValue> sinr, std::string name);
     virtual ~LteDownlinkCtrlSinrTestCase ();
-    
-  private:
-    virtual void DoRun (void);
-    
-    Ptr<SpectrumValue> m_sv;
-    Ptr<const SpectrumModel> m_sm;
-    Ptr<SpectrumValue> m_sinr;
+  
+private:
+  virtual void DoRun (void);
+  
+  Ptr<SpectrumValue> m_sv;
+  Ptr<const SpectrumModel> m_sm;
+  Ptr<SpectrumValue> m_expectedSinr;
 };
 
 #endif /* LTE_TEST_DOWNLINK_SINR_H */
diff -Naur ns-3.22/src/lte/test/lte-test-entities.cc ns-3.23/src/lte/test/lte-test-entities.cc
--- ns-3.22/src/lte/test/lte-test-entities.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-entities.cc	2015-05-13 11:05:27.000000000 -0700
@@ -20,6 +20,7 @@
 
 #include "ns3/simulator.h"
 #include "ns3/log.h"
+#include "ns3/node.h"
 
 #include "ns3/lte-rlc-header.h"
 #include "ns3/lte-rlc-am-header.h"
@@ -72,6 +73,12 @@
 }
 
 void
+LteTestRrc::SetDevice (Ptr<NetDevice> device)
+{
+  m_device = device;
+}
+
+void
 LteTestRrc::SetLtePdcpSapProvider (LtePdcpSapProvider* s)
 {
   m_pdcpSapProvider = s;
@@ -196,8 +203,26 @@
   p.rnti = 1111;
   p.lcid = 222;
   p.pdcpSdu = Create<Packet> (m_pduSize);
+  
+  bool haveContext = false;
+  Ptr<Node> node;
+  if (m_device != 0)
+    {
+      node = m_device->GetNode ();
+      if (node != 0)
+        {                    
+          haveContext = true;
+        }
+    }
+  if (haveContext)
+    {
+      Simulator::ScheduleWithContext (node->GetId (), Seconds (0), &LtePdcpSapProvider::TransmitPdcpSdu, m_pdcpSapProvider, p);
+    }
+  else
+    {
+      Simulator::Schedule (Seconds (0), &LtePdcpSapProvider::TransmitPdcpSdu, m_pdcpSapProvider, p);
+    }
 
-  Simulator::ScheduleNow (&LtePdcpSapProvider::TransmitPdcpSdu, m_pdcpSapProvider, p);
   m_nextPdu = Simulator::Schedule (m_arrivalTime, &LteTestRrc::Start, this);
 //   Simulator::Run ();
 }
@@ -449,7 +474,25 @@
 LteTestMac::SendTxOpportunity (Time time, uint32_t bytes)
 {
   NS_LOG_FUNCTION (this << time << bytes);
-  Simulator::Schedule (time, &LteMacSapUser::NotifyTxOpportunity, m_macSapUser, bytes, 0, 0);
+  bool haveContext = false;
+  Ptr<Node> node;
+  if (m_device != 0)
+    {
+      node = m_device->GetNode ();
+      if (node != 0)
+        {                    
+          haveContext = true;
+        }
+    }
+  if (haveContext)
+    {
+      Simulator::ScheduleWithContext (node->GetId (), time, &LteMacSapUser::NotifyTxOpportunity, m_macSapUser, bytes, 0, 0);
+    }
+  else
+    {
+      Simulator::Schedule (time, &LteMacSapUser::NotifyTxOpportunity, m_macSapUser, bytes, 0, 0);
+    }
+    
   if (m_txOpportunityMode == RANDOM_MODE)
   {
     if (m_txOppTime != Seconds (0))
@@ -568,20 +611,25 @@
 
   if (m_txOpportunityMode == AUTOMATIC_MODE)
     {
-      if (params.statusPduSize)
-        {
-          Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportunity,
-                               m_macSapUser, params.statusPduSize + 2, 0, 0);
+      // cancel all previously scheduled TxOpps
+      for (std::list<EventId>::iterator it = m_nextTxOppList.begin ();
+           it != m_nextTxOppList.end ();
+           ++it)
+        {          
+          it->Cancel ();
         }
-      else if (params.txQueueSize)
-        {
-          Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportunity,
-                               m_macSapUser, params.txQueueSize + 2, 0, 0);
-        }
-      else if (params.retxQueueSize)
+      m_nextTxOppList.clear ();
+
+      int32_t size = params.statusPduSize + params.txQueueSize  + params.retxQueueSize;
+      Time time = m_txOppTime;
+      while (size > 0)
         {
-          Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportunity,
-                               m_macSapUser, params.retxQueueSize + 2, 0, 0);
+          EventId e = Simulator::Schedule (time, 
+                                           &LteMacSapUser::NotifyTxOpportunity,
+                                           m_macSapUser, m_txOppSize, 0, 0);
+          m_nextTxOppList.push_back (e);
+          size -= m_txOppSize;
+          time += m_txOppTime;
         }
     }
 }
diff -Naur ns-3.22/src/lte/test/lte-test-entities.h ns-3.23/src/lte/test/lte-test-entities.h
--- ns-3.22/src/lte/test/lte-test-entities.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-entities.h	2015-05-13 11:05:27.000000000 -0700
@@ -82,6 +82,8 @@
     void SetArrivalTime (Time arrivalTime);
     void SetPduSize (uint32_t pduSize);
 
+  void SetDevice (Ptr<NetDevice> device);
+
   private:
     // Interface forwarded by LtePdcpSapUser
     virtual void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params);
@@ -101,6 +103,8 @@
     EventId m_nextPdu;
     Time m_arrivalTime;
     uint32_t m_pduSize;
+
+    Ptr<NetDevice> m_device;
 };
 
 /////////////////////////////////////////////////////////////////////
@@ -246,6 +250,7 @@
     EventId m_nextTxOpp;
     Time m_txOppTime;
     uint32_t m_txOppSize;
+    std::list<EventId> m_nextTxOppList;
 
     // Stats
     uint32_t m_txPdus;
diff -Naur ns-3.22/src/lte/test/lte-test-fading.cc ns-3.23/src/lte/test/lte-test-fading.cc
--- ns-3.22/src/lte/test/lte-test-fading.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-fading.cc	2015-05-13 11:05:27.000000000 -0700
@@ -239,7 +239,7 @@
       sum.at (i) = 0.;
       sumSquared.at (i) = 0.;
     }
-  for (uint i = 0; i < m_fadingSamples.size (); i++)
+  for (std::vector<SpectrumValue>::size_type i = 0; i != m_fadingSamples.size (); i++)
   {
     NS_LOG_INFO ("Sample time " << time << " : " << m_fadingSamples.at(i)[0] << " " << m_fadingSamples.at(i)[1]);
     time += samplingInterval;
diff -Naur ns-3.22/src/lte/test/lte-test-frequency-reuse.cc ns-3.23/src/lte/test/lte-test-frequency-reuse.cc
--- ns-3.22/src/lte/test/lte-test-frequency-reuse.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-frequency-reuse.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,7 +46,6 @@
 
 #include "lte-ffr-simple.h"
 #include "lte-simple-spectrum-phy.h"
-#include "lte-test-sinr-chunk-processor.h"
 #include <ns3/lte-common.h>
 
 #include "lte-test-frequency-reuse.h"
diff -Naur ns-3.22/src/lte/test/lte-test-interference.cc ns-3.23/src/lte/test/lte-test-interference.cc
--- ns-3.22/src/lte/test/lte-test-interference.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,9 +35,10 @@
 #include "ns3/lte-ue-phy.h"
 #include "ns3/lte-ue-net-device.h"
 
+#include <ns3/lte-chunk-processor.h>
+
 #include "lte-test-interference.h"
 
-#include "lte-test-sinr-chunk-processor.h"
 
 using namespace ns3;
 
@@ -67,9 +68,12 @@
 LteInterferenceTestSuite::LteInterferenceTestSuite ()
   : TestSuite ("lte-interference", SYSTEM)
 {
+  // these two first test cases have a spectral efficiency that corresponds to CQI=0 (out of range)
+  // TODO: update the test conditions to handle out-of-range correctly
+  // AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10",  50.000000, 10.000000,  0.040000, 0.040000,  0.010399, 0.010399, 0, 0), TestCase::QUICK);
+  // AddTestCase (new LteInterferenceTestCase ("d1=50, d2=20",  50.000000, 20.000000,  0.160000, 0.159998,  0.041154, 0.041153, 0, 0), TestCase::QUICK);
+
   AddTestCase (new LteInterferenceTestCase ("d1=3000, d2=6000",  3000.000000, 6000.000000,  3.844681, 1.714583,  0.761558, 0.389662, 6, 4), TestCase::QUICK);
-  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10",  50.000000, 10.000000,  0.040000, 0.040000,  0.010399, 0.010399, 0, 0), TestCase::QUICK);
-  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=20",  50.000000, 20.000000,  0.160000, 0.159998,  0.041154, 0.041153, 0, 0), TestCase::QUICK);
   AddTestCase (new LteInterferenceTestCase ("d1=50, d2=50",  50.000000, 50.000000,  0.999997, 0.999907,  0.239828, 0.239808, 2, 2), TestCase::QUICK);
   AddTestCase (new LteInterferenceTestCase ("d1=50, d2=100",  50.000000, 100.000000,  3.999955, 3.998520,  0.785259, 0.785042, 6, 6), TestCase::QUICK);
   AddTestCase (new LteInterferenceTestCase ("d1=50, d2=200",  50.000000, 200.000000,  15.999282, 15.976339,  1.961072, 1.959533, 14, 14), TestCase::QUICK);
@@ -95,8 +99,8 @@
   : TestCase (name),
     m_d1 (d1),
     m_d2 (d2),
-    m_dlSinrDb (10 * std::log10 (dlSinr)),
-    m_ulSinrDb (10 * std::log10 (ulSinr)),
+    m_expectedDlSinrDb (10 * std::log10 (dlSinr)),
+    m_expectedUlSinrDb (10 * std::log10 (ulSinr)),
     m_dlMcs (dlMcs),
     m_ulMcs (ulMcs)
 {
@@ -174,11 +178,15 @@
   // we plug in two instances, one for DL and one for UL
 
   Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinr1Catcher;
+  testDlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
   ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
 
   Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinr1Catcher;
+  testUlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
   enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
 
   Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
@@ -191,11 +199,15 @@
   // same as above for eNB2 and UE2
 
   Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinr2Catcher;
+  testDlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
   ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
 
   Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinr2Catcher;
+  testUlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
   enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
 
   Config::Connect ("/NodeList/1/DeviceList/0/LteEnbMac/DlScheduling",
@@ -210,19 +222,19 @@
 
   if (m_dlMcs > 0)
     {
-      double dlSinr1Db = 10.0 * std::log10 (testDlSinr1->GetSinr ()->operator[] (0));
-      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
+      double dlSinr1Db = 10.0 * std::log10 (dlSinr1Catcher.GetValue ()->operator[] (0));
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_expectedDlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
 
-      double dlSinr2Db = 10.0 * std::log10 (testDlSinr2->GetSinr ()->operator[] (0));
-      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
+      double dlSinr2Db = 10.0 * std::log10 (dlSinr2Catcher.GetValue ()->operator[] (0));
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_expectedDlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
     }
   if (m_ulMcs > 0)
     {
-      double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetSinr ()->operator[] (0));
-      NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!  (UE1 --> eNB1)");
+      double ulSinr1Db = 10.0 * std::log10 (ulSinr1Catcher.GetValue ()->operator[] (0));
+      NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL!  (UE1 --> eNB1)");
       
-      double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[] (0));
-      NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!  (UE2 --> eNB2)");
+      double ulSinr2Db = 10.0 * std::log10 (ulSinr2Catcher.GetValue ()->operator[] (0));
+      NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL!  (UE2 --> eNB2)");
     }
 
   Simulator::Destroy ();
diff -Naur ns-3.22/src/lte/test/lte-test-interference-fr.cc ns-3.23/src/lte/test/lte-test-interference-fr.cc
--- ns-3.22/src/lte/test/lte-test-interference-fr.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference-fr.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,7 +39,7 @@
 
 #include "lte-test-interference-fr.h"
 
-#include "lte-test-sinr-chunk-processor.h"
+#include <ns3/lte-chunk-processor.h>
 
 #include "lte-simple-spectrum-phy.h"
 #include "ns3/spectrum-value.h"
@@ -50,6 +50,8 @@
 
 NS_LOG_COMPONENT_DEFINE ("LteInterferenceFrTest");
 
+
+
 /**
  * TestSuite
  */
@@ -82,8 +84,8 @@
   : TestCase ("Test: " + name),
     m_d1 (d1),
     m_d2 (d2),
-    m_dlSinrDb (10 * std::log10 (dlSinr)),
-    m_ulSinrDb (10 * std::log10 (ulSinr))
+    m_expectedDlSinrDb (10 * std::log10 (dlSinr)),
+    m_expectedUlSinrDb (10 * std::log10 (ulSinr))
 {
   NS_LOG_INFO ("Creating LteInterferenceFrTestCase");
 }
@@ -174,21 +176,29 @@
   // we plug in two instances, one for DL and one for UL
 
   Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinr1Catcher;
+  testDlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
   ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
 
   Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinr1Catcher;
+  testUlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
   enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
 
   // same as above for eNB2 and UE2
 
   Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinr2Catcher;
+  testDlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
   ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
 
   Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinr2Catcher;
+  testUlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
   enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
 
 // need to allow for RRC connection establishment + SRS
@@ -198,33 +208,33 @@
 
   for (uint32_t i = 0; i < 12; i++)
     {
-      double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+      double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
       double dlSinr1Db = 10.0 * std::log10 (dlSinr1);
-      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_expectedDlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
 
 
-      double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);
+      double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
     }
 
   for (uint32_t i = 12; i < 24; i++)
     {
-      double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+      double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
 
-      double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);
+      double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
       double dlSinr2Db = 10.0 * std::log10 (dlSinr2);
-      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_expectedDlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
     }
 
   //FR algorithms do not operate in uplink now, so we do not test it
-//  double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetSinr ()->operator[] (0));
+//  double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[] (0));
 //  NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
-//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!  (UE1 --> eNB1)");
+//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL!  (UE1 --> eNB1)");
 //
-//  double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[] (0));
+//  double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[] (0));
 //  NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
-//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!  (UE2 --> eNB2)");
+//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL!  (UE2 --> eNB2)");
 
   Simulator::Destroy ();
 }
@@ -344,21 +354,29 @@
   // we plug in two instances, one for DL and one for UL
 
   Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinr1Catcher;
+  testDlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
   ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
 
   Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinr1Catcher;
+  testUlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
   enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
 
   // same as above for eNB2 and UE2
 
   Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinr2Catcher;
+  testDlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
   ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
 
   Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinr2Catcher;
+  testUlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
   enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
 
 // need to allow for UE Measurement report
@@ -368,46 +386,46 @@
 
   for (uint32_t i = 0; i < 12; i++)
     {
-      double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+      double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
       double dlSinr1Db = 10.0 * std::log10 (dlSinr1);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_commonDlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
 
 
-      double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);
+      double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
       double dlSinr2Db = 10.0 * std::log10 (dlSinr2);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_commonDlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
     }
 
   for (uint32_t i = 12; i < 18; i++)
     {
-      double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+      double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
       double dlSinr1Db = 10.0 * std::log10 (dlSinr1);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_edgeDlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
 
 
-      double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);
+      double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
     }
 
   for (uint32_t i = 18; i < 24; i++)
     {
-      double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+      double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
 
-      double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);
+      double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
       double dlSinr2Db = 10.0 * std::log10 (dlSinr2);
       NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_edgeDlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
     }
 
 
   //FR algorithms do not operate in uplink now, so we do not test it
-//  double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetSinr ()->operator[] (0));
+//  double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[] (0));
 //  NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
-//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!  (UE1 --> eNB1)");
+//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL!  (UE1 --> eNB1)");
 //
-//  double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[] (0));
+//  double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[] (0));
 //  NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
-//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!  (UE2 --> eNB2)");
+//  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL!  (UE2 --> eNB2)");
 
   Simulator::Destroy ();
 }
diff -Naur ns-3.22/src/lte/test/lte-test-interference-fr.h ns-3.23/src/lte/test/lte-test-interference-fr.h
--- ns-3.22/src/lte/test/lte-test-interference-fr.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference-fr.h	2015-05-13 11:05:27.000000000 -0700
@@ -49,8 +49,8 @@
 
   double m_d1;
   double m_d2;
-  double m_dlSinrDb;
-  double m_ulSinrDb;
+  double m_expectedDlSinrDb;
+  double m_expectedUlSinrDb;
 };
 
 class LteInterferenceStrictFrTestCase : public TestCase
diff -Naur ns-3.22/src/lte/test/lte-test-interference.h ns-3.23/src/lte/test/lte-test-interference.h
--- ns-3.22/src/lte/test/lte-test-interference.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference.h	2015-05-13 11:05:27.000000000 -0700
@@ -56,8 +56,8 @@
 
   double m_d1;
   double m_d2;
-  double m_dlSinrDb;
-  double m_ulSinrDb;
+  double m_expectedDlSinrDb;
+  double m_expectedUlSinrDb;
   uint16_t m_dlMcs;
   uint16_t m_ulMcs;
 };
diff -Naur ns-3.22/src/lte/test/lte-test-link-adaptation.cc ns-3.23/src/lte/test/lte-test-link-adaptation.cc
--- ns-3.22/src/lte/test/lte-test-link-adaptation.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-link-adaptation.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,9 +31,10 @@
 #include "ns3/lte-ue-phy.h"
 #include "ns3/lte-ue-net-device.h"
 
+#include <ns3/lte-chunk-processor.h>
+
 #include "lte-test-link-adaptation.h"
 
-#include "lte-test-sinr-chunk-processor.h"
 
 using namespace ns3;
 
@@ -206,7 +207,9 @@
   // Use testing chunk processor in the PHY layer
   // It will be used to test that the SNR is as intended
   Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testSinr = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testSinr = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher sinrCatcher;
+  testSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &sinrCatcher));
   uePhy->GetDownlinkSpectrumPhy ()->AddCtrlSinrChunkProcessor (testSinr);
 
   Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
@@ -215,7 +218,7 @@
   Simulator::Stop (Seconds (0.040));
   Simulator::Run ();
 
-  double calculatedSinrDb = 10.0 * std::log10 (testSinr->GetSinr ()->operator[] (0));
+  double calculatedSinrDb = 10.0 * std::log10 (sinrCatcher.GetValue ()->operator[] (0));
   NS_TEST_ASSERT_MSG_EQ_TOL (calculatedSinrDb, m_snrDb, 0.0000001, "Wrong SINR !");
   Simulator::Destroy ();
 }
diff -Naur ns-3.22/src/lte/test/lte-test-pathloss-model.cc ns-3.23/src/lte/test/lte-test-pathloss-model.cc
--- ns-3.22/src/lte/test/lte-test-pathloss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-pathloss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,7 +47,6 @@
 #include <ns3/lte-enb-phy.h>
 #include <ns3/lte-ue-phy.h>
 
-#include "lte-test-sinr-chunk-processor.h"
 #include "lte-test-ue-phy.h"
 #include "lte-test-pathloss-model.h"
 
@@ -271,7 +270,9 @@
   // Use testing chunk processor in the PHY layer
   // It will be used to test that the SNR is as intended
   //Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testSinr = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testSinr = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher sinrCatcher;
+  testSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &sinrCatcher));
   uePhy->GetDownlinkSpectrumPhy ()->AddCtrlSinrChunkProcessor (testSinr);
    
 //   Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
@@ -280,7 +281,7 @@
   Simulator::Stop (Seconds (0.035));
   Simulator::Run ();
   
-  double calculatedSinrDb = 10.0 * std::log10 (testSinr->GetSinr ()->operator[] (0));
+  double calculatedSinrDb = 10.0 * std::log10 (sinrCatcher.GetValue ()->operator[] (0));
   NS_LOG_INFO ("Distance " << m_distance << " Calculated SINR " << calculatedSinrDb << " ref " << m_snrDb);
   Simulator::Destroy ();
   NS_TEST_ASSERT_MSG_EQ_TOL (calculatedSinrDb, m_snrDb, 0.001, "Wrong SINR !");
diff -Naur ns-3.22/src/lte/test/lte-test-rlc-am-e2e.cc ns-3.23/src/lte/test/lte-test-rlc-am-e2e.cc
--- ns-3.22/src/lte/test/lte-test-rlc-am-e2e.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-rlc-am-e2e.cc	2015-05-13 11:05:27.000000000 -0700
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Manuel Requena <manuel.requena@cttc.es>
+ *         Nicola Baldo <nbaldo@cttc.es>
  */
 
 #include "ns3/config.h"
@@ -41,59 +42,71 @@
 
 NS_LOG_COMPONENT_DEFINE ("LteRlcAmE2eTest");
 
-/**
- * Test x.x.x RLC AM: End-to-end flow
- */
-
-/**
- * TestSuite
- */
-
 LteRlcAmE2eTestSuite::LteRlcAmE2eTestSuite ()
   : TestSuite ("lte-rlc-am-e2e", SYSTEM)
 {
   // NS_LOG_INFO ("Creating LteRlcAmE2eTestSuite");
 
-  double losses[] = {0.0, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95};
-  uint32_t seeds[] = {1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 10101};
+  double losses[] = {0.0, 0.05,  0.10, 0.15, 0.25, 0.50, 0.75, 0.90, 0.95};
+  uint32_t runs[] = {1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 11110,
+                     12221, 13332, 14443, 15554, 16665, 17776, 18887, 19998, 21109, 22220,
+                     23331, 24442, 25553, 26664, 27775, 28886, 29997, 31108, 32219, 33330};
 
   for ( uint32_t l = 0 ; l < (sizeof (losses) / sizeof (double)) ; l++ )
     {
-      for ( uint32_t s = 0 ; s < (sizeof (seeds) / sizeof (uint32_t)) ; s++ )
+      for ( uint32_t s = 0 ; s < (sizeof (runs) / sizeof (uint32_t)) ; s++ )
         {
-          std::ostringstream name;
-          name << " Losses = " << losses[l] * 100 << "%. Seed = " << seeds[s];
-          TestCase::TestDuration testDuration;
-          if (l == 1 && s == 0)
+          for (uint32_t sduArrivalType = 0; sduArrivalType <= 1; ++sduArrivalType)
             {
-              testDuration = TestCase::QUICK;
+              std::ostringstream name;
+              name << " losses = " << losses[l] * 100 << "%; run = " << runs[s];
+              
+              bool bulkSduArrival;
+              switch (sduArrivalType)
+                {
+                case 0:
+                  bulkSduArrival = false;
+                  name << "; continuous SDU arrival";
+                  break;
+                case 1:
+                  bulkSduArrival = true;
+                  name << "; bulk SDU arrival";
+                  break;
+                default:
+                  NS_FATAL_ERROR ("unsupported option");
+                  break;
+                }
+              
+              TestCase::TestDuration testDuration;
+              if (l == 1 && s == 0)
+                {
+                  testDuration = TestCase::QUICK;
+                }
+              else if (s <= 4)
+                {
+                  testDuration = TestCase::EXTENSIVE;
+                }
+              else
+                {
+                  testDuration = TestCase::TAKES_FOREVER;              
+                }
+              AddTestCase (new LteRlcAmE2eTestCase (name.str (), runs[s], losses[l], bulkSduArrival), testDuration);
             }
-          else
-            {
-              testDuration = TestCase::EXTENSIVE;
-            }
-          AddTestCase (new LteRlcAmE2eTestCase (name.str (), seeds[s], losses[l]), testDuration);
         }
     }
 }
 
 static LteRlcAmE2eTestSuite lteRlcAmE2eTestSuite;
 
-
-/**
- * TestCase
- */
-
-LteRlcAmE2eTestCase::LteRlcAmE2eTestCase (std::string name, uint32_t seed, double losses)
-  : TestCase (name)
+LteRlcAmE2eTestCase::LteRlcAmE2eTestCase (std::string name, uint32_t run, double losses, bool bulkSduArrival)
+   : TestCase (name),
+     m_run (run),
+     m_losses (losses),
+     m_bulkSduArrival (bulkSduArrival),
+     m_dlDrops (0),
+     m_ulDrops (0)
 {
-  // NS_LOG_UNCOND ("Creating LteRlcAmTestingTestCase: " + name);
-
-  m_seed = seed;
-  m_losses = losses;
-
-  m_dlDrops = 0;
-  m_ulDrops = 0;
+  NS_LOG_INFO ("Creating LteRlcAmTestingTestCase: " + name);
 }
 
 LteRlcAmE2eTestCase::~LteRlcAmE2eTestCase ()
@@ -133,7 +146,10 @@
   // LogComponentEnable ("LteRlcUm", level);
   // LogComponentEnable ("LteRlcAm", level);
 
-  RngSeedManager::SetSeed (m_seed);
+  Config::SetGlobal ("RngRun", IntegerValue (m_run));
+  Config::SetDefault ("ns3::LteRlcAm::PollRetransmitTimer", TimeValue (MilliSeconds (20)));
+  Config::SetDefault ("ns3::LteRlcAm::ReorderingTimer", TimeValue (MilliSeconds (10)));
+  Config::SetDefault ("ns3::LteRlcAm::StatusProhibitTimer", TimeValue (MilliSeconds (40)));
 
   Ptr<LteSimpleHelper> lteSimpleHelper = CreateObject<LteSimpleHelper> ();
   // lteSimpleHelper->EnableLogComponents ();
@@ -164,6 +180,9 @@
 
   // Error models: downlink and uplink
   Ptr<RateErrorModel> dlEm = CreateObject<RateErrorModel> ();
+  // fix the stream so that subsequent test cases get a number from the same stream
+  // if RngRun is different, the number shall then be different
+  dlEm->AssignStreams (3);
   dlEm->SetAttribute ("ErrorRate", DoubleValue (m_losses));
   dlEm->SetAttribute ("ErrorUnit", StringValue ("ERROR_UNIT_PACKET"));
 
@@ -177,43 +196,128 @@
 //   enbLteDevs.Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (enbEm));
 //   enbLteDevs.Get (0)->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&LteRlcAmE2eTestCase::EnbDropEvent, this));
 
+
+
+  uint32_t sduSizeBytes = 100;
+  uint32_t numSdu = 1000;
+  double sduStartTimeSeconds = 0.100;
+  double sduStopTimeSeconds;
+  double sduArrivalTimeSeconds;
+  uint32_t dlTxOppSizeBytes = 150;
+  double dlTxOpprTimeSeconds = 0.003;
+  uint32_t ulTxOppSizeBytes = 140;
+  double ulTxOpprTimeSeconds = 0.003;
+
+  if (m_bulkSduArrival)
+    {
+      sduStopTimeSeconds = sduStartTimeSeconds + 0.010;
+    }
+  else
+    {
+      sduStopTimeSeconds = sduStartTimeSeconds + 10;
+    }
+  sduArrivalTimeSeconds = (sduStopTimeSeconds - sduStartTimeSeconds) / numSdu;
+  
+  
+
   // Sending packets from RRC layer
-  lteSimpleHelper->m_enbRrc->SetArrivalTime (Seconds (0.010));
-  lteSimpleHelper->m_enbRrc->SetPduSize (100);
+  lteSimpleHelper->m_enbRrc->SetArrivalTime (Seconds (sduArrivalTimeSeconds));
+  lteSimpleHelper->m_enbRrc->SetPduSize (sduSizeBytes);
 
   // MAC sends transmission opportunities (TxOpp)
-  lteSimpleHelper->m_enbMac->SetTxOppSize (150);
-  lteSimpleHelper->m_enbMac->SetTxOppTime (Seconds (0.005));
-  lteSimpleHelper->m_enbMac->SetTxOpportunityMode (LteTestMac::RANDOM_MODE);
+  lteSimpleHelper->m_enbMac->SetTxOppSize (dlTxOppSizeBytes);
+  lteSimpleHelper->m_enbMac->SetTxOppTime (Seconds (dlTxOpprTimeSeconds));
+  lteSimpleHelper->m_enbMac->SetTxOpportunityMode (LteTestMac::AUTOMATIC_MODE);
 
   // MAC sends transmission opportunities (TxOpp)
-  lteSimpleHelper->m_ueMac->SetTxOppSize (140);
-  lteSimpleHelper->m_ueMac->SetTxOppTime (Seconds (0.015));
-  lteSimpleHelper->m_ueMac->SetTxOpportunityMode (LteTestMac::RANDOM_MODE);
+  lteSimpleHelper->m_ueMac->SetTxOppSize (ulTxOppSizeBytes);
+  lteSimpleHelper->m_ueMac->SetTxOppTime (Seconds (ulTxOpprTimeSeconds));
+  lteSimpleHelper->m_ueMac->SetTxOpportunityMode (LteTestMac::AUTOMATIC_MODE);
 
   // Start/Stop pseudo-application at RRC layer
-  Simulator::Schedule (Seconds (0.100), &LteTestRrc::Start, lteSimpleHelper->m_enbRrc);
-  Simulator::Schedule (Seconds (10.100), &LteTestRrc::Stop, lteSimpleHelper->m_enbRrc);
-
+  Simulator::Schedule (Seconds (sduStartTimeSeconds), &LteTestRrc::Start, lteSimpleHelper->m_enbRrc);
+  Simulator::Schedule (Seconds (sduStopTimeSeconds), &LteTestRrc::Stop, lteSimpleHelper->m_enbRrc);
 
-  Simulator::Stop (Seconds (100.000));
+  
+  double maxDlThroughput = (dlTxOppSizeBytes/(dlTxOppSizeBytes+4.0))*(dlTxOppSizeBytes/dlTxOpprTimeSeconds) * (1.0-m_losses);
+  const double statusProhibitSeconds = 0.020;
+  double pollFrequency = (1.0/dlTxOpprTimeSeconds)*(1-m_losses);
+  double statusFrequency = std::min (pollFrequency, 1.0/statusProhibitSeconds);
+  const uint32_t numNackSnPerStatusPdu = (ulTxOppSizeBytes*8 - 14)/10;
+  double maxRetxThroughput = ((double)numNackSnPerStatusPdu*(double)dlTxOppSizeBytes)*statusFrequency;
+  double throughput = std::min (maxDlThroughput, maxRetxThroughput);
+  double totBytes = ((sduSizeBytes) * (sduStopTimeSeconds - sduStartTimeSeconds) / sduArrivalTimeSeconds);
+
+
+  // note: the throughput estimation is valid only for the full buffer
+  // case. However, the test sends a finite number of SDUs. Hence, the
+  // estimated throughput will only be effective at the beginning of
+  // the test. Towards the end of the test, two issues are present:
+  //   1) no new data is transmitted, hence less feedback is sent,
+  //      hence the transmission rate for the last PDUs to be
+  //      retransmitted is much lower. This effect can be best noteed
+  //      at very high loss rates, and can be adjusted by timers and
+  //      params.
+  //   2) throuhgput is not meaningful, you need to evaluate the time
+  //      it takes for all PDUs to be (re)transmitted successfully,
+  //      i.e., how long it takes for the TX and reTX queues to deplete.
+
+  // Estimating correctly this effect would require a complex stateful
+  // model (e.g., a Markov chain model) so to avoid the hassle we just
+  // use a margin here which we empirically determine as something we
+  // think reasonable based on the PDU loss rate
+  Time margin;
+  if (m_losses < 0.07)
+    {
+      margin = Seconds (0.500);
+    }
+  else if (m_losses < 0.20)
+    {
+      margin = Seconds (1);
+    }
+  else if (m_losses < 0.50)
+    {
+      margin = Seconds (2);
+    }
+  else if (m_losses < 0.70)
+    {
+      margin = Seconds (10);
+    }
+  else if (m_losses < 0.91)
+    {
+      margin = Seconds (20);
+    }
+  else // 0.95
+    {
+      margin = Seconds (30);
+    }
+  Time stopTime = Seconds (std::max (sduStartTimeSeconds + totBytes/throughput, sduStopTimeSeconds)) + margin;
+  
+  NS_LOG_INFO ("statusFrequency=" << statusFrequency << ", maxDlThroughput=" << maxDlThroughput << ", maxRetxThroughput=" << maxRetxThroughput << ", totBytes=" << totBytes << ", stopTime=" << stopTime.GetSeconds () << "s");
+  
+  Simulator::Stop (stopTime);
   Simulator::Run ();
 
   uint32_t txEnbRrcPdus = lteSimpleHelper->m_enbRrc->GetTxPdus ();
   uint32_t rxUeRrcPdus = lteSimpleHelper->m_ueRrc->GetRxPdus ();
 
-  // NS_LOG_INFO ("Seed = " << m_seed);
-  // NS_LOG_INFO ("Losses (%) = " << uint32_t (m_losses * 100));
+  uint32_t txEnbRlcPdus = lteSimpleHelper->m_enbMac->GetTxPdus ();
+  uint32_t rxUeRlcPdus = lteSimpleHelper->m_ueMac->GetRxPdus ();
 
-  // NS_LOG_INFO ("dl dev drops = " << m_dlDrops);
-  // NS_LOG_INFO ("ul dev drops = " << m_ulDrops);
+  NS_LOG_INFO ("Run = " << m_run);
+  NS_LOG_INFO ("Loss rate (%) = " << uint32_t (m_losses * 100));
 
-  // NS_LOG_INFO ("eNB tx RRC count = " << txEnbRrcPdus);
-  // NS_LOG_INFO ("eNB rx RRC count = " << rxEnbRrcPdus);
-  // NS_LOG_INFO ("UE tx RRC count = " << txUeRrcPdus);
-  // NS_LOG_INFO ("UE rx RRC count = " << rxUeRrcPdus);
+  
+  NS_LOG_INFO ("RLC PDUs   TX: " << txEnbRlcPdus 
+               << "   RX: " << rxUeRlcPdus 
+               << "   LOST: " << m_dlDrops
+               << " (" << (100.0 * (double) m_dlDrops)/txEnbRlcPdus << "%)");
+
+  NS_TEST_ASSERT_MSG_EQ (txEnbRlcPdus,  rxUeRlcPdus + m_dlDrops, "lost RLC PDUs don't match TX + RX");  
+                          
+  NS_LOG_INFO ("eNB tx RRC count = " << txEnbRrcPdus);
+  NS_LOG_INFO ("UE rx RRC count = " << rxUeRrcPdus);
 
-  NS_LOG_INFO (m_seed << "\t" << m_losses << "\t" << txEnbRrcPdus << "\t" << rxUeRrcPdus << "\t" << m_dlDrops);
 
   NS_TEST_ASSERT_MSG_EQ (txEnbRrcPdus, rxUeRrcPdus,
                          "TX PDUs (" << txEnbRrcPdus << ") != RX PDUs (" << rxUeRrcPdus << ")");
diff -Naur ns-3.22/src/lte/test/lte-test-rlc-am-e2e.h ns-3.23/src/lte/test/lte-test-rlc-am-e2e.h
--- ns-3.22/src/lte/test/lte-test-rlc-am-e2e.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-rlc-am-e2e.h	2015-05-13 11:05:27.000000000 -0700
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Manuel Requena <manuel.requena@cttc.es>
+ *         Nicola Baldo <nbaldo@cttc.es>
  */
 
 #ifndef LTE_TEST_RLC_AM_E2E_H
@@ -28,7 +29,8 @@
 
 
 /**
- * Test x.x.x RLC AM: End-to-end flow
+ * Provides the test suite lte-rlc-am-e2e. See the testing section of
+ * the LTE module documentation for details.  
  */
 class LteRlcAmE2eTestSuite : public TestSuite
 {
@@ -36,11 +38,15 @@
   LteRlcAmE2eTestSuite ();
 };
 
-
+/**
+ * Test cases used for the test suite lte-rlc-am-e2e. See the testing section of
+ * the LTE module documentation for details.  
+ * 
+ */
 class LteRlcAmE2eTestCase : public TestCase
 {
   public:
-    LteRlcAmE2eTestCase (std::string name, uint32_t seed, double losses);
+  LteRlcAmE2eTestCase (std::string name, uint32_t seed, double losses, bool bulkSduArrival);
     LteRlcAmE2eTestCase ();
     virtual ~LteRlcAmE2eTestCase ();
 
@@ -50,11 +56,13 @@
     void DlDropEvent (Ptr<const Packet> p);
     void UlDropEvent (Ptr<const Packet> p);
 
+    uint32_t m_run;
+    double   m_losses;
+    bool m_bulkSduArrival;
+
     uint32_t m_dlDrops;
     uint32_t m_ulDrops;
 
-    uint32_t m_seed;
-    double   m_losses;
 };
 
 #endif // LTE_TEST_RLC_AM_E2E_H
diff -Naur ns-3.22/src/lte/test/lte-test-rlc-am-transmitter.cc ns-3.23/src/lte/test/lte-test-rlc-am-transmitter.cc
--- ns-3.22/src/lte/test/lte-test-rlc-am-transmitter.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-rlc-am-transmitter.cc	2015-05-13 11:05:27.000000000 -0700
@@ -139,6 +139,7 @@
   txMac->SendTxOpportunity (Seconds (0.150), 30);
   CheckDataReceived (Seconds (0.200), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "SDU is not OK");
 
+  Simulator::Stop (Seconds (0.3));
   Simulator::Run ();
   Simulator::Destroy ();
 }
@@ -181,6 +182,7 @@
   txMac->SendTxOpportunity (Seconds (0.450), 7);
   CheckDataReceived (Seconds (0.500), "YZZ", "Segment #4 is not OK");
 
+  Simulator::Stop (Seconds (0.6));
   Simulator::Run ();
   Simulator::Destroy ();
 }
@@ -217,6 +219,7 @@
   txMac->SendTxOpportunity (Seconds (0.250), 33);
   CheckDataReceived (Seconds (0.300), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "Concatenation is not OK");
 
+  Simulator::Stop (Seconds (0.4));
   Simulator::Run ();
   Simulator::Destroy ();
 }
@@ -293,6 +296,7 @@
   txMac->SendTxOpportunity (Seconds (1.650), (4+2+1+2) + (3+10+10+7));
   CheckDataReceived (Seconds (1.700), "XYZABCDEFGHIJKLMNOPQRSTUVWXYZ", "SDU #9 is not OK");
 
+  Simulator::Stop (Seconds (2));
   Simulator::Run ();
   Simulator::Destroy ();
 }
diff -Naur ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.cc ns-3.23/src/lte/test/lte-test-sinr-chunk-processor.cc
--- ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-sinr-chunk-processor.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,94 +0,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: Manuel Requena <manuel.requena@cttc.es> : Based on lte-sinr-chunk-processor code
- *         Nicola Baldo <nbaldo>@cttc.es>
- */
-
-#include <ns3/log.h>
-#include <ns3/spectrum-value.h>
-#include "lte-test-sinr-chunk-processor.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("LteTestSinrChunkProcessor");
-
-LteTestSinrChunkProcessor::LteTestSinrChunkProcessor ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-LteTestSinrChunkProcessor::~LteTestSinrChunkProcessor ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-LteTestSinrChunkProcessor::AddCallback (LteChunkProcessorCallback c)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-LteTestSinrChunkProcessor::Start ()
-{
-  NS_LOG_FUNCTION (this);
-  m_sumSinr = 0;
-  m_totDuration = MicroSeconds (0);
-}
-
-void
-LteTestSinrChunkProcessor::EvaluateChunk (const SpectrumValue& sinr, Time duration)
-{
-  NS_LOG_FUNCTION (this << sinr << duration);
-  if (m_sumSinr == 0)
-    {
-      m_sumSinr = Create<SpectrumValue> (sinr.GetSpectrumModel ());
-    }
-  (*m_sumSinr) += sinr * duration.GetSeconds ();
-  m_totDuration += duration;
-  NS_LOG_LOGIC (this << " m_sumSinr = " << *m_sumSinr);
-  NS_LOG_LOGIC (this << " m_totDuration = " << m_totDuration);
-}
-
-void
-LteTestSinrChunkProcessor::End ()
-{
-  NS_LOG_FUNCTION (this);
-  if (m_totDuration.GetSeconds () > 0)
-    {
-      NS_LOG_LOGIC (this << " m_sumSinr = " << *m_sumSinr);
-      NS_LOG_LOGIC (this << " m_totDuration = " << m_totDuration);
-      m_sinr = Create<SpectrumValue> ((*m_sumSinr) / m_totDuration.GetSeconds ());
-      NS_LOG_LOGIC (this << " m_sumSinr / m_totDuration = " << *m_sinr);
-    }
-  else
-    {
-      NS_LOG_WARN ("m_numSinr == 0");
-    }
-}
-
-Ptr<SpectrumValue>
-LteTestSinrChunkProcessor::GetSinr ()
-{
-  NS_LOG_FUNCTION (this);
-
-  NS_ASSERT (m_sinr);
-  return m_sinr;
-}
-
-} // namespace ns3
diff -Naur ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.h ns-3.23/src/lte/test/lte-test-sinr-chunk-processor.h
--- ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-sinr-chunk-processor.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,56 +0,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: Manuel Requena <manuel.requena@cttc.es> : Based on lte-sinr-chunk-processor code
- *         Nicola Baldo <nbaldo@cttc.es>
- */
-
-#ifndef LTE_TEST_SINR_CHUNK_PROCESSOR_H
-#define LTE_TEST_SINR_CHUNK_PROCESSOR_H
-
-#include "ns3/lte-chunk-processor.h"
-
-namespace ns3 {
-
-/**
- * This custom LteTestSinrChunkProcessor averages the calculated SINR over time.
- * It is plugged on the receiving SpectrumPhy and therefore
- * receives the SINR SpectrumValue calculated by the LteInterference module.
- */
-class LteTestSinrChunkProcessor : public LteChunkProcessor
-{
-public:
-  LteTestSinrChunkProcessor ();
-  virtual ~LteTestSinrChunkProcessor ();
-
-  virtual void AddCallback (LteChunkProcessorCallback c);
-  virtual void Start ();
-  virtual void EvaluateChunk (const SpectrumValue& sinr, Time duration);
-  virtual void End ();
-
-  Ptr<SpectrumValue> GetSinr ();
-
-private:
-  Ptr<SpectrumValue> m_sumSinr;
-  Ptr<SpectrumValue> m_sinr;
-  Time m_totDuration;
-};
-
-
-} // namespace ns3
-
-#endif /* LTE_TEST_SINR_CHUNK_PROCESSOR_H */
diff -Naur ns-3.22/src/lte/test/lte-test-ue-measurements.cc ns-3.23/src/lte/test/lte-test-ue-measurements.cc
--- ns-3.22/src/lte/test/lte-test-ue-measurements.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-ue-measurements.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,7 +51,6 @@
 #include <ns3/lte-ue-rrc.h>
 
 #include "lte-test-ue-measurements.h"
-#include "lte-test-sinr-chunk-processor.h"
 #include <ns3/lte-common.h>
 
 using namespace ns3;
@@ -198,33 +197,12 @@
   lteHelper->ActivateDataRadioBearer (ueDevs1, bearer);
   lteHelper->ActivateDataRadioBearer (ueDevs2, bearer);
 
-  // Use testing chunk processor in the PHY layer
-  // It will be used to test that the SNR is as intended
-  // we plug in two instances, one for DL and one for UL
-
-  Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor> ();
-  ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
-
-  Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor> ();
-  enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
 
   Config::Connect ("/NodeList/2/DeviceList/0/LteUePhy/ReportUeMeasurements",
                    MakeBoundCallback (&ReportUeMeasurementsCallback, this));
   Config::Connect ("/NodeList/0/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
                    MakeBoundCallback (&RecvMeasurementReportCallback, this));
 
-  // same as above for eNB2 and UE2
-
-  Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor> ();
-  ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
-
-  Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor> ();
-  enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
-
   Config::Connect ("/NodeList/3/DeviceList/0/LteUePhy/ReportUeMeasurements",
                    MakeBoundCallback (&ReportUeMeasurementsCallback, this));
   Config::Connect ("/NodeList/1/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
diff -Naur ns-3.22/src/lte/test/lte-test-uplink-power-control.cc ns-3.23/src/lte/test/lte-test-uplink-power-control.cc
--- ns-3.22/src/lte/test/lte-test-uplink-power-control.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-uplink-power-control.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,7 +42,6 @@
 #include <ns3/lte-ue-rrc.h>
 
 #include "lte-ffr-simple.h"
-#include "lte-test-sinr-chunk-processor.h"
 #include <ns3/lte-common.h>
 
 #include "lte-test-uplink-power-control.h"
diff -Naur ns-3.22/src/lte/test/lte-test-uplink-sinr.cc ns-3.23/src/lte/test/lte-test-uplink-sinr.cc
--- ns-3.22/src/lte/test/lte-test-uplink-sinr.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-uplink-sinr.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,12 +28,12 @@
 
 #include "ns3/lte-phy-tag.h"
 #include "lte-test-ue-phy.h"
-#include "lte-test-sinr-chunk-processor.h"
 #include "ns3/lte-spectrum-signal-parameters.h"
 
 #include "lte-test-uplink-sinr.h"
 
 #include <ns3/lte-helper.h>
+#include <ns3/lte-chunk-processor.h>
 
 using namespace ns3;
 
@@ -121,7 +121,7 @@
     m_sv1 (sv1),
     m_sv2 (sv2),
     m_sm (sv1->GetSpectrumModel ()),
-    m_sinr (sinr)
+    m_expectedSinr (sinr)
 {
   NS_LOG_INFO ("Creating LteUplinkDataSinrTestCase");
 }
@@ -130,6 +130,7 @@
 {
 }
 
+
 void
 LteUplinkDataSinrTestCase::DoRun (void)
 {
@@ -143,7 +144,9 @@
   dlPhy->SetCellId (cellId);
   ulPhy->SetCellId (cellId);
 
-  Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher actualSinrCatcher;
+  chunkProcessor->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &actualSinrCatcher));
   ulPhy->AddDataSinrChunkProcessor (chunkProcessor);
 
   /**
@@ -294,16 +297,12 @@
   Simulator::Stop (Seconds (5.0));
   Simulator::Run ();
 
-  /**
-   * Check that the values passed to LteChunkProcessor::EvaluateChunk () correspond
-   * to known values which have been calculated offline (with octave) for the generated signals
-   */
-  Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
+  NS_LOG_INFO ("Data Frame - Theoretical SINR: " << *m_expectedSinr);
+  NS_LOG_INFO ("Data Frame - Calculated SINR: " << *(actualSinrCatcher.GetValue ()));
 
-  NS_LOG_INFO ("Data Frame - Theoretical SINR: " << *m_sinr);
-  NS_LOG_INFO ("Data Frame - Calculated SINR: " << *calculatedSinr);
-  
-  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*calculatedSinr, *m_sinr, 0.0000001, "Data Frame - Wrong SINR !");
+  NS_TEST_EXPECT_MSG_NE (actualSinrCatcher.GetValue (), 0, "no actual SINR reported");
+
+  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*(actualSinrCatcher.GetValue ()), *m_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
   ulPhy->Dispose ();
   Simulator::Destroy ();
   
@@ -315,11 +314,11 @@
 */
 
 LteUplinkSrsSinrTestCase::LteUplinkSrsSinrTestCase (Ptr<SpectrumValue> sv1, Ptr<SpectrumValue> sv2, Ptr<SpectrumValue> sinr, std::string name)
-: TestCase ("SINR calculation in uplink srs frame: " + name),
-m_sv1 (sv1),
-m_sv2 (sv2),
-m_sm (sv1->GetSpectrumModel ()),
-m_sinr (sinr)
+  : TestCase ("SINR calculation in uplink srs frame: " + name),
+    m_sv1 (sv1),
+    m_sv2 (sv2),
+    m_sm (sv1->GetSpectrumModel ()),
+    m_expectedSinr (sinr)
 {
   NS_LOG_INFO ("Creating LteUplinkSrsSinrTestCase");
 }
@@ -329,6 +328,12 @@
 }
 
 void
+LteUplinkSrsSinrTestCase::ReportSinr (const SpectrumValue& sinr)
+{
+  m_actualSinr = sinr.Copy ();
+}
+
+void
 LteUplinkSrsSinrTestCase::DoRun (void)
 {
   /**
@@ -344,9 +349,10 @@
   dlPhy->SetCellId (cellId);
   ulPhy->SetCellId (cellId);
   
-  Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+  chunkProcessor->AddCallback (MakeCallback (&LteUplinkSrsSinrTestCase::ReportSinr, this));
   ulPhy->AddCtrlSinrChunkProcessor (chunkProcessor);
-  
+
   /**
   * Generate several calls to LteSpectrumPhy::StartRx corresponding to 
   * several signals.
@@ -464,16 +470,12 @@
   Simulator::Stop (Seconds (5.0));
   Simulator::Run ();
   
-  /**
-  * Check that the values passed to LteChunkProcessor::EvaluateChunk () correspond
-  * to known values which have been calculated offline (with octave) for the generated signals
-  */
-  Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
+  NS_ASSERT_MSG (m_actualSinr != 0, "no actual SINR reported");
   
-  NS_LOG_INFO ("SRS Frame - Theoretical SINR: " << *m_sinr);
-  NS_LOG_INFO ("SRS Frame - Calculated SINR: " << *calculatedSinr);
-  
-  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*calculatedSinr, *m_sinr, 0.0000001, "Data Frame - Wrong SINR !");
+  NS_LOG_INFO ("SRS Frame - Theoretical SINR: " << *m_expectedSinr);
+  NS_LOG_INFO ("SRS Frame - Calculated SINR: " << *m_actualSinr);
+
+  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*m_actualSinr, *m_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
   ulPhy->Dispose ();
   Simulator::Destroy ();
   
diff -Naur ns-3.22/src/lte/test/lte-test-uplink-sinr.h ns-3.23/src/lte/test/lte-test-uplink-sinr.h
--- ns-3.22/src/lte/test/lte-test-uplink-sinr.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-uplink-sinr.h	2015-05-13 11:05:27.000000000 -0700
@@ -53,7 +53,7 @@
   Ptr<SpectrumValue> m_sv1;
   Ptr<SpectrumValue> m_sv2;
   Ptr<const SpectrumModel> m_sm;
-  Ptr<SpectrumValue> m_sinr;
+  Ptr<SpectrumValue> m_expectedSinr;
 };
 
 
@@ -63,13 +63,22 @@
     LteUplinkSrsSinrTestCase (Ptr<SpectrumValue> sv1, Ptr<SpectrumValue> sv2, Ptr<SpectrumValue> sinr, std::string name);
     virtual ~LteUplinkSrsSinrTestCase ();
     
-  private:
-    virtual void DoRun (void);
-    
-    Ptr<SpectrumValue> m_sv1;
-    Ptr<SpectrumValue> m_sv2;
-    Ptr<const SpectrumModel> m_sm;
-    Ptr<SpectrumValue> m_sinr;
+  /** 
+   * Callback to be connected to an LteChunkProcessor to collect the reported SINR
+   * 
+   * \param sinr 
+   */
+  void ReportSinr (const SpectrumValue& sinr);
+
+private:
+  virtual void DoRun (void);
+  
+  Ptr<SpectrumValue> m_sv1;
+  Ptr<SpectrumValue> m_sv2;
+  Ptr<const SpectrumModel> m_sm;
+  
+  Ptr<SpectrumValue> m_expectedSinr;
+  Ptr<SpectrumValue> m_actualSinr;
 };
 
 
diff -Naur ns-3.22/src/lte/test/test-lte-antenna.cc ns-3.23/src/lte/test/test-lte-antenna.cc
--- ns-3.22/src/lte/test/test-lte-antenna.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/test/test-lte-antenna.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,7 +37,8 @@
 
 #include "ns3/lte-global-pathloss-database.h"
 
-#include "lte-test-sinr-chunk-processor.h"
+#include <ns3/lte-chunk-processor.h>
+
 
 using namespace ns3;
 
@@ -148,11 +149,15 @@
   // Use testing chunk processor in the PHY layer
   // It will be used to test that the SNR is as intended
   Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testDlSinr = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testDlSinr = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher dlSinrCatcher;
+  testDlSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlSinrCatcher));
   uePhy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr);
 
   Ptr<LtePhy> enbphy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
-  Ptr<LteTestSinrChunkProcessor> testUlSinr = Create<LteTestSinrChunkProcessor> ();
+  Ptr<LteChunkProcessor> testUlSinr = Create<LteChunkProcessor> ();
+  LteSpectrumValueCatcher ulSinrCatcher;
+  testUlSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &ulSinrCatcher));
   enbphy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr);
 
 
@@ -177,15 +182,15 @@
   const double enbNoiseFigureDb = 5.0; // default eNB noise figure
   double tolerance = (m_antennaGainDb != 0) ? std::abs (m_antennaGainDb) * 0.001 : 0.001;
 
-  // first test with SINR from LteTestSinrChunkProcessor
+  // first test with SINR from LteChunkProcessor
   // this can only be done for not-too-bad SINR otherwise the measurement won't be available
   double expectedSinrDl = enbTxPowerDbm + m_antennaGainDb - noisePowerDbm + ueNoiseFigureDb;
   if (expectedSinrDl > 0)
     {
       double calculatedSinrDbDl = -INFINITY;
-      if (testDlSinr->GetSinr () != 0)
+      if (dlSinrCatcher.GetValue () != 0)
         {
-          calculatedSinrDbDl = 10.0 * std::log10 (testDlSinr->GetSinr ()->operator[] (0));
+          calculatedSinrDbDl = 10.0 * std::log10 (dlSinrCatcher.GetValue ()->operator[] (0));
         }      
       // remember that propagation loss is 0dB
       double calculatedAntennaGainDbDl = - (enbTxPowerDbm - calculatedSinrDbDl - noisePowerDbm - ueNoiseFigureDb);      
@@ -195,9 +200,9 @@
   if (expectedSinrUl > 0)
     {      
       double calculatedSinrDbUl = -INFINITY;
-      if (testUlSinr->GetSinr () != 0)
+      if (ulSinrCatcher.GetValue () != 0)
         {
-          calculatedSinrDbUl = 10.0 * std::log10 (testUlSinr->GetSinr ()->operator[] (0));
+          calculatedSinrDbUl = 10.0 * std::log10 (ulSinrCatcher.GetValue ()->operator[] (0));
         }  
       double calculatedAntennaGainDbUl = - (ueTxPowerDbm - calculatedSinrDbUl - noisePowerDbm - enbNoiseFigureDb);
       NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbUl, m_antennaGainDb, tolerance, "Wrong UL antenna gain!");
diff -Naur ns-3.22/src/lte/test/test-lte-rlc-header.cc ns-3.23/src/lte/test/test-lte-rlc-header.cc
--- ns-3.22/src/lte/test/test-lte-rlc-header.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/lte/test/test-lte-rlc-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,225 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011, 2012, 2013 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: Lluis Parcerisa <lparcerisa@cttc.cat> (TestUtils from test-asn1-encoding.cc)
+ *         Nicola Baldo <nbaldo@cttc.es> (actual test)
+ */
+
+#include "ns3/log.h"
+#include "ns3/test.h"
+#include "ns3/ptr.h"
+#include "ns3/packet.h"
+
+#include "ns3/lte-rlc-am-header.h"
+
+#include <list>
+#include <bitset>
+#include <iomanip>
+
+
+NS_LOG_COMPONENT_DEFINE ("TestLteRlcHeader");
+
+namespace ns3 {
+
+class TestUtils
+{
+public:
+  // Function to convert packet contents in hex format
+  static std::string sprintPacketContentsHex (Ptr<Packet> pkt)
+  {
+    uint32_t psize = pkt->GetSize ();
+    uint8_t buffer[psize];
+    std::ostringstream oss (std::ostringstream::out);
+    pkt->CopyData (buffer, psize);
+    for (uint32_t i = 0; i < psize; i++)
+      {
+        oss << std::setfill ('0') << std::setw (2) << std::hex << (uint32_t) buffer[i];
+      }
+    return oss.str ();
+  }
+
+  // Function to convert packet contents in binary format
+  static std::string sprintPacketContentsBin (Ptr<Packet> pkt)
+  {
+    uint32_t psize = pkt->GetSize ();
+    uint8_t buffer[psize];
+    std::ostringstream oss (std::ostringstream::out);
+    pkt->CopyData (buffer, psize);
+    for (uint32_t i = 0; i < psize; i++)
+      {
+        oss << (std::bitset<8> (buffer[i]));
+      }
+    return std::string (oss.str () + "\n");
+  }
+
+  // Function to log packet contents
+  static void LogPacketContents (Ptr<Packet> pkt)
+  {
+    NS_LOG_DEBUG ("---- SERIALIZED PACKET CONTENTS (HEX): -------");
+    NS_LOG_DEBUG ("Hex: " << TestUtils::sprintPacketContentsHex (pkt));
+    NS_LOG_DEBUG ("Bin: " << TestUtils::sprintPacketContentsBin (pkt));
+  }
+
+  template <class T>
+  static void LogPacketInfo (T source,std::string s)
+  {
+    NS_LOG_DEBUG ("--------- " << s.data () << " INFO: -------");
+    std::ostringstream oss (std::ostringstream::out);
+    source.Print (oss);
+    NS_LOG_DEBUG (oss.str ());
+  }
+};
+
+
+class RlcAmStatusPduTestCase : public TestCase
+{
+public:
+  RlcAmStatusPduTestCase (SequenceNumber10 ackSn, 
+			  std::list<SequenceNumber10> nackSnList,
+			  std::string hex);
+
+protected:  
+  virtual void DoRun (void);
+  
+  SequenceNumber10 m_ackSn;  
+  std::list<SequenceNumber10> m_nackSnList;
+  std::string m_hex;
+  
+};
+
+
+RlcAmStatusPduTestCase::RlcAmStatusPduTestCase (SequenceNumber10 ackSn, 
+						std::list<SequenceNumber10> nackSnList ,
+						std::string hex)
+  : TestCase (hex), 
+    m_ackSn (ackSn),
+    m_nackSnList (nackSnList),
+    m_hex (hex)
+{
+  NS_LOG_FUNCTION (this << hex);
+}
+
+void
+
+RlcAmStatusPduTestCase::DoRun ()
+{
+  NS_LOG_FUNCTION (this);
+  
+  Ptr<Packet> p = Create<Packet> ();
+  LteRlcAmHeader h;
+  h.SetControlPdu (LteRlcAmHeader::STATUS_PDU);
+  h.SetAckSn (m_ackSn);
+  for (std::list<SequenceNumber10>::iterator it = m_nackSnList.begin ();
+       it != m_nackSnList.end ();
+       ++it)
+    {
+      h.PushNack (it->GetValue ());
+    }
+  p->AddHeader (h);  
+
+  TestUtils::LogPacketContents (p);
+  std::string hex = TestUtils::sprintPacketContentsHex (p);
+  NS_TEST_ASSERT_MSG_EQ (m_hex, hex, "serialized packet content " << hex << " differs from test vector " << m_hex);
+  
+  LteRlcAmHeader h2;
+  p->RemoveHeader (h2);
+  SequenceNumber10 ackSn = h2.GetAckSn ();
+  NS_TEST_ASSERT_MSG_EQ (ackSn, m_ackSn, "deserialized ACK SN differs from test vector");
+  
+  for (std::list<SequenceNumber10>::iterator it = m_nackSnList.begin ();
+       it != m_nackSnList.end ();
+       ++it)
+    {
+      int nackSn = h2.PopNack ();
+      NS_TEST_ASSERT_MSG_GT (nackSn, -1, "not enough elements in deserialized NACK list");
+      NS_TEST_ASSERT_MSG_EQ (nackSn, it->GetValue (), "deserialized NACK SN  differs from test vector");
+    }
+  int retVal = h2.PopNack ();
+  NS_TEST_ASSERT_MSG_LT (retVal, 0, "too many elements in deserialized NACK list");
+}
+
+
+class LteRlcHeaderTestSuite : public TestSuite
+{
+public:
+  LteRlcHeaderTestSuite ();
+} staticLteRlcHeaderTestSuiteInstance ;
+
+LteRlcHeaderTestSuite::LteRlcHeaderTestSuite ()
+  : TestSuite ("lte-rlc-header", UNIT)
+{
+  NS_LOG_FUNCTION (this);
+
+  {
+    SequenceNumber10 ackSn (8);
+    std::list<SequenceNumber10> nackSnList;
+    std::string hex ("0020");
+    AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
+  }
+
+  {
+    SequenceNumber10 ackSn (873);
+    std::list<SequenceNumber10> nackSnList;
+    std::string hex ("0da4");
+    AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
+  }
+
+  {
+    SequenceNumber10 ackSn (2);
+    std::list<SequenceNumber10> nackSnList;
+    nackSnList.push_back (SequenceNumber10 (873));
+    std::string hex ("000bb480");
+    AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
+  }
+
+
+  {
+    SequenceNumber10 ackSn (2);
+    std::list<SequenceNumber10> nackSnList;
+    nackSnList.push_back (SequenceNumber10 (1021));
+    nackSnList.push_back (SequenceNumber10 (754));
+    std::string hex ("000bfed790");
+    AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
+  }
+
+
+  {
+    SequenceNumber10 ackSn (2);
+    std::list<SequenceNumber10> nackSnList;
+    nackSnList.push_back (SequenceNumber10 (1021));
+    nackSnList.push_back (SequenceNumber10 (754));
+    nackSnList.push_back (SequenceNumber10 (947));
+    std::string hex ("000bfed795d980");
+    AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
+  }
+
+
+  {
+    SequenceNumber10 ackSn (2);
+    std::list<SequenceNumber10> nackSnList;
+    nackSnList.push_back (SequenceNumber10 (1021));
+    nackSnList.push_back (SequenceNumber10 (754));
+    nackSnList.push_back (SequenceNumber10 (947));
+    nackSnList.push_back (SequenceNumber10 (347));
+    std::string hex ("000bfed795d9cad8");
+    AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase::QUICK);
+  }
+
+}
+
+
+} // namespace ns3
diff -Naur ns-3.22/src/lte/wscript ns-3.23/src/lte/wscript
--- ns-3.22/src/lte/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -129,7 +129,6 @@
         'test/lte-test-uplink-sinr.cc',
         'test/lte-test-link-adaptation.cc',
         'test/lte-test-interference.cc',
-        'test/lte-test-sinr-chunk-processor.cc',
         'test/lte-test-ue-phy.cc',
         'test/lte-test-rr-ff-mac-scheduler.cc',
         'test/lte-test-pf-ff-mac-scheduler.cc',
@@ -148,6 +147,7 @@
         'test/lte-test-entities.cc',
         'test/lte-simple-helper.cc',
         'test/lte-simple-net-device.cc',
+        'test/test-lte-rlc-header.cc',
         'test/lte-test-rlc-um-transmitter.cc',
         'test/lte-test-rlc-am-transmitter.cc',
         'test/lte-test-rlc-um-e2e.cc',
diff -Naur ns-3.22/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.23/src/mesh/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/mesh/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -251,17 +251,13 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
-    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
-    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
-    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
-    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
-    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PROTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActionValue [enumeration]
+    module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValue [enumeration]
+    module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFIRMATION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [enumeration]
+    module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION', 'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
     module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
@@ -507,7 +503,7 @@
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sCongestionControlMode [enumeration]
     module.add_enum('dot11sCongestionControlMode', ['CONGESTION_SIGNALING', 'CONGESTION_NULL'])
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sAuthenticationProtocol [enumeration]
-    module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE'])
+    module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE', 'AUTH_IEEE'])
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sPathSelectionMetric [enumeration]
     module.add_enum('dot11sPathSelectionMetric', ['METRIC_AIRTIME'])
     ## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::PmpReasonCode [enumeration]
@@ -4986,16 +4982,12 @@
     cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
     cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
-    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
-    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
-    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
-    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
-    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshAction [variable]
+    cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multihopAction [variable]
+    cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::MultihopActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfProtectedAction [variable]
+    cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
 def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -5791,6 +5783,10 @@
                    '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', 
@@ -6264,10 +6260,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -6441,10 +6437,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -10222,15 +10218,15 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ie-dot11s-configuration.h (module 'mesh'): uint16_t ns3::dot11s::Dot11sMeshCapability::GetUint16() const [member function]
-    cls.add_method('GetUint16', 
-                   'uint16_t', 
+    ## ie-dot11s-configuration.h (module 'mesh'): uint8_t ns3::dot11s::Dot11sMeshCapability::GetUint8() const [member function]
+    cls.add_method('GetUint8', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshCapability::Is(uint16_t cap, uint8_t n) const [member function]
+    ## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshCapability::Is(uint8_t cap, uint8_t n) const [member function]
     cls.add_method('Is', 
                    'bool', 
-                   [param('uint16_t', 'cap'), param('uint8_t', 'n')], 
+                   [param('uint8_t', 'cap'), param('uint8_t', 'n')], 
                    is_const=True)
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::Buffer::Iterator ns3::dot11s::Dot11sMeshCapability::Serialize(ns3::Buffer::Iterator i) const [member function]
     cls.add_method('Serialize', 
diff -Naur ns-3.22/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.23/src/mesh/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/mesh/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -251,17 +251,13 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
-    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
-    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
-    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
-    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
-    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PROTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActionValue [enumeration]
+    module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValue [enumeration]
+    module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFIRMATION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [enumeration]
+    module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION', 'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
     module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
@@ -505,7 +501,7 @@
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sCongestionControlMode [enumeration]
     module.add_enum('dot11sCongestionControlMode', ['CONGESTION_SIGNALING', 'CONGESTION_NULL'])
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sAuthenticationProtocol [enumeration]
-    module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE'])
+    module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE', 'AUTH_IEEE'])
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sPathSelectionMetric [enumeration]
     module.add_enum('dot11sPathSelectionMetric', ['METRIC_AIRTIME'])
     ## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::PmpReasonCode [enumeration]
@@ -4986,16 +4982,12 @@
     cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
     cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
-    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
-    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
-    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
-    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
-    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshAction [variable]
+    cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multihopAction [variable]
+    cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::MultihopActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfProtectedAction [variable]
+    cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
 def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -5791,6 +5783,10 @@
                    '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', 
@@ -6264,10 +6260,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -6441,10 +6437,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -10222,15 +10218,15 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ie-dot11s-configuration.h (module 'mesh'): uint16_t ns3::dot11s::Dot11sMeshCapability::GetUint16() const [member function]
-    cls.add_method('GetUint16', 
-                   'uint16_t', 
+    ## ie-dot11s-configuration.h (module 'mesh'): uint8_t ns3::dot11s::Dot11sMeshCapability::GetUint8() const [member function]
+    cls.add_method('GetUint8', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshCapability::Is(uint16_t cap, uint8_t n) const [member function]
+    ## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshCapability::Is(uint8_t cap, uint8_t n) const [member function]
     cls.add_method('Is', 
                    'bool', 
-                   [param('uint16_t', 'cap'), param('uint8_t', 'n')], 
+                   [param('uint8_t', 'cap'), param('uint8_t', 'n')], 
                    is_const=True)
     ## ie-dot11s-configuration.h (module 'mesh'): ns3::Buffer::Iterator ns3::dot11s::Dot11sMeshCapability::Serialize(ns3::Buffer::Iterator i) const [member function]
     cls.add_method('Serialize', 
diff -Naur ns-3.22/src/mesh/doc/mesh.rst ns-3.23/src/mesh/doc/mesh.rst
--- ns-3.22/src/mesh/doc/mesh.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/doc/mesh.rst	2015-05-13 11:05:27.000000000 -0700
@@ -8,3 +8,9 @@
 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.22/src/mesh/model/dot11s/airtime-metric.cc ns-3.23/src/mesh/model/dot11s/airtime-metric.cc
--- ns-3.22/src/mesh/model/dot11s/airtime-metric.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/airtime-metric.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::dot11s::AirtimeLinkMetricCalculator")
     .SetParent<Object> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<AirtimeLinkMetricCalculator> ()
     .AddAttribute ( "TestLength",
                     "Rate should be estimated using test length.",
diff -Naur ns-3.22/src/mesh/model/dot11s/dot11s-mac-header.cc ns-3.23/src/mesh/model/dot11s/dot11s-mac-header.cc
--- ns-3.22/src/mesh/model/dot11s/dot11s-mac-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/dot11s-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::Dot11sMacHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<MeshHeader> ();
   return tid;
 }
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-protocol.cc ns-3.23/src/mesh/model/dot11s/hwmp-protocol.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::dot11s::HwmpProtocol")
     .SetParent<MeshL2RoutingProtocol> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<HwmpProtocol> ()
     .AddAttribute ( "RandomStart",
                     "Random delay at first proactive PREQ",
@@ -209,7 +210,8 @@
   m_coefficient->SetAttribute ("Max", DoubleValue (m_randomStart.GetSeconds ()));
   if (m_isRoot)
     {
-      SetRoot ();
+      Time randomStart = Seconds (m_coefficient->GetValue ());
+      m_proactivePreqTimer = Simulator::Schedule (randomStart, &HwmpProtocol::SendProactivePreq, this);
     }
 }
 
@@ -1026,8 +1028,6 @@
 void
 HwmpProtocol::SetRoot ()
 {
-  Time randomStart = Seconds (m_coefficient->GetValue ());
-  m_proactivePreqTimer = Simulator::Schedule (randomStart, &HwmpProtocol::SendProactivePreq, this);
   NS_LOG_DEBUG ("ROOT IS: " << m_address);
   m_isRoot = true;
 }
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-protocol.h ns-3.23/src/mesh/model/dot11s/hwmp-protocol.h
--- ns-3.22/src/mesh/model/dot11s/hwmp-protocol.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-protocol.h	2015-05-13 11:05:27.000000000 -0700
@@ -156,7 +156,7 @@
   /// \return list of addresses where a PERR should be sent to
   std::vector<std::pair<uint32_t, Mac48Address> > GetPerrReceivers (std::vector<FailedDestination> failedDest);
 
-  /// \return list of addresses where a PERR should be sent to
+  /// \return list of addresses where a PREQ should be sent to
   std::vector<Mac48Address> GetPreqReceivers (uint32_t interface);
   /// \return list of addresses where a broadcast should be
   //retransmitted
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-protocol-mac.cc ns-3.23/src/mesh/model/dot11s/hwmp-protocol-mac.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -99,7 +99,7 @@
   m_stats.rxMgtBytes += packet->GetSize ();
   WifiActionHeader actionHdr;
   packet->RemoveHeader (actionHdr);
-  if (actionHdr.GetCategory () != WifiActionHeader::MESH_PATH_SELECTION)
+  if (actionHdr.GetCategory () != WifiActionHeader::MESH)
     {
       return true;
     }
@@ -210,8 +210,8 @@
 {
   WifiActionHeader actionHdr;
   WifiActionHeader::ActionValue action;
-  action.pathSelection = WifiActionHeader::PATH_SELECTION;
-  actionHdr.SetAction (WifiActionHeader::MESH_PATH_SELECTION, action);
+  action.meshAction = WifiActionHeader::PATH_SELECTION;
+  actionHdr.SetAction (WifiActionHeader::MESH, action); 
   return actionHdr;
 }
 void
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-rtable.cc ns-3.23/src/mesh/model/dot11s/hwmp-rtable.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-rtable.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-rtable.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::dot11s::HwmpRtable")
     .SetParent<Object> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<HwmpRtable> ();
   return tid;
 }
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-tag.cc ns-3.23/src/mesh/model/dot11s/hwmp-tag.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -86,7 +86,7 @@
 TypeId
 HwmpTag::GetTypeId ()
 {
-  static TypeId tid = TypeId ("ns3::dot11s::HwmpTag").SetParent<Tag> ().AddConstructor<HwmpTag> ();
+  static TypeId tid = TypeId ("ns3::dot11s::HwmpTag").SetParent<Tag> ().AddConstructor<HwmpTag> ().SetGroupName ("Mesh");
   return tid;
 }
 
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.cc ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.cc
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,17 +32,17 @@
 uint8_t
 Dot11sMeshCapability::GetSerializedSize () const
 {
-  return 2;
+  return 1; 
 }
-uint16_t
-Dot11sMeshCapability::GetUint16 () const
+uint8_t  
+Dot11sMeshCapability::GetUint8 () const  //IEEE 802.11-2012 8.4.2.100.8 Mesh Capability 
 {
-  uint16_t result = 0;
+  uint8_t result = 0;  
   if (acceptPeerLinks)
     {
-      result |= 1 << 0;
+      result |= 1 << 0; //The Accepting Additional Mesh Peerings subfield is set to 1 if the mesh STA is willing to establish additional mesh peerings   with other mesh STAs and set to 0 otherwise
     }
-  if (MCCASupported)
+  if (MCCASupported) // The MCCA Supported subfield is set to 1 if the mesh STA implements MCCA and set to 0 otherwise
     {
       result |= 1 << 1;
     }
@@ -71,13 +71,13 @@
 Buffer::Iterator
 Dot11sMeshCapability::Serialize (Buffer::Iterator i) const
 {
-  i.WriteHtolsbU16 (GetUint16 ());
+  i.WriteU8 (GetUint8 ());
   return i;
 }
 Buffer::Iterator
 Dot11sMeshCapability::Deserialize (Buffer::Iterator i)
 {
-  uint16_t cap = i.ReadLsbtohU16 ();
+  uint8_t cap = i.ReadU8 ();
   acceptPeerLinks = Is (cap, 0);
   MCCASupported = Is (cap, 1);
   MCCAEnabled = Is (cap, 2);
@@ -88,7 +88,7 @@
   return i;
 }
 bool
-Dot11sMeshCapability::Is (uint16_t cap, uint8_t n) const
+Dot11sMeshCapability::Is (uint8_t cap, uint8_t n) const
 {
   uint16_t mask = 1 << n;
   return (cap & mask);
@@ -107,29 +107,28 @@
 uint8_t
 IeConfiguration::GetInformationFieldSize () const
 {
-  return 1 // Version
-         + 4 // APSPId
-         + 4 // APSMId
-         + 4 // CCMId
-         + 4 // SPId
-         + 4 // APId
+   return 0   // Version
+         + 1  // APSPId
+         + 1 // APSMId
+         + 1 // CCMId
+         + 1 // SPId
+         + 1 // APId
          + 1 // Mesh formation info (see 7.3.2.86.6 of 802.11s draft 3.0)
          + m_meshCap.GetSerializedSize ();
 }
 void
 IeConfiguration::SerializeInformationField (Buffer::Iterator i) const
 {
-  i.WriteU8 (1); //Version
   // Active Path Selection Protocol ID:
-  i.WriteHtolsbU32 (m_APSPId);
+  i.WriteU8 (m_APSPId);
   // Active Path Metric ID:
-  i.WriteHtolsbU32 (m_APSMId);
+  i.WriteU8 (m_APSMId);
   // Congestion Control Mode ID:
-  i.WriteHtolsbU32 (m_CCMId);
+  i.WriteU8 (m_CCMId);
   // Sync:
-  i.WriteHtolsbU32 (m_SPId);
+  i.WriteU8 (m_SPId);
   // Auth:
-  i.WriteHtolsbU32 (m_APId);
+  i.WriteU8 (m_APId);
   i.WriteU8 (m_neighbors << 1);
   m_meshCap.Serialize (i);
 }
@@ -137,20 +136,14 @@
 IeConfiguration::DeserializeInformationField (Buffer::Iterator i, uint8_t length)
 {
   Buffer::Iterator start = i;
-  uint8_t version;
-  version = i.ReadU8 ();
-  if (version != 1)
-    {
-      NS_FATAL_ERROR ("Other versions not supported yet");
-    }
   // Active Path Selection Protocol ID:
-  m_APSPId = (dot11sPathSelectionProtocol) i.ReadLsbtohU32 ();
+  m_APSPId = (dot11sPathSelectionProtocol) i.ReadU8 ();
   // Active Path Metric ID:
-  m_APSMId = (dot11sPathSelectionMetric) i.ReadLsbtohU32 ();
+  m_APSMId = (dot11sPathSelectionMetric) i.ReadU8 ();
   // Congestion Control Mode ID:
-  m_CCMId = (dot11sCongestionControlMode) i.ReadLsbtohU32 ();
-  m_SPId = (dot11sSynchronizationProtocolIdentifier) i.ReadLsbtohU32 ();
-  m_APId = (dot11sAuthenticationProtocol) i.ReadLsbtohU32 ();
+  m_CCMId = (dot11sCongestionControlMode) i.ReadU8 ();
+  m_SPId = (dot11sSynchronizationProtocolIdentifier) i.ReadU8 ();
+  m_APId = (dot11sAuthenticationProtocol) i.ReadU8 ();
   m_neighbors = (i.ReadU8 () >> 1) & 0xF;
   i = m_meshCap.Deserialize (i);
   return i.GetDistanceFrom (start);
@@ -165,7 +158,7 @@
      << 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.GetUint16 () << std::endl;
+     << std::endl << "Capabilities:                      = " << m_meshCap.GetUint8 () << std::endl;
   os << "</information_element>" << std::endl;
 }
 void
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.h ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.h
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.h	2015-05-13 11:05:27.000000000 -0700
@@ -27,48 +27,41 @@
 
 namespace ns3 {
 namespace dot11s {
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.1 in 802.11s draft 3.0
- */
+ 
+//according to IEEE 802.11 - 2012
+
+//in 7.3.2.98.2 Active Path Selection Protocol Identifier - 802.11s-2011 
 enum dot11sPathSelectionProtocol
 {
-  PROTOCOL_HWMP = 0x000fac00,
+  PROTOCOL_HWMP = 0x01,
 };
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.2 in 802.11s draft 3.0
- */
+ 
+//in 7.3.2.98.3 Active Path Selection Metric Identifier - 802.11s-2011 
 enum dot11sPathSelectionMetric
 {
-  METRIC_AIRTIME = 0x000fac00,
+  METRIC_AIRTIME = 0x01,
 };
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.3 in 802.11s draft 3.0
- */
+
+// in 7.3.2.98.4 Congestion Control Mode Identifier - 802.11s-2011 
 enum dot11sCongestionControlMode
 {
-  CONGESTION_SIGNALING = 0x000fac00,
-  CONGESTION_NULL      = 0x000facff,
+  CONGESTION_SIGNALING = 0x01,
+  CONGESTION_NULL      = 0x00,
 };
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.4 in 802.11s draft 3.0
- */
+
+// in 7.3.2.98.5 Synchronization Method Identifier - 802.11s-2011 
 enum dot11sSynchronizationProtocolIdentifier
 {
-  SYNC_NEIGHBOUR_OFFSET = 0x000fac00,
-  SYNC_NULL             = 0x000facff,
+  SYNC_NEIGHBOUR_OFFSET = 0x01,  //Neighbor offset synchronization method
+  SYNC_NULL             = 0x00,  //Reserved
 };
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.5 in 802.11s draft 3.0
- */
+
+// in 7.3.2.98.6 Authentication Protocol Identifier - 802.11s-2011 
 enum dot11sAuthenticationProtocol
 {
-  AUTH_NULL = 0x000fac00,
-  AUTH_SAE  = 0x000fac01,
+  AUTH_NULL = 0x00,  //No authentication method is required to establish mesh peerings within the MBSS
+  AUTH_SAE  = 0x01,  //SAE defined in 8.2a
+  AUTH_IEEE = 0x02,  //IEEE 802.1X authentication
 };
 /**
  * \ingroup dot11s
@@ -81,7 +74,7 @@
   uint8_t  GetSerializedSize () const;
   Buffer::Iterator Serialize (Buffer::Iterator i) const;
   Buffer::Iterator Deserialize (Buffer::Iterator i);
-  uint16_t GetUint16 () const;
+  uint8_t GetUint8 () const;  
   bool acceptPeerLinks;
   bool MCCASupported;
   bool MCCAEnabled;
@@ -89,7 +82,7 @@
   bool beaconTimingReport;
   bool TBTTAdjustment;
   bool powerSaveLevel;
-  bool Is (uint16_t cap,uint8_t n) const;
+  bool Is (uint8_t cap,uint8_t n) const;
   friend bool operator== (const Dot11sMeshCapability & a, const Dot11sMeshCapability & b);
 };
 
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-peer-management.h ns-3.23/src/mesh/model/dot11s/ie-dot11s-peer-management.h
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-peer-management.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-peer-management.h	2015-05-13 11:05:27.000000000 -0700
@@ -33,31 +33,30 @@
  */
 enum PmpReasonCode
 {
-  REASON11S_PEERING_CANCELLED = 2, // according to open80211s
-  REASON11S_MESH_MAX_PEERS,
-  REASON11S_MESH_CAPABILITY_POLICY_VIOLATION,
-  REASON11S_MESH_CLOSE_RCVD,
-  REASON11S_MESH_MAX_RETRIES,
-  REASON11S_MESH_CONFIRM_TIMEOUT,
-  REASON11S_MESH_INVALID_GTK,
-  REASON11S_MESH_INCONSISTENT_PARAMETERS,
-  REASON11S_MESH_INVALID_SECURITY_CAPABILITY,
-  REASON11S_RESERVED,
+  REASON11S_PEERING_CANCELLED = 52, // according to IEEE 802.11 - 2012
+  REASON11S_MESH_MAX_PEERS = 53,
+  REASON11S_MESH_CAPABILITY_POLICY_VIOLATION = 54,
+  REASON11S_MESH_CLOSE_RCVD = 55,
+  REASON11S_MESH_MAX_RETRIES = 56,
+  REASON11S_MESH_CONFIRM_TIMEOUT = 57,
+  REASON11S_MESH_INVALID_GTK = 58,
+  REASON11S_MESH_INCONSISTENT_PARAMETERS = 59,
+  REASON11S_MESH_INVALID_SECURITY_CAPABILITY =60,
+  REASON11S_RESERVED = 67,
 };
 
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.85 of draft 2.07
- */
+
+// according to IEEE 802.11 - 2012
+
 class IePeerManagement : public WifiInformationElement
 {
 public:
   IePeerManagement ();
   enum Subtype
   {
-    PEER_OPEN = 0,
-    PEER_CONFIRM,
-    PEER_CLOSE,
+    PEER_OPEN = 1,
+    PEER_CONFIRM = 2,
+    PEER_CLOSE = 3,
   };
   void   SetPeerOpen (uint16_t localLinkId);
   void   SetPeerClose (uint16_t localLinkID, uint16_t peerLinkId, PmpReasonCode reasonCode);
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-perr.cc ns-3.23/src/mesh/model/dot11s/ie-dot11s-perr.cc
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-perr.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-perr.cc	2015-05-13 11:05:27.000000000 -0700
@@ -54,28 +54,33 @@
 void
 IePerr::SerializeInformationField (Buffer::Iterator i) const
 {
-  i.WriteU8 (0);
-  i.WriteU8 (m_addressUnits.size ());
+  i.WriteU8 (0);// TTL
+  i.WriteU8 (m_addressUnits.size ()); // number of Destinations
   for (unsigned int j = 0; j < m_addressUnits.size (); j++)
     {
+      i.WriteU8 (0); // not used // Bit 6: AE (Address Extension) subfield (1 = destination external address is present, 0 = otherwise).
       WriteTo (i, m_addressUnits[j].destination);
       i.WriteHtolsbU32 (m_addressUnits[j].seqnum);
+      i.WriteU8 (0);
+      i.WriteU8 (0);
     }
 }
 uint8_t
 IePerr::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
 {
   Buffer::Iterator i = start;
-  i.Next (1); //Mode flags is not used now
+  i.Next (1); //TTL //Mode flags is not used now
   uint8_t numOfDest = i.ReadU8 ();
-  NS_ASSERT ((2 + 10 * numOfDest ) == length);
+  NS_ASSERT ((2 + 13 * numOfDest ) == length);
   length = 0; //to avoid compiler warning in optimized builds
   for (unsigned int j = 0; j < numOfDest; j++)
     {
+      i.Next (1); // flags is not used now
       HwmpProtocol::FailedDestination unit;
       ReadFrom (i, unit.destination);
       unit.seqnum = i.ReadLsbtohU32 ();
       m_addressUnits.push_back (unit);
+      i.Next (2); // Reason
     }
   return i.GetDistanceFrom (start);
 }
@@ -83,9 +88,11 @@
 uint8_t
 IePerr::GetInformationFieldSize () const
 {
-  uint8_t retval = 1 //ModeFlags
+  uint8_t retval = 1 //TTL   //ModeFlags
     + 1   //NumOfDests
-    + (6 + 4) * m_addressUnits.size ();
+    + 1  * m_addressUnits.size () //ModeFlags
+    + (6 + 4) * m_addressUnits.size ()
+    + 2* m_addressUnits.size (); // Reason Code
   return retval;
 }
 
@@ -99,7 +106,7 @@
           return;
         }
     }
-  if ((m_addressUnits.size () + 1) * 10 + 2 > 255)
+ if ((m_addressUnits.size () + 1) * 13 + 2 > 255)
     {
       return;
     }
@@ -112,7 +119,7 @@
   return (GetInformationFieldSize ()
           > 255
           -   2 /* ID + LENGTH*/
-          -  10 /* Size of Mac48Address + uint32_t (one unit)*/
+          -  13// 10 /* Size of Mac48Address + uint32_t (one unit)*/
           );
 }
 std::vector<HwmpProtocol::FailedDestination>
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-link.cc ns-3.23/src/mesh/model/dot11s/peer-link.cc
--- ns-3.22/src/mesh/model/dot11s/peer-link.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-link.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::dot11s::PeerLink")
     .SetParent<Object> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<PeerLink> ()
     .AddAttribute ( "RetryTimeout",
                     "Retry timeout",
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-link-frame.cc ns-3.23/src/mesh/model/dot11s/peer-link-frame.cc
--- ns-3.22/src/mesh/model/dot11s/peer-link-frame.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-link-frame.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,7 +30,7 @@
 
 PeerLinkFrameStart::PeerLinkFrameStart () :
   m_subtype (255), m_capability (0), m_aid (0), m_rates (SupportedRates ()), m_meshId (),
-  m_config (IeConfiguration ()), m_reasonCode ((uint16_t)REASON11S_RESERVED)
+  m_config (IeConfiguration ())
 {
 }
 void
@@ -42,7 +42,7 @@
 PeerLinkFrameStart::SetPlinkFrameStart (PeerLinkFrameStart::PlinkFrameStartFields fields)
 {
   m_subtype = fields.subtype;
-  m_protocol = fields.protocol;
+  
   if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE))
     {
       m_capability = fields.capability;
@@ -65,7 +65,7 @@
     }
   else
     {
-      m_reasonCode = fields.reasonCode;
+      //reasonCode not used here
     }
 }
 PeerLinkFrameStart::PlinkFrameStartFields
@@ -79,14 +79,17 @@
   retval.rates = m_rates;
   retval.meshId = m_meshId;
   retval.config = m_config;
-  retval.reasonCode = m_reasonCode;
+  
   return retval;
 }
 TypeId
 PeerLinkFrameStart::GetTypeId ()
 {
-  static TypeId tid = TypeId ("ns3::dot11s::PeerLinkFrameStart").SetParent<Header> ().AddConstructor<
-      PeerLinkFrameStart> ();
+  static TypeId tid = TypeId ("ns3::dot11s::PeerLinkFrameStart")
+    .SetParent<Header> ()
+    .SetGroupName ("Mesh")
+    .AddConstructor<PeerLinkFrameStart> ()
+  ;
   return tid;
 }
 TypeId
@@ -107,8 +110,8 @@
 uint32_t
 PeerLinkFrameStart::GetSerializedSize () const
 {
-  uint32_t size = 3; //Peering protocol
-  NS_ASSERT (m_subtype < 3);
+  uint32_t size =0; //Peering protocol
+  NS_ASSERT (m_subtype < 4);
   if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
     {
       size += 2; //capability
@@ -132,7 +135,7 @@
     }
   else
     {
-      size += 2; //reasonCode
+      //reasonCode not used here
     }
   return size;
 }
@@ -140,8 +143,8 @@
 PeerLinkFrameStart::Serialize (Buffer::Iterator start) const
 {
   Buffer::Iterator i = start;
-  NS_ASSERT (m_subtype < 3);
-  i = m_protocol.Serialize (i);
+  NS_ASSERT (m_subtype < 4);
+  
   if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
     {
       i.WriteHtolsbU16 (m_capability);
@@ -165,24 +168,15 @@
     }
   else
     {
-      i.WriteHtolsbU16 (m_reasonCode);
+      //reasonCode not used here
     }
 }
 uint32_t
 PeerLinkFrameStart::Deserialize (Buffer::Iterator start)
 {
   Buffer::Iterator i = start;
-  NS_ASSERT (m_subtype < 3);
-  {
-    uint8_t id = i.ReadU8 ();
-    uint8_t length = i.ReadU8 ();
-    m_protocol.DeserializeInformationField (i, length);
-    if ((m_protocol.ElementId () != (WifiInformationElementId) id) || (m_protocol.GetInformationFieldSize () != length))
-      {
-        NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
-      }
-    i.Next (m_protocol.GetInformationFieldSize ());
-  }
+  NS_ASSERT (m_subtype < 4);
+  
   if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
     {
       m_capability = i.ReadLsbtohU16 ();
@@ -220,7 +214,7 @@
     }
   else
     {
-      m_reasonCode = i.ReadLsbtohU16 ();
+       //reasonCode not used here
     }
   return i.GetDistanceFrom (start);
 }
@@ -228,8 +222,8 @@
 operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & 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)
-          && (a.m_reasonCode == b.m_reasonCode));
+          && (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config));
+  
 }
 } // namespace dot11s
 } // namespace ns3
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-management-protocol.cc ns-3.23/src/mesh/model/dot11s/peer-management-protocol.cc
--- ns-3.22/src/mesh/model/dot11s/peer-management-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-management-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::dot11s::PeerManagementProtocol")
     .SetParent<Object> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<PeerManagementProtocol> ()
     // maximum number of peer links. Now we calculate the total
     // number of peer links on all interfaces
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-management-protocol-mac.cc ns-3.23/src/mesh/model/dot11s/peer-management-protocol-mac.cc
--- ns-3.22/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -88,7 +88,7 @@
       packet->RemoveHeader (actionHdr);
       WifiActionHeader::ActionValue actionValue = actionHdr.GetAction ();
       // If can not handle - just return;
-      if (actionHdr.GetCategory () != WifiActionHeader::MESH_PEERING_MGT)
+      if (actionHdr.GetCategory () != WifiActionHeader::SELF_PROTECTED)
         {
           return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ());
         }
@@ -99,20 +99,19 @@
       PeerLinkFrameStart::PlinkFrameStartFields fields;
       {
         PeerLinkFrameStart peerFrame;
-        peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.peerLink);
+        peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.selfProtectedAction);
         packet->RemoveHeader (peerFrame);
         fields = peerFrame.GetFields ();
-        NS_ASSERT (fields.subtype == actionValue.peerLink);
+        NS_ASSERT (fields.subtype == actionValue.selfProtectedAction); 
       }
-      if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates (
-                                                                             fields.rates)))
+      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.peerLink != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual (
+     if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual (
             *(m_protocol->GetMeshId ())))
         {
           m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
@@ -125,22 +124,23 @@
       MeshInformationElementVector elements;
       packet->RemoveHeader (elements);
       peerElement = DynamicCast<IePeerManagement>(elements.FindFirst (IE11S_PEERING_MANAGEMENT));
+
       NS_ASSERT (peerElement != 0);
       //Check taht frame subtype corresponds peer link subtype
       if (peerElement->SubtypeIsOpen ())
         {
           m_stats.rxOpen++;
-          NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_OPEN);
+         NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_OPEN);
         }
       if (peerElement->SubtypeIsConfirm ())
         {
           m_stats.rxConfirm++;
-          NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CONFIRM);
+       NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CONFIRM); 
         }
       if (peerElement->SubtypeIsClose ())
         {
           m_stats.rxClose++;
-          NS_ASSERT (actionValue.peerLink == 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,
@@ -158,7 +158,7 @@
     {
       WifiActionHeader actionHdr;
       packet->PeekHeader (actionHdr);
-      if (actionHdr.GetCategory () == WifiActionHeader::MESH_PEERING_MGT)
+      if (actionHdr.GetCategory () == WifiActionHeader::SELF_PROTECTED) 
         {
           return true;
         }
@@ -215,27 +215,27 @@
     {
       m_stats.txOpen++;
       WifiActionHeader::ActionValue action;
-      action.peerLink = WifiActionHeader::PEER_LINK_OPEN;
+      action.selfProtectedAction = WifiActionHeader::PEER_LINK_OPEN;
       fields.subtype = WifiActionHeader::PEER_LINK_OPEN;
-      actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
+      actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action); 
     }
   if (peerElement.SubtypeIsConfirm ())
     {
       m_stats.txConfirm++;
       WifiActionHeader::ActionValue action;
-      action.peerLink = WifiActionHeader::PEER_LINK_CONFIRM;
+       action.selfProtectedAction = WifiActionHeader::PEER_LINK_CONFIRM; 
       fields.aid = aid;
       fields.subtype = WifiActionHeader::PEER_LINK_CONFIRM;
-      actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
+      actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action); 
     }
   if (peerElement.SubtypeIsClose ())
     {
       m_stats.txClose++;
       WifiActionHeader::ActionValue action;
-      action.peerLink = WifiActionHeader::PEER_LINK_CLOSE;
+      action.selfProtectedAction = WifiActionHeader::PEER_LINK_CLOSE; 
       fields.subtype = WifiActionHeader::PEER_LINK_CLOSE;
       fields.reasonCode = peerElement.GetReasonCode ();
-      actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
+      actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action); 
     }
   plinkFrame.SetPlinkFrameStart (fields);
   packet->AddHeader (plinkFrame);
diff -Naur ns-3.22/src/mesh/model/flame/flame-header.cc ns-3.23/src/mesh/model/flame/flame-header.cc
--- ns-3.22/src/mesh/model/flame/flame-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/flame/flame-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::flame::FlameHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<FlameHeader> ();
   return tid;
 }
diff -Naur ns-3.22/src/mesh/model/flame/flame-protocol.cc ns-3.23/src/mesh/model/flame/flame-protocol.cc
--- ns-3.22/src/mesh/model/flame/flame-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/flame/flame-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,7 +46,7 @@
 TypeId
 FlameTag::GetTypeId ()
 {
-  static TypeId tid = TypeId ("ns3::flame::FlameTag").SetParent<Tag> ().AddConstructor<FlameTag> ();
+  static TypeId tid = TypeId ("ns3::flame::FlameTag").SetParent<Tag> ().AddConstructor<FlameTag> ().SetGroupName ("Mesh");
   return tid;
 }
 
@@ -110,6 +110,7 @@
 {
   static TypeId tid = TypeId ("ns3::flame::FlameProtocol")
     .SetParent<MeshL2RoutingProtocol> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<FlameProtocol> ()
     .AddAttribute ( "BroadcastInterval",
                     "How often we must send broadcast packets",
diff -Naur ns-3.22/src/mesh/model/flame/flame-rtable.cc ns-3.23/src/mesh/model/flame/flame-rtable.cc
--- ns-3.22/src/mesh/model/flame/flame-rtable.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/flame/flame-rtable.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
   static TypeId tid =
     TypeId ("ns3::flame::FlameRtable")
     .SetParent<Object> ().AddConstructor<FlameRtable> ()
+    .SetGroupName ("Mesh")
     .AddAttribute ( "Lifetime",
                     "The lifetime of the routing enrty",
                     TimeValue (Seconds (120)), MakeTimeAccessor (
diff -Naur ns-3.22/src/mesh/model/mesh-information-element.h ns-3.23/src/mesh/model/mesh-information-element.h
--- ns-3.22/src/mesh/model/mesh-information-element.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/mesh-information-element.h	2015-05-13 11:05:27.000000000 -0700
@@ -25,31 +25,31 @@
 
 namespace ns3 {
 
-#define IE11S_LINK_METRIC_REPORT               ((WifiInformationElementId)20)
-#define IE11S_CONGESTION_NOTIFICATION          ((WifiInformationElementId)21)
+#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)26)
-#define IE11S_BEACON_TIMING                    ((WifiInformationElementId)27)
-#define IE11S_MCCAOP_SETUP_REQUEST             ((WifiInformationElementId)28)
-#define IE11S_MCCAOP_SETUP_REPLY               ((WifiInformationElementId)29)
-#define IE11S_MCCAOP_ADVERTISEMENT             ((WifiInformationElementId)30)
+#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)37)
-#define IE11S_PROXY_UPDATE_CONFIRMATION        ((WifiInformationElementId)38)
+#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)51)
-#define IE11S_MESH_ID                          ((WifiInformationElementId)52)
-#define IE11S_PEERING_MANAGEMENT               ((WifiInformationElementId)55)
+#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)67)
+#define IE11S_RANN                             ((WifiInformationElementId)126)
 /* begin of open80211s-compatible IDs */
-#define IE11S_PREQ                             ((WifiInformationElementId)68)
-#define IE11S_PREP                             ((WifiInformationElementId)69)
-#define IE11S_PERR                             ((WifiInformationElementId)70)
+#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)
 
diff -Naur ns-3.22/src/mesh/model/mesh-l2-routing-protocol.cc ns-3.23/src/mesh/model/mesh-l2-routing-protocol.cc
--- ns-3.22/src/mesh/model/mesh-l2-routing-protocol.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/mesh-l2-routing-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,7 +33,9 @@
 MeshL2RoutingProtocol::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::MeshL2RoutingProtocol")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Mesh")
+  ;
   return tid;
 }
 
diff -Naur ns-3.22/src/mesh/model/mesh-point-device.cc ns-3.23/src/mesh/model/mesh-point-device.cc
--- ns-3.22/src/mesh/model/mesh-point-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/mesh-point-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::MeshPointDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Dsr")
     .AddConstructor<MeshPointDevice> ()
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (0xffff),
diff -Naur ns-3.22/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.23/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.22/src/mesh/model/mesh-wifi-interface-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/mesh-wifi-interface-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,6 +47,7 @@
 {
   static TypeId tid = TypeId ("ns3::MeshWifiInterfaceMac")
     .SetParent<RegularWifiMac> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<MeshWifiInterfaceMac> ()
     .AddAttribute ( "BeaconInterval",
                     "Beacon Interval",
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,62 +1,55 @@
-ò            i       B  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          a        Ԁ               H        Ԁ                  P   P   Ѐ<                 J     $0H`l3         9 7            A   A                           $0H`l  4mesh        %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7                  Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               JO A   A                 JO         $0H`l  4mesh        +b F   F               P a         $0H`l
- 7O4mesh        j A   A               0 j         $0H`l b4mesh        
- ?   ?   Ѐ<                `   E                                 a
- E   E   Ѐ            p   D%                             
- ?   ?   Ѐ<                @   E                                 ,
-       Ԁ               
- ?   ?   Ѐ<                   E                              
- ?   ?   Ј<                   E                              :
- E   E   Ѐ            P   D%              ,               F   F                         $0H`l
- 4mesh       JO A   A               `          $0H`l 4mesh       +b F   F                         $0H`l
- z4mesh       j A   A               p 2         $0H`l 4mesh         ?   ?   Ѐ<                   E                                  F   F                E         $0H`l
- 34mesh         ?   ?   Ј<                   E                                  E   E   Ѐ               D%                            A  ?   ?   Ѐ<                   E                                        Ԁ                ?   ?   Ѐ<                   E                             O  E   E   Ѐ               D%              ,             JO A   A                         $0H`l F4mesh       [ L   L                               
+ò            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         ?   ?   Ѐ<                                                 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                               
 
-        L   L   <                                       
+        L   L   <                                       
      
-       B       Ԁ              m L   L                               
+       B       Ԁ              m L   L                               
 
-        L   L   <                                      
+        L   L   <                                      
      
-              Ԁ                     <                              E      @  
+              Ԁ                     <                               E      @  
 
- 	 l                                                                                                                    Ԁ               L   L                                
+ 	 l                                                                                                                    Ԁ               L   L                                
 
-       G L   L                               
+       G L   L                               
 
-       Y       Ԁ               L   L   <                0                     
+       Y       Ԁ               L   L   <                                      
      
-              Ԁ              k       <                                E      @  
+              Ԁ              k       <                                E      @  
 
- 	 l                                                                                                                    Ԁ                     <                @              E      @  
+ 	 l                                                                                                                    Ԁ                     <                              E      @  
 
- 	 l                                                                                                             +b F   F               P3&         $0H`l
- &4mesh       j A   A                t'         $0H`l &4mesh       k ?   ?   Ѐ<                `  E                                l E   E   Ѐ            p  D%                            *l ?   ?   Ѐ<                   E                                l       Ԁ              jm ?   ?   Ѐ<                  E                             m E   E   Ѐ              D%              Y                     Ԁ              F        <                              E     @  
+ 	 l                                                                                                             +b F   F                3&         $0H`lx
+ &rmesh       j A   A                t'         $0H`lx &rmesh               Ԁ              F        <                0              E     @  
 
- 	 l                                                                                                             V        Ԁ                      <                                E     @  
+ 	 l                                                                                                             V        Ԁ                      <                                E     @  
 
- 	 l                                                                                                                     Ԁ              [        <                              E     @  
+ 	 l                                                                                                                     Ԁ              [        <                @              E     @  
 
- 	 l                                                                                                               F   F               S.         $0H`l
- ].u'4mesh       JO A   A               0
-/         $0H`l .4mesh       7       Ԁ              f       <                              E     @  
+ 	 l                                                                                                               F   F               PS.         $0H`lx
+ ].u'rmesh       JO A   A                
+/         $0H`lx .rmesh       7       Ԁ              f       <                `              E     @  
 
- 	 l                                                                                                             v       Ԁ              ͦ       <                @               E     @  
+ 	 l                                                                                                             v       Ԁ              ͦ       <                                E     @  
 
- 	 l                                                                                                                    Ԁ              {       <                              E     @  
+ 	 l                                                                                                                    Ԁ              {       <                p              E     @  
 
- 	 l                                                                                                             +b F   F               s(6         $0H`l
- 5/4mesh       j A   A               P*6         $0H`l (64mesh               Ԁ              F        <                              E     @  
+ 	 l                                                                                                             +b F   F               s(6         $0H`lx
+ 5/rmesh       j A   A               *6         $0H`lx (6rmesh               Ԁ              F        <                              E     @  
 
- 	 l                                                                                                             V        Ԁ                      <                `               E     @  
+ 	 l                                                                                                             V        Ԁ                      <                                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                               F   F               =         $0H`l
- =64mesh       JO A   A               pJX>         $0H`l =4mesh       | ?   ?   Ѐ<                   E                                } ?   ?   Ј<                   E                                ~ E   E   Ѐ            0  D%              m              /~ ?   ?   Ѐ<                  E                                ~       Ԁ              J ?   ?   Ѐ<                @  E                              E   E   Ѐ              D%                                   Ԁ                     <                P              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                                                                                                             &       Ԁ              }       <                               E     @  
+ 	 l                                                                                                             v       Ԁ              ͦ       <                `               E     @  
 
- 	 l                                                                                                             m       Ԁ                     <                `              E     @  
+ 	 l                                                                                                                    Ԁ                     <                               E     @  
 
- 	 l                                                                                                             +b F   F               pjE         $0H`l
- @EX>4mesh       j A   A               jE         $0H`l kE4mesh       & ?   ?   Ѐ<                  E                                ' E   E   Ѐ              D%                            ' ?   ?   Ѐ<                  E                                7(       Ԁ              ( ?   ?   Ѐ<                  E                             v) E   E   Ѐ              D%                        
\ No newline at end of file
+ 	 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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,107 +1,95 @@
-ò            i         E   E   Ѐ                D%                                %  R   R   Ѐ<                  J   $0H`l4mesh3          9 7          >&        Ԁ               7'        Ԁ               '  P   P   Ѐ<                  J     $0H`l3         9 7            A   A               0 (          $0H`l $ 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ               %  P   P   Ѐ<                @ J    $0H`l3         9 7          5        Ԁ                 R   R   Ѐ<                P  J   $0H`l4mesh3         9 7                  Ԁ               {  P   P   Ѐ<                 J     $0H`l3         9 7          <        Ԁ                 A   A                           $0H`l  4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7                  Ԁ               	  R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ               t  P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               O A   A                 JO         $0H`l  4mesh        7 F   F               ` H7         $0H`l
-  4mesh        a F   F               P a         $0H`l
- 7O4mesh         A   A               0 j         $0H`l b4mesh        
- E   E   Ѐ            p   D%                                
- ?   ?   Ѐ<                `   E                                 ů
-       Ԁ               
-       Ԁ               
- E   E   Ѐ            p   D%                             
- ?   ?   Ѐ<                @   E                                 
-       Ԁ               N
- ?   ?   Ѐ<                   E                              
-       Ԁ               B
- ?   ?   Ј<                   E                              
-       Ԁ               
- E   E   Ѐ            P   D%              ,               F   F                h         $0H`l
- fb4mesh         F   F                         $0H`l
- 4mesh       O A   A               `          $0H`l 4mesh       7 F   F                y         $0H`l
- 4mesh       a F   F                         $0H`l
- z4mesh        A   A               p 2         $0H`l 4mesh         F   F                         $0H`l
- 4mesh         E   E   Ѐ               D%                               @  ?   ?   Ѐ<                   E                                  F   F                E         $0H`l
- 34mesh         ?   ?   Ј<                   E                                \        Ԁ                E   E   Ѐ               D%                              ?   ?   Ѐ<                   E                                        Ԁ              5        Ԁ              W  ?   ?   Ѐ<                   E                                      Ԁ                E   E   Ѐ               D%              ,                     Ԁ              O A   A                         $0H`l F4mesh        L   L                               
+ò            i         E   E   Ѐ              %                                %  >   >   Ѐ<                   $0H`lrmeshq   9u         (  >   >   Ј<                   $0H`lrmeshq   9u         t)  >   >   Ј<                   $0H`lrmeshq   9u         w*        Ԁ               #,        Ԁ               ,  <   <   Ѐ<                      $0H`lq  9u            A   A               0 (          $0H`lx $ rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u         c        Ԁ                 <   <   Ѐ<                @    $0H`lq  9u                  Ԁ               ɘ  >   >   Ѐ<                P   $0H`lrmeshq  9u         ٘        Ԁ               '  <   <   Ѐ<                     $0H`lq  9u          ̙        Ԁ                 A   A                           $0H`lx  rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u                 Ԁ                 <   <   Ѐ<                0    $0H`lq  9u                  Ԁ                 >   >   Ѐ<                @   $0H`lrmeshq  9u         z        Ԁ                 <   <   Ѐ<                     $0H`lq  9u                  Ԁ               O A   A                 JO         $0H`lx  rmesh        7 F   F               ` H7         $0H`lx
+  rmesh        a F   F               P a         $0H`lx
+ 7Ormesh         A   A               0 j         $0H`lx brmesh         F   F               p h         $0H`lx
+ fbrmesh         F   F               `          $0H`lx
+ rmesh       O A   A               @          $0H`lx rmesh       7 F   F                y         $0H`lx
+ 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                               
 
-        L   L                               
+        L   L                               
 
-        L   L   <                                       
+        L   L   <                                       
      
-              Ԁ               L   L                               
+              Ԁ               L   L                               
 
-       X L   L   <                                      
+       X L   L   <                                      
      
-              Ԁ               L   L   <                                      
+              Ԁ               L   L   <                                      
      
-       /       Ԁ              p       <                               E      @  
+       /       Ԁ              p       <                               E      @  
 
- 	 l                                                                                                                    Ԁ                     <                              E      @  
+ 	 l                                                                                                                    Ԁ                     <                               E      @  
 
- 	 l                                                                                                                    Ԁ               L   L                                
+ 	 l                                                                                                                    Ԁ               L   L                                
 
-        L   L                               
+        L   L                               
 
-        L   L                               
+        L   L                               
 
-       r       Ԁ               L   L   <                                      
+       r       Ԁ               L   L   <                                      
      
-       -       Ԁ               L   L   <                0                     
+       -       Ԁ               L   L   <                                      
      
-       A       Ԁ              p       <                                E      @  
+       A       Ԁ              p       <                                E      @  
 
- 	 l                                                                                                                    Ԁ                     <                @              E      @  
+ 	 l                                                                                                                    Ԁ                     <                              E      @  
 
- 	 l                                                                                                             )       Ԁ                     <                              E      @  
+ 	 l                                                                                                             )       Ԁ                     <                               E      @  
 
- 	 l                                                                                                             7 F   F                Ȼ&         $0H`l
- J&F4mesh       a F   F               P3&         $0H`l
- &4mesh        A   A                t'         $0H`l &4mesh       zj E   E   Ѐ            0  D%                               j ?   ?   Ѐ<                `  E                                Ek       Ԁ              k E   E   Ѐ            p  D%                            l ?   ?   Ѐ<                   E                                l       Ԁ              l ?   ?   Ѐ<                  E                             m       Ԁ              jn E   E   Ѐ              D%              Y             o       Ԁ                      Ԁ                      <                @              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        <                              E     @  
+ 	 l                                                                                                                     Ԁ              A        <                0              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                                E     @  
+ 	 l                                                                                                                     Ԁ                      <                                E     @  
 
- 	 l                                                                                                                     Ԁ              W        <                              E     @  
+ 	 l                                                                                                                     Ԁ              W        <                @              E     @  
 
- 	 l                                                                                                                     Ԁ              	        <                P              E     @  
+ 	 l                                                                                                                     Ԁ              	        <                0              E     @  
 
- 	 l                                                                                                               F   F               `\.         $0H`l
- -&4mesh         F   F               S.         $0H`l
- ].u'4mesh       O A   A               0
-/         $0H`l .4mesh       ˣ       Ԁ                     <                p              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                                                                                                             
-       Ԁ              a       <                              E     @  
+       Ԁ              a       <                `              E     @  
 
- 	 l                                                                                                                    Ԁ              ѧ       <                @               E     @  
+ 	 l                                                                                                                    Ԁ              ѧ       <                                E     @  
 
- 	 l                                                                                                                    Ԁ              w       <                              E     @  
+ 	 l                                                                                                                    Ԁ              w       <                p              E     @  
 
- 	 l                                                                                                                    Ԁ              &       <                              E     @  
+ 	 l                                                                                                                    Ԁ              &       <                `              E     @  
 
- 	 l                                                                                                             7 F   F               5         $0H`l
- 5.4mesh       a F   F               s(6         $0H`l
- 5/4mesh        A   A               P*6         $0H`l (64mesh               Ԁ                      <                              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                                                                                                                     Ԁ              A        <                              E     @  
+ 	 l                                                                                                                     Ԁ              A        <                              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                `               E     @  
+ 	 l                                                                                                                     Ԁ                      <                                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                              E     @  
 
  	 l                                                                                                                     Ԁ              
-        <                              E     @  
+        <                              E     @  
 
- 	 l                                                                                                               F   F               (=         $0H`l
- -=(64mesh         F   F               =         $0H`l
- =64mesh       O A   A               pJX>         $0H`l =4mesh       { E   E   Ѐ              D%                               { ?   ?   Ѐ<                   E                                | ?   ?   Ј<                   E                                J}       Ԁ              } E   E   Ѐ            0  D%              m              ~ ?   ?   Ѐ<                  E                                ~       Ԁ              ~ ?   ?   Ѐ<                @  E                                    Ԁ              J E   E   Ѐ              D%                            &       Ԁ              {       Ԁ                     <                              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                                                                                                                    Ԁ                     <                P              E     @  
+ 	 l                                                                                                             
+       Ԁ              a       <                              E     @  
 
- 	 l                                                                                                             R       Ԁ              1       <                               E     @  
+ 	 l                                                                                                                    Ԁ              ѧ       <                `               E     @  
 
- 	 l                                                                                                             A       Ԁ                     <                `              E     @  
+ 	 l                                                                                                                    Ԁ                     <                               E     @  
 
- 	 l                                                                                                             E       Ԁ              t       <                              E     @  
+ 	 l                                                                                                                    Ԁ                     <                              E     @  
 
- 	 l                                                                                                             7 F   F                H@E         $0H`l
- D=4mesh       a F   F               pjE         $0H`l
- @EX>4mesh        A   A               jE         $0H`l kE4mesh       % E   E   Ѐ              D%                               & ?   ?   Ѐ<                  E                                &       Ԁ              ' E   E   Ѐ              D%                            ' ?   ?   Ѐ<                  E                                
-(       Ԁ              ~( ?   ?   Ѐ<                  E                             ')       Ԁ              ) E   E   Ѐ              D%                           c+       Ԁ           
\ No newline at end of file
+ 	 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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,126 +1,114 @@
-ò            i       *  E   E   Ѐ                D%                                u$  <   <                 $          $0H`l 4mesh        $  R   R   Ѐ<                  J   $0H`l4mesh3          9 7          \%        Ԁ               &  P   P   Ѐ<                 J     $0H`l3          9 7          &        Ԁ               &  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          
-'        Ԁ               a'  P   P   Ѐ<                  J     $0H`l3         9 7          "(        Ԁ               $)        Ԁ               )  P   P   Ѐ<                0 J    $0H`l3         9 7          *  R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          +        Ԁ               (  A   A               0 (          $0H`l $ 4mesh        B  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          R        Ԁ                 P   P   Ѐ<                @ J    $0H`l3         9 7          a        Ԁ                 R   R   Ѐ<                P  J   $0H`l4mesh3         9 7          H        Ԁ                  P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ                 A   A                           $0H`l  4mesh                Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7            R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ                F   F               P -         $0H`l
-  4mesh        H7 F   F               ` H7         $0H`l
-  4mesh        +b F   F               P a         $0H`l
- 7O4mesh        
- E   E   Ѐ            p   D%                                
- ?   ?   Ѐ<                `   E                                 
-       Ԁ               a
- ?   ?   Ј<                `   E                                 q
-       Ԁ               a
- E   E   Ѐ            p   D%                             ,
-       Ԁ               
- ?   ?   Ѐ<                   E                              ʲ
-       Ԁ               
- ?   ?   Ј<                   E                              
-       Ԁ              $  F   F                Mf         $0H`l
- 7J4mesh       (  F   F                h         $0H`l
- fb4mesh         F   F                         $0H`l
- 4mesh        F   F                m         $0H`l
- 4mesh       H7 F   F                y         $0H`l
- 4mesh       +b F   F                         $0H`l
- z4mesh       $  F   F                         $0H`l
- z4mesh       (  F   F                         $0H`l
- 4mesh         E   E   Ѐ               D%                                 F   F                E         $0H`l
- 34mesh         ?   ?   Ј<                   E                                /        Ԁ                E   E   Ѐ               D%                              ?   ?   Ј<                   E                                	        Ԁ                ?   ?   Ѐ<                   E                                     Ԁ              A  E   E   Ѐ               D%                                    Ԁ                ?   ?   Ѐ<                   E                                     Ԁ              s L   L                               
+ò            i       *  E   E   Ѐ              %                                u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<                   $0H`lrmeshq   9u         F&        Ԁ               &  <   <   Ѐ<                     $0H`lq   9u          '  >   >   Ѐ<                    $0H`lrmeshq   9u         (  >   >   Ј<                   $0H`lrmeshq   9u         )  >   >   Ј<                   $0H`lrmeshq   9u         )        Ԁ               ;*  <   <   Ѐ<                0    $0H`lq   9u          K*        Ԁ               G+        Ԁ               +  >   >   Ѐ<                @   $0H`lrmeshq   9u         +        Ԁ               E,  <   <   Ѐ<                      $0H`lq  9u          ,        Ԁ               (  A   A               0 (          $0H`lx $ rmesh        &  >   >   Ѐ<                    $0H`lrmeshq   9u         6        Ԁ                 <   <   Ѐ<                @    $0H`lq  9u          )        Ԁ               ]  >   >   Ѐ<                P   $0H`lrmeshq  9u                 Ԁ                 <   <   Ѐ<                     $0H`lq  9u                  Ԁ                 A   A                           $0H`lx  rmesh                Ԁ               X  <   <   Ѐ<                0    $0H`lq  9u          >  >   >   Ѐ<                @   $0H`lrmeshq  9u         @        Ԁ                F   F               P -         $0H`lx
+  rmesh        H7 F   F               ` H7         $0H`lx
+  rmesh        +b F   F               P a         $0H`lx
+ 7Ormesh       $  F   F               ` Mf         $0H`lx
+ J7rmesh       (  F   F               p h         $0H`lx
+ fbrmesh         F   F               `          $0H`lx
+ rmesh        F   F               p m         $0H`lx
+ rmesh       H7 F   F                y         $0H`lx
+ rmesh       +b F   F               p          $0H`lx
+ 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                               
 
-        F   F                I&         $0H`l
- -&4mesh       / L   L                               
+        F   F                I&         $0H`lx
+ -&rmesh       / L   L                               
 
-       [ L   L                               
+       [ L   L                               
 
-       B       Ԁ               L   L   <                                      
+       B       Ԁ               L   L   <                                      
      
-              Ԁ              u L   L   <                                      
+              Ԁ              u L   L   <                                      
      
-       2       Ԁ               L   L   <                                     
+       2       Ԁ               L   L   <                                      
      
-              Ԁ                     <                               E      @  
+              Ԁ                     <                               E      @  
 
- 	 l                                                                                                                    Ԁ              k       <                               E      @  
+ 	 l                                                                                                                    Ԁ              k       <                               E      @  
 
- 	 l                                                                                                                    Ԁ                     <                              E      @  
+ 	 l                                                                                                                    Ԁ                     <                               E      @  
 
- 	 l                                                                                                             G L   L                               
+ 	 l                                                                                                             G L   L                               
 
-       r L   L                               
+       r L   L                               
 
-        L   L          0                    
+        L   L                               
 
-              Ԁ              6 L   L   <                @                     
+              Ԁ              6 L   L   <                                     
      
-       F       Ԁ               L   L   <                                      
+       F       Ԁ               L   L   <                                      
      
-       Y       Ԁ               L   L   <                0                     
+       Y       Ԁ               L   L   <                                      
      
-              Ԁ                     <                @              E      @  
+              Ԁ                     <                              E      @  
 
- 	 l                                                                                                                    Ԁ                     <                              E      @  
+ 	 l                                                                                                                    Ԁ                     <                               E      @  
 
- 	 l                                                                                                                    Ԁ              '       <                P              E      @  
+ 	 l                                                                                                                    Ԁ              '       <                               E      @  
 
- 	 l                                                                                                             H7 F   F                Ȼ&         $0H`l
- J&F4mesh       +b F   F               P3&         $0H`l
- &4mesh       j E   E   Ѐ            0  D%                               k ?   ?   Ѐ<                `  E                                k       Ԁ              l E   E   Ѐ            p  D%                            l ?   ?   Ј<                `  E                                l       Ԁ              jm ?   ?   Ѐ<                  E                             zm       Ԁ              jn E   E   Ѐ            p  D%                            5o       Ԁ              o ?   ?   Ѐ<                  E                             o       Ԁ              @        Ԁ              o        <                              E     @  
+ 	 l                                                                                                             H7 F   F               Ȼ&         $0H`lx
+ J&Ermesh       +b F   F                3&         $0H`lx
+ &rmesh       @        Ԁ              o        <                0              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                @              E     @  
+ 	 l                                                                                                                     Ԁ                      <                               E     @  
 
- 	 l                                                                                                                     Ԁ              F        <                              E     @  
+ 	 l                                                                                                                     Ԁ              F        <                0              E     @  
 
- 	 l                                                                                                                     Ԁ              [        <                              E     @  
+ 	 l                                                                                                                     Ԁ              [        <                @              E     @  
 
- 	 l                                                                                                             k        Ԁ                      <                P              E     @  
+ 	 l                                                                                                             k        Ԁ                      <                0              E     @  
 
  	 l                                                                                                             
-        Ԁ              2        <                              E     @  
+        Ԁ              2        <                @              E     @  
 
- 	 l                                                                                                             $  F   F               -         $0H`l
- &-4mesh       (  F   F               `\.         $0H`l
- -&4mesh         F   F               S.         $0H`l
- ].u'4mesh       `       Ԁ                     <                              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                                                                                                                    Ԁ                     <                p              E     @  
+ 	 l                                                                                                                    Ԁ                     <                P              E     @  
 
- 	 l                                                                                                             7       Ԁ              f       <                              E     @  
+ 	 l                                                                                                             7       Ԁ              f       <                `              E     @  
 
- 	 l                                                                                                                    Ԁ              {       <                              E     @  
+ 	 l                                                                                                                    Ԁ              {       <                p              E     @  
 
- 	 l                                                                                                                    Ԁ              !       <                              E     @  
+ 	 l                                                                                                                    Ԁ              !       <                `              E     @  
 
- 	 l                                                                                                             b       Ԁ                     <                              E     @  
+ 	 l                                                                                                             b       Ԁ                     <                p              E     @  
 
- 	 l                                                                                                              F   F               5         $0H`l
- ].o54mesh       H7 F   F               5         $0H`l
- 5.4mesh       +b F   F               s(6         $0H`l
- 5/4mesh       @        Ԁ              o        <                              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                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                                     Ԁ              F        <                              E     @  
+ 	 l                                                                                                                     Ԁ              F        <                              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                                     Ԁ              	        <                              E     @  
+ 	 l                                                                                                                     Ԁ              	        <                              E     @  
 
  	 l                                                                                                             B
-        Ԁ              q        <                               E     @  
+        Ԁ              q        <                              E     @  
 
- 	 l                                                                                                             $  F   F               -=         $0H`l
- 5=4mesh       (  F   F               (=         $0H`l
- -=(64mesh         F   F               =         $0H`l
- =64mesh       *{ E   E   Ѐ              D%                               } ?   ?   Ј<                   E                                }       Ԁ              ~ E   E   Ѐ            0  D%              m              ~       Ԁ              J ?   ?   Ѐ<                @  E                             Z       Ԁ              & ?   ?   Ј<                   E                                6       Ԁ               E   E   Ѐ            0  D%                            \       Ԁ               ?   ?   Ѐ<                @  E                                    Ԁ                     Ԁ              ?       <                P              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                                                                                                             O       Ԁ                     <                              E     @  
+ 	 l                                                                                                                    Ԁ                     <                              E     @  
 
- 	 l                                                                                                                    Ԁ                     <                P              E     @  
+ 	 l                                                                                                             7       Ԁ              f       <                              E     @  
 
- 	 l                                                                                                             m       Ԁ                     <                `              E     @  
+ 	 l                                                                                                                    Ԁ                     <                               E     @  
 
- 	 l                                                                                                                    Ԁ              o       <                              E     @  
+ 	 l                                                                                                                    Ԁ                     <                              E     @  
 
- 	 l                                                                                                                    Ԁ              ߫       <                `              E     @  
+ 	 l                                                                                                             Y       Ԁ                     <                               E     @  
 
- 	 l                                                                                                              F   F               p-D         $0H`l
- =D4mesh       H7 F   F                H@E         $0H`l
- D=4mesh       +b F   F               pjE         $0H`l
- @EX>4mesh       % E   E   Ѐ              D%                               & ?   ?   Ѐ<                  E                                &       Ԁ              ' E   E   Ѐ              D%                             ( ?   ?   Ј<                  E                                0(       Ԁ              ( ?   ?   Ѐ<                  E                             (       Ԁ              ) E   E   Ѐ              D%                            *       Ԁ              '+ ?   ?   Ѐ<                  E                             7+       Ԁ           
\ No newline at end of file
+ 	 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
+ @EX>rmesh    
\ No newline at end of file
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,107 +1,95 @@
-ò            i         E   E   Ѐ                D%                                $  <   <                 $          $0H`l 4mesh        %  R   R   Ѐ<                  J   $0H`l4mesh3          9 7          /%        Ԁ               }%  P   P   Ѐ<                 J     $0H`l3          9 7          >&        Ԁ               r&  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          7'        Ԁ               '  P   P   Ѐ<                  J     $0H`l3         9 7          '        Ԁ               (  R   R   Ј<                   J   $0H`l4mesh3          9 7          (        Ԁ               E)  P   P   Ѐ<                0 J    $0H`l3         9 7          *        Ԁ               C*  R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          +        Ԁ               +  P   P   Ѐ<                 J     $0H`l3         9 7          +        Ԁ               ?  A   A                 k?          $0H`l $ 4mesh          A   A               0 (          $0H`l $ 4mesh                Ԁ               %  P   P   Ѐ<                @ J    $0H`l3         9 7            R   R   Ѐ<                P  J   $0H`l4mesh3         9 7          <        Ԁ                A   A               0          $0H`l $ 4mesh        - F   F               P -         $0H`l
-  4mesh        7 F   F               ` H7         $0H`l
-  4mesh        
- E   E   Ѐ            p   D%                                
- ?   ?   Ѐ<                `   E                                 ů
-       Ԁ               
- ?   ?   Ј<                `   E                                 
-       Ԁ               
- E   E   Ѐ            p   D%                             
- ?   ?   Ѐ<                @   E                                 
-       Ԁ               N
- ?   ?   Ѐ<                   E                              
-       Ԁ               
- E   E   Ѐ            P   D%              -              
-       Ԁ                A   A               ` I         $0H`l 4mesh       $  F   F                Mf         $0H`l
- 7J4mesh         F   F                h         $0H`l
- fb4mesh        A   A               p          $0H`l f4mesh       - F   F                m         $0H`l
- 4mesh       7 F   F                y         $0H`l
- 4mesh         A   A                         $0H`l 4mesh       $  F   F                         $0H`l
- z4mesh         F   F                         $0H`l
- 4mesh         E   E   Ѐ               D%                               @  ?   ?   Ѐ<                   E                                \        Ԁ                ?   ?   Ј<                   E                                  ?   ?   Ј<                   E                                5        Ԁ                       Ԁ                E   E   Ѐ               D%                              ?   ?   Ѐ<                   E                                        Ԁ              .  ?   ?   Ѐ<                   E                                     Ԁ                E   E   Ѐ               D%              ^              A   A                -&         $0H`l 4mesh        L   L                                
+ò            i         E   E   Ѐ              %                                $  <   <                 $          $0H`lx rmesh        	&  >   >   Ј<                    $0H`lrmeshq   9u         &        Ԁ               g&  <   <   Ѐ<                     $0H`lq   9u          '        Ԁ               @'  >   >   Ѐ<                    $0H`lrmeshq   9u         '        Ԁ               t)  >   >   Ј<                   $0H`lrmeshq   9u         )        Ԁ               )  <   <   Ѐ<                0    $0H`lq   9u          w*        Ԁ               +  <   <   Ј<                     $0H`lq  9u          +        Ԁ               {+  >   >   Ѐ<                @   $0H`lrmeshq   9u         #,        Ԁ               ,  <   <   Ѐ<                      $0H`lq  9u          ,        Ԁ               ?  A   A                 k?          $0H`lx $ rmesh          A   A               0 (          $0H`lx $ rmesh        c        Ԁ                 <   <   Ѐ<                @    $0H`lq  9u          ɘ  >   >   Ѐ<                P   $0H`lrmeshq  9u         ̙        Ԁ                A   A               0          $0H`lx $ rmesh        - F   F               P -         $0H`lx
+  rmesh        7 F   F               ` H7         $0H`lx
+  rmesh         A   A               @ I         $0H`lx rmesh       $  F   F               ` Mf         $0H`lx
+ J7rmesh         F   F               p h         $0H`lx
+ fbrmesh        A   A               P          $0H`lx frmesh       - F   F               p m         $0H`lx
+ 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                                
 
-        L   L                               
+        L   L                               
 
-        F   F                I&         $0H`l
- -&4mesh        L   L                               
+        F   F                I&         $0H`lx
+ -&rmesh        L   L                               
 
-              Ԁ               L   L   <                                      
+              Ԁ               L   L   <                                      
      
-              Ԁ              \ L   L   <                                     
+              Ԁ              \ L   L   <                                      
      
-              Ԁ              H       <                                E      @  
+              Ԁ              H       <                                E      @  
 
- 	 l                                                                                                             X       Ԁ                     <                               E      @  
+ 	 l                                                                                                             X       Ԁ                     <                               E      @  
 
- 	 l                                                                                                             /       Ԁ              p       <                               E      @  
+ 	 l                                                                                                             /       Ԁ              p       <                               E      @  
 
- 	 l                                                                                                              L   L                               
+ 	 l                                                                                                              L   L                               
 
-        L   L          0                    
+        L   L                               
 
-       I L   L   <                                       
+       I L   L   <                                       
      
-       Y       Ԁ              T L   L                               
+       Y       Ԁ              T L   L                               
 
-        L   L   <                @                     
+        L   L   <                                     
      
-       r       Ԁ               L   L   <                                      
+       r       Ԁ               L   L   <                                      
      
-       )       Ԁ                     <                              E      @  
+       )       Ԁ                     <                               E      @  
 
- 	 l                                                                                                                    Ԁ              "       <                P              E      @  
+ 	 l                                                                                                                    Ԁ              "       <                               E      @  
 
- 	 l                                                                                                             c       Ԁ              7 F   F                Ȼ&         $0H`l
- J&F4mesh       zj E   E   Ѐ            0  D%                               j ?   ?   Ѐ<                `  E                                Ek       Ԁ              3l ?   ?   Ј<                `  E                                l       Ԁ              m       Ԁ              m E   E   Ѐ            p  D%                            n ?   ?   Ѐ<                   E                                o       Ԁ              Vo ?   ?   Ѐ<                  E                             o       Ԁ              p E   E   Ѐ              D%              }                     <                                E     @  
+ 	 l                                                                                                             c       Ԁ              7 F   F               Ȼ&         $0H`lx
+ J&Ermesh               <                                E     @  
 
- 	 l                                                                                                                     Ԁ              k        <                              E     @  
+ 	 l                                                                                                                     Ԁ              k        <                0              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                @              E     @  
+ 	 l                                                                                                                     Ԁ                      <                               E     @  
 
- 	 l                                                                                                               A   A               0+-         $0H`l J&4mesh               Ԁ              	        <                P              E     @  
+ 	 l                                                                                                               A   A                +-         $0H`lx J&rmesh               Ԁ              	        <                0              E     @  
 
  	 l                                                                                                             	        Ԁ              .
-        <                              E     @  
+        <                @              E     @  
 
- 	 l                                                                                                             n        Ԁ              $  F   F               -         $0H`l
- &-4mesh         F   F               `\.         $0H`l
- -&4mesh       $       <                @               E     @  
+ 	 l                                                                                                             n        Ԁ              $  F   F               P-         $0H`lx
+ -&rmesh         F   F               @\.         $0H`lx
+ -&rmesh       $       <                                E     @  
 
- 	 l                                                                                                             4       Ԁ                     <                              E     @  
+ 	 l                                                                                                             4       Ԁ                     <                `              E     @  
 
- 	 l                                                                                                             ˣ       Ԁ                     <                p              E     @  
+ 	 l                                                                                                             ˣ       Ԁ                     <                P              E     @  
 
- 	 l                                                                                                              A   A               PKo5         $0H`l -4mesh              Ԁ              &       <                              E     @  
+ 	 l                                                                                                              A   A               Ko5         $0H`lx -rmesh              Ԁ              &       <                `              E     @  
 
- 	 l                                                                                                             6       Ԁ                     <                              E     @  
+ 	 l                                                                                                             6       Ԁ                     <                p              E     @  
 
- 	 l                                                                                                             ͬ       Ԁ              - F   F               5         $0H`l
- ].o54mesh       7 F   F               5         $0H`l
- 5.4mesh               <                `               E     @  
+ 	 l                                                                                                             ͬ       Ԁ              - F   F               5         $0H`lx
+ o5].rmesh       7 F   F               p5         $0H`lx
+ 5.rmesh               <                                E     @  
 
- 	 l                                                                                                                     Ԁ              k        <                              E     @  
+ 	 l                                                                                                                     Ԁ              k        <                              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                               A   A               pk=         $0H`l 54mesh               Ԁ              
-        <                              E     @  
+ 	 l                                                                                                               A   A               0k=         $0H`lx 5rmesh               Ԁ              
+        <                              E     @  
 
  	 l                                                                                                             
         Ԁ              m
-        <                               E     @  
+        <                              E     @  
 
- 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`l
- 5=4mesh         F   F               (=         $0H`l
- -=(64mesh       { E   E   Ѐ              D%                               { ?   ?   Ѐ<                   E                                J}       Ԁ              } ?   ?   Ј<                   E                                       Ԁ               ?   ?   Ј<                   E                                c       Ԁ              9 E   E   Ѐ            0  D%                             ?   ?   Ѐ<                  E                                /       Ԁ              } ?   ?   Ѐ<                @  E                             &       Ԁ               E   E   Ѐ              D%                           ԡ       <                               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                                                                                                                    Ԁ              ;       <                P              E     @  
+ 	 l                                                                                                             4       Ԁ                     <                              E     @  
 
- 	 l                                                                                                             {       Ԁ                     <                              E     @  
+ 	 l                                                                                                             ˣ       Ԁ                     <                              E     @  
 
- 	 l                                                                                                              A   A               D         $0H`l -=4mesh       E       Ԁ              t       <                              E     @  
+ 	 l                                                                                                              A   A               pD         $0H`lx -=rmesh              Ԁ                     <                              E     @  
 
- 	 l                                                                                                                    Ԁ              ۪       <                `              E     @  
+ 	 l                                                                                                             -       Ԁ                     <                               E     @  
 
- 	 l                                                                                                                    Ԁ              - F   F               p-D         $0H`l
- =D4mesh       7 F   F                H@E         $0H`l
- D=4mesh       % E   E   Ѐ              D%                               & ?   ?   Ѐ<                  E                                &       Ԁ              ' ?   ?   Ј<                  E                                \(       Ԁ              ')       Ԁ              v) E   E   Ѐ              D%                            \* ?   ?   Ѐ<                  E                                l*       Ԁ              * ?   ?   Ѐ<                  E                             c+       Ԁ              ', E   E   Ѐ              D%                        
\ No newline at end of file
+ 	 l                                                                                                             Ĭ       Ԁ              - F   F               -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.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,63 +1,56 @@
-ò            i       u$  <   <                 $          $0H`l 4mesh        $  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          \%        Ԁ               &  P   P   Ѐ<                 J     $0H`l3          9 7          &  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          "(        Ԁ               _(  R   R   Ј<                   J   $0H`l4mesh3          9 7          $)        Ԁ               )  P   P   Ѐ<                0 J    $0H`l3         9 7          )        Ԁ               *  R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          *        Ԁ               )+  P   P   Ѐ<                 J     $0H`l3         9 7          +        Ԁ               k?  A   A                 k?          $0H`l $ 4mesh         A   A               0          $0H`l $ 4mesh         F   F               P -         $0H`l
-  4mesh        
- ?   ?   Ѐ<                `   E                                 a
- ?   ?   Ј<                `   E                                 a
- E   E   Ѐ            p   D%                             
- ?   ?   Ѐ<                @   E                                 ,
-       Ԁ               
- ?   ?   Ѐ<                   E                              F
- E   E   Ѐ            P   D%              -             k  A   A               ` I         $0H`l 4mesh       $  F   F                Mf         $0H`l
- 7J4mesh        A   A               p          $0H`l f4mesh        F   F                m         $0H`l
- 4mesh       k  A   A                         $0H`l 4mesh       $  F   F                         $0H`l
- z4mesh         ?   ?   Ѐ<                   E                                  ?   ?   Ј<                   E                                  ?   ?   Ј<                   E                                A  E   E   Ѐ               D%                            c  ?   ?   Ѐ<                   E                                        Ԁ                ?   ?   Ѐ<                   E                             &  E   E   Ѐ               D%              ^              A   A                -&         $0H`l 4mesh       H L   L                                
+ò            i       u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<                    $0H`lrmeshq   9u         %  >   >   Ј<                    $0H`lrmeshq   9u         F&        Ԁ               &  <   <   Ѐ<                     $0H`lq   9u          &        Ԁ               '  >   >   Ѐ<                    $0H`lrmeshq   9u         '        Ԁ               (  <   <   Ѐ<                     $0H`lq  9u          )        Ԁ               ;*  <   <   Ѐ<                0    $0H`lq   9u          *  <   <   Ј<                     $0H`lq  9u          G+        Ԁ               +  >   >   Ѐ<                @   $0H`lrmeshq   9u         ,        Ԁ               k?  A   A                 k?          $0H`lx $ rmesh         A   A               0          $0H`lx $ rmesh         F   F               P -         $0H`lx
+  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                                
 
-       s L   L                               
+       s L   L                               
 
-        F   F                I&         $0H`l
- -&4mesh       2       Ԁ               L   L   <                                     
+        F   F                I&         $0H`lx
+ -&rmesh       2       Ԁ               L   L   <                                      
      
-              Ԁ              D       <                                E      @  
+              Ԁ              D       <                                E      @  
 
- 	 l                                                                                                                    Ԁ                     <                               E      @  
+ 	 l                                                                                                                    Ԁ                     <                               E      @  
 
- 	 l                                                                                                              L   L          0                    
+ 	 l                                                                                                              L   L                               
 
-        L   L   <                                       
+        L   L   <                                       
      
-              Ԁ               L   L                               
+              Ԁ               L   L                               
 
-       6 L   L   <                @                     
+       6 L   L   <                                     
      
-              Ԁ              '       <                P              E      @  
+              Ԁ              '       <                               E      @  
 
- 	 l                                                                                                             7       Ԁ              k ?   ?   Ѐ<                `  E                                l ?   ?   Ј<                `  E                                jn E   E   Ѐ            p  D%                            n ?   ?   Ѐ<                   E                                5o       Ԁ              o ?   ?   Ѐ<                  E                             Np E   E   Ѐ              D%              }                       <                                E     @  
+ 	 l                                                                                                             7       Ԁ                        <                                E     @  
 
- 	 l                                                                                                             @        Ԁ              o        <                              E     @  
+ 	 l                                                                                                             @        Ԁ              o        <                0              E     @  
 
- 	 l                                                                                                             k  A   A               0+-         $0H`l J&4mesh       
-        Ԁ              2        <                              E     @  
+ 	 l                                                                                                             k  A   A                +-         $0H`lx J&rmesh       
+        Ԁ              2        <                @              E     @  
 
- 	 l                                                                                                             B        Ԁ              $  F   F               -         $0H`l
- &-4mesh               <                @               E     @  
+ 	 l                                                                                                             B        Ԁ              $  F   F               P-         $0H`lx
+ -&rmesh               <                                E     @  
 
- 	 l                                                                                                             `       Ԁ                     <                              E     @  
+ 	 l                                                                                                             `       Ԁ                     <                `              E     @  
 
- 	 l                                                                                                              A   A               PKo5         $0H`l -4mesh       b       Ԁ                     <                              E     @  
+ 	 l                                                                                                              A   A               Ko5         $0H`lx -rmesh       b       Ԁ                     <                p              E     @  
 
- 	 l                                                                                                                    Ԁ               F   F               5         $0H`l
- ].o54mesh                 <                `               E     @  
+ 	 l                                                                                                                    Ԁ               F   F               5         $0H`lx
+ o5].rmesh                 <                                E     @  
 
- 	 l                                                                                                             @        Ԁ              o        <                              E     @  
+ 	 l                                                                                                             @        Ԁ              o        <                              E     @  
 
- 	 l                                                                                                             k  A   A               pk=         $0H`l 54mesh       B
-        Ԁ              q        <                               E     @  
+ 	 l                                                                                                             k  A   A               0k=         $0H`lx 5rmesh       B
+        Ԁ              q        <                              E     @  
 
- 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`l
- 5=4mesh       ,| ?   ?   Ѐ<                   E                                ~ ?   ?   Ј<                   E                                & ?   ?   Ј<                   E                                 E   E   Ѐ            0  D%                            ρ ?   ?   Ѐ<                  E                                \       Ԁ               ?   ?   Ѐ<                @  E                             u E   E   Ѐ              D%                                   <                               E     @  
+ 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`lx
+ =5rmesh       ,| ?   ?   Ѐ<                                                ~ ?   ?   Ј<                                                ~ ?   ?   Ј<                                                0 E   E   Ѐ            %                            R ?   ?   Ѐ<                @                                       Ԁ               ?   ?   Ѐ<                                              E   E   Ѐ            P%              6                     <                `               E     @  
 
- 	 l                                                                                                                    Ԁ              ?       <                P              E     @  
+ 	 l                                                                                                             `       Ԁ                     <                              E     @  
 
- 	 l                                                                                                              A   A               D         $0H`l -=4mesh              Ԁ              ߫       <                `              E     @  
+ 	 l                                                                                                              A   A               pD         $0H`lx -=rmesh       Y       Ԁ                     <                               E     @  
 
- 	 l                                                                                                                    Ԁ               F   F               p-D         $0H`l
- =D4mesh       & ?   ?   Ѐ<                  E                                 ( ?   ?   Ј<                  E                                ) E   E   Ѐ              D%                            * ?   ?   Ѐ<                  E                                *       Ԁ              '+ ?   ?   Ѐ<                  E                             + E   E   Ѐ              D%                        
\ No newline at end of file
+ 	 l                                                                                                                    Ԁ               F   F               -D         $0H`lx
+ D=rmesh    
\ No newline at end of file
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,76 +1,126 @@
-ò            i       C  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          b        Ԁ               [        Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7            A   A                           $0H`l  4mesh        %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7                  Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               JO A   A                 JO         $0H`l  4mesh        +b F   F               P a         $0H`l
- 7O4mesh        j A   A               0 j         $0H`l b4mesh         F   F               `          $0H`l
- 4mesh       JO A   A               @          $0H`l 4mesh       +b F   F               p          $0H`l
- z4mesh       j A   A               P 2         $0H`l 4mesh         F   F                E         $0H`l
- z34mesh       JO A   A               `          $0H`l E4mesh       +b F   F                3&         $0H`l
- K4mesh       j A   A               p t'         $0H`l &4mesh       .  L   L                
-               
+ò            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                
+               
 
 
-       Y  L   L                
-               
+         L   L          p      
+               
 
 
-       (  E   E   Ѐ               D%                         
-           `  E   E   Ѐ               D%                      
-           
-        Ԁ              c  ?   ?   Ѐ<                   E                  
-          s        Ԁ                L   L   <                
-                       
+       [  E   E   Ѐ             %                         
+             E   E   Ѐ             %                      
+                   Ԁ              x  ?   ?   Ѐ<                                   
+                  Ԁ                L   L   <                
+                       
      
 
-       b  L   L   <                
-                       
+       w  L   L   <                
+                       
      
 
-               Ԁ                L   L   <                
-                      
+       4        Ԁ                L   L   <                
+                      
      
 
-               Ԁ                `   `   <                      
+       2         Ԁ                 `   `   <                      
          E  0    @  
 
- 	                                      Ԁ                      Ԁ              c  `   `   <                      
+ 	                              !        Ԁ              }4  L   L                                
+
+       5  L   L                               
+
+       <=        Ԁ              =  L   L   <                      
+                
+
+     
+       =        Ԁ              N>  `   `   <                
+                E  0    @  
+
+ 	                              #?        Ԁ              ?  `   `   <                
+               E  0    @  
+
+ 	                                F   F               E         $0H`lx
+ rmesh       J/ A   A                ʳ         $0H`lx Ermesh              Ԁ               `   `   <                      
          E  0   @  
 
- 	                              s        Ԁ                      Ԁ                `   `   <                      
+ 	                              ƥ       Ԁ               `   `   <                
+                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   @  
 
- 	                                      Ԁ              **  L   L                                
-
-       V+  L   L                              
-
-         F   F                S.         $0H`l
- &u'4mesh       JO A   A                
-/         $0H`l .4mesh       R       Ԁ               `   `   <                0     
+ 	                              1       Ԁ              )2 `   `   <                
+               E  0   @  
+
+ 	                              2       Ԁ               4 `   `   <                
+              E  0   @  
+
+ 	                              M5 `   `   <                
+              E  0   @  
+
+ 	                                     Ԁ               `   `   <                     
          E  0   @  
 
- 	                              %       Ԁ              +b F   F               @s(6         $0H`l
- ./4mesh       j A   A                *6         $0H`l (64mesh       3       Ԁ              {3 ,   ,   Ѐ<                P  F      
-          3       Ԁ                L   L                                
-
-         L   L          `                    
-
-         F   F               p=         $0H`l
- ./4mesh         2   2   Ѐ<                J 4mesh 7                  Ԁ              K  R   R   Ѐ<                 J   $0H`l4mesh3         9 7         B        Ԁ                2   2   Ѐ<                J 4mesh 7          M 2   2   Ѐ<                J 4mesh 7          M       Ԁ              5N 2   2   Ѐ<                 J 4mesh 7          N       Ԁ              JO A   A                JX>         $0H`l =4mesh       eP R   R   Ѐ<                 J   $0H`l4mesh3          9 7         uP       Ԁ              P 2   2   Ѐ<                J 4mesh 7          \Q       Ԁ              R 2   2   Ј<                J 4mesh 7          R       Ԁ              6 <   <               >E         $0H`l 4mesh       =6 R   R   Ѐ<                  J   $0H`l4mesh3          9 7         q7 R   R   Ј<                  J   $0H`l4mesh3          9 7         8 R   R   Ј<                  J   $0H`l4mesh3          9 7         9 R   R   Ј<                  J   $0H`l4mesh3          9 7         : R   R   Ј<                  J   $0H`l4mesh3          9 7         < R   R   Ј<                  J   $0H`l4mesh3          9 7         	= R   R   Ј<                  J   $0H`l4mesh3          9 7         kh R   R   Ѐ<                 J   $0H`l4mesh3          9 7         i       Ԁ              j A   A               0jE         $0H`l?E4mesh        R   R   Ѐ<                  J   $0H`l4mesh3          9 7                Ԁ               P   P   Ѐ<                @J    $0H`l3          9 7                Ԁ               R   R   Ѐ<                P J   $0H`l4mesh3          9 7         O R   R   Ј<                P J   $0H`l4mesh3          9 7         z R   R   Ј<                P J   $0H`l4mesh3          9 7          R   R   Ј<                P J   $0H`l4mesh3          9 7          R   R   Ј<                P J   $0H`l4mesh3          9 7          R   R   Ј<                P J   $0H`l4mesh3          9 7          R   R   Ј<                P J   $0H`l4mesh3          9 7         		 2   2   Ѐ<                J 4mesh 7          s	       Ԁ              r	 2   2   Ѐ<                 J 4mesh 7          r	       Ԁ              "s	 2   2   Ѐ<                `J 4mesh 7          s	       Ԁ                L   L          p                     
-
-         <   <               0M         $0H`l 4mesh         R   R   Ѐ<                 J   $0H`l4mesh3          9 7         6  R   R   Ј<                 J   $0H`l4mesh3          9 7         4  R   R   Ј<                 J   $0H`l4mesh3          9 7         _  R   R   Ј<                 J   $0H`l4mesh3          9 7         f  R   R   Ј<                 J   $0H`l4mesh3          9 7           R   R   Ј<                 J   $0H`l4mesh3          9 7                 Ԁ              r  P   P   Ѐ<                @J    $0H`l3          9 7           R   R   Ј<                 J   $0H`l4mesh3          9 7                 Ԁ              Z  R   R   Ѐ<                P J   $0H`l4mesh3          9 7         y        Ԁ              :  P   P   Ѐ<                `J    $0H`l3          9 7         J        Ԁ              <  R   R   Ѐ<                p J   $0H`l4mesh3          9 7         L        Ԁ                P   P   Ѐ<                J    $0H`l3         9 7         [        Ԁ              JW A   A               M         $0H`lM4mesh       + F   F               T         $0H`l
-TM4mesh       j A   A               CU         $0H`lT4mesh         L   L                               
-
-         L   L                              
-
-         F   F               v\         $0H`l
-<\DU4mesh       JW A   A               \         $0H`lv\4mesh       + F   F               3d         $0H`l
-cDU4mesh        2   2   Ѐ<                J 4mesh 7                 Ԁ              U 2   2   Ѐ<                J 4mesh 7                 Ԁ              j A   A               d         $0H`ld4mesh        R   R   Ѐ<                 J   $0H`l4mesh3         9 7 	               Ԁ               2   2   Ѐ<                 J 4mesh 7 	         |       Ԁ               2   2   Ј<                J 4mesh 7	                 Ԁ                A   A               Sk         $0H`l~k4mesh       %  R   R   Ѐ<                 J   $0H`l4mesh3          9 7                 Ԁ                P   P   Ѐ<                 J   	 $0H`l3         9 7
-                 Ԁ                R   R   Ѐ<                 J   $0H`l4mesh3         9 7 
-                Ԁ                P   P   Ѐ<                 J    $0H`l3         9 7 
-                Ԁ              J7 A   A               0
-l         $0H`lk4mesh       + F   F                sYs         $0H`l
-s	l4mesh       j A   A               @*s         $0H`lYs4mesh       J7 A   A               PJI{         $0H`lYs4mesh        2   2   Ѐ<                `J 4mesh 7 
-                Ԁ               2   2   Ј<                @J 4mesh 7
-                 Ԁ               F   F               P         $0H`l
-a	I{4mesh       ߊ R   R   Ѐ<                p J   $0H`l4mesh3          9 7                Ԁ              4 2   2   Ѐ<                `J 4mesh 7
-          D       Ԁ               2   2   Ѐ<                J 4mesh 7 
-         +       Ԁ              j A   A               jւ         $0H`l4mesh        R   R   Ѐ<                p J   $0H`l4mesh3         9 7                Ԁ               2   2   Ѐ<                J 4mesh 7          |       Ԁ               2   2   Ј<                J 4mesh 7                 Ԁ           	     A   A               <         $0H`l4mesh    	   %  R   R   Ѐ<                 J   $0H`l4mesh3          9 7      	     R   R   Ј<                 J   $0H`l4mesh3          9 7      	           Ԁ           	   x  P   P   Ѐ<                J    $0H`l3         9 7      	           Ԁ           	     A   A               ?         $0H`l=4mesh    	     R   R   Ѐ<                 J   $0H`l4mesh3         9 7      	   
-        Ԁ           	   a  P   P   Ѐ<                J    $0H`l3         9 7      	   "        Ԁ           	   + F   F               ݑ         $0H`l
-@4mesh    	   j A   A                        $0H`lޑ4mesh    
\ No newline at end of file
+ 	                              ƥ       Ԁ               `   `   <                
+                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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,112 +1,206 @@
-ò            i        %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          ?&        Ԁ               8'        Ԁ               '  P   P   Ѐ<                 J     $0H`l3         9 7          (  P   P   Ј<                 J     $0H`l3         9 7            A   A                 (          $0H`l $ 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ               %  P   P   Ѐ<                0 J    $0H`l3         9 7          5        Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          .        Ԁ               |  P   P   Ѐ<                 J     $0H`l3         9 7          =        Ԁ                 A   A                           $0H`l  4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7                  Ԁ               
-  R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ               u  P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               O A   A                 JO         $0H`l  4mesh        7 F   F               P H7         $0H`l
-  4mesh        a F   F               P a         $0H`l
- 7O4mesh         A   A               0 j         $0H`l b4mesh         F   F               ` h         $0H`l
- 6b4mesh         F   F               `          $0H`l
- 4mesh       O A   A               @          $0H`l 4mesh       6       Ԁ              6 2   2   Ѐ<                p J 4mesh 7          7       Ԁ              L8 F   F                y         $0H`l
- 4mesh       39       Ԁ              9 2   2   Ѐ<                 J 4mesh 7          :       Ԁ              a F   F               p          $0H`l
- z4mesh        A   A               P 2         $0H`l 4mesh       (-  R   R   Ѐ<                  J   $0H`l4mesh3         9 7         G.        Ԁ              I/        Ԁ              /  P   P   Ѐ<                 J    $0H`l3         9 7           F   F                E         $0H`l
- z34mesh         F   F                J         $0H`l
-E4mesh       O A   A               `          $0H`l E4mesh       a F   F                3&         $0H`l
- K4mesh       g F   F                &         $0H`l
-&R&4mesh        A   A               p t'         $0H`l &4mesh         L   L                
-               
+ò            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                
+               
 
 
-         L   L                
-               
+       
+  L   L                
+               
 
 
-         L   L                
-               
+         L   L          p      
+               
 
 
-         E   E   Ѐ               D%                         
-             E   E   Ѐ               D%                      
-           $  E   E   Ѐ               D%              ,       
-           
-        Ԁ              
-  ?   ?   Ѐ<                   E           )       
-          
-        Ԁ              
-  ?   ?   Ѐ<                   E                  
-                  Ԁ                L   L   <                
-                       
+         E   E   Ѐ             %                         
+             E   E   Ѐ             %                      
+                    Ԁ                ?   ?   Ѐ<                                  
+                  Ԁ                ?   ?   Ѐ<                                   
+                  Ԁ                L   L   <                
+                       
      
 
-               Ԁ              J  L   L   <                
-                      
+               Ԁ              _  L   L   <                
+                      
      
 
-               Ԁ                      Ԁ                `   `   <                      
+               Ԁ                L   L   <                
+                      
+     
+
+       3        Ԁ                `   `   <                0     
          E  0    @  
 
- 	                                      Ԁ              
-  `   `   <                      
+ 	                                       Ԁ              ]   `   `   <                      
          E  0    @  
 
- 	                                      Ԁ                      Ԁ              d  `   `   <                0     
+ 	                              2!        Ԁ              4  L   L                                
+
+       )5  L   L                               
+
+       U6  L   L          @                    
+
+       l:        Ԁ               =  L   L   <                P     
+                
+
+     
+       =        Ԁ              g=  L   L   <                      
+                
+
+     
+       $>        Ԁ              >  `   `   <                
+                E  0    @  
+
+ 	                              >        Ԁ              `?  `   `   <                
+               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   @  
 
- 	                              t        Ԁ                `   `   <                      
+ 	                              Ǥ       Ԁ               `   `   <                      
          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   @  
 
- 	                                      Ԁ              *  L   L                                
-
-       *  L   L                              
-
-       ,  L   L          P                    
-
-         F   F                S.         $0H`l
- &u'4mesh         F   F               `.         $0H`l
-.-4mesh       O A   A                
-/         $0H`l .4mesh       S       Ԁ               `   `   <                p     
+ 	                              1       Ԁ              2 `   `   <                
+               E  0   @  
+
+ 	                              2       Ԁ              h3 `   `   <                
+              E  0   @  
+
+ 	                              4 `   `   <                
+              E  0   @  
+
+ 	                              5       Ԁ              8 `   `   <                
+               E  0   @  
+
+ 	                                     Ԁ               `   `   <                     
          E  0   @  
 
- 	                              &       Ԁ              } `   `   <                0     
+ 	                              Ǥ       Ԁ               `   `   <                     
          E  0   @  
 
- 	                              R       Ԁ              a F   F               @s(6         $0H`l
- ./4mesh       R2       Ԁ              2 ,   ,   Ѐ<                  F      
-          2       Ԁ              &3 ,   ,   Ѐ<                P  F      
-          3       Ԁ              #  L   L                                
-
-       N  L   L          `                    
-
-       z  L   L                              
-
-         F   F               p=         $0H`l
- ./4mesh       `  2   2   Ѐ<                J 4mesh 7                  Ԁ              w  2   2   Ѐ<                J 4mesh 7                  Ԁ                F   F               (=         $0H`l
-=	=4mesh         R   R   Ѐ<                 J   $0H`l4mesh3         9 7                 Ԁ                2   2   Ѐ<                J 4mesh 7                  Ԁ              c  2   2   Ѐ<                J 4mesh 7                  Ԁ              {M 2   2   Ѐ<                J 4mesh 7          N       Ԁ              N 2   2   Ѐ<                 J 4mesh 7          N       Ԁ              O A   A                JX>         $0H`l =4mesh       O R   R   Ѐ<                 J   $0H`l4mesh3          9 7         P       Ԁ               Q 2   2   Ѐ<                J 4mesh 7          0Q       Ԁ              Q 2   2   Ѐ<                J 4mesh 7          wR 2   2   Ј<                J 4mesh 7          S       Ԁ              } 6   6   Ѐ<                  F                        5 <   <               >E         $0H`l 4mesh       g F   F                HpE         $0H`l
-D?E4mesh       g R   R   Ѐ<                 J   $0H`l4mesh3          9 7         h       Ԁ              Mi P   P   Ѐ<                J    $0H`l3         9 7         ]i       Ԁ               A   A               0jE         $0H`l?E4mesh        R   R   Ѐ<                  J   $0H`l4mesh3          9 7                Ԁ              h P   P   Ѐ<                @J    $0H`l3          9 7         x       Ԁ              M		 2   2   Ѐ<                J 4mesh 7          		       Ԁ              6	 2   2   Ј<                0J 4mesh 7          F	       Ԁ              hr	 2   2   Ѐ<                 J 4mesh 7          s	       Ԁ              s	 2   2   Ѐ<                `J 4mesh 7          s	       Ԁ              #  L   L          p                     
-
-         <   <               0M         $0H`l 4mesh         R   R   Ј<                @ J   $0H`l4mesh3         9 7                 Ԁ                P   P   Ѐ<                @J    $0H`l3          9 7                 Ԁ              b  R   R   Ј<                 J   $0H`l4mesh3          9 7         r        Ԁ                R   R   Ѐ<                P J   $0H`l4mesh3          9 7                 Ԁ              =  P   P   Ѐ<                `J    $0H`l3         9 7         M        Ԁ                P   P   Ѐ<                `J    $0H`l3          9 7         w        Ԁ                R   R   Ѐ<                p J   $0H`l4mesh3          9 7         y        Ԁ                P   P   Ѐ<                J    $0H`l3         9 7         /        Ԁ              W A   A               M         $0H`lM4mesh       O F   F               pT         $0H`l
-/LM4mesh        F   F               T         $0H`l
-TM4mesh        A   A               CU         $0H`lT4mesh       $ 2   2   Ѐ<                J 4mesh 7          % 2   2   Ј<                J 4mesh 7          & 2   2   Ј<                J 4mesh 7          ' 2   2   Ј<                J 4mesh 7          ( 2   2   Ј<                J 4mesh 7          ) 2   2   Ј<                J 4mesh 7          * 2   2   Ј<                J 4mesh 7          #  L   L                               
-
-       N  L   L                              
-
-       z  L   L                              
-
-         A   A               ;\         $0H`lT4mesh         F   F               v\         $0H`l
-<\DU4mesh       O A   A               c         $0H`lv\4mesh        F   F               3d         $0H`l
-cDU4mesh        2   2   Ѐ<                J 4mesh 7          4       Ԁ               2   2   Ѐ<                J 4mesh 7                 Ԁ               A   A               d         $0H`ld4mesh        R   R   Ѐ<                 J   $0H`l4mesh3         9 7 	               Ԁ              @ 2   2   Ѐ<                 J 4mesh 7 	         P       Ԁ               2   2   Ѐ<                J 4mesh 7	          p 2   2   Ј<                J 4mesh 7	          	       Ԁ                A   A               }k         $0H`ld4mesh         A   A               Sk         $0H`l~k4mesh         R   R   Ѐ<                 J   $0H`l4mesh3          9 7                 Ԁ                P   P   Ѐ<                 J   	 $0H`l3         9 7
-                 Ԁ                R   R   Ѐ<                 J   $0H`l4mesh3         9 7 
-                Ԁ              l  P   P   Ѐ<                 J    $0H`l3         9 7 
-        |        Ԁ              7 A   A               0
-l         $0H`lk4mesh       O A   A               s         $0H`lk4mesh        F   F                sYs         $0H`l
-s	l4mesh        A   A               @*s         $0H`lYs4mesh         A   A               (z         $0H`lYs4mesh         F   F               0z         $0H`l
-z	s4mesh       7 A   A               PJI{         $0H`lYs4mesh       O A   A               Ha         $0H`lz4mesh       H 2   2   Ѐ<                `J 4mesh 7 
-         X       Ԁ               2   2   Ѐ<                @J 4mesh 7
-           2   2   Ј<                @J 4mesh 7
-          ,       Ԁ              E F   F               P         $0H`l
-a	I{4mesh       h R   R   Ѐ<                p J   $0H`l4mesh3          9 7         x       Ԁ              ؋ 2   2   Ѐ<                `J 4mesh 7
-          q       Ԁ               2   2   Ѐ<                J 4mesh 7 
-                Ԁ               A   A               jւ         $0H`l4mesh        R   R   Ѐ<                p J   $0H`l4mesh3         9 7                Ԁ              @ 2   2   Ѐ<                J 4mesh 7          P       Ԁ               2   2   Ѐ<                J 4mesh 7          j 2   2   Ј<                J 4mesh 7                 Ԁ           	     A   A                h         $0H`l4mesh    	     A   A               <         $0H`l4mesh    	     R   R   Ј<                 J   $0H`l4mesh3          9 7      	           Ԁ           	     P   P   Ѐ<                J    $0H`l3         9 7      	           Ԁ           	   >  A   A               ?         $0H`l=4mesh    	   r  R   R   Ѐ<                 J   $0H`l4mesh3         9 7      	   7        Ԁ           	     P   P   Ѐ<                J    $0H`l3         9 7      	           Ԁ           	   O A   A                        $0H`l=4mesh    	    F   F               ݑ         $0H`l
-@4mesh    	   ې A   A                        $0H`lޑ4mesh    
\ No newline at end of file
+ 	                                     Ԁ               `   `   <                
+                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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,137 +1,222 @@
-ò            i       u$  <   <                 $          $0H`l 4mesh        $  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          \%        Ԁ               &  P   P   Ѐ<                 J     $0H`l3          9 7          &        Ԁ               &  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          '        Ԁ               b'  P   P   Ѐ<                 J     $0H`l3         9 7          n(  P   P   Ј<                 J     $0H`l3         9 7          /)        Ԁ               ~@  R   R   Ѐ<      	          0  J   $0H`l4mesh3         9 7          A  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          B  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          C  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          E  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          F  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          JG  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          (  A   A                 (          $0H`l $ 4mesh        C  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          S        Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7          b        Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          [        Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ                 A   A                           $0H`l  4mesh                Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7            R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ               u  R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            2   2   Ѐ<      	          P J 4mesh 7             R   R   Ѐ<      	          `  J   $0H`l4mesh3         9 7          Ҫ R   R   Ј<      	          `  J   $0H`l4mesh3         9 7           R   R   Ј<      	          `  J   $0H`l4mesh3         9 7           R   R   Ј<      	          `  J   $0H`l4mesh3         9 7           R   R   Ј<      	          `  J   $0H`l4mesh3         9 7            R   R   Ј<      	          `  J   $0H`l4mesh3         9 7           R   R   Ј<      	          `  J   $0H`l4mesh3         9 7           F   F               p -         $0H`l
-  4mesh               Ԁ       	        2 P   P   Ѐ<      	           J    $0H`l3         9 7          H7 F   F               P H7         $0H`l
-  4mesh        |I R   R   Ѐ<      	            J   $0H`l4mesh3         9 7          zJ R   R   Ј<      	            J   $0H`l4mesh3         9 7          K R   R   Ј<      	            J   $0H`l4mesh3         9 7          L R   R   Ј<      	            J   $0H`l4mesh3         9 7          M R   R   Ј<      	            J   $0H`l4mesh3         9 7          N R   R   Ј<      	            J   $0H`l4mesh3         9 7          P R   R   Ј<      	            J   $0H`l4mesh3         9 7          +b F   F               P a         $0H`l
- 7O4mesh        g       Ԁ       	        Ih 2   2   Ѐ<      	           J 4mesh 7            R   R   Ѐ<      	            J   $0H`l4mesh3         9 7           R   R   Ј<      	            J   $0H`l4mesh3         9 7            R   R   Ј<      	            J   $0H`l4mesh3         9 7          " R   R   Ј<      	            J   $0H`l4mesh3         9 7          6 F   F                M6         $0H`l
- 74mesh        7       Ԁ       	        R8 P   P   Ѐ<      	           J    $0H`l3         9 7         \|  R   R   Ѐ<      	            J   $0H`l4mesh3         9 7         Q}  R   R   Ј<      	            J   $0H`l4mesh3         9 7         |~  R   R   Ј<      	            J   $0H`l4mesh3         9 7           R   R   Ј<      	            J   $0H`l4mesh3         9 7           R   R   Ј<      	            J   $0H`l4mesh3         9 7           R   R   Ј<      	            J   $0H`l4mesh3         9 7         ł  R   R   Ј<      	            J   $0H`l4mesh3         9 7         (  F   F               ` h         $0H`l
- 6b4mesh               Ԁ       	         2   2   Ѐ<      	           J 4mesh 7            F   F               `          $0H`l
- 4mesh       U R   R   Ѐ<      	            J   $0H`l4mesh3         9 7         V       Ԁ       	       W       Ԁ       	       \X P   P   Ѐ<      	          J    $0H`l3         9 7          F   F                m         $0H`l
- 74mesh       5 2   2   Ѐ<                0J 4mesh 7          5       Ԁ              ;6 2   2   Ѐ<                p J 4mesh 7          6       Ԁ              7 2   2   Ј<                0J 4mesh 7          7       Ԁ              7 F   F                y         $0H`l
- 4mesh       8 R   R   Ѐ<                @ J   $0H`l4mesh3         9 7         9       Ԁ              U9 2   2   Ѐ<                 J 4mesh 7          9       Ԁ              u: 2   2   Ѐ<                PJ 4mesh 7          :       Ԁ              +b F   F               p          $0H`l
- z4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         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       
 
-
-       },  A   A               p         $0H`l84mesh       ,  R   R   Ѐ<                  J   $0H`l4mesh3         9 7         d-        Ԁ              
-.  P   P   Ѐ<                J    $0H`l3         9 7         .        Ԁ              /  R   R   Ѐ<                 J   $0H`l4mesh3         9 7         /        Ԁ              j/  P   P   Ѐ<                 J    $0H`l3         9 7         +0        Ԁ                F   F                E         $0H`l
- z34mesh       (  F   F                J         $0H`l
-E4mesh        F   F               Q&         $0H`l
-%K4mesh       +b F   F                3&         $0H`l
- K4mesh       Hg F   F                &         $0H`l
-&R&4mesh         L   L               
-               
+  L   L               
+               
 
 
-         L   L                
-               
+       5
+  L   L                
+               
 
 
-       .  L   L                
-               
+       a  L   L                
+               
 
 
-       `  E   E   Ѐ               D%                      
-             E   E   Ѐ               D%              ,       
-             E   E   Ѐ              D%                     
-           	  ?   ?   Ѐ<                  E                  
-          	        Ԁ              ,
-  ?   ?   Ѐ<                   E           )       
-          
-        Ԁ              c  ?   ?   Ѐ<                   E                  
-                  Ԁ                L   L   <                
-                      
+         E   E   Ѐ             %                      
+             E   E   Ѐ             %              3       
+             E   E   Ѐ             %                     
+           s        Ԁ       	         ?   ?   Ј<                0           -       
+                  Ԁ              A  ?   ?   Ѐ<                                  
+                  Ԁ              x  ?   ?   Ѐ<                                   
+          4        Ԁ                L   L   <                
+                      
      
 
-               Ԁ              1  L   L   <                
-                     
+               Ԁ              F  L   L   <                
+                      
      
 
-               Ԁ                L   L   <      	          
-                     
+               Ԁ                L   L   <      	          
+@                     
      
 
-               Ԁ       	         `   `   <                     
+       3        Ԁ       	         `   `   <                P     
          E  0    @  
 
- 	                                      Ԁ              
-  `   `   <                      
+ 	                                      Ԁ              ]  `   `   <                0     
          E  0    @  
 
- 	                                      Ԁ                `   `   <                      
+ 	                              2         Ԁ                 `   `   <                      
          E  0    @  
 
- 	                                      Ԁ       	       d  `   `   <                      
+ 	                              5  L   L                               
+
+       5  L   L          @                    
+
+        7  L   L          `                    
+
+       9        Ԁ       	       /:  L   L   <                p     
+                
+
+     
+       ?:        Ԁ              :  L   L   <                P     
+                
+
+     
+       <  L   L   <                P     
+                
+
+     
+       <=        Ԁ              =  L   L   <                      
+                
+
+     
+       #?        Ԁ              ?  `   `   <                
+               E  0    @  
+
+ 	                              @        Ԁ              _@  `   `   <                
+`              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   @  
 
- 	                              t        Ԁ                `   `   <                0     
+ 	                              ǣ       Ԁ               `   `   <                     
          E  0   @  
 
- 	                                      Ԁ              c  `   `   <                      
+ 	                                     Ԁ               `   `   <                      
          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   @  
 
- 	                              V+  L   L                              
-
-       +  L   L          P                    
-
-       ,  F   F                -         $0H`l
-z-&4mesh         F   F                S.         $0H`l
- &u'4mesh       (  F   F               `.         $0H`l
-.-4mesh       S       Ԁ       	        `   `   <                0     
+ 	                              2       Ԁ              M5 `   `   <                
+              E  0   @  
+
+ 	                              ]5       Ԁ              5 `   `   <                
+               E  0   @  
+
+ 	                              7 `   `   <                
+               E  0   @  
+
+ 	                              T8       Ԁ              9 `   `   <      	          
+`              E  0   @  
+
+ 	                                     Ԁ       	        `   `   <                p     
          E  0   @  
 
- 	                              &       Ԁ              } `   `   <                p     
+ 	                              ǣ       Ԁ               `   `   <                     
          E  0   @  
 
- 	                              R       Ԁ               `   `   <                0     
+ 	                                     Ԁ               `   `   <                     
          E  0   @  
 
- 	                               F   F               @5         $0H`l
-z-.4mesh       +b F   F               @s(6         $0H`l
- ./4mesh       Hg F   F               .6         $0H`l
-(654mesh       @ 2   2   Ѐ<      	          PJ 4mesh 7                 Ԁ       	       2 R   R   Ѐ<      	          ` J   $0H`l4mesh3         9 7         ;       Ԁ       	        2   2   Ѐ<      	          pJ 4mesh 7          2 6   6   Ј<                  F      	        
-          &2       Ԁ              t2 ,   ,   Ѐ<                  F      
-          3       Ԁ              {3 ,   ,   Ѐ<                P  F      
-             F   F               	=         $0H`l
-.6<4mesh         L   L          `                    
-
-         L   L                              
-
-       %  L   L                              
-
-         F   F               p=         $0H`l
- ./4mesh         2   2   Ѐ<                J 4mesh 7                  Ԁ                2   2   Ѐ<                J 4mesh 7                  Ԁ              (  F   F               (=         $0H`l
-=	=4mesh       K  R   R   Ѐ<                 J   $0H`l4mesh3         9 7         [        Ԁ                2   2   Ѐ<                J 4mesh 7          B        Ԁ                2   2   Ѐ<                J 4mesh 7                  Ԁ              M 2   2   Ѐ<                J 4mesh 7          N       Ԁ              eP R   R   Ѐ<                 J   $0H`l4mesh3          9 7         \Q       Ԁ              R 2   2   Ј<                J 4mesh 7           6   6   Ѐ<                  F                               Ԁ              U R   R   Ѐ<      	           J   $0H`l4mesh3         9 7 	        X R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        Y R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        Z R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        1[ R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         F   F               -D         $0H`l
-=^D4mesh              Ԁ       	       , P   P   Ѐ<      	          J    $0H`l3         9 7	          R   R   Ѐ<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        (       Ԁ       	       C) 2   2   Ѐ<      	          J 4mesh 7	          6 <   <               >E         $0H`l 4mesh       =6 R   R   Ѐ<                 J   $0H`l4mesh3         9 7         %7 R   R   Ј<                 J   $0H`l4mesh3         9 7         P8 R   R   Ј<                 J   $0H`l4mesh3         9 7         `9 R   R   Ј<                 J   $0H`l4mesh3         9 7         : R   R   Ј<                 J   $0H`l4mesh3         9 7         ; R   R   Ј<                 J   $0H`l4mesh3         9 7         < R   R   Ј<                 J   $0H`l4mesh3         9 7         Hg F   F                HpE         $0H`l
-D?E4mesh       kh R   R   Ѐ<                 J   $0H`l4mesh3          9 7         {h       Ԁ              h P   P   Ѐ<                J    $0H`l3         9 7         i       Ԁ               R   R   Ѐ<                  J   $0H`l4mesh3          9 7                Ԁ               R   R   Ѐ<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7         ; R   R   Ј<                  J   $0H`l4mesh3         9 7         T R   R   Ј<                  J   $0H`l4mesh3         9 7         d R   R   Ј<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7         		 2   2   Ѐ<                J 4mesh 7          		       Ԁ              
-	 2   2   Ѐ<                0J 4mesh 7          
-	 2   2   Ј<                0J 4mesh 7          s	       Ԁ              r	 2   2   Ѐ<                 J 4mesh 7          s	       Ԁ               R   R   Ѐ<      	            J   $0H`l4mesh3         9 7 
-               Ԁ       	              Ԁ       	        P   P   Ѐ<      	          J   	 $0H`l3         9 7
- 
-        & F   F                M/L         $0H`l
-=	K4mesh         <   <               0M         $0H`l 4mesh         R   R   Ѐ<                @ J   $0H`l4mesh3         9 7         $  R   R   Ј<                @ J   $0H`l4mesh3         9 7           R   R   Ј<                @ J   $0H`l4mesh3         9 7         )  R   R   Ј<                @ J   $0H`l4mesh3         9 7         ]  R   R   Ј<                @ J   $0H`l4mesh3         9 7         I  F   F               PhM         $0H`l
-/LM4mesh         R   R   Ј<                @ J   $0H`l4mesh3         9 7                 Ԁ              r  P   P   Ѐ<                @J    $0H`l3          9 7                 Ԁ                      Ԁ              Z  R   R   Ѐ<                P J   $0H`l4mesh3          9 7         j        Ԁ                P   P   Ѐ<                `J    $0H`l3         9 7         y        Ԁ              <  R   R   Ѐ<                p J   $0H`l4mesh3          9 7         [        Ԁ              HO F   F               pT         $0H`l
-/LM4mesh       + F   F               T         $0H`l
-TM4mesh       $ 2   2   Ѐ<                J 4mesh 7          % 2   2   Ј<                J 4mesh 7          & 2   2   Ј<                J 4mesh 7          ^' 2   2   Ј<                J 4mesh 7          K( 2   2   Ј<                J 4mesh 7          8) 2   2   Ј<                J 4mesh 7          7* 2   2   Ј<                J 4mesh 7            L   L                              
-
-         L   L                              
-
-       (  A   A               ;\         $0H`lT4mesh         F   F               v\         $0H`l
-<\DU4mesh       HO A   A               c         $0H`lv\4mesh       + F   F               3d         $0H`l
-cDU4mesh        2   2   Ѐ<                J 4mesh 7                 Ԁ               R   R   Ѐ<                 J   $0H`l4mesh3         9 7 	        |       Ԁ               2   2   Ѐ<                J 4mesh 7	           2   2   Ј<                J 4mesh 7	          (  A   A               }k         $0H`ld4mesh         A   A               Sk         $0H`l~k4mesh               Ԁ                P   P   Ѐ<                 J   	 $0H`l3         9 7
-           R   R   Ѐ<                 J   $0H`l4mesh3         9 7 
-                Ԁ              HO A   A               s         $0H`lk4mesh       + F   F                sYs         $0H`l
-s	l4mesh       (  A   A               (z         $0H`lYs4mesh         F   F               0z         $0H`l
-z	s4mesh       HO A   A               Ha         $0H`lz4mesh              Ԁ               2   2   Ѐ<                @J 4mesh 7
-           2   2   Ј<                @J 4mesh 7
-           F   F               P         $0H`l
-a	I{4mesh              Ԁ              4 2   2   Ѐ<                `J 4mesh 7
-          +       Ԁ               R   R   Ѐ<                p J   $0H`l4mesh3         9 7         |       Ԁ               2   2   Ј<                J 4mesh 7       	   (  A   A                h         $0H`l4mesh    	     A   A               <         $0H`l4mesh    	           Ԁ           	   x  P   P   Ѐ<                J    $0H`l3         9 7      	     R   R   Ѐ<                 J   $0H`l4mesh3         9 7      	   "        Ԁ           	   HO A   A                        $0H`l=4mesh    	   + F   F               ݑ         $0H`l
-@4mesh    
\ No newline at end of file
+ 	                                     Ԁ              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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,153 +1,267 @@
-ò            i       $  <   <                 $          $0H`l 4mesh         %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          0%        Ԁ               ~%  P   P   Ѐ<                 J     $0H`l3          9 7          ?&        Ԁ               s&  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          8'        Ԁ               (  P   P   Ј<                 J     $0H`l3         9 7          )        Ԁ               ?  <   <          	     	  k?          $0H`l 4mesh        ?  R   R   Ѐ<      	          0  J   $0H`l4mesh3         9 7          *A  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          UB  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          JC  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          ~D  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          E  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7          F  R   R   Ј<      	          0  J   $0H`l4mesh3         9 7            A   A                 (          $0H`l $ 4mesh                Ԁ               %  P   P   Ѐ<                0 J    $0H`l3         9 7            R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          =        Ԁ                 R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3          9 7            R   R   Ј<      
-     	     	  J   $0H`l4mesh3          9 7                  Ԁ       
-          R   R   Ѐ<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7            R   R   Ј<      	          @  J   $0H`l4mesh3         9 7          (  R   R   Ј<      	          @  J   $0H`l4mesh3         9 7          A  R   R   Ј<      	          @  J   $0H`l4mesh3         9 7          H  R   R   Ј<      	          @  J   $0H`l4mesh3         9 7          j  R   R   Ј<      	          @  J   $0H`l4mesh3         9 7          q  2   2   Ѐ<      	          P J 4mesh 7            
-        Ԁ               k 2   2   Ѐ<      
-     	     	  J 4mesh 7           k       Ԁ       
-         <   <          	     	0          $0H`l 4mesh         R   R   Ѐ<      	          `  J   $0H`l4mesh3         9 7          J R   R   Ј<      	          `  J   $0H`l4mesh3         9 7          c R   R   Ј<      	          `  J   $0H`l4mesh3         9 7          a R   R   Ј<      	          `  J   $0H`l4mesh3         9 7          _ R   R   Ј<      	          `  J   $0H`l4mesh3         9 7          x R   R   Ј<      	          `  J   $0H`l4mesh3         9 7          v R   R   Ј<      	          `  J   $0H`l4mesh3         9 7          - F   F               p -         $0H`l
-  4mesh        P R   R   Ѐ<           	     	@  J   $0H`l4mesh3          9 7          `       Ԁ       	         P   P   Ѐ<      	           J    $0H`l3         9 7          o       Ԁ               7 F   F               P H7         $0H`l
-  4mesh        H R   R   Ѐ<      	            J   $0H`l4mesh3         9 7          I R   R   Ј<      	            J   $0H`l4mesh3         9 7          K R   R   Ј<      	            J   $0H`l4mesh3         9 7          -L R   R   Ј<      	            J   $0H`l4mesh3         9 7          OM R   R   Ј<      	            J   $0H`l4mesh3         9 7          _N R   R   Ј<      	            J   $0H`l4mesh3         9 7          O R   R   Ј<      	            J   $0H`l4mesh3         9 7          3Q       Ԁ       
-        g 2   2   Ѐ<           	     	P J 4mesh 7           g       Ԁ       	        g 2   2   Ѐ<      	           J 4mesh 7           h       Ԁ               č R   R   Ѐ<      
-     	     	`  J   $0H`l4mesh3          9 7                 Ԁ       
-        K 2   2   Ѐ<      
-     	     	p J 4mesh 7            <   <          	     	          $0H`l 4mesh        6 R   R   Ѐ<      	            J   $0H`l4mesh3         9 7          O R   R   Ј<      	            J   $0H`l4mesh3         9 7          h  R   R   Ј<      	            J   $0H`l4mesh3         9 7          ! R   R   Ј<      	            J   $0H`l4mesh3         9 7          " R   R   Ј<      	            J   $0H`l4mesh3         9 7          # R   R   Ј<      	            J   $0H`l4mesh3         9 7          $ R   R   Ј<      	            J   $0H`l4mesh3         9 7          M6 F   F                M6         $0H`l
- 74mesh        p7 R   R   Ѐ<           	     	  J   $0H`l4mesh3          9 7          7       Ԁ       	        7 P   P   Ѐ<      	           J    $0H`l3         9 7          8       Ԁ              {  R   R   Ѐ<      	            J   $0H`l4mesh3         9 7         |  R   R   Ј<      	            J   $0H`l4mesh3         9 7         }  R   R   Ј<      	            J   $0H`l4mesh3         9 7           R   R   Ј<      	            J   $0H`l4mesh3         9 7         8  R   R   Ј<      	            J   $0H`l4mesh3         9 7         -  R   R   Ј<      	            J   $0H`l4mesh3         9 7         =  R   R   Ј<      	            J   $0H`l4mesh3         9 7                 Ԁ       
-       J  2   2   Ј<           	     	 J 4mesh 7          Z        Ԁ       	         2   2   Ѐ<      	           J 4mesh 7          A        Ԁ                R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3          9 7                 Ԁ       
-       "  2   2   Ѐ<      
-     	     	 J 4mesh 7          T <   <          	     	 ˖         $0H`l 4mesh       U R   R   Ѐ<      	            J   $0H`l4mesh3         9 7         U       Ԁ              V P   P   Ѐ<           	     	 J    $0H`l3          9 7         V       Ԁ       	       zW R   R   Ѐ<           	     	  J   $0H`l4mesh3          9 7         W       Ԁ       	       W P   P   Ѐ<      	          J    $0H`l3         9 7         X       Ԁ              - F   F                m         $0H`l
- 74mesh       5 2   2   Ѐ<                0J 4mesh 7          6 2   2   Ѐ<                p J 4mesh 7          6       Ԁ              "7 2   2   Ј<                0J 4mesh 7          7       Ԁ              L8 F   F                y         $0H`l
- 4mesh       n8 R   R   Ѐ<                @ J   $0H`l4mesh3         9 7         39       Ԁ              9 2   2   Ѐ<                 J 4mesh 7          9       Ԁ              : 2   2   Ѐ<                PJ 4mesh 7          :       Ԁ               A   A          	     	 7         $0H`l4mesh              Ԁ       
-        P   P   Ѐ<      
-     	     	J    $0H`l3         9 7          R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3         9 7                Ԁ       
-         L   L          	0     
+ò            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                 Ԁ                       Ԁ       
+          <   <   Ѐ<      
+     	     	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     
                
 
 
-       '	  L   L          `     
+       	  L   L               
                
 
 
-       ,  A   A               p         $0H`l84mesh       (-  R   R   Ѐ<                  J   $0H`l4mesh3         9 7         8-        Ԁ              -  P   P   Ѐ<                J    $0H`l3         9 7         G.        Ԁ              .  R   R   Ѐ<                 J   $0H`l4mesh3         9 7         I/        Ԁ              /  P   P   Ѐ<                 J    $0H`l3         9 7         /        Ԁ                F   F                J         $0H`l
-E4mesh       U F   F          	     	@%         $0H`l
-4mesh       - F   F               Q&         $0H`l
-%K4mesh       g F   F                &         $0H`l
-&R&4mesh       $ F   F          	     	P+z-         $0H`l
-R&!'4mesh       ,  L   L          	`     
-               
+       
+  L   L                
+               
 
 
-       W  L   L               
-               
-
-
-         L   L                
-               
+       W  E   E   Ѐ             %              3       
+             E   E   Ѐ             %                     
+             E   E   Ѐ       	     	`%                     
+                   Ԁ       
+       7  ?   ?   Ѐ<           	     	p                   
+          G        Ԁ       	         ?   ?   Ѐ<                0           -       
+          w  ?   ?   Ј<                0           -       
+                   Ԁ                ?   ?   Ѐ<                                  
+                  Ԁ                L   L   <                
+                      
+     
 
-
-       $  E   E   Ѐ               D%              ,       
-           s  E   E   Ѐ              D%                     
-             E   E   Ѐ       	     	p  D%                     
-           v        Ԁ       
-       	  ?   ?   Ѐ<           	     	  E                   
-          	        Ԁ       	       b	  ?   ?   Ѐ<                  E                  
-          
-        Ԁ              
-  ?   ?   Ѐ<                   E           )       
-                  Ԁ                L   L   <                
-                     
+               Ԁ              .  L   L   <      	          
+@                     
      
 
-               Ԁ                L   L   <      	          
-                     
+               Ԁ                L   L   <      
+     	     
+                     
      
 
-               Ԁ                L   L   <      
+         L   L   <      
      	     
-                     
+                     
      
 
-               Ԁ       
-         `   `   <           	          
+               Ԁ       
+         `   `   <           	          
          E  0    @  
 
- 	                                      Ԁ       	         `   `   <                     
+ 	                                      Ԁ       	       ^  `   `   <                P     
          E  0    @  
 
- 	                                      Ԁ                `   `   <                      
+ 	                              3        Ԁ                `   `   <                0     
          E  0    @  
 
- 	                                      Ԁ       
-       e  `   `   <           	          
+ 	                              U6  L   L          @                    
+
+       6  L   L          `                    
+
+       7  L   L          	                    
+
+       8        Ԁ       
+       H9  L   L   <           	          
+                
+
+     
+       X9        Ԁ       	       9  L   L   <                p     
+                
+
+     
+       l:        Ԁ              ;  L   L   <                P     
+                
+
+     
+        =  L   L   <                P     
+                
+
+     
+       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   @  
 
- 	                              u        Ԁ       	         `   `   <                      
+ 	                              Ȣ       Ԁ       	        `   `   <                     
          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   @  
 
- 	                              W,  F   F                -         $0H`l
-z-&4mesh         F   F               `.         $0H`l
-.-4mesh       T       Ԁ       
-        `   `   <           	          
+ 	                              5       Ԁ              6       Ԁ       
+       8 `   `   <                
+               E  0   @  
+
+ 	                              (8       Ԁ              8 `   `   <      	          
+`              E  0   @  
+
+ 	                              T9       Ԁ              : `   `   <      
+     	     
+              E  0   @  
+
+ 	                              < `   `   <      
+     	     
+              E  0   @  
+
+ 	                                     Ԁ       
+        `   `   <           	          
          E  0   @  
 
- 	                              '       Ԁ       	       ~ `   `   <                0     
+ 	                              Ȣ       Ԁ       	        `   `   <                p     
          E  0   @  
 
- 	                              S       Ԁ               `   `   <                p     
+ 	                                     Ԁ               `   `   <                     
          E  0   @  
 
- 	                              - F   F               @5         $0H`l
-z-.4mesh       g F   F               .6         $0H`l
-(654mesh        2   2   Ѐ<      	          PJ 4mesh 7          }       Ԁ               6   6   Ѐ<      
-     	     	  F                         2   2   Ѐ<           	     	 J 4mesh 7                 Ԁ       	        F   F          	     	k<         $0H`l
-5c64mesh        R   R   Ѐ<      	          ` J   $0H`l4mesh3         9 7         o       Ԁ               2   2   Ѐ<           	     	 J 4mesh 7                 Ԁ       	       ] 2   2   Ѐ<      	          pJ 4mesh 7                 Ԁ               1 6   6   Ѐ<                  F      	        
-          1 6   6   Ј<                  F      	        
-          R2       Ԁ              2 ,   ,   Ѐ<                  F      
-             F   F               	=         $0H`l
-.6<4mesh       z  L   L                              
-
-         L   L                              
-
-               Ԁ              w  2   2   Ѐ<                J 4mesh 7            F   F               (=         $0H`l
-=	=4mesh               Ԁ                      Ԁ              } 6   6   Ѐ<                  F                               Ԁ              8! E   E   Ѐ       	     	0  D%         
-     h                   ]S       Ԁ       
-       S 2   2   Ѐ<      
-     	     	@J 4mesh 7          T 2   2   Ј<      
-     	     	@J 4mesh 7          RU A   A          	     	P]D         $0H`l>4mesh       tU R   R   Ѐ<      	           J   $0H`l4mesh3         9 7 	        V R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        W R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        X R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        ~Y R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        Z R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        [ R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        - F   F               -D         $0H`l
-=^D4mesh       J R   R   Ј<           	     	` J   $0H`l4mesh3          9 7         Z       Ԁ       	        P   P   Ѐ<      	          J    $0H`l3         9 7	         i       Ԁ              R R   R   Ѐ<      	           J   $0H`l4mesh3         9 7 	        P R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        N R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        g R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	         R   R   Ј<      	           J   $0H`l4mesh3         9 7 	        I       Ԁ       
-       ( 2   2   Ѐ<           	     	pJ 4mesh 7 	         (       Ԁ       	       ( 2   2   Ѐ<      	          J 4mesh 7	          )       Ԁ              7 R   R   Ј<                 J   $0H`l4mesh3         9 7         9 R   R   Ј<                 J   $0H`l4mesh3         9 7         ; R   R   Ј<                 J   $0H`l4mesh3         9 7         -< R   R   Ј<                 J   $0H`l4mesh3         9 7         a= R   R   Ј<                 J   $0H`l4mesh3         9 7         e R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3          9 7 	        f       Ԁ       
-       h       Ԁ              Mi P   P   Ѐ<                J    $0H`l3         9 7          R   R   Ѐ<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7          R   R   Ј<                  J   $0H`l4mesh3         9 7         		       Ԁ              d
-	 2   2   Ѐ<                0J 4mesh 7           <   <          	     	K         $0H`l 4mesh       6 R   R   Ѐ<      	            J   $0H`l4mesh3         9 7 
-               Ԁ               P   P   Ѐ<           	     	J   	 $0H`l3          9 7
- 
-               Ԁ       	        R   R   Ѐ<           	     	 J   $0H`l4mesh3          9 7 
-               Ԁ       	        P   P   Ѐ<      	          J   	 $0H`l3         9 7
- 
-               Ԁ              M& F   F                M/L         $0H`l
-=	K4mesh       `  2   2   Ѐ<                0J 4mesh 7          D  2   2   Ј<                0J 4mesh 7          C  2   2   Ј<                0J 4mesh 7            2   2   Ј<                0J 4mesh 7            2   2   Ј<                0J 4mesh 7            2   2   Ј<                0J 4mesh 7            2   2   Ј<                0J 4mesh 7          - A   A               @mS         $0H`l	K4mesh        2   2   Ѐ<      	          PJ 4mesh 7
- 
-          2   2   Ј<      	          PJ 4mesh 7
- 
-          2   2   Ј<      	          PJ 4mesh 7
- 
-          2   2   Ј<      	          PJ 4mesh 7
- 
-         v 2   2   Ј<      	          PJ 4mesh 7
- 
-         Q 2   2   Ј<      	          PJ 4mesh 7
- 
-         Y 2   2   Ј<      	          PJ 4mesh 7
- 
-         M> A   A               `[         $0H`l	K4mesh       -i <   <               pb         $0H`l 4mesh       M> <   <               j         $0H`l 4mesh       - <   <               Tr         $0H`l 4mesh       M" <   <               y         $0H`l 4mesh       - <   <               -         $0H`l 4mesh       M* <   <               M<         $0H`l 4mesh    	   -q <   <               mŐ         $0H`l 4mesh    
\ No newline at end of file
+ 	                              p       Ԁ               F   F               o5         $0H`lx
+.-rmesh        `   `   <                
+               E  0   @  
+
+ 	                                     Ԁ              s `   `   <      	          
+              E  0   @  
+
+ 	                              H       Ԁ               `   `   <      
+     	     
+               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   @  
+
+ 	                              	 `   `   <      
+     	     
+              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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,260 +1,439 @@
-ò            i       \%        Ԁ               &  P   P   Ѐ<                 J     $0H`l3          9 7          &  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          /)        Ԁ               k?  <   <          	     	  k?          $0H`l 4mesh          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           >   >   Ј<                    $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`l ? 4mesh          R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3          9 7          =  R   R   Ј<      
-     	     	  J   $0H`l4mesh3          9 7                  Ԁ       	          P   P   Ѐ<      	     
-     
-  J     $0H`l3          9 7                  Ԁ       
-          2   2   Ѐ<      	          P J 4mesh 7                    Ԁ               j 2   2   Ѐ<      
-     	     	  J 4mesh 7           Ak       Ԁ       	        k 2   2   Ѐ<      	     
-     
-@ J 4mesh 7           k       Ԁ       
-         <   <          	     	0          $0H`l 4mesh         F   F               p -         $0H`l
-  4mesh         R   R   Ѐ<           	     	@  J   $0H`l4mesh3          9 7                 Ԁ       	        2 P   P   Ѐ<      	           J    $0H`l3         9 7          B       Ԁ               P 2   2   Ѐ<      	     
-     
-p J 4mesh 7            Q       Ԁ       
-        2g 2   2   Ѐ<           	     	P J 4mesh 7           g       Ԁ       	        Ih 2   2   Ѐ<      	           J 4mesh 7           Yh       Ԁ                A   A          
-     
-          $0H`l4mesh        ; R   R   Ѐ<      
-     	     	`  J   $0H`l4mesh3          9 7                  Ԁ       	        ~ 2   2   Ѐ<      	     
-     
- J 4mesh 7                  Ԁ       
-         2   2   Ѐ<      
-     	     	p J 4mesh 7                  Ԁ       	         <   <          	     	          $0H`l 4mesh        6 F   F                M6         $0H`l
- 74mesh        6 R   R   Ѐ<           	     	  J   $0H`l4mesh3          9 7          7       Ԁ       	        R8 P   P   Ѐ<      	           J    $0H`l3         9 7          b8       Ԁ              O  2   2   Ѐ<      	     
-     
- J 4mesh 7           _        Ԁ       
-         2   2   Ѐ<           	     	 J 4mesh 7            2   2   Ј<           	     	 J 4mesh 7                  Ԁ       	         2   2   Ѐ<      	           J 4mesh 7                  Ԁ                A   A          
-     
- 1         $0H`l4mesh         R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3          9 7                 Ԁ       	       ^  2   2   Ѐ<      	     
-     
- J 4mesh 7          n        Ԁ       
-         2   2   Ѐ<      
-     	     	 J 4mesh 7          ^        Ԁ       	       T <   <          	     	 ˖         $0H`l 4mesh       U R   R   Ѐ<      	            J   $0H`l4mesh3         9 7         U       Ԁ              U P   P   Ѐ<           	     	 J    $0H`l3          9 7         V       Ԁ       	       V R   R   Ѐ<           	     	  J   $0H`l4mesh3          9 7         W       Ԁ       	       \X P   P   Ѐ<      	          J    $0H`l3         9 7         lX       Ԁ               F   F                m         $0H`l
- 74mesh       5 2   2   Ѐ<                0J 4mesh 7          6       Ԁ              7 2   2   Ј<                0J 4mesh 7          8 R   R   Ѐ<                @ J   $0H`l4mesh3         9 7         9       Ԁ              u: 2   2   Ѐ<                PJ 4mesh 7           A   A          	     	 7         $0H`l4mesh        R   R   Ѐ<      	     
-     
-  J   $0H`l4mesh3          9 7                Ԁ       
-       $ P   P   Ѐ<      
-     	     	J    $0H`l3         9 7                Ԁ       	        R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3         9 7                Ԁ       	        P   P   Ѐ<      	     
-     
-J    $0H`l3         9 7                Ԁ       
-       P  L   L          
-      
+           $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  >   >   Ѐ<      	     
+     
+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          
+      
                 
 
 
-       {  L   L          	0     
+         L   L          	P     
                
 
 
-       	  L   L          `     
-               
+       
 
-
-       },  A   A               p         $0H`l84mesh       d-        Ԁ              
-.  P   P   Ѐ<                J    $0H`l3         9 7         /  R   R   Ѐ<                 J   $0H`l4mesh3         9 7         +0        Ԁ                A   A          
-     
-0	         $0H`l84mesh       T F   F          	     	@%         $0H`l
-4mesh        F   F               Q&         $0H`l
-%K4mesh        A   A          
-     
-@)!'         $0H`l%4mesh        F   F          	     	P+z-         $0H`l
-R&!'4mesh          L   L          
-P     
-                
+  L   L               
+               
 
 
-          L   L          	`     
-               
+         E   E   Ѐ             %                     
+           i  E   E   Ѐ       	     	`%                     
+           l  ?   ?   Ѐ<      	     
+     
+                       
+          |        Ԁ       
+         ?   ?   Ѐ<           	     	p                   
+          s        Ԁ       	         ?   ?   Ѐ<                0           -       
+                  Ԁ                L   L   <      	          
+@                     
+     
 
-
-         E   E   Ѐ              D%                     
-           6  E   E   Ѐ       	     	p  D%                     
-           9  ?   ?   Ѐ<      	     
-     
-`  E                      
-          I        Ԁ       
-         ?   ?   Ѐ<           	     	  E                   
-          @	        Ԁ       	       	  ?   ?   Ѐ<                  E                  
-                  Ԁ                L   L   <      	          
-                     
+               Ԁ                L   L   <      
+     	     
+                     
      
 
-               Ԁ                 L   L   <      
+       S  L   L   <      
      	     
-                     
+                     
      
 
-               Ԁ       	         `   `   <      	     
-     p     
+               Ԁ       	         `   `   <      	     
+           
           E  0    @  
 
- 	                                      Ԁ       
-         `   `   <           	          
+ 	                                      Ԁ       
+       ^  `   `   <           	          
          E  0    @  
 
- 	                                      Ԁ       	       e  `   `   <      	     
-          
+ 	                              3        Ԁ       	         `   `   <                P     
+         E  0    @  
+
+ 	                               7  L   L          `                    
+
+       +7  L   L          	                    
+
+       W8  L   L   <      	     
+           
+                 
+
+     
+       g8        Ԁ       
+       8  L   L   <           	          
+                
+
+     
+       9        Ԁ       	       4A        Ԁ              DC  `   `   <      	          
+              E  0    @  
+
+ 	                              TC        Ԁ              C  `   `   <      
+     	     
+              E  0    @  
+
+ 	                              D        Ԁ       	       K  L   L   <      	     
+           
+                 
+
+     
+       K        Ԁ       
+       L  L   L          
+                     
+
+        F   F               	&         $0H`lx
+srmesh        `   `   <      	     
+          
           E  0   @  
 
- 	                              u        Ԁ       
-         `   `   <           	          
+ 	                              ȡ       Ԁ       
+        `   `   <           	          
          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   @  
 
- 	                              ,  F   F                -         $0H`l
-z-&4mesh         A   A          
-     
-I.         $0H`lz-4mesh       T F   F          	     	K5         $0H`l
--.4mesh        `   `   <      	     
+ 	                              9,       Ԁ              , ?   ?   Ѐ<      	          P      
+                      ,       Ԁ              %- ?   ?   Ѐ<      
+     	     	      
+                      -       Ԁ       	       / `   `   <                @     
+         E  0   @  
+
+ 	                              D6 `   `   <      	     
+          
+          E  0   @  
+
+ 	                              T6       Ԁ       
+       T8       Ԁ              9 `   `   <      	          
+`              E  0   @  
+
+ 	                              '9       Ԁ              ~9 `   `   <      
+     	     
+              E  0   @  
+
+ 	                              v; `   `   <      
+     	     
+              E  0   @  
+
+ 	                              K<       Ԁ       	       | A   A          	     	 KC5         $0H`lx.rmesh        `   `   <      	     
           
           E  0   @  
 
- 	                              '       Ԁ       
-       ~ `   `   <           	          
+ 	                              ȡ       Ԁ       
+        `   `   <           	          
          E  0   @  
 
- 	                              S       Ԁ       	        `   `   <                0     
+ 	                                     Ԁ       	        `   `   <                p     
          E  0   @  
 
- 	                               F   F               @5         $0H`l
-z-.4mesh        A   A          
+ 	                                F   F               o5         $0H`lx
+.-rmesh       H       Ԁ               `   `   <      	          
+              E  0   @  
+
+ 	                                     Ԁ              r `   `   <      
+     	     
+               E  0   @  
+
+ 	                              G       Ԁ       	        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   @  
+
+ 	                              	       Ԁ       	       	 `   `   <                     
+         E  0   @  
+
+ 	                              	       Ԁ              E	 `   `   <      	          
+               E  0   @  
+
+ 	                              U	       Ԁ              	 `   `   <      
+     	     
+              E  0   @  
+
+ 	                              	 `   `   <      
+     	     
+              E  0   @  
+
+ 	                              	       Ԁ       	       	       Ԁ              	 `   `   <      	          
+0              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   @  
+
+ 	                                       Ԁ       
+          `   `   <           	          
+         E  0   @  
+
+ 	                              p  `   `   <           	          
+         E  0   @  
+
+ 	                                `   `   <           	          
+         E  0   @  
+
+ 	                                `   `   <           	          
+         E  0   @  
+
+ 	                              -  `   `   <           	          
+         E  0   @  
+
+ 	                                `   `   <           	          
+         E  0   @  
+
+ 	                              P  `   `   <           	          
+         E  0   @  
+
+ 	                                A   A          
      
-ic6         $0H`l54mesh       @ 2   2   Ѐ<      	          PJ 4mesh 7          P       Ԁ               6   6   Ѐ<      
-     	     	  F                        ;       Ԁ       	       ] 2   2   Ѐ<           	     	 J 4mesh 7                 Ԁ       	        F   F          	     	k<         $0H`l
-5c64mesh       2 R   R   Ѐ<      	          ` J   $0H`l4mesh3         9 7         B       Ԁ               2   2   Ѐ<           	     	 J 4mesh 7          ;       Ԁ       	        2   2   Ѐ<      	          pJ 4mesh 7                 Ԁ              2 6   6   Ј<                  F      	        
-          %  L   L                              
-
-         A   A          
+@:M         $0H`lx'Lrmesh       | F   F          	     	S         $0H`lx
+;MGLrmesh        `   `   <      	     
+     P     
+          E  0   @  
+
+ 	                              ȡ       Ԁ       
+        `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                              J `   `   <           	           
+         E  0   @  
+
+ 	                              ] `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                              ݶ `   `   <           	           
+         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  7                Ԁ       
+         A   A          
+     
+	}\         $0H`lxi[rmesh         >   >   Ѐ<      
+     	     	`  $0H`lrmeshq   9u
+        Q        Ԁ       	         -   -   Ѐ<      	     
      
->         $0H`l54mesh              Ԁ              t  E   E   Ѐ       
+rmeshu 
+ 4                Ԁ       
+       7  -   -   Ѐ<      
+     	     	prmeshu
+  7                Ԁ       	       t  E   E   Ѐ       
      
-  D%           
-                           E   E   Ѐ       	     	0  D%         
-     h                    S 2   2   Ѐ<      	     
-     
- J 4mesh 7          0S       Ԁ       
-       ~S 2   2   Ѐ<      
-     	     	@J 4mesh 7          /T 2   2   Ј<      
-     	     	@J 4mesh 7          T       Ԁ       	       T A   A          	     	P]D         $0H`l>4mesh        F   F               -D         $0H`l
-=^D4mesh       ǅ R   R   Ѐ<           	     	` J   $0H`l4mesh3          9 7          R   R   Ј<           	     	` J   $0H`l4mesh3          9 7                Ԁ       	       , P   P   Ѐ<      	          J    $0H`l3         9 7	         <       Ԁ               2   2   Ѐ<      	     
-     
-0J 4mesh 7                  Ԁ       
-       ,( 2   2   Ѐ<           	     	pJ 4mesh 7 	         (       Ԁ       	       C) 2   2   Ѐ<      	          J 4mesh 7	          S)       Ԁ              e A   A          
-     
-@mE         $0H`l^D4mesh       ;e R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3          9 7 	         f       Ԁ       	       ~f 2   2   Ѐ<      	     
-     
-PJ 4mesh 7 	         f       Ԁ       
-       f 2   2   Ѐ<      
-     	     	J 4mesh 7	          g       Ԁ       	       t E   E   Ѐ       
-     
-`  D%           
-                          <   <          	     	K         $0H`l 4mesh        R   R   Ѐ<      	            J   $0H`l4mesh3         9 7 
-               Ԁ               P   P   Ѐ<           	     	J   	 $0H`l3          9 7
- 
-               Ԁ       	        R   R   Ѐ<           	     	 J   $0H`l4mesh3          9 7 
-               Ԁ       	        P   P   Ѐ<      	          J   	 $0H`l3         9 7
- 
-               Ԁ              & F   F                M/L         $0H`l
-=	K4mesh         <   <          
-     
-pL         $0H`l 4mesh         R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3         9 7         ؜        Ԁ       	       ~  P   P   Ѐ<      	     
-     
-J    $0H`l3          9 7                 Ԁ       
-       e  R   R   Ѐ<      	     
-     
- J   $0H`l4mesh3          9 7         u        Ԁ       
-       ՞  P   P   Ѐ<      
-     	     	J   
- $0H`l3         9 7                 Ԁ       	       T F   F          	     	˟S         $0H`l
-	/L
-L4mesh       = A   A          
-     
-T         $0H`lS4mesh       4	 E   E   Ѐ       
-     
-  D%           
-                         	 E   E   Ѐ       	     	   D%         
-                         F   F          	     	@[         $0H`l
-	/L
-T4mesh       $ 2   2   Ѐ<           	     	 J 4mesh 7
- 
-         W% 2   2   Ј<           	     	 J 4mesh 7
- 
-         )& 2   2   Ј<           	     	 J 4mesh 7
- 
-         & 2   2   Ј<           	     	 J 4mesh 7
- 
-         ( 2   2   Ј<           	     	 J 4mesh 7
- 
-         ( 2   2   Ј<           	     	 J 4mesh 7
- 
-         ) 2   2   Ј<           	     	 J 4mesh 7
- 
-           A   A          
-     
-	)\         $0H`lA[4mesh       T A   A          	     	0b         $0H`l
-)\4mesh       = A   A          
-     
-)c         $0H`lb4mesh        A   A          	     	@+j         $0H`l
-c4mesh       t   E   E   Ѐ       
-     
-  D%           
-                            E   E   Ѐ       	     	P  D%         
-                          A   A          
-     
-Ikk         $0H`lj4mesh       t  E   E   Ѐ       
-     
-   D%           
-                           E   E   Ѐ       	     	`  D%         
-                        T A   A          	     	pK$r         $0H`l
-kk4mesh       = A   A          
-     
-is         $0H`l$r4mesh       t E   E   Ѐ       
-     
-   D%           
-	                         À E   E   Ѐ       	     	  D%         
-	                         A   A          	     	ky         $0H`l
-s4mesh       T A   A          	     	f         $0H`l
-s4mesh       : 2   2   Ѐ<      
-     	     	J 4mesh 7          r;       Ԁ       	       ; 2   2   Ѐ<      	     
-     
-@J 4mesh 7           <       Ԁ       
-       = A   A          
-     
-PN         $0H`lf4mesh       ;= R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3          9 7          >       Ԁ       	       ~> 2   2   Ѐ<      	     
-     
-`J 4mesh 7          >       Ԁ       
-       > 2   2   Ѐ<      
-     	     	J 4mesh 7          u?       Ԁ       	       4	 E   E   Ѐ       
-     
-p  D%           
-
-                          <   <          	     	         $0H`l 4mesh        R   R   Ѐ<      	     
-     
- J   $0H`l4mesh3          9 7                Ԁ       
-        P   P   Ѐ<      
-     	     	J    $0H`l3          9 7                Ԁ       	        R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3          9 7          R   R   Ј<      
-     	     	  J   $0H`l4mesh3          9 7                Ԁ       	       q P   P   Ѐ<      	     
+%           
+                         T <   <          	     	b         $0H`lx rmesh       U >   >   Ѐ<      	     
      
-J    $0H`l3         9 7                Ԁ       
-    	     A   A          
+  $0H`lrmeshq   9u        U       Ԁ       
+       U <   <   Ѐ<      
+     	     	  
+ $0H`lq   9u         V       Ԁ       	       V >   >   Ѐ<      
+     	     	  $0H`lrmeshq   9u        PW       Ԁ       	       W <   <   Ѐ<      	     
      
-         $0H`l 4mesh    	   L A   A          	     	ˠ         $0H`l4mesh    	   Q A   A          
+   $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   Ѐ       	     	%         
+
+                         A   A          	     	ky         $0H`lx
+4srmesh         A   A          
      
-餑         $0H`l4mesh    	    A   A          	     	 A         $0H`l4mesh    
\ No newline at end of file
+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   Ѐ       
+     
+P%   	        
+                      	      E   E   Ѐ       	     	 % 	        
+                     	     -   -   Ѐ<      
+     	     	0rmeshu  4     	   J        Ԁ       	    	     -   -   Ѐ<      	     
+     
+`rmeshu  7     	           Ԁ       
+    	     A   A          
+     
+p         $0H`lxrmesh    	     >   >   Ѐ<      
+     	     	@  $0H`lrmeshq   9u     	           Ԁ       	    	   :  -   -   Ѐ<      	     
+     
+rmeshu  4     	   J        Ԁ       
+    	     -   -   Ѐ<      
+     	     	Prmeshu  7     	   D        Ԁ       	    	   t  E   E   Ѐ       
+     
+%   
+        
+                      	   L <   <          	     	`ˠ         $0H`lx rmesh    	   M >   >   Ѐ<      	     
+     
+  $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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,357 +1,418 @@
-ò            i       ?  <   <          	     	  k?          $0H`l 4mesh        ?  R   R   Ѐ<      	     
+ò            i       
+&  >   >   Ј<           	     	    $0H`lrmeshq   9u         ?  A   A          	     	 k?          $0H`lx $ rmesh        ?  >   >   Ѐ<      	     
      
-   J   $0H`l4mesh3          9 7          @  R   R   Ј<      	     
+    $0H`lrmeshq   9u         @  >   >   Ј<      	     
      
-   J   $0H`l4mesh3          9 7          B  R   R   Ј<      	     
+    $0H`lrmeshq   9u         A  >   >   Ј<      	     
      
-   J   $0H`l4mesh3          9 7          AC  R   R   Ј<      	     
+    $0H`lrmeshq   9u         B  >   >   Ј<      	     
      
-   J   $0H`l4mesh3          9 7          cD  R   R   Ј<      	     
+    $0H`lrmeshq   9u         C  >   >   Ј<      	     
      
-   J   $0H`l4mesh3          9 7          aE  R   R   Ј<      	     
+    $0H`lrmeshq   9u         D  >   >   Ј<      	     
      
-   J   $0H`l4mesh3          9 7          _F  R   R   Ј<      	     
+    $0H`lrmeshq   9u         E  >   >   Ј<      	     
      
-   J   $0H`l4mesh3          9 7            A   A          
+    $0H`lrmeshq   9u           >   >   Ѐ<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           A   A          
      
-           $0H`l ? 4mesh          R   R   Ј<      
-     	     	  J   $0H`l4mesh3          9 7                  Ԁ       	        $  P   P   Ѐ<      	     
+           $0H`lx ? rmesh          >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ѐ<      
+     	     	0   $0H`lrmeshq   9u                 Ԁ       	          <   <   Ѐ<      	     
      
-  J     $0H`l3          9 7                  Ԁ       
-          R   R   Ѐ<      	     
+      $0H`lq   9u                  Ԁ       
+          -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4         u        Ԁ                 >   >   Ѐ<      	     
      
-0  J   $0H`l4mesh3          9 7            R   R   Ј<      	     
+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          
      
-0  J   $0H`l4mesh3          9 7            R   R   Ј<      	     
+@ h         $0H`lx rmesh         A   A          	     	 I         $0H`lx rmesh               Ԁ              1	  <   <   Ѐ<           	     	    $0H`lq  9u         
+  >   >   Ѐ<           	     	   $0H`lrmeshq  9u                Ԁ              }  -   -   Ѐ<      
+     	     	 rmeshu  4                Ԁ       	         -   -   Ѐ<      	     
      
-0  J   $0H`l4mesh3          9 7            R   R   Ј<      	     
+P rmeshu  7        l        Ԁ       
+         A   A          
      
-0  J   $0H`l4mesh3          9 7          8  R   R   Ј<      	     
+` 	         $0H`lx Jrmesh         >   >   Ѐ<      
+     	     	   $0H`lrmeshq  9u                Ԁ       	         -   -   Ѐ<      	     
      
-0  J   $0H`l4mesh3          9 7          -  R   R   Ј<      	     
+p rmeshu  4        w        Ԁ       
+         -   -   Ѐ<      
+     	     	 rmeshu  7                Ԁ       	        A   A          	     	         $0H`lxrmesh        >   >   Ѐ<      	     
      
-0  J   $0H`l4mesh3          9 7          a  R   R   Ј<      	     
+   $0H`lrmeshq   9u        ǩ       Ԁ       
+       Q <   <   Ѐ<      
+     	     	    $0H`lq  9u         a       Ԁ       	       . >   >   Ѐ<      
+     	     	0  $0H`lrmeshq  9u        >       Ԁ       	        <   <   Ѐ<      	     
      
-0  J   $0H`l4mesh3          9 7          
-        Ԁ               k 2   2   Ѐ<      
-     	     	  J 4mesh 7           k       Ԁ       	        ck 2   2   Ѐ<      	     
+    $0H`lq  9u         1       Ԁ       
+        A   A          
      
-@ J 4mesh 7           k       Ԁ       
-         <   <          	     	0          $0H`l 4mesh         R   R   Ѐ<      	     
-     
-P  J   $0H`l4mesh3          9 7          A R   R   Ј<      	     
-     
-P  J   $0H`l4mesh3          9 7          H R   R   Ј<      	     
-     
-P  J   $0H`l4mesh3          9 7          = R   R   Ј<      	     
-     
-P  J   $0H`l4mesh3          9 7          D R   R   Ј<      	     
-     
-P  J   $0H`l4mesh3          9 7          K R   R   Ј<      	     
-     
-P  J   $0H`l4mesh3          9 7          [ R   R   Ј<      	     
-     
-P  J   $0H`l4mesh3          9 7          P R   R   Ѐ<           	     	@  J   $0H`l4mesh3          9 7          o       Ԁ               H R   R   Ѐ<      	     
-     
-`  J   $0H`l4mesh3          9 7          J R   R   Ј<      	     
-     
-`  J   $0H`l4mesh3          9 7          JK R   R   Ј<      	     
-     
-`  J   $0H`l4mesh3          9 7          cL R   R   Ј<      	     
-     
-`  J   $0H`l4mesh3          9 7          M R   R   Ј<      	     
-     
-`  J   $0H`l4mesh3          9 7          N R   R   Ј<      	     
-     
-`  J   $0H`l4mesh3          9 7          O R   R   Ј<      	     
-     
-`  J   $0H`l4mesh3          9 7          P 2   2   Ѐ<      	     
-     
-p J 4mesh 7            3Q       Ԁ       
-        g 2   2   Ѐ<           	     	P J 4mesh 7           h       Ԁ                A   A          
-     
-          $0H`l4mesh        č R   R   Ѐ<      
-     	     	`  J   $0H`l4mesh3          9 7          ԍ       Ԁ       	        " 2   2   Ѐ<      	     
-     
- J 4mesh 7                  Ԁ       
-        K 2   2   Ѐ<      
-     	     	p J 4mesh 7           [       Ԁ       	         <   <          	     	          $0H`l 4mesh        6 R   R   Ѐ<      	     
-     
-  J   $0H`l4mesh3          9 7          F R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7          z  R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7          ! R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7          " R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7          # R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7          $ R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7          p7 R   R   Ѐ<           	     	  J   $0H`l4mesh3          9 7          8       Ԁ              {  R   R   Ѐ<      	     
-     
-  J   $0H`l4mesh3          9 7         |  R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7         }  R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7         ~  R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7           R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7           R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7           R   R   Ј<      	     
-     
-  J   $0H`l4mesh3          9 7           2   2   Ѐ<      	     
-     
- J 4mesh 7                   Ԁ       
-       o  2   2   Ѐ<           	     	 J 4mesh 7          J  2   2   Ј<           	     	 J 4mesh 7          A        Ԁ                A   A          
-     
- 1         $0H`l4mesh         R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3          9 7                 Ԁ       	         2   2   Ѐ<      	     
-     
- J 4mesh 7                  Ԁ       
-       "  2   2   Ѐ<      
-     	     	 J 4mesh 7          2        Ԁ       	       U       Ԁ              V P   P   Ѐ<           	     	 J    $0H`l3          9 7         zW R   R   Ѐ<           	     	  J   $0H`l4mesh3          9 7         X       Ԁ              d <   <          
-     
-          $0H`l 4mesh        A   A          	     	 7         $0H`l4mesh       > R   R   Ѐ<      	     
-     
-  J   $0H`l4mesh3          9 7                Ԁ       
-        P   P   Ѐ<      
-     	     	J    $0H`l3         9 7                Ԁ       	        R   R   Ѐ<      
-     	     	  J   $0H`l4mesh3         9 7                Ԁ       	       	 P   P   Ѐ<      	     
-     
-J    $0H`l3         9 7                Ԁ       
-         L   L          
-      
+          $0H`lxrmesh         F   F          	     	@         $0H`lx
+hrmesh       3  L   L          
+      
                 
 
 
-         L   L          	0     
+       _	  L   L          	P     
                
 
 
-         A   A          
-     
-0	         $0H`l84mesh       U F   F          	     	@%         $0H`l
-4mesh        A   A          
-     
-@)!'         $0H`l%4mesh       $ F   F          	     	P+z-         $0H`l
-R&!'4mesh           L   L          
-P     
-                
-
-
-       ,  L   L          	`     
-               
-
-
-         E   E   Ѐ       	     	p  D%                     
-             ?   ?   Ѐ<      	     
+         E   E   Ѐ       	     	`%                     
+              ?   ?   Ѐ<      	     
      
-`  E                      
-          v        Ԁ       
-       	  ?   ?   Ѐ<           	     	  E                   
-                  Ԁ                L   L   <      
+                       
+                  Ԁ       
+       7  ?   ?   Ѐ<           	     	p                   
+                  Ԁ                L   L   <      
      	     
-                     
+                     
      
 
-               Ԁ       	         `   `   <      	     
-     p     
+               Ԁ       	       ;  `   `   <      	     
+           
           E  0    @  
 
- 	                                      Ԁ       
-         `   `   <           	          
+ 	                                      Ԁ       
+         `   `   <           	          
          E  0    @  
 
- 	                              n  `   `   <      	     
-          
-          E  0   @  
-
- 	                                `   `   <      	     
-          
+ 	                              7  L   L          	                    
+
+       7  L   L   <      	     
+           
+                 
+
+     
+       H9  L   L   <           	          
+                
+
+     
+        :  L   L   <      	     
+           
+                 
+
+     
+       <  L   L   <      	     
+           
+                 
+
+     
+       2A  L   L   <      	     
+           
+                 
+
+     
+       C        Ԁ              DD  `   `   <      
+     	     
+              E  0    @  
+
+ 	                              TD        Ԁ       	       K  L   L   <      	     
+           
+                 
+
+     
+       K        Ԁ       
+       &L  L   L          
+                     
+
+         A   A          
+     
+ 	p         $0H`lxrmesh         `   `   <      	     
+          
           E  0   @  
 
- 	                                      Ԁ       
-       e  `   `   <           	          
+ 	                                     Ԁ       
+        `   `   <           	          
          E  0   @  
 
- 	                              /  `   `   <      	     
-          
-          E  0   @  
-
- 	                              '  `   `   <      	     
-          
-          E  0   @  
-
- 	                                      Ԁ       
-         `   `   <           	          
-         E  0   @  
-
- 	                                A   A          
-     
-I.         $0H`lz-4mesh       U F   F          	     	K5         $0H`l
--.4mesh         `   `   <      	     
-          
-          E  0   @  
-
- 	                               `   `   <      	     
-          
-          E  0   @  
-
- 	                              T       Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                               A   A          
-     
-ic6         $0H`l54mesh       }       Ԁ               6   6   Ѐ<      
-     	     	  F                               Ԁ       	        2   2   Ѐ<           	     	 J 4mesh 7          o       Ԁ               2   2   Ѐ<           	     	 J 4mesh 7                 Ԁ                  E   E   Ѐ       
-     
-  D%           
-                           A   A          
-     
->         $0H`l54mesh          E   E   Ѐ       
-     
-  D%           
-                         8! E   E   Ѐ       	     	0  D%         
-     h                   R 2   2   Ѐ<      	     
+ 	                                     Ԁ               `   `   <      
+     	     
+              E  0   @  
+
+ 	                              ˯       Ԁ       	       . -   -   Ѐ<      
+     	     	 rmeshu  4        >       Ԁ       	        -   -   Ѐ<      	     
      
- J 4mesh 7          ]S       Ԁ       
-       T 2   2   Ј<      
-     	     	@J 4mesh 7          T       Ԁ       	       RU A   A          	     	P]D         $0H`l>4mesh       }U R   R   Ѐ<      	     
+ rmeshu  7               Ԁ       
+        A   A          
      
- J   $0H`l4mesh3          9 7         V R   R   Ј<      	     
+0)'         $0H`lxrmesh        >   >   Ѐ<      
+     	     	  $0H`lrmeshq  9u               Ԁ       	        -   -   Ѐ<      	     
      
- J   $0H`l4mesh3          9 7         W R   R   Ј<      	     
+@rmeshu  4               Ԁ       
+        -   -   Ѐ<      
+     	     	 rmeshu  7               Ԁ       	       A /   /   Ѐ<           	     	0       
+                E   E   Ѐ       
      
- J   $0H`l4mesh3          9 7         X R   R   Ј<      	     
+P%           
+                         5        Ԁ                -   -   Ѐ<           	     	@rmeshu  7          A   A          	     	P+-         $0H`lx-rmesh         >   >   Ѐ<      	     
      
- J   $0H`l4mesh3          9 7         Y R   R   Ј<      	     
+`  $0H`lrmeshq   9u        	  >   >   Ј<      	     
      
- J   $0H`l4mesh3          9 7         Z R   R   Ј<      	     
+`  $0H`lrmeshq   9u        	  >   >   Ј<      	     
      
- J   $0H`l4mesh3          9 7         %\ R   R   Ј<      	     
+`  $0H`lrmeshq   9u        
+  >   >   Ј<      	     
      
- J   $0H`l4mesh3          9 7         J R   R   Ј<           	     	` J   $0H`l4mesh3          9 7         i       Ԁ              R R   R   Ѐ<      	     
+`  $0H`lrmeshq   9u          >   >   Ј<      	     
      
-  J   $0H`l4mesh3          9 7         G R   R   Ј<      	     
+`  $0H`lrmeshq   9u          >   >   Ј<      	     
      
-  J   $0H`l4mesh3          9 7         { R   R   Ј<      	     
+`  $0H`lrmeshq   9u          >   >   Ј<      	     
      
-  J   $0H`l4mesh3          9 7          R   R   Ј<      	     
+`  $0H`lrmeshq   9u        D        Ԁ       
+         <   <   Ѐ<      
+     	     	`   $0H`lq   9u                 Ԁ       	         >   >   Ј<      
+     	     	p  $0H`lrmeshq   9u                Ԁ       	         <   <   Ѐ<      	     
      
-  J   $0H`l4mesh3          9 7         w R   R   Ј<      	     
+p   $0H`lq  9u                 Ԁ       
+               Ԁ                <   <   Ѐ<           	     	   $0H`lq  9u	                 Ԁ                A   A          
      
-  J   $0H`l4mesh3          9 7         u R   R   Ј<      	     
+I.         $0H`lx-rmesh        <   <   Ѐ<      
+     	     	                              !       Ԁ       	          E   E   Ѐ       
      
-  J   $0H`l4mesh3          9 7          R   R   Ј<      	     
+%           
+                         8! E   E   Ѐ       	     	%         
+                        "       Ԁ              " ?   ?   Ѐ<      
+     	     	      
+     f                 "       Ԁ       	       " `   `   <      	     
+          
+          E  0   @  
+
+ 	                              $ `   `   <      	     
+          
+          E  0   @  
+
+ 	                              & `   `   <      	     
+          
+          E  0   @  
+
+ 	                              ( `   `   <           	          
+         E  0   @  
+
+ 	                              * `   `   <      	     
+          
+          E  0   @  
+
+ 	                              -       Ԁ              - ?   ?   Ѐ<      
+     	     	      
+                      -       Ԁ       	       5 `   `   <      	     
+          
+          E  0   @  
+
+ 	                              6       Ԁ       
+       T9       Ԁ              < `   `   <      
+     	     
+              E  0   @  
+
+ 	                              <       Ԁ       	       | A   A          	     	 KC5         $0H`lx.rmesh         `   `   <      	     
+          
+          E  0   @  
+
+ 	                                     Ԁ       
+        `   `   <           	          
+         E  0   @  
+
+ 	                              H       Ԁ               `   `   <      
+     	     
+               E  0   @  
+
+ 	                                     Ԁ       	        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   @  
+
+ 	                              	       Ԁ              	 `   `   <      
+     	     
+              E  0   @  
+
+ 	                              	       Ԁ       	       	       Ԁ              	 `   `   <      
+     	     
+              E  0   @  
+
+ 	                              	       Ԁ       	       $ F   F          	     	&L         $0H`lx
+EDrmesh           `   `   <      	     
+     0     
+          E  0   @  
+
+ 	                                       Ԁ       
+         `   `   <           	          
+         E  0   @  
+
+ 	                              	  `   `   <           	          
+         E  0   @  
+
+ 	                                `   `   <           	          
+         E  0   @  
+
+ 	                                `   `   <           	          
+         E  0   @  
+
+ 	                                `   `   <           	          
+         E  0   @  
+
+ 	                                A   A          
      
-  J   $0H`l4mesh3          9 7          2   2   Ѐ<      	     
+@:M         $0H`lx'Lrmesh       } F   F          	     	S         $0H`lx
+;MGLrmesh         `   `   <      	     
+     P     
+          E  0   @  
+
+ 	                                     Ԁ       
+        `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                               `   `   <           	           
+         E  0   @  
+
+ 	                              v `   `   <           	           
+         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          
      
-0J 4mesh 7           I       Ԁ       
-       ( 2   2   Ѐ<           	     	pJ 4mesh 7 	         )       Ԁ              d A   A          
+`T         $0H`lxSrmesh        A   A          	     	0h[         $0H`lx;Mrmesh           E   E   Ѐ       
      
-@mE         $0H`l^D4mesh       e R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3          9 7 	        e       Ԁ       	       "f 2   2   Ѐ<      	     
+p%           
+                         8  E   E   Ѐ       	     	@%         
+                          -   -   Ѐ<      
+     	     	Prmeshu  4                Ԁ       	       l  -   -   Ѐ<      	     
      
-PJ 4mesh 7 	         f       Ԁ       
-       Tg 2   2   Ѐ<      
-     	     	J 4mesh 7	          dg       Ԁ       	         E   E   Ѐ       
+rmeshu  7        l  -   -   Ј<      	     
      
-`  D%           
-                                Ԁ               P   P   Ѐ<           	     	J   	 $0H`l3          9 7
- 
-         R   R   Ѐ<           	     	 J   $0H`l4mesh3          9 7 
-               Ԁ                <   <          
+rmeshu  7                Ԁ       
+         A   A          
      
-pL         $0H`l 4mesh         R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3         9 7                 Ԁ       	         P   P   Ѐ<      	     
+	}\         $0H`lxi[rmesh         >   >   Ѐ<      
+     	     	`  $0H`lrmeshq   9u
+        %        Ԁ       	         -   -   Ѐ<      	     
      
-J    $0H`l3          9 7                 Ԁ       
-       ݝ  R   R   Ѐ<      	     
+rmeshu 
+ 4                Ԁ       
+         -   -   Ѐ<      
+     	     	prmeshu
+  7                Ԁ       	          E   E   Ѐ       
      
- J   $0H`l4mesh3          9 7                 Ԁ       
-       Z  P   P   Ѐ<      
-     	     	J   
- $0H`l3         9 7         j        Ԁ       	       U F   F          	     	˟S         $0H`l
-	/L
-L4mesh       < A   A          
+%           
+                         T <   <          	     	b         $0H`lx rmesh       U >   >   Ѐ<      	     
      
-T         $0H`lS4mesh       	 E   E   Ѐ       
+  $0H`lrmeshq   9u        U       Ԁ       
+       IV <   <   Ѐ<      
+     	     	  
+ $0H`lq   9u         YV       Ԁ       	       W >   >   Ѐ<      
+     	     	  $0H`lrmeshq   9u        $W       Ԁ       	       rW <   <   Ѐ<      	     
      
-  D%           
-                         	 E   E   Ѐ       	     	   D%         
-                        $ F   F          	     	@[         $0H`l
-	/L
-T4mesh       $ 2   2   Ѐ<           	     	 J 4mesh 7
- 
-         % 2   2   Ј<           	     	 J 4mesh 7
- 
-         & 2   2   Ј<           	     	 J 4mesh 7
- 
-         X' 2   2   Ј<           	     	 J 4mesh 7
- 
-         `( 2   2   Ј<           	     	 J 4mesh 7
- 
-         2) 2   2   Ј<           	     	 J 4mesh 7
- 
-         * 2   2   Ј<           	     	 J 4mesh 7
- 
-           A   A          
+   $0H`lq  9u         X       Ԁ       
+       d A   A          
      
-	)\         $0H`lA[4mesh       T A   A          	     	0b         $0H`l
-)\4mesh       < A   A          
+)c         $0H`lxbrmesh         E   E   Ѐ       
      
-)c         $0H`lb4mesh        A   A          	     	@+j         $0H`l
-c4mesh           E   E   Ѐ       
+%           
+	                         8 E   E   Ѐ       	     	%         
+	                         A   A          	     	+j         $0H`lx
+crmesh         A   A          
      
-  D%           
-                         8  E   E   Ѐ       	     	P  D%         
-                          A   A          
+ Ik         $0H`lxjrmesh       T A   A          	     	K$r         $0H`lx
+krmesh       d A   A          
      
-Ikk         $0H`lj4mesh          E   E   Ѐ       
+i4s         $0H`lx$rrmesh       	 E   E   Ѐ       
      
-   D%           
-                         8! E   E   Ѐ       	     	`  D%         
-                        T A   A          	     	pK$r         $0H`l
-kk4mesh       < A   A          
+ %           
+
+                          A   A          	     	ky         $0H`lx
+4srmesh         A   A          
      
-is         $0H`l$r4mesh         E   E   Ѐ       
+0z         $0H`lxyrmesh       T A   A          	     	 f         $0H`lx
+zrmesh       d A   A          
      
-   D%           
-	                         8 E   E   Ѐ       	     	  D%         
-	                         A   A          	     	ky         $0H`l
-s4mesh         A   A          
+@v         $0H`lxfrmesh        A   A          	     	         $0H`lx
+zrmesh    	       E   E   Ѐ       
      
-0z         $0H`ly4mesh       T A   A          	     	f         $0H`l
-s4mesh       6; 2   2   Ѐ<      
-     	     	J 4mesh 7          F;       Ԁ       	       ; 2   2   Ѐ<      	     
+P%   	        
+                      	   8  E   E   Ѐ       	     	 % 	        
+                     	     -   -   Ѐ<      
+     	     	0rmeshu  4     	           Ԁ       	    	   l  -   -   Ѐ<      	     
      
-@J 4mesh 7          -<       Ԁ       
-       < A   A          
+`rmeshu  7     	           Ԁ       
+    	     A   A          
      
-PN         $0H`lf4mesh       = R   R   Ѐ<      
-     	     	 J   $0H`l4mesh3          9 7         =       Ԁ       	       "> 2   2   Ѐ<      	     
+p         $0H`lxrmesh    	     >   >   Ѐ<      
+     	     	@  $0H`lrmeshq   9u     	           Ԁ       	    	     -   -   Ѐ<      	     
      
-`J 4mesh 7          >       Ԁ       
-       9? 2   2   Ѐ<      
-     	     	J 4mesh 7          I?       Ԁ       	       	 E   E   Ѐ       
+rmeshu  4     	   w        Ԁ       
+    	     -   -   Ѐ<      
+     	     	Prmeshu  7     	           Ԁ       	    	      E   E   Ѐ       
      
-p  D%           
-
-                          <   <          	     	         $0H`l 4mesh       6 R   R   Ѐ<      	     
+%   
+        
+                      	   L <   <          	     	`ˠ         $0H`lx rmesh    	   M >   >   Ѐ<      	     
      
- J   $0H`l4mesh3          9 7                Ԁ       
-        P   P   Ѐ<      
-     	     	J    $0H`l3          9 7                Ԁ       	        R   R   Ј<      
-     	     	  J   $0H`l4mesh3          9 7                Ԁ       	        P   P   Ѐ<      	     
+  $0H`lrmeshq   9u     	   M       Ԁ       
+    	   O <   <   Ј<      
+     	     	p   $0H`lq   9u      	   $O       Ԁ       	    	   O >   >   Ѐ<      
+     	     	  $0H`lrmeshq   9u     	   
+P       Ԁ       	    	   XP <   <   Ѐ<      	     
      
-J    $0H`l3         9 7                Ԁ       
-    	     A   A          
+   $0H`lq  9u      	   P       Ԁ       
+    	    A   A          
      
-         $0H`l 4mesh    	   L A   A          	     	ˠ         $0H`l4mesh    	   P A   A          
+         $0H`lxrmesh    	     E   E   Ѐ       
      
-餑         $0H`l4mesh    	    A   A          	     	 A         $0H`l4mesh    
\ No newline at end of file
+%           
+                      	   8 E   E   Ѐ       	     	%         
+                     	    A   A          	     	A         $0H`lxrmesh    
\ No newline at end of file
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-simplest-regression-test-0-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,9 +1,9 @@
-ò            i         <   <                           $0H`l 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3          9 7                  Ԁ                 R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               JO A   A                 JO         $0H`l  4mesh        #j A   A               0 i         $0H`l O4mesh        j A   A               0 j         $0H`l j4mesh         A   A               @ 
-         $0H`l 4mesh       JO A   A               @          $0H`l 4mesh       #j A   A               P          $0H`l 4mesh       j A   A               P 2         $0H`l 4mesh       #  L   L          `                      
+ò            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          `                      
 
        #  L   L          `                     
 
-       $  E   E   Ѐ            p   D%                                    %  ?   ?   Ѐ<                p   E                                %        Ԁ              &  L   L   <                                       
+       $  E   E   Ѐ            p %                                    %  ?   ?   Ѐ<                p                                 %        Ԁ              &  L   L   <                                       
      
        &        Ԁ              (        <                                E      @  
 
@@ -19,7 +19,7 @@
 
  	 l                                                                                                             d        Ԁ                      <                                E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                M         $0H`l 34mesh       JO A   A                         $0H`l M4mesh              <                                E     @  
+ 	 l                                                                                                                     Ԁ                A   A                M         $0H`lx 3rmesh       JO A   A                         $0H`lx Mrmesh              <                                E     @  
 
  	 l                                                                                                                    Ԁ                     <                                E     @  
 
@@ -61,7 +61,7 @@
 
  	 l                                                                                                             4e       Ԁ              e       <                `               E     @  
 
- 	 l                                                                                                             {f       Ԁ              #j A   A               p3&         $0H`l 4mesh       j A   A               pt'         $0H`l &4mesh       t(	       <                               E     @  
+ 	 l                                                                                                             {f       Ԁ              #j A   A               p3&         $0H`lx rmesh       j A   A               pt'         $0H`lx &rmesh       t(	       <                               E     @  
 
  	 l                                                                                                             (	       Ԁ              (	       <                               E     @  
 
@@ -105,8 +105,8 @@
 
  	 l                                                                                                                     Ԁ              C        <                               E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                S.         $0H`l u'4mesh       JO A   A                
-/         $0H`l .4mesh       ,       <                0               E     @  
+ 	 l                                                                                                                     Ԁ                A   A                S.         $0H`lx u'rmesh       JO A   A                
+/         $0H`lx .rmesh       ,       <                0               E     @  
 
  	 l                                                                                                             <       Ԁ                     <                0               E     @  
 
@@ -146,7 +146,7 @@
 
  	 l                                                                                                             d       Ԁ              ;e       <                               E     @  
 
- 	 l                                                                                                             e       Ԁ              #j A   A               s06         $0H`l /4mesh       j A   A               *6         $0H`l 064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      @  
 
@@ -190,7 +190,7 @@
 
  	 l                                                                                                                     Ԁ                      <                p               E   )  @  
 
- 	 l                                                                                                                     Ԁ                A   A               =         $0H`l 64mesh       JO A   A               JX>         $0H`l =4mesh              <                               E   *  @  
+ 	 l                                                                                                                     Ԁ                A   A               =         $0H`lx 6rmesh       JO A   A               JX>         $0H`lx =rmesh              <                               E   *  @  
 
  	 l                                                                                                                     Ԁ              W       <                               E   *  @  
 
@@ -230,7 +230,7 @@
 
  	 l                                                                                                             d       Ԁ              e       <                                E   3  @  
 
- 	 l                                                                                                             e       Ԁ              #j A   A               0rE         $0H`l X>4mesh       j A   A               0jE         $0H`l sE4mesh       '	       <                @               E   4  @  
+ 	 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                                                                                                             (	       Ԁ              c(	       <                @               E   4  @  
 
@@ -274,7 +274,7 @@
 
  	 l                                                                                                                     Ԁ                      <                               E   =  @  
 
- 	 l                                                                                                             [        Ԁ                A   A               M         $0H`l E4mesh       JO A   A               M         $0H`l M4mesh       Ԇ       <                               E   >  @  
+ 	 l                                                                                                             [        Ԁ                A   A               M         $0H`lx Ermesh       JO A   A               M         $0H`lx Mrmesh       Ԇ       <                               E   >  @  
 
  	 l                                                                                                                    Ԁ              ;       <                               E   >  @  
 
@@ -314,7 +314,7 @@
 
  	 l                                                                                                             d       Ԁ              e       <                               E   G  @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               T         $0H`l M4mesh       j A   A               ;U         $0H`l T4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  @  
 
@@ -358,7 +358,7 @@
 
  	 l                                                                                                                     Ԁ                      <                0               E   Q  @  
 
- 	 l                                                                                                             S        Ԁ                A   A               @V\         $0H`l <U4mesh       JO A   A               @\         $0H`l V\4mesh       І       <                P               E   R  @  
+ 	 l                                                                                                             S        Ԁ                A   A               @V\         $0H`lx <Urmesh       JO A   A               @\         $0H`lx V\rmesh       І       <                P               E   R  @  
 
  	 l                                                                                                                    Ԁ              7       <                P               E   R  @  
 
@@ -398,7 +398,7 @@
 
  	 l                                                                                                             d       Ԁ              e       <                               E   [  @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               3c         $0H`l \4mesh       j A   A               }d         $0H`l c4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   \  @  
 
@@ -442,12 +442,12 @@
 
  	 l                                                                                                                     Ԁ                      <                               E   e  @  
 
- 	 l                                                                                                             S        Ԁ                A   A               Sk         $0H`l ~d4mesh       JO A   A               
-l         $0H`l k4mesh       І       <                               E   f  @  
+ 	 l                                                                                                             S        Ԁ                A   A               Sk         $0H`lx ~drmesh       JO A   A               
+l         $0H`lx krmesh       І       <                               E   f  @  
 
  	 l                                                                                                                    Ԁ              7       <                               E   f  @  
 
- 	 l                                                                                                                    Ԁ              dJ E   E   Ѐ              D%                                   J ?   ?   Ѐ<                  E                                J       Ԁ              =K       <                               E   g  @  
+ 	 l                                                                                                                    Ԁ              dJ E   E   Ѐ            %                                   J ?   ?   Ѐ<                                                J       Ԁ              =K       <                               E   g  @  
 
  	 l                                                                                                             MK       Ԁ              K       <                               E   g  @  
 
@@ -483,7 +483,7 @@
 
  	 l                                                                                                             d       Ԁ              e       <                P               E   o  @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               `s9s         $0H`l l4mesh       j A   A               `*s         $0H`l 9s4mesh       '	       <                p               E   p  @  
+ 	 l                                                                                                             se       Ԁ              #j A   A               `s9s         $0H`lx lrmesh       j A   A               `*s         $0H`lx 9srmesh       '	       <                p               E   p  @  
 
  	 l                                                                                                              (	       Ԁ              W(	       <                p               E   p  @  
 
@@ -527,7 +527,7 @@
 
  	 l                                                                                                                     Ԁ                      <                 	               E   y  @  
 
- 	 l                                                                                                             S        Ԁ                A   A               	z         $0H`l s4mesh       JO A   A               	Ja{         $0H`l z4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  @  
 
@@ -567,7 +567,7 @@
 
  	 l                                                                                                             d       Ԁ              e       <                	               E     @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               	{         $0H`l a{4mesh       j A   A               	j         $0H`l |4mesh       '	       <                	               E     @  
+ 	 l                                                                                                             se       Ԁ              #j A   A               	{         $0H`lx a{rmesh       j A   A               	j         $0H`lx |rmesh       '	       <                	               E     @  
 
  	 l                                                                                                              (	       Ԁ              W(	       <                	               E     @  
 
@@ -626,8 +626,8 @@
                E     @  
 
  	 l                                                                                                          	   S        Ԁ           	     A   A               p
-         $0H`l 4mesh    	   JO A   A               p
-         $0H`l 4mesh    	   І       <                
+         $0H`lx rmesh    	   JO A   A               p
+         $0H`lx rmesh    	   І       <                
                E     @  
 
  	 l                                                                                                          	          Ԁ           	   7       <                
@@ -683,7 +683,7 @@
 
  	 l                                                                                                          	   d       Ԁ           	   e       <                               E     @  
 
- 	 l                                                                                                          	   se       Ԁ           	   #j A   A                         $0H`l 4mesh    	   j A   A                D         $0H`l 4mesh    	   '	       <                0               E     @  
+ 	 l                                                                                                          	   se       Ԁ           	   #j A   A                         $0H`lx rmesh    	   j A   A                D         $0H`lx rmesh    	   '	       <                0               E     @  
 
  	 l                                                                                                          	    (	       Ԁ           	   W(	       <                0               E     @  
 
@@ -720,13 +720,13 @@
  	 l                                                                                                          	   0       Ԁ           	          <                               E     @  
 
  	 l                                                                                                          	          Ԁ           
-   JO A   A                        $0H`l 4mesh    
-   g 2   2   Ѐ<                J 4mesh 7       
-   h 2   2   Ј<                J 4mesh 7       
-   ai 2   2   Ј<                J 4mesh 7       
-   $j 2   2   Ј<                J 4mesh 7       
-   j 2   2   Ј<                J 4mesh 7       
-   k 2   2   Ј<                J 4mesh 7       
-   [l 2   2   Ј<                J 4mesh 7       
-   j A   A               ꆡ         $0H`l 4mesh       J/ <   <               
-         $0H`l 4mesh       j <   <               *Ѱ         $0H`l 4mesh       J7 <   <                JR         $0H`l 4mesh       j <   <               j߿         $0H`l 4mesh       J  <   <                H         $0H`l 4mesh       j <   <               0         $0H`l 4mesh       J  <   <               @ʒ         $0H`l 4mesh       j <   <               PK         $0H`l 4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 <   <               0         $0H`lx rmesh       J  <   <               @ʒ         $0H`lx rmesh       j <   <               PK         $0H`lx rmesh    
\ No newline at end of file
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-simplest-regression-test-1-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,9 +1,9 @@
-ò            i         <   <                           $0H`l 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3          9 7                  Ԁ                 R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ               a  P   P   Ѐ<                 J     $0H`l3         9 7          q        Ԁ               O A   A                 JO         $0H`l  4mesh        i A   A               0 i         $0H`l O4mesh         A   A               0 j         $0H`l j4mesh         A   A               @ 
-         $0H`l 4mesh       O A   A               @          $0H`l 4mesh       i A   A               P          $0H`l 4mesh        A   A               P 2         $0H`l 4mesh       (#  L   L          `                      
+ò            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          `                      
 
        S$  L   L          `                     
 
-       %  E   E   Ѐ            p   D%                                    8%  ?   ?   Ѐ<                p   E                                %        Ԁ              &  L   L   <                                       
+       %  E   E   Ѐ            p %                                    8%  ?   ?   Ѐ<                p                                 %        Ԁ              &  L   L   <                                       
      
        &        Ԁ              '        <                                E      @  
 
@@ -20,7 +20,7 @@
 
  	 l                                                                                                                     Ԁ                      <                                E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                M         $0H`l 34mesh       O A   A                         $0H`l M4mesh              <                                E     @  
+ 	 l                                                                                                                     Ԁ                A   A                M         $0H`lx 3rmesh       O A   A                         $0H`lx Mrmesh              <                                E     @  
 
  	 l                                                                                                                    Ԁ                     <                                E     @  
 
@@ -62,7 +62,7 @@
 
  	 l                                                                                                             `e       Ԁ              ?f       <                `               E     @  
 
- 	 l                                                                                                             Of       Ԁ              i A   A               p3&         $0H`l 4mesh        A   A               pt'         $0H`l &4mesh       '	       <                               E     @  
+ 	 l                                                                                                             Of       Ԁ              i A   A               p3&         $0H`lx rmesh        A   A               pt'         $0H`lx &rmesh       '	       <                               E     @  
 
  	 l                                                                                                             (	       Ԁ              )	       <                               E     @  
 
@@ -106,8 +106,8 @@
 
  	 l                                                                                                                     Ԁ                      <                               E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                S.         $0H`l u'4mesh       O A   A                
-/         $0H`l .4mesh              <                0               E     @  
+ 	 l                                                                                                                     Ԁ                A   A                S.         $0H`lx u'rmesh       O A   A                
+/         $0H`lx .rmesh              <                0               E     @  
 
  	 l                                                                                                             h       Ԁ                     <                0               E     @  
 
@@ -147,7 +147,7 @@
 
  	 l                                                                                                             e       Ԁ              e       <                               E     @  
 
- 	 l                                                                                                             e       Ԁ              i A   A               s06         $0H`l /4mesh        A   A               *6         $0H`l 064mesh       '	       <                               E      @  
+ 	 l                                                                                                             e       Ԁ              i A   A               s06         $0H`lx /rmesh        A   A               *6         $0H`lx 06rmesh       '	       <                               E      @  
 
  	 l                                                                                                             `(	       Ԁ              (	       <                               E      @  
 
@@ -191,7 +191,7 @@
 
  	 l                                                                                                                     Ԁ              W        <                p               E   )  @  
 
- 	 l                                                                                                             g        Ԁ                A   A               =         $0H`l 64mesh       O A   A               JX>         $0H`l =4mesh              <                               E   *  @  
+ 	 l                                                                                                             g        Ԁ                A   A               =         $0H`lx 6rmesh       O A   A               JX>         $0H`lx =rmesh              <                               E   *  @  
 
  	 l                                                                                                             ,       Ԁ                     <                               E   *  @  
 
@@ -231,7 +231,7 @@
 
  	 l                                                                                                             d       Ԁ              Oe       <                                E   3  @  
 
- 	 l                                                                                                             _e       Ԁ              i A   A               0rE         $0H`l X>4mesh        A   A               0jE         $0H`l sE4mesh       '	       <                @               E   4  @  
+ 	 l                                                                                                             _e       Ԁ              i A   A               0rE         $0H`lx X>rmesh        A   A               0jE         $0H`lx sErmesh       '	       <                @               E   4  @  
 
  	 l                                                                                                             8(	       Ԁ              (	       <                @               E   4  @  
 
@@ -275,7 +275,7 @@
 
  	 l                                                                                                                     Ԁ                      <                               E   =  @  
 
- 	 l                                                                                                             /        Ԁ                A   A               M         $0H`l E4mesh       O A   A               M         $0H`l M4mesh              <                               E   >  @  
+ 	 l                                                                                                             /        Ԁ                A   A               M         $0H`lx Ermesh       O A   A               M         $0H`lx Mrmesh              <                               E   >  @  
 
  	 l                                                                                                                    Ԁ              o       <                               E   >  @  
 
@@ -315,7 +315,7 @@
 
  	 l                                                                                                             d       Ԁ              7e       <                               E   G  @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               T         $0H`l M4mesh        A   A               ;U         $0H`l T4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  @  
 
@@ -359,7 +359,7 @@
 
  	 l                                                                                                                     Ԁ                      <                0               E   Q  @  
 
- 	 l                                                                                                             '        Ԁ                A   A               @V\         $0H`l <U4mesh       O A   A               @\         $0H`l V\4mesh              <                P               E   R  @  
+ 	 l                                                                                                             '        Ԁ                A   A               @V\         $0H`lx <Urmesh       O A   A               @\         $0H`lx V\rmesh              <                P               E   R  @  
 
  	 l                                                                                                                    Ԁ              g       <                P               E   R  @  
 
@@ -399,7 +399,7 @@
 
  	 l                                                                                                             d       Ԁ              7e       <                               E   [  @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               3c         $0H`l \4mesh        A   A               }d         $0H`l c4mesh       '	       <                                E   \  @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A               3c         $0H`lx \rmesh        A   A               }d         $0H`lx crmesh       '	       <                                E   \  @  
 
  	 l                                                                                                             ,(	       Ԁ              (	       <                                E   \  @  
 
@@ -443,12 +443,12 @@
 
  	 l                                                                                                                     Ԁ                      <                               E   e  @  
 
- 	 l                                                                                                             '        Ԁ                A   A               Sk         $0H`l ~d4mesh       O A   A               
-l         $0H`l k4mesh              <                               E   f  @  
+ 	 l                                                                                                             '        Ԁ                A   A               Sk         $0H`lx ~drmesh       O A   A               
+l         $0H`lx krmesh              <                               E   f  @  
 
  	 l                                                                                                                    Ԁ              g       <                               E   f  @  
 
- 	 l                                                                                                             w       Ԁ              I E   E   Ѐ              D%                                   J ?   ?   Ѐ<                  E                                J       Ԁ              K       <                               E   g  @  
+ 	 l                                                                                                             w       Ԁ              I E   E   Ѐ            %                                   J ?   ?   Ѐ<                                                J       Ԁ              K       <                               E   g  @  
 
  	 l                                                                                                             yK       Ԁ              K       <                               E   g  @  
 
@@ -484,7 +484,7 @@
 
  	 l                                                                                                             d       Ԁ              7e       <                P               E   o  @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               `s9s         $0H`l l4mesh        A   A               `*s         $0H`l 9s4mesh       '	       <                p               E   p  @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A               `s9s         $0H`lx lrmesh        A   A               `*s         $0H`lx 9srmesh       '	       <                p               E   p  @  
 
  	 l                                                                                                             ,(	       Ԁ              (	       <                p               E   p  @  
 
@@ -528,7 +528,7 @@
 
  	 l                                                                                                                     Ԁ                      <                 	               E   y  @  
 
- 	 l                                                                                                             '        Ԁ                A   A               	z         $0H`l s4mesh       O A   A               	Ja{         $0H`l z4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  @  
 
@@ -568,7 +568,7 @@
 
  	 l                                                                                                             d       Ԁ              7e       <                	               E     @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               	{         $0H`l a{4mesh        A   A               	j         $0H`l |4mesh       '	       <                	               E     @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A               	{         $0H`lx a{rmesh        A   A               	j         $0H`lx |rmesh       '	       <                	               E     @  
 
  	 l                                                                                                             ,(	       Ԁ              (	       <                	               E     @  
 
@@ -627,8 +627,8 @@
                E     @  
 
  	 l                                                                                                          	   '        Ԁ           	     A   A               p
-         $0H`l 4mesh    	   O A   A               p
-         $0H`l 4mesh    	          <                
+         $0H`lx rmesh    	   O A   A               p
+         $0H`lx rmesh    	          <                
                E     @  
 
  	 l                                                                                                          	          Ԁ           	   g       <                
@@ -684,7 +684,7 @@
 
  	 l                                                                                                          	   d       Ԁ           	   7e       <                               E     @  
 
- 	 l                                                                                                          	   Ge       Ԁ           	   i A   A                         $0H`l 4mesh    	    A   A                D         $0H`l 4mesh    	   '	       <                0               E     @  
+ 	 l                                                                                                          	   Ge       Ԁ           	   i A   A                         $0H`lx rmesh    	    A   A                D         $0H`lx rmesh    	   '	       <                0               E     @  
 
  	 l                                                                                                          	   ,(	       Ԁ           	   (	       <                0               E     @  
 
@@ -751,7 +751,7 @@
    "        <                               E     @  
 
  	 l                                                                                                          
-     A   A               _         $0H`l E4mesh    
+     A   A               _         $0H`lx Ermesh    
            <                               E     @  
 
  	 l                                                                                                          
@@ -764,15 +764,15 @@
    K        <                               E     @  
 
  	 l                                                                                                          
-   l  2   2   Ѐ<                J 4mesh 7       
-   k  2   2   Ј<                J 4mesh 7       
-   j  2   2   Ј<                J 4mesh 7       
-   N  2   2   Ј<                J 4mesh 7       
-   D  2   2   Ј<                J 4mesh 7       
-     2   2   Ј<                J 4mesh 7       
-     2   2   Ј<                J 4mesh 7       
-    E   E   Ѐ              D%                                 
-    E   E   Ѐ               D%                                 
-   a <   <               3         $0H`l 4mesh    
-    E   E   Ѐ               D%                                      <   <               0Sm         $0H`l 4mesh       a <   <               @s:         $0H`l 4mesh       `D E   E   Ѐ            P  D%                                      <   <               `         $0H`l 4mesh       u <   <               p         $0H`l 4mesh        5 E   E   Ѐ              D%                                      E   E   Ѐ              D%           	                           <   <               Y         $0H`l 4mesh        <   <                        $0H`l 4mesh       r	 E   E   Ѐ              D%           
-                           <   <                        $0H`l 4mesh        E   E   Ѐ              D%   	                                 u <   <               3         $0H`l 4mesh    
\ No newline at end of file
+   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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,11 +1,11 @@
-ò            i       B  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          a        Ԁ               H        Ԁ                  P   P   Ѐ<                 J     $0H`l3         9 7            A   A                           $0H`l  4mesh        %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7                  Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               JO A   A                 JO         $0H`l  4mesh        +b F   F               P a         $0H`l
- 7O4mesh        j A   A               0 j         $0H`l b4mesh         F   F               `          $0H`l
- 4mesh       JO A   A               @          $0H`l 4mesh       +b F   F               p          $0H`l
- z4mesh       j A   A               P 2         $0H`l 4mesh         L   L                               
+ò            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                               
 
          L   L          `                     
 
-         E   E   Ѐ            p   D%                                      E   E   Ѐ               D%                                         Ԁ              =  ?   ?   Ѐ<                   E                             M        Ԁ                L   L   <                                       
+         E   E   Ѐ            p %                                      E   E   Ѐ             %                                         Ԁ              =  ?   ?   Ѐ<                                              M        Ԁ                L   L   <                                       
      
        a        Ԁ                L   L   <                                      
      
@@ -21,30 +21,28 @@
 
  	 l                                                                                                             "        Ԁ              #        <                               E      @  
 
- 	 l                                                                                                               F   F                E         $0H`l
- 34mesh       JO A   A                         $0H`l E4mesh       0 L   L                               
+ 	 l                                                                                                               F   F                E         $0H`lx
+ 3rmesh       JO A   A                         $0H`lx Ermesh       0 L   L                               
 
        1 L   L   <                                       
      
-        3 L   L   <                                       
-     
-       3       Ԁ              5       <                                E      @  
-
- 	 l                                                                                                             5       Ԁ              5 L   L                               
+       1       Ԁ              2 L   L                               
 
-       8 L   L                                
+       p4       <                                E      @  
+
+ 	 l                                                                                                             4       Ԁ              X8 L   L                                
 
-       : L   L   <                0                      
+       9 L   L   <                0                      
      
-       /:       Ԁ              F; L   L          @                    
+       9       Ԁ              : L   L          @                    
 
-       7<       <                                E      @  
+       ;       <                                E      @  
 
- 	 l                                                                                                             x=       Ԁ              g L   L                                
+ 	 l                                                                                                             <       Ԁ              g L   L                                
 
         L   L          P                    
 
-       O$       Ԁ              % E   E   Ѐ            `  D%              ,                  % ?   ?   Ѐ<                  E                                &       Ԁ              .' ?   ?   Ѐ<                p  E                             ( L   L   <                                     
+       O$       Ԁ              % E   E   Ѐ            `%              ,                  % ?   ?   Ѐ<                                                &       Ԁ              .' ?   ?   Ѐ<                p                             ( L   L   <                                     
      
        (       Ԁ              Q)       <                                E      @  
 
@@ -58,46 +56,46 @@
      
        M1       Ԁ              2 L   L   <                                     
      
-       2 L   L          @                    
+       2 L   L          @                    
 
        J7       Ԁ              y8       <                              E      @  
 
  
- l                                                                                                             8       Ԁ              +b F   F               3&         $0H`l
- &4mesh       j A   A               Pt'         $0H`l &4mesh       @        Ԁ              o        <                              E     @  
+ l                                                                                                             8       Ԁ              +b F   F               3&         $0H`lx
+ &rmesh       j A   A               Pt'         $0H`lx &rmesh       @        Ԁ              o        <                              E     @  
 
  	 l                                                                                                                     Ԁ                      <                `               E     @  
 
  	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                               F   F                S.         $0H`l
- ].u'4mesh       JO A   A               p
-/         $0H`l .4mesh              <                               E     @  
+ 	 l                                                                                                               F   F                S.         $0H`lx
+ ].u'rmesh       JO A   A               p
+/         $0H`lx .rmesh              <                               E     @  
 
  	 l                                                                                                                    Ԁ              [       <                               E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                             K       Ԁ                     <                               E     @  
 
  
- l                                                                                                                    Ԁ                     <                               E     @  
+ l                                                                                                             p       Ԁ                     <                               E     @  
 
  
- l                                                                                                             !       Ԁ              "       <                0              E     @  
+ l                                                                                                             /!       Ԁ              V"       <                0              E     @  
 
  
- l                                                                                                             "       Ԁ              +b F   F               @s(6         $0H`l
- 5/4mesh       j A   A               *6         $0H`l (64mesh       @        Ԁ                      <                P              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                                                                                                             /        Ԁ                      <                               E     @  
 
- 	 l                                                                                                                     Ԁ                      <                `              E     @  
+ 	 l                                                                                                             w        Ԁ                      <                `              E     @  
 
- 	 l                                                                                                               F   F               p=         $0H`l
- =64mesh       JO A   A               JX>         $0H`l =4mesh              <                               E     @  
+ 	 l                                                                                                               F   F               p=         $0H`lx
+ =6rmesh       JO A   A               JX>         $0H`lx =rmesh              <                               E     @  
 
  	 l                                                                                                                    Ԁ              [       <                               E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                             K       Ԁ                     <                               E     @  
 
  
  l                                                                                                             p       Ԁ              O       <                              E     @  
@@ -106,5 +104,5 @@
  l                                                                                                                     Ԁ              !       <                              E     @  
 
  
- l                                                                                                             !       Ԁ              +b F   F               jE         $0H`l
- @EX>4mesh       j A   A               jE         $0H`l kE4mesh    
\ No newline at end of file
+ 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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,16 +1,16 @@
-ò            i       %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          >&        Ԁ               7'        Ԁ               '  P   P   Ѐ<                 J     $0H`l3         9 7            A   A                 (          $0H`l $ 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ               %  P   P   Ѐ<                0 J    $0H`l3         9 7          5        Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ               {  P   P   Ѐ<                 J     $0H`l3         9 7          <        Ԁ                 A   A                           $0H`l  4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7                  Ԁ               	  R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ               t  P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               O A   A                 JO         $0H`l  4mesh        7 F   F               P H7         $0H`l
-  4mesh        a F   F               P a         $0H`l
- 7O4mesh         A   A               0 j         $0H`l b4mesh         F   F               ` h         $0H`l
- fb4mesh         F   F               `          $0H`l
- 4mesh       O A   A               @          $0H`l 4mesh       7 F   F               p y         $0H`l
- 4mesh       a F   F               p          $0H`l
- z4mesh        A   A               P 2         $0H`l 4mesh         L   L                                
+ò            i       %  >   >   Ѐ<                    $0H`lrmeshq   9u         &        Ԁ               &        Ԁ               v'  <   <   Ѐ<                     $0H`lq  9u            A   A                 (          $0H`lx $ rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u         c        Ԁ                 <   <   Ѐ<                0    $0H`lq  9u                  Ԁ                 >   >   Ѐ<                @   $0H`lrmeshq  9u         ǘ        Ԁ               '  <   <   Ѐ<                     $0H`lq  9u          ̙        Ԁ                 A   A                           $0H`lx  rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u                 Ԁ                 <   <   Ѐ<                0    $0H`lq  9u                  Ԁ                 >   >   Ѐ<                @   $0H`lrmeshq  9u         z        Ԁ                 <   <   Ѐ<                     $0H`lq  9u                  Ԁ               O A   A                 JO         $0H`lx  rmesh        7 F   F               P H7         $0H`lx
+  rmesh        a F   F               P a         $0H`lx
+ 7Ormesh         A   A               0 j         $0H`lx brmesh         F   F               ` h         $0H`lx
+ 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                                
 
        3  L   L                               
 
        ^  L   L          `                     
 
-       !  E   E   Ѐ            p   D%                                    p  E   E   Ѐ               D%                                 s  ?   ?   Ѐ<                   E                                        Ԁ                ?   ?   Ѐ<                   E                             z        Ԁ              %  L   L   <                                       
+       !  E   E   Ѐ            p %                                    p  E   E   Ѐ             %                                 s  ?   ?   Ѐ<                                                         Ԁ                ?   ?   Ѐ<                                              z        Ԁ              %  L   L   <                                       
      
        5        Ԁ                L   L   <                                      
      
@@ -32,35 +32,35 @@
 
  	 l                                                                                                             #        Ԁ              :%  L   L                               
 
-         F   F                         $0H`l
- 4mesh         F   F                E         $0H`l
- 34mesh       O A   A                         $0H`l E4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 L   L                               
 
-       3 L   L   <                                       
+       1 L   L   <                                       
      
-       3       Ԁ              4       <                                E      @  
-
- 	 l                                                                                                             H5       Ԁ              ;6 L   L                               
+       1       Ԁ              3 L   L                               
 
-       t9 L   L                                
+       l3       <                                E      @  
+
+ 	 l                                                                                                             4       Ԁ              8 L   L                                
 
-       9 L   L   <                0                      
+       9 L   L   <                0                      
      
-       [:       Ԁ              : L   L          @                    
+       9       Ԁ              *: L   L          @                    
 
-       ; L   L                               
+       V; L   L                               
 
-       <=       <                                E      @  
+       <       <                                E      @  
 
- 	 l                                                                                                             L=       Ԁ               L   L                                
+ 	 l                                                                                                             <       Ԁ               L   L                                
 
         L   L          P                    
 
        >  L   L                               
 
-       ;" ?   ?   Ѐ<                  E             ,                 _#       Ԁ              $ L   L   <                                      
+       ;" ?   ?   Ѐ<                             ,                 _#       Ԁ              $ L   L   <                                      
      
-       #$       Ԁ              % E   E   Ѐ            0  D%                                 a% E   E   Ѐ            `  D%              ,                  d& ?   ?   Ѐ<                  E                                t&       Ԁ              & ?   ?   Ѐ<                p  E                             k'       Ԁ              ' ?   ?   Ѐ<                @  E           ,                 i( L   L   <                                     
+       #$       Ԁ              % E   E   Ѐ            0%                                 a% E   E   Ѐ            `%              ,                  d& ?   ?   Ѐ<                                                t&       Ԁ              & ?   ?   Ѐ<                p                             k'       Ԁ              ' ?   ?   Ѐ<                @           ,                 i( L   L   <                                     
      
        &)       Ԁ              U*       <                                E      @  
 
@@ -79,7 +79,7 @@
      
        !1       Ԁ              1 L   L   <                                     
      
-       P2       Ԁ              3 L   L          @                    
+       P2       Ԁ              3 L   L          @                    
 
        3 L   L   <                p                     
      
@@ -89,9 +89,9 @@
  l                                                                                                             7       Ԁ              u7       <                              E      @  
 
  
- l                                                                                                             8       Ԁ              7 F   F               Ȼ&         $0H`l
- J&E4mesh       a F   F               3&         $0H`l
- &4mesh        A   A               Pt'         $0H`l &4mesh               <                               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                                                                                                                     Ԁ              k        <                              E     @  
 
@@ -99,45 +99,46 @@
 
  	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                             	        Ԁ                F   F               \.         $0H`l
- -&4mesh         F   F                S.         $0H`l
- ].u'4mesh       O A   A               p
-/         $0H`l .4mesh       @       <                               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                                                                                                             0       Ԁ              _       <                               E     @  
+ 	 l                                                                                                             0       Ԁ                     <                               E     @  
 
- 	 l                                                                                                             o       Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ              4       <                               E     @  
 
  
- l                                                                                                                    Ԁ                     <                               E     @  
+ l                                                                                                             D       Ԁ                     <                               E     @  
 
  
- l                                                                                                             +       Ԁ              Z       <                              E     @  
+ l                                                                                                                    Ԁ              
+       <                              E     @  
 
  
- l                                                                                                                     Ԁ              C!       <                              E     @  
+ l                                                                                                                    Ԁ                      <                              E     @  
 
  
- l                                                                                                             S!       Ԁ              !       <                0              E     @  
+ l                                                                                                             !       Ԁ              !       <                0              E     @  
 
  
- l                                                                                                             "       Ԁ              7 F   F               5         $0H`l
- 5.4mesh       a F   F               @s(6         $0H`l
- 5/4mesh        A   A               *6         $0H`l (64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                                                                                                                     Ԁ              k        <                P              E     @  
 
- 	 l                                                                                                             [        Ԁ                      <                               E     @  
+ 	 l                                                                                                             [        Ԁ              :        <                               E     @  
 
- 	 l                                                                                                                     Ԁ                      <                `              E     @  
+ 	 l                                                                                                             J        Ԁ                      <                `              E     @  
 
- 	 l                                                                                                             V        Ԁ                F   F                (=         $0H`l
- -=(64mesh         F   F               p=         $0H`l
- =64mesh       O A   A               JX>         $0H`l =4mesh       @       <                               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                                                                                                             0       Ԁ              _       <                               E     @  
+ 	 l                                                                                                             0       Ԁ                     <                               E     @  
 
- 	 l                                                                                                             o       Ԁ              4       <                               E     @  
+ 	 l                                                                                                                    Ԁ              4       <                               E     @  
 
  
  l                                                                                                             D       Ԁ                     <                              E     @  
@@ -152,6 +153,6 @@
  l                                                                                                             c        Ԁ              !       <                              E     @  
 
  
- l                                                                                                             !       Ԁ              7 F   F               0H@E         $0H`l
- D=4mesh       a F   F               jE         $0H`l
- @EX>4mesh        A   A               jE         $0H`l kE4mesh    
\ No newline at end of file
+ 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
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-target-flags-regression-test-2-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,15 +1,14 @@
-ò            i       u$  <   <                 $          $0H`l 4mesh        $  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          \%        Ԁ               &  P   P   Ѐ<                 J     $0H`l3          9 7          &        Ԁ               &  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          
-'        Ԁ               a'  P   P   Ѐ<                 J     $0H`l3         9 7          "(        Ԁ               (  A   A                 (          $0H`l $ 4mesh        B  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          R        Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7          a        Ԁ                 R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          H        Ԁ                  P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ                 A   A                           $0H`l  4mesh                Ԁ                 P   P   Ѐ<                0 J    $0H`l3         9 7            R   R   Ѐ<                @  J   $0H`l4mesh3         9 7                  Ԁ                A   A               0 -         $0H`l  4mesh        H7 F   F               P H7         $0H`l
-  4mesh        +b F   F               P a         $0H`l
- 7O4mesh       }$  A   A               @ Mf         $0H`l 74mesh       (  F   F               ` h         $0H`l
- fb4mesh         F   F               `          $0H`l
- 4mesh        A   A               P m         $0H`l 4mesh       H7 F   F               p y         $0H`l
- 4mesh       +b F   F               p          $0H`l
- z4mesh         L   L                                
+ò            i       u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<                    $0H`lrmeshq   9u         @%        Ԁ               %  <   <   Ѐ<                     $0H`lq   9u          %        Ԁ               &  >   >   Ѐ<                    $0H`lrmeshq   9u         &        Ԁ               '  <   <   Ѐ<                     $0H`lq  9u          '        Ԁ               (  A   A                 (          $0H`lx $ rmesh        &  >   >   Ѐ<                    $0H`lrmeshq   9u         6        Ԁ                 <   <   Ѐ<                0    $0H`lq  9u          )        Ԁ               K  >   >   Ѐ<                @   $0H`lrmeshq  9u                 Ԁ                 <   <   Ѐ<                     $0H`lq  9u                  Ԁ                 A   A                           $0H`lx  rmesh                Ԁ               X  <   <   Ѐ<                0    $0H`lq  9u          >  >   >   Ѐ<                @   $0H`lrmeshq  9u         @        Ԁ                A   A               0 -         $0H`lx  rmesh        H7 F   F               P H7         $0H`lx
+  rmesh        +b F   F               P a         $0H`lx
+ 7Ormesh       }$  A   A               @ Mf         $0H`lx 7rmesh       (  F   F               ` h         $0H`lx
+ 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                                
 
          L   L                               
 
-         E   E   Ѐ               D%                                   ?   ?   Ѐ<                   E                                        Ԁ              =  ?   ?   Ѐ<                   E                             a        Ԁ                L   L   <                                      
+         E   E   Ѐ             %                                   ?   ?   Ѐ<                                                         Ԁ              =  ?   ?   Ѐ<                                              a        Ԁ                L   L   <                                      
      
                Ԁ                      <                                E      @  
 
@@ -23,39 +22,39 @@
      
        "        Ԁ              #        <                               E      @  
 
- 	 l                                                                                                             #        Ԁ              }$  A   A               p          $0H`l z4mesh       $  L   L                               
+ 	 l                                                                                                             #        Ԁ              }$  A   A               p          $0H`lx zrmesh       $  L   L                               
 
        %  L   L                               
 
-       (  F   F                         $0H`l
- 4mesh         F   F                E         $0H`l
- 34mesh       0 L   L                               
+       (  F   F                         $0H`lx
+ rmesh         F   F                E         $0H`lx
+ 3rmesh       0 L   L                               
 
        1 L   L                               
 
-       >2 L   L                               
+       1       Ԁ              {2 L   L                               
 
-       3       Ԁ              5       <                                E      @  
+       p4       <                                E      @  
 
- 	 l                                                                                                             : L   L   <                0                      
+ 	 l                                                                                                             9 L   L   <                0                      
      
-       F; L   L          @                    
+       : L   L          @                    
 
-       q; L   L                               
+       : L   L                               
 
-       < L   L                               
+       < L   L                               
 
-       x=       Ԁ               L   L          P                    
+       <       Ԁ               L   L          P                    
 
         L   L                               
 
          L   L                               
 
-       ! E   E   Ѐ               D%                                    ! ?   ?   Ѐ<                  E             ,                 w"       Ԁ              "# L   L   <                                       
+       ! E   E   Ѐ             %                                    ! ?   ?   Ѐ<                             ,                 w"       Ԁ              "# L   L   <                                       
      
        2#       Ԁ              # L   L   <                                      
      
-       O$       Ԁ              $ E   E   Ѐ            0  D%                                 % E   E   Ѐ            `  D%              ,                  &       Ԁ              .' ?   ?   Ѐ<                p  E                             >'       Ԁ              ' ?   ?   Ѐ<                @  E           ,                 5(       Ԁ              ( L   L   <                                     
+       O$       Ԁ              $ E   E   Ѐ            0%                                 % E   E   Ѐ            `%              ,                  &       Ԁ              .' ?   ?   Ѐ<                p                             >'       Ԁ              ' ?   ?   Ѐ<                @           ,                 5(       Ԁ              ( L   L   <                                     
      
        *       Ԁ              >,       <                              E      @  
 
@@ -82,46 +81,46 @@
  l                                                                                                             J7       Ԁ              y8       <                              E      @  
 
  
- l                                                                                                              A   A                I&         $0H`l 4mesh       H7 F   F               Ȼ&         $0H`l
- J&E4mesh       +b F   F               3&         $0H`l
- &4mesh                 <                               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                                                                                                             @        Ԁ              o        <                              E     @  
 
  	 l                                                                                                                     Ԁ                      <                              E     @  
 
- 	 l                                                                                                                     Ԁ              }$  A   A               -         $0H`l &4mesh       (  F   F               \.         $0H`l
- -&4mesh         F   F                S.         $0H`l
- ].u'4mesh              <                               E     @  
+ 	 l                                                                                                                     Ԁ              }$  A   A               -         $0H`lx &rmesh       (  F   F               \.         $0H`lx
+ -&rmesh         F   F                S.         $0H`lx
+ ].u'rmesh              <                               E     @  
 
- 	 l                                                                                                                    Ԁ                     Ԁ                     <                               E     @  
+ 	 l                                                                                                             K       Ԁ              p       Ԁ                     <                               E     @  
 
  
- l                                                                                                                    Ԁ              V       <                              E     @  
+ l                                                                                                                    Ԁ                     <                              E     @  
 
  
- l                                                                                                                    Ԁ                     <                                E     @  
+ l                                                                                                             G       Ԁ              v       <                                E     @  
 
  
- l                                                                                                                    Ԁ              ?        <                              E     @  
+ l                                                                                                                    Ԁ                     <                              E     @  
 
  
- l                                                                                                             !       Ԁ              "       <                0              E     @  
+ l                                                                                                             /!       Ԁ              V"       <                0              E     @  
 
  
- l                                                                                                              A   A               05         $0H`l ].4mesh       H7 F   F               5         $0H`l
- 5.4mesh       +b F   F               @s(6         $0H`l
- 5/4mesh                 <                               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                                                                                                             @        Ԁ                      <                P              E     @  
 
- 	 l                                                                                                                     Ԁ                      <                `              E     @  
+ 	 l                                                                                                             w        Ԁ                      <                `              E     @  
 
- 	 l                                                                                                             *        Ԁ              }$  A   A               @-=         $0H`l 54mesh       (  F   F                (=         $0H`l
- -=(64mesh         F   F               p=         $0H`l
- =64mesh              <                               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                                                                                                                    Ԁ              p       Ԁ              O       <                              E     @  
+ 	 l                                                                                                             K       Ԁ              p       Ԁ              O       <                              E     @  
 
  
  l                                                                                                             _       Ԁ                     <                              E     @  
@@ -136,6 +135,6 @@
  l                                                                                                                     Ԁ              !       <                              E     @  
 
  
- l                                                                                                              A   A               `-D         $0H`l =4mesh       H7 F   F               0H@E         $0H`l
- D=4mesh       +b F   F               jE         $0H`l
- @EX>4mesh    
\ No newline at end of file
+ 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
+ @EX>rmesh    
\ No newline at end of file
diff -Naur ns-3.22/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
--- ns-3.22/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,36 +1,36 @@
-ò            i       $  <   <                 $          $0H`l 4mesh        %  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          /%        Ԁ               }%  P   P   Ѐ<                 J     $0H`l3          9 7          >&        Ԁ               r&  R   R   Ѐ<                   J   $0H`l4mesh3          9 7          7'        Ԁ               '  P   P   Ѐ<                 J     $0H`l3         9 7          '        Ԁ                 A   A                 (          $0H`l $ 4mesh                Ԁ               %  P   P   Ѐ<                0 J    $0H`l3         9 7            R   R   Ѐ<                @  J   $0H`l4mesh3         9 7          <        Ԁ               - A   A               0 -         $0H`l  4mesh        7 F   F               P H7         $0H`l
-  4mesh       $  A   A               @ Mf         $0H`l 74mesh         F   F               ` h         $0H`l
- fb4mesh       - A   A               P m         $0H`l 4mesh       7 F   F               p y         $0H`l
- 4mesh         L   L                                
+ò            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                                
 
        3  L   L          `                     
 
-       s  ?   ?   Ѐ<                   E                                H        Ԁ                      <                                E      @  
+       s  ?   ?   Ѐ<                                                 H        Ԁ                      <                                E      @  
 
  	 l                                                                                                               L   L   <                                       
      
-       #        Ԁ              $  A   A               p          $0H`l z4mesh       :%  L   L                               
+       #        Ԁ              $  A   A               p          $0H`lx zrmesh       :%  L   L                               
 
        e%  L   L                               
 
-         F   F                         $0H`l
- 4mesh       1 L   L                               
+         F   F                         $0H`lx
+ rmesh       1 L   L                               
 
-       1 L   L                               
+       1 L   L                               
 
-       ; L   L                               
+       V; L   L                               
 
-       < L   L                               
+       ; L   L                               
 
        >  L   L                               
 
        i  L   L                               
 
-       8! E   E   Ѐ               D%                                    ;" ?   ?   Ѐ<                  E             ,                 K"       Ԁ              " L   L   <                                       
+       8! E   E   Ѐ             %                                    ;" ?   ?   Ѐ<                             ,                 K"       Ԁ              " L   L   <                                       
      
        _#       Ԁ              $ L   L   <                                      
      
-       % E   E   Ѐ            0  D%                                 k'       Ԁ              ' ?   ?   Ѐ<                @  E           ,                 	(       Ԁ              {,       Ԁ              -       <                P              E      @  
+       % E   E   Ѐ            0%                                 k'       Ԁ              ' ?   ?   Ѐ<                @           ,                 	(       Ԁ              {,       Ԁ              -       <                P              E      @  
 
  
  l                                                                                                             -       Ԁ              . L   L                                
@@ -45,24 +45,25 @@
  l                                                                                                             5       Ԁ              7       <                              E      @  
 
  
- l                                                                                                             - A   A                I&         $0H`l 4mesh       7 F   F               Ȼ&         $0H`l
- J&E4mesh               <                               E     @  
+ l                                                                                                             - A   A                I&         $0H`lx rmesh       7 F   F               Ȼ&         $0H`lx
+ J&Ermesh               <                               E     @  
 
- 	 l                                                                                                             	        Ԁ              $  A   A               -         $0H`l &4mesh         F   F               \.         $0H`l
- -&4mesh       +       Ԁ              Z       <                              E     @  
+ 	 l                                                                                                             	        Ԁ              $  A   A               -         $0H`lx &rmesh         F   F               \.         $0H`lx
+ -&rmesh              Ԁ              
+       <                              E     @  
 
  
- l                                                                                                             j       Ԁ                     <                                E     @  
+ l                                                                                                                    Ԁ              q       <                                E     @  
 
  
- l                                                                                                                     Ԁ              C!       <                              E     @  
+ l                                                                                                                    Ԁ                      <                              E     @  
 
  
- l                                                                                                             - A   A               05         $0H`l ].4mesh       7 F   F               5         $0H`l
- 5.4mesh               <                               E     @  
+ l                                                                                                             - A   A               05         $0H`lx ].rmesh       7 F   F               5         $0H`lx
+ 5.rmesh               <                               E     @  
 
- 	 l                                                                                                             V        Ԁ              $  A   A               @-=         $0H`l 54mesh         F   F                (=         $0H`l
- -=(64mesh              Ԁ                     <                              E     @  
+ 	 l                                                                                                                     Ԁ              $  A   A               @-=         $0H`lx 5rmesh         F   F                (=         $0H`lx
+ -=(6rmesh              Ԁ                     <                              E     @  
 
  
  l                                                                                                                    Ԁ              !       <                P               E     @  
@@ -71,5 +72,5 @@
  l                                                                                                             b       Ԁ              S        <                               E     @  
 
  
- l                                                                                                             - A   A               `-D         $0H`l =4mesh       7 F   F               0H@E         $0H`l
- D=4mesh    
\ No newline at end of file
+ l                                                                                                             - A   A               `-D         $0H`lx =rmesh       7 F   F               0H@E         $0H`lx
+ D=rmesh    
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/pmp-regression-test-0-1.pcap ns-3.23/src/mesh/test/dot11s/pmp-regression-test-0-1.pcap
--- ns-3.22/src/mesh/test/dot11s/pmp-regression-test-0-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/pmp-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1 +1 @@
-ò            i         <   <                           $0H`l 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3          9 7                  Ԁ                 R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3         9 7                  Ԁ               JO A   A                 JO         $0H`l  4mesh        #j A   A               0 i         $0H`l O4mesh        j A   A               0 j         $0H`l j4mesh    
\ No newline at end of file
+ò            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    
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/pmp-regression-test-1-1.pcap ns-3.23/src/mesh/test/dot11s/pmp-regression-test-1-1.pcap
--- ns-3.22/src/mesh/test/dot11s/pmp-regression-test-1-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/pmp-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1 +1 @@
-ò            i         <   <                           $0H`l 4mesh          R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ                 P   P   Ѐ<                 J     $0H`l3          9 7                  Ԁ                 R   R   Ѐ<                   J   $0H`l4mesh3          9 7                  Ԁ               a  P   P   Ѐ<                 J     $0H`l3         9 7          q        Ԁ               O A   A                 JO         $0H`l  4mesh        i A   A               0 i         $0H`l O4mesh         A   A               0 j         $0H`l j4mesh    
\ No newline at end of file
+ò            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    
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/flame/flame-regression-test-0-1.pcap ns-3.23/src/mesh/test/flame/flame-regression-test-0-1.pcap
--- ns-3.22/src/mesh/test/flame/flame-regression-test-0-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/flame/flame-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,65 +1,70 @@
-ò            i      L  X   X                    @@               
+ò            i      t$  X   X                    @@               
 
-       w  X   X   <                          @@                     
+       $  X   X   <                          @@                     
      
-       D        Ԁ                X   X   <                         @@                    
+       l%        Ԁ              B&  X   X   <                         @@                    
      
-         X   X                   @@               
+       &  X   X                   @@               
 
-               Ԁ              n  l   l   <                          @@             E  0    @  
+       )        Ԁ              *  l   l   <                          @@             E  0    @  
 
- 	                              ~        Ԁ                <   <                    @@                 "	  <   <          0         @@                *  X   X          0         @@                
+ 	                              *        Ԁ              *  <   <                    @@                 A,  <   <          0         @@                M  X   X          0         @@                
 
-       +  X   X          @         @@               
+       O  X   X          @         @@               
 
-       ,        Ԁ              .  X   X   <                P         @@                    
+       O        Ԁ              Q  X   X   <                P         @@                    
      
-       .        Ԁ              -/  l   l   <                @         @@              E  0    @  
+       Q        Ԁ              LR  l   l   <                @         @@              E  0    @  
 
- 	                              0        Ԁ              	1  l   l   <                `         @@             E  0    @  
+ 	                              1S        Ԁ              (T  l   l   <                `         @@             E  0    @  
 
- 	                                     Ԁ              X l   l   <                p         @@             E  0   @  
+ 	                                     Ԁ              X l   l   <                p         @@             E  0   @  
 
  	                              h       Ԁ               l   l   <                P         @@              E  0   @  
 
  	                                     Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              %       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              %       Ԁ               l   l   <                         @@             E  0   @  
 
  	                                     Ԁ              _ l   l   <                `         @@              E  0   @  
 
  	                              D       Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              Ŕ       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              Ŕ       Ԁ               l   l   <                         @@             E  0   @  
 
  	                                     Ԁ               l   l   <                p         @@              E  0   @  
 
- 	                                     Ԁ              S l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              e       Ԁ              8 l   l   <                         @@             E  0   @  
+ 	                              e       Ԁ              8 l   l   <                         @@             E  0   @  
 
  	                              H       Ԁ               l   l   <                         @@              E  0   @  
 
- 	                                     Ԁ              W l   l   <                         @@             E  0   @  
+ 	                              M l   l   <                         @@              E  0   @  
 
- 	                                     Ԁ              آ l   l   <                         @@  	           E  0   @  
+ 	                              2       Ԁ                l   l   <                         @@             E  0   @  
+
+ 	                               l   l                        @@             E  0   @  
 
- 	                                     Ԁ              ? l   l   <                         @@   	           E  0   @  
+ 	                              Ǣ <   <                   @@   	              Z l   l   <                         @@   
+           E  0   @  
+
+ 	                              ?       Ԁ              5 <   <                   @@  	               l   l   <                        @@  
+           E  0   @  
 
- 	                              $       Ԁ              Q l   l   <                         @@  	           E  0   @  
+ 	                              w l   l   <                        @@  
+           E  0   @  
 
- 	                              <)	 l   l                       @@  
-           E  0   @  
+ 	                              (	       Ԁ              x)	 l   l   <                         @@  	           E  0   @  
 
- 	                              g)	 <   <                   @@   
-              )	 l   l   <                         @@              E  0   @  
+ 	                              )	       Ԁ              )	 l   l   <                         @@              E  0   @  
 
- 	                              *	       Ԁ              +	 <   <                   @@  
-              *-	 l   l   <                0        @@             E  0   @  
+ 	                              *	       Ԁ              +	 l   l   <                0        @@             E  0   @  
 
  	                              E
        Ԁ              
- l   l   <                @        @@             E  0   @  
+ l   l   <                @        @@  
+           E  0   @  
 
  	                              (
        Ԁ              
@@ -69,10 +74,10 @@
        Ԁ              @
  l   l   <                P        @@             E  0   @  
 
- 	                           	   5       Ԁ           	   6 l   l   <                `        @@             E  0   @  
+ 	                           	   9 l   l   <                `        @@             E  0   @  
 
- 	                           	   6       Ԁ           	   7 l   l   <                         @@              E  0   @  
+ 	                           	   9       Ԁ           	   9 l   l   <                         @@              E  0   @  
 
- 	                           	   8       Ԁ           	   9 l   l   <                p        @@             E  0   @  
+ 	                           	   :       Ԁ           	   ; l   l   <                p        @@             E  0   @  
 
  	                           
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/flame/flame-regression-test-1-1.pcap ns-3.23/src/mesh/test/flame/flame-regression-test-1-1.pcap
--- ns-3.22/src/mesh/test/flame/flame-regression-test-1-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/flame/flame-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,90 +1,90 @@
-ò            i         X   X                   @@                
+ò            i      #  X   X                    @@                
 
-          X   X                    @@               
+       #  X   X                    @@               
 
-         X   X   <                          @@                     
+       /%  X   X   <                          @@                     
      
-               Ԁ                X   X   <                         @@                    
+       ?%        Ԁ              %  X   X   <                         @@                    
      
-       V        Ԁ              ^  l   l   <                          @@              E  0    @  
+       ~&        Ԁ              })  l   l   <                         @@              E  0    @  
 
- 	                              n        Ԁ                l   l   <                          @@             E  0    @  
+ 	                              )        Ԁ              )  l   l   <                          @@             E  0    @  
 
- 	                                      Ԁ              =  <   <                    @@                   <   <          0         @@                	  <   <          0         @@                &+  X   X          0         @@                
+ 	                              *        Ԁ              \+  <   <                    @@                 +  <   <          0         @@                ,  <   <                    @@                EN  X   X          0         @@                
 
-       Q+  X   X          @         @@               
+       pN  X   X          @         @@               
 
-       ,  X   X   <                @         @@                     
+       O  X   X   <                0         @@                     
      
-       ,        Ԁ              -  X   X          P         @@               
+       O        Ԁ              P  X   X          @         @@               
 
-       5.  X   X   <                P         @@                    
+       TQ  X   X   <                P         @@                    
      
-       /        Ԁ              /  l   l   <                @         @@              E  0    @  
+       !R        Ԁ              R  l   l   <                @         @@              E  0    @  
 
- 	                              /        Ԁ              `0  l   l   <                `         @@             E  0    @  
+ 	                              S        Ԁ              S  l   l   <                `         @@             E  0    @  
 
- 	                              E1        Ԁ              H l   l   <                `         @@              E  0   @  
+ 	                              dT        Ԁ              H l   l   <                P         @@              E  0   @  
 
- 	                              X       Ԁ               l   l   <                p         @@             E  0   @  
+ 	                              X       Ԁ               l   l   <                p         @@             E  0   @  
 
  	                                     Ԁ              g l   l   <                P         @@              E  0   @  
 
  	                              w       Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              ׊       Ԁ               l   l   <                p         @@              E  0   @  
+ 	                              ׊       Ԁ               l   l   <                `         @@              E  0   @  
 
- 	                                     Ԁ              O l   l   <                         @@             E  0   @  
+ 	                                     Ԁ              O l   l   <                         @@             E  0   @  
 
  	                              4       Ԁ               l   l   <                `         @@              E  0   @  
 
  	                                     Ԁ              n l   l   <                         @@             E  0   @  
 
- 	                              S       Ԁ               l   l   <                         @@              E  0   @  
+ 	                              S       Ԁ               l   l   <                p         @@              E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               l   l   <                         @@             E  0   @  
 
  	                              ԕ       Ԁ               l   l   <                p         @@              E  0   @  
 
  	                                     Ԁ              h l   l   <                         @@             E  0   @  
 
- 	                               l   l   <                         @@             E  0   @  
-
- 	                                     Ԁ              ( l   l   <                         @@              E  0   @  
+ 	                              M       Ԁ              ( l   l   <                         @@              E  0   @  
 
- 	                              8       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              8       Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              t       Ԁ              G l   l   <                         @@              E  0   @  
+ 	                              t       Ԁ               l   l   <                         @@              E  0   @  
 
- 	                              W       Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ              \ l   l   <                         @@             E  0   @  
 
- 	                                     Ԁ              ȡ l   l   <                         @@   	           E  0   @  
+ 	                              A        Ԁ              ȡ l   l                        @@              E  0   @  
 
- 	                              ء       Ԁ              / l   l   <                         @@  	           E  0   @  
+ 	                               l   l                        @@             E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@   	           E  0   @  
+ 	                              / <   <                   @@   	               l   l   <                         @@   
+           E  0   @  
+
+ 	                                     Ԁ              ̤ <   <                   @@  	              ȥ <   <                   @@  	              M l   l   <                        @@  
+           E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@  	           E  0   @  
+ 	                              Χ l   l   <                        @@  
+           E  0   @  
 
- 	                                     Ԁ              h(	 l   l                        @@   
-           E  0   @  
+ 	                                     Ԁ              h(	 l   l   <                         @@   	           E  0   @  
 
- 	                              (	 l   l                       @@  
-           E  0   @  
+ 	                              x(	       Ԁ              (	 l   l   <                         @@  	           E  0   @  
 
- 	                              )	 <   <                   @@   
-              *	 l   l   <                         @@              E  0   @  
+ 	                              )	       Ԁ              *	 l   l   <                         @@              E  0   @  
 
- 	                              *	       Ԁ              ?+	 <   <                   @@  
-              ;,	 <   <                   @@  
-              ,	 l   l   <                0        @@             E  0   @  
+ 	                              *	       Ԁ              	+	 l   l   <                0        @@             E  0   @  
 
- 	                              f-	       Ԁ              
- l   l   <                         @@              E  0   @  
+ 	                              +	       Ԁ              
+ l   l   <                         @@   
+           E  0   @  
 
  	                              
        Ԁ              o
- l   l   <                @        @@             E  0   @  
+ l   l   <                @        @@  
+           E  0   @  
 
  	                              T
        Ԁ              '
@@ -95,12 +95,14 @@
  l   l   <                P        @@             E  0   @  
 
  	                              |
-       Ԁ           	   5 l   l   <                         @@              E  0   @  
+       Ԁ           	   6 l   l   <                         @@              E  0   @  
+
+ 	                           	   6       Ԁ           	   H7 l   l   <                `        @@             E  0   @  
 
- 	                           	   5       Ԁ           	   6 l   l   <                `        @@             E  0   @  
+ 	                           	   8 l   l   <                `        @@             E  0   @  
 
- 	                           	   6       Ԁ           	   7 l   l   <                         @@              E  0   @  
+ 	                           	   9       Ԁ           	   : l   l   <                         @@              E  0   @  
 
- 	                           	   7       Ԁ           	   m8 l   l   <                p        @@             E  0   @  
+ 	                           	   :       Ԁ           	   ; l   l   <                p        @@             E  0   @  
 
- 	                           	   R9       Ԁ           
\ No newline at end of file
+ 	                           	   ;       Ԁ           
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/flame/flame-regression-test-2-1.pcap ns-3.23/src/mesh/test/flame/flame-regression-test-2-1.pcap
--- ns-3.22/src/mesh/test/flame/flame-regression-test-2-1.pcap	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/flame/flame-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
@@ -1,83 +1,84 @@
 ò            i      (#  X   X                    @@                
 
-           X   X                   @@                
+       t$  X   X                    @@               
 
-       L  X   X                    @@               
-
-       D        Ԁ                X   X   <                         @@                    
+       l%        Ԁ              B&  X   X   <                         @@                    
      
-       *        Ԁ                l   l   <                          @@              E  0    @  
+       R&        Ԁ              &  l   l   <                         @@              E  0    @  
 
- 	                                l   l   <                          @@              E  0    @  
+ 	                              (  l   l   <                         @@              E  0    @  
 
- 	                                      Ԁ              n  l   l   <                          @@             E  0    @  
+ 	                              )        Ԁ              *  l   l   <                          @@             E  0    @  
 
- 	                              "	  <   <          0         @@                M	  <   <          0         @@                +  X   X          @         @@               
+ 	                              A,  <   <          0         @@                l,  <   <                    @@                O  X   X          @         @@               
 
-       ,  X   X   <                @         @@                     
+       ,O  X   X   <                0         @@                     
      
-       ,        Ԁ              -  X   X          P         @@               
+       O        Ԁ              QP  X   X          @         @@               
 
-       .  X   X   <                P         @@                    
+       Q  X   X   <                P         @@                    
      
-       0        Ԁ              	1  l   l   <                `         @@             E  0    @  
+       1S        Ԁ              (T  l   l   <                `         @@             E  0    @  
 
- 	                              1        Ԁ               l   l   <                `         @@              E  0   @  
+ 	                              8T        Ԁ               l   l   <                P         @@              E  0   @  
 
- 	                                     Ԁ              X l   l   <                p         @@             E  0   @  
+ 	                                     Ԁ              X l   l   <                p         @@             E  0   @  
 
  	                                     Ԁ               l   l   <                         @@             E  0   @  
 
- 	                                     Ԁ              @ l   l   <                p         @@              E  0   @  
+ 	                                     Ԁ              @ l   l   <                `         @@              E  0   @  
 
- 	                              %       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              %       Ԁ               l   l   <                         @@             E  0   @  
 
  	                              D       Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              '       Ԁ               l   l   <                         @@              E  0   @  
+ 	                              '       Ԁ               l   l   <                p         @@              E  0   @  
 
- 	                              Ŕ       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              Ŕ       Ԁ               l   l   <                         @@             E  0   @  
 
- 	                                     Ԁ              S l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               l   l   <                         @@             E  0   @  
 
- 	                              c       Ԁ               l   l   <                         @@              E  0   @  
+ 	                              !       Ԁ               l   l   <                         @@              E  0   @  
 
- 	                              e       Ԁ              8 l   l   <                         @@             E  0   @  
+ 	                              e       Ԁ              8 l   l   <                         @@             E  0   @  
 
- 	                                     Ԁ              W l   l   <                         @@             E  0   @  
+ 	                              2       Ԁ                l   l   <                         @@             E  0   @  
 
- 	                              g       Ԁ                l   l   <                         @@   	           E  0   @  
+ 	                                      Ԁ                l   l                        @@              E  0   @  
 
- 	                                     Ԁ              آ l   l   <                         @@  	           E  0   @  
+ 	                               l   l                        @@             E  0   @  
 
- 	                              $       Ԁ              Q l   l   <                         @@  	           E  0   @  
+ 	                              ?       Ԁ              5 <   <                   @@  	              ` <   <                   @@  	              w l   l   <                        @@  
+           E  0   @  
 
- 	                              a       Ԁ              '	 l   l                        @@   
-           E  0   @  
+ 	                                     Ԁ              '	 l   l   <                         @@   	           E  0   @  
 
- 	                              <)	 l   l                       @@  
-           E  0   @  
+ 	                              (	       Ԁ              x)	 l   l   <                         @@  	           E  0   @  
 
- 	                              *	       Ԁ              +	 <   <                   @@  
-              +	 <   <                   @@  
-              *-	 l   l   <                0        @@             E  0   @  
+ 	                              *	       Ԁ              +	 l   l   <                0        @@             E  0   @  
 
- 	                              :-	       Ԁ              `
- l   l   <                         @@              E  0   @  
+ 	                              +	       Ԁ              `
+ l   l   <                         @@   
+           E  0   @  
 
  	                              E
        Ԁ              
- l   l   <                @        @@             E  0   @  
+ l   l   <                @        @@  
+           E  0   @  
 
  	                              d
        Ԁ              @
  l   l   <                P        @@             E  0   @  
 
  	                              P
-       Ԁ           	    5 l   l   <                         @@              E  0   @  
+       Ԁ           	    5 l   l   <                         @@              E  0   @  
+
+ 	                           	   96 l   l   <                         @@              E  0   @  
+
+ 	                           	   7       Ԁ           	   7 l   l   <                `        @@             E  0   @  
 
- 	                           	   5       Ԁ           	   6 l   l   <                `        @@             E  0   @  
+ 	                           	   9 l   l   <                `        @@             E  0   @  
 
- 	                           	   8       Ԁ           	   9 l   l   <                p        @@             E  0   @  
+ 	                           	   :       Ԁ           	   ; l   l   <                p        @@             E  0   @  
 
- 	                           	   &9       Ԁ           
\ No newline at end of file
+ 	                           	   ;       Ԁ           
\ No newline at end of file
diff -Naur ns-3.22/src/mobility/bindings/modulegen__gcc_ILP32.py ns-3.23/src/mobility/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/mobility/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,10 @@
     module.add_class('ConstantVelocityHelper')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions [class]
+    module.add_class('GeographicPositions')
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::EarthSpheroidType [enumeration]
+    module.add_enum('EarthSpheroidType', ['SPHERE', 'GRS80', 'WGS84'], outer_class=root_module['ns3::GeographicPositions'])
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -268,6 +272,7 @@
     module.add_class('GaussMarkovMobilityModel', parent=root_module['ns3::MobilityModel'])
     ## hierarchical-mobility-model.h (module 'mobility'): ns3::HierarchicalMobilityModel [class]
     module.add_class('HierarchicalMobilityModel', parent=root_module['ns3::MobilityModel'])
+    module.add_container('std::list< ns3::Vector3D >', 'ns3::Vector3D', container_type=u'list')
     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&')
@@ -335,6 +340,7 @@
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3ConstantVelocityHelper_methods(root_module, root_module['ns3::ConstantVelocityHelper'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3GeographicPositions_methods(root_module, root_module['ns3::GeographicPositions'])
     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'])
@@ -710,6 +716,23 @@
                    is_const=True)
     return
 
+def register_Ns3GeographicPositions_methods(root_module, cls):
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::GeographicPositions() [constructor]
+    cls.add_constructor([])
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::GeographicPositions(ns3::GeographicPositions const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::GeographicPositions const &', 'arg0')])
+    ## geographic-positions.h (module 'mobility'): static ns3::Vector ns3::GeographicPositions::GeographicToCartesianCoordinates(double latitude, double longitude, double altitude, ns3::GeographicPositions::EarthSpheroidType sphType) [member function]
+    cls.add_method('GeographicToCartesianCoordinates', 
+                   'ns3::Vector', 
+                   [param('double', 'latitude'), param('double', 'longitude'), param('double', 'altitude'), param('ns3::GeographicPositions::EarthSpheroidType', 'sphType')], 
+                   is_static=True)
+    ## geographic-positions.h (module 'mobility'): static std::list<ns3::Vector3D,std::allocator<ns3::Vector3D> > ns3::GeographicPositions::RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, ns3::Ptr<ns3::UniformRandomVariable> uniRand) [member function]
+    cls.add_method('RandCartesianPointsAroundGeographicPoint', 
+                   'std::list< ns3::Vector3D >', 
+                   [param('double', 'originLatitude'), param('double', 'originLongitude'), param('double', 'maxAltitude'), param('int', 'numPoints'), param('double', 'maxDistFromOrigin'), param('ns3::Ptr< ns3::UniformRandomVariable >', 'uniRand')], 
+                   is_static=True)
+    return
+
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
diff -Naur ns-3.22/src/mobility/bindings/modulegen__gcc_LP64.py ns-3.23/src/mobility/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/mobility/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,10 @@
     module.add_class('ConstantVelocityHelper')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions [class]
+    module.add_class('GeographicPositions')
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::EarthSpheroidType [enumeration]
+    module.add_enum('EarthSpheroidType', ['SPHERE', 'GRS80', 'WGS84'], outer_class=root_module['ns3::GeographicPositions'])
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -268,6 +272,7 @@
     module.add_class('GaussMarkovMobilityModel', parent=root_module['ns3::MobilityModel'])
     ## hierarchical-mobility-model.h (module 'mobility'): ns3::HierarchicalMobilityModel [class]
     module.add_class('HierarchicalMobilityModel', parent=root_module['ns3::MobilityModel'])
+    module.add_container('std::list< ns3::Vector3D >', 'ns3::Vector3D', container_type=u'list')
     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&')
@@ -335,6 +340,7 @@
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3ConstantVelocityHelper_methods(root_module, root_module['ns3::ConstantVelocityHelper'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3GeographicPositions_methods(root_module, root_module['ns3::GeographicPositions'])
     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'])
@@ -710,6 +716,23 @@
                    is_const=True)
     return
 
+def register_Ns3GeographicPositions_methods(root_module, cls):
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::GeographicPositions() [constructor]
+    cls.add_constructor([])
+    ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::GeographicPositions(ns3::GeographicPositions const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::GeographicPositions const &', 'arg0')])
+    ## geographic-positions.h (module 'mobility'): static ns3::Vector ns3::GeographicPositions::GeographicToCartesianCoordinates(double latitude, double longitude, double altitude, ns3::GeographicPositions::EarthSpheroidType sphType) [member function]
+    cls.add_method('GeographicToCartesianCoordinates', 
+                   'ns3::Vector', 
+                   [param('double', 'latitude'), param('double', 'longitude'), param('double', 'altitude'), param('ns3::GeographicPositions::EarthSpheroidType', 'sphType')], 
+                   is_static=True)
+    ## geographic-positions.h (module 'mobility'): static std::list<ns3::Vector3D,std::allocator<ns3::Vector3D> > ns3::GeographicPositions::RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, ns3::Ptr<ns3::UniformRandomVariable> uniRand) [member function]
+    cls.add_method('RandCartesianPointsAroundGeographicPoint', 
+                   'std::list< ns3::Vector3D >', 
+                   [param('double', 'originLatitude'), param('double', 'originLongitude'), param('double', 'maxAltitude'), param('int', 'numPoints'), param('double', 'maxDistFromOrigin'), param('ns3::Ptr< ns3::UniformRandomVariable >', 'uniRand')], 
+                   is_static=True)
+    return
+
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
diff -Naur ns-3.22/src/mobility/model/constant-acceleration-mobility-model.cc ns-3.23/src/mobility/model/constant-acceleration-mobility-model.cc
--- ns-3.22/src/mobility/model/constant-acceleration-mobility-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/model/constant-acceleration-mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -26,6 +26,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantAccelerationMobilityModel")
     .SetParent<MobilityModel> ()
+    .SetGroupName ("Mobility")
     .AddConstructor<ConstantAccelerationMobilityModel> ();
   return tid;
 }
diff -Naur ns-3.22/src/mobility/model/constant-position-mobility-model.cc ns-3.23/src/mobility/model/constant-position-mobility-model.cc
--- ns-3.22/src/mobility/model/constant-position-mobility-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/model/constant-position-mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantPositionMobilityModel")
     .SetParent<MobilityModel> ()
+    .SetGroupName ("Mobility")
     .AddConstructor<ConstantPositionMobilityModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/mobility/model/constant-velocity-mobility-model.cc ns-3.23/src/mobility/model/constant-velocity-mobility-model.cc
--- ns-3.22/src/mobility/model/constant-velocity-mobility-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/model/constant-velocity-mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantVelocityMobilityModel")
     .SetParent<MobilityModel> ()
+    .SetGroupName ("Mobility")
     .AddConstructor<ConstantVelocityMobilityModel> ();
   return tid;
 }
diff -Naur ns-3.22/src/mobility/model/geographic-positions.cc ns-3.23/src/mobility/model/geographic-positions.cc
--- ns-3.22/src/mobility/model/geographic-positions.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/mobility/model/geographic-positions.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,178 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/log.h>
+#include <cmath>
+#include "geographic-positions.h"
+
+NS_LOG_COMPONENT_DEFINE ("GeographicPositions");
+
+namespace ns3 {
+
+// earth's radius in meters if modeled as a perfect sphere
+static const double EARTH_RADIUS = 6371e3; 
+
+/**
+ * GRS80 and WGS84 sources
+ * 
+ * Moritz, H. "Geodetic Reference System 1980." GEODETIC REFERENCE SYSTEM 1980. 
+ * <http://www.gfy.ku.dk/~iag/HB2000/part4/grs80_corr.htm>.
+ * 
+ * "Department of Defense World Geodetic System 1984." National Imagery and 
+ * Mapping Agency, 1 Jan. 2000. 
+ * <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
+static const double EARTH_SEMIMAJOR_AXIS = 6378137;
+
+// earth's first eccentricity as defined by GRS80
+static const double EARTH_GRS80_ECCENTRICITY = 0.0818191910428158;
+
+// earth's first eccentricity as defined by WGS84
+static const double EARTH_WGS84_ECCENTRICITY = 0.0818191908426215;
+
+Vector
+GeographicPositions::GeographicToCartesianCoordinates (double latitude, 
+                                                       double longitude, 
+                                                       double altitude,
+                                                       EarthSpheroidType sphType)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  double latitudeRadians = 0.01745329 * latitude;
+  double longitudeRadians = 0.01745329 * longitude;
+  double a; // semi-major axis of earth
+  double e; // first eccentricity of earth
+  if (sphType == SPHERE)
+    {
+      a = EARTH_RADIUS;
+      e = 0;
+    }
+  else if (sphType == GRS80)
+    {
+      a = EARTH_SEMIMAJOR_AXIS;
+      e = EARTH_GRS80_ECCENTRICITY;
+    }
+  else // if sphType == WGS84
+    {
+      a = EARTH_SEMIMAJOR_AXIS;
+      e = EARTH_WGS84_ECCENTRICITY;
+    }
+
+  double Rn = a / (sqrt (1 - pow (e, 2) * pow (sin (latitudeRadians), 2))); // radius of
+                                                                           // curvature
+  double x = (Rn + altitude) * cos (latitudeRadians) * cos (longitudeRadians);
+  double y = (Rn + altitude) * cos (latitudeRadians) * sin (longitudeRadians);
+  double z = ((1 - pow (e, 2)) * Rn + altitude) * sin (latitudeRadians);
+  Vector cartesianCoordinates = Vector (x, y, z);
+  return cartesianCoordinates;
+}
+
+std::list<Vector>
+GeographicPositions::RandCartesianPointsAroundGeographicPoint (double originLatitude, 
+                                                               double originLongitude, 
+                                                               double maxAltitude,
+                                                               int numPoints, 
+                                                               double maxDistFromOrigin,
+                                                               Ptr<UniformRandomVariable> uniRand)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  // fixes divide by zero case and limits latitude bounds
+  if (originLatitude >= 90)
+    {
+      NS_LOG_WARN ("origin latitude must be less than 90. setting to 89.999");
+      originLatitude = 89.999;
+    }
+  else if (originLatitude <= -90)
+    {
+      NS_LOG_WARN ("origin latitude must be greater than -90. setting to -89.999");
+      originLatitude = -89.999;
+    }
+
+  // restricts maximum altitude from being less than zero (below earth's surface).
+  // sets maximum altitude equal to zero if parameter is set to be less than zero.
+  if (maxAltitude < 0)
+    {
+      NS_LOG_WARN ("maximum altitude must be greater than or equal to 0. setting to 0");
+      maxAltitude = 0;
+    }
+
+  double originLatitudeRadians = originLatitude * (M_PI / 180);
+  double originLongitudeRadians = originLongitude * (M_PI / 180);
+  double originColatitude = (M_PI / 2) - originLatitudeRadians;
+
+  double a = maxDistFromOrigin / EARTH_RADIUS; // maximum alpha allowed 
+                                               // (arc length formula)
+  if (a > M_PI)
+    {
+      a = M_PI; // pi is largest alpha possible (polar angle from origin that 
+                // points can be generated within)
+    }
+  
+  std::list<Vector> generatedPoints;
+  for (int i = 0; i < numPoints; i++)
+    {
+      // random distance from North Pole (towards center of earth)
+      double d = uniRand->GetValue (0, EARTH_RADIUS - EARTH_RADIUS * cos (a)); 
+      // random angle in latitude slice (wrt Prime Meridian), radians
+      double phi = uniRand->GetValue (0, M_PI * 2); 
+      // random angle from Center of Earth (wrt North Pole), radians
+      double alpha = acos((EARTH_RADIUS - d) / EARTH_RADIUS); 
+
+      // shift coordinate system from North Pole referred to origin point referred
+      // reference: http://en.wikibooks.org/wiki/General_Astronomy/Coordinate_Systems
+      double theta = M_PI / 2 - alpha; // angle of elevation of new point wrt 
+                                       // origin point (latitude in coordinate 
+                                       // system referred to origin point)
+      double randPointLatitude = asin(sin(theta)*cos(originColatitude) + 
+                                 cos(theta)*sin(originColatitude)*sin(phi)); 
+                                 // declination
+      double intermedLong = asin((sin(randPointLatitude)*cos(originColatitude) - 
+                            sin(theta)) / (cos(randPointLatitude)*sin(originColatitude))); 
+                            // right ascension
+      intermedLong = intermedLong + M_PI / 2; // shift to longitude 0
+
+      //flip / mirror point if it has phi in quadrant II or III (wasn't 
+      //resolved correctly by arcsin) across longitude 0
+      if (phi > (M_PI / 2) && phi <= ((3 * M_PI) / 2))
+      intermedLong = -intermedLong;
+
+      // shift longitude to be referenced to origin
+      double randPointLongitude = intermedLong + originLongitudeRadians; 
+
+      // random altitude above earth's surface
+      double randAltitude = uniRand->GetValue (0, maxAltitude);
+
+      Vector pointPosition = GeographicPositions::GeographicToCartesianCoordinates 
+                             (randPointLatitude * (180/M_PI), 
+                              randPointLongitude * (180/M_PI),
+                              randAltitude,
+                              SPHERE);
+                              // convert coordinates 
+                              // from geographic to cartesian
+
+      generatedPoints.push_back (pointPosition); //add generated coordinate 
+                                                      //points to list
+    }
+  return generatedPoints;
+}
+
+} // namespace ns3
+
diff -Naur ns-3.22/src/mobility/model/geographic-positions.h ns-3.23/src/mobility/model/geographic-positions.h
--- ns-3.22/src/mobility/model/geographic-positions.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/mobility/model/geographic-positions.h	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,113 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/vector.h>
+#include <ns3/random-variable-stream.h>
+
+#ifndef GEOGRAPHIC_POSITIONS_H
+#define GEOGRAPHIC_POSITIONS_H
+
+namespace ns3
+{
+
+/**
+ * \ingroup mobility
+ *
+ * Consists of methods dealing with Earth geographic coordinates and locations.
+ */
+class GeographicPositions
+{
+
+public:
+  /** 
+   * Spheroid model to use for earth: perfect sphere (SPHERE), Geodetic 
+   * Reference System 1980 (GRS80), or World Geodetic System 1984 (WGS84)
+   * 
+   * Moritz, H. "Geodetic Reference System 1980." GEODETIC REFERENCE SYSTEM 1980. 
+   * <http://www.gfy.ku.dk/~iag/HB2000/part4/grs80_corr.htm>.
+   * 
+   * "Department of Defense World Geodetic System 1984." National Imagery and 
+   * Mapping Agency, 1 Jan. 2000. 
+   * <http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf>.
+   */
+  enum EarthSpheroidType
+  {
+    SPHERE,
+    GRS80,
+    WGS84
+  };
+
+  /**
+   * Converts earth geographic/geodetic coordinates (latitude and longitude in 
+   * degrees) with a given altitude above earth's surface (in meters) to Earth 
+   * Centered Earth Fixed (ECEF) Cartesian coordinates (x, y, z in meters), 
+   * where origin (0, 0, 0) is the center of the earth.
+   *
+   * @param latitude earth-referenced latitude (in degrees) of the point
+   * @param longitude earth-referenced longitude (in degrees) of the point
+   * @param altitude height of the point (in meters) above earth's surface
+   * @param sphType earth spheroid model to use for conversion
+   *
+   * @return a vector containing the Cartesian coordinates (x, y, z referenced 
+   * in meters) of the point (origin (0, 0, 0) is center of earth)
+   */
+  static Vector GeographicToCartesianCoordinates (double latitude, 
+                                                  double longitude, 
+                                                  double altitude,
+                                                  EarthSpheroidType sphType);
+
+  /**
+   * Generates uniformly distributed random points (in ECEF Cartesian 
+   * coordinates) within a given altitude above earth's surface centered around 
+   * a given origin point (on earth's surface, in geographic/geodetic coordinates) 
+   * within a given distance radius (using arc length of earth's surface, not 
+   * pythagorean distance).
+   * Distance radius is measured as if all generated points are on earth's 
+   * surface (with altitude = 0).
+   * Assumes earth is a perfect sphere.
+   * 
+   * @param originLatitude origin point latitude in degrees
+   * @param originLongitude origin point longitude in degrees
+   * @param maxAltitude maximum altitude in meters above earth's surface with
+   * which random points can be generated
+   * @param numPoints number of points to generate
+   * @param maxDistFromOrigin max distance in meters from origin with which 
+   * random transmitters can be generated (all transmitters are less than or 
+   * equal to this distance from the origin, relative to points being on earth's 
+   * surface)
+   * @param uniRand pointer to the uniform random variable to use for random 
+   * location and altitude generation
+   *
+   * @return a list containing the vectors (x, y, z location referenced in 
+   * meters from origin at center of earth) of each point generated
+   */
+  static std::list<Vector> RandCartesianPointsAroundGeographicPoint (double originLatitude, 
+                                                                     double originLongitude,
+                                                                     double maxAltitude, 
+                                                                     int numPoints, 
+                                                                     double maxDistFromOrigin,
+                                                                     Ptr<UniformRandomVariable> uniRand);
+
+};
+
+} // namespace ns3
+
+#endif /* GEOGRAPHIC_POSITIONS_H */
+
diff -Naur ns-3.22/src/mobility/model/hierarchical-mobility-model.cc ns-3.23/src/mobility/model/hierarchical-mobility-model.cc
--- ns-3.22/src/mobility/model/hierarchical-mobility-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/model/hierarchical-mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -29,6 +29,7 @@
 {
   static TypeId tid = TypeId ("ns3::HierarchicalMobilityModel")
     .SetParent<MobilityModel> ()
+    .SetGroupName ("Mobility")
     .AddConstructor<HierarchicalMobilityModel> ()
     .AddAttribute ("Child", "The child mobility model.",
                    PointerValue (),
diff -Naur ns-3.22/src/mobility/model/mobility-model.cc ns-3.23/src/mobility/model/mobility-model.cc
--- ns-3.22/src/mobility/model/mobility-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/model/mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::MobilityModel")
     .SetParent<Object> ()
+    .SetGroupName ("Mobility")
     .AddAttribute ("Position", "The current position of the mobility model.",
                    TypeId::ATTR_SET | TypeId::ATTR_GET,
                    VectorValue (Vector (0.0, 0.0, 0.0)),
diff -Naur ns-3.22/src/mobility/test/geo-to-cartesian-test.cc ns-3.23/src/mobility/test/geo-to-cartesian-test.cc
--- ns-3.22/src/mobility/test/geo-to-cartesian-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/mobility/test/geo-to-cartesian-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,671 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <ns3/geographic-positions.h>
+
+/**
+ * This test verifies the accuracy of the GeographicToCartesianCoordinates()
+ * method in the GeographicPositions class, which converts earth 
+ * geographic/geodetic coordinates to ECEF Cartesian coordinates. To do so, it 
+ * compares the values generated from the method to values generated from the 
+ * MATLAB function geodetic2ecef(), which is part of the MATLAB Mapping Toolbox, 
+ * using the built-in earth referenceSphere, GRS80 referenceEllipsoid, and WGS84 
+ * referenceEllipsoid in MATLAB. A description of the MATLAB function can be 
+ * found at this webpage: http://www.mathworks.com/help/map/ref/geodetic2ecef.html
+ * Values are compared using 216 test cases for each of the three earth spheroid
+ * models.
+ */
+NS_LOG_COMPONENT_DEFINE ("GeoToCartesianTest");
+
+using namespace ns3;
+
+// 10 meter tolerance for testing, which is very small with respect to ECEF
+// Cartesian coordinates on or above earth's surface
+const double TOLERANCE = 10;
+
+const double XSPHERE_MATLAB[216] = {6371000, 1968747.27116279, -5154247.27116279, 
+-5154247.27116279, 1968747.27116279, 6371000, 1968747.27116279, 608376.364418605, 
+-1592750, -1592750.00000000, 608376.364418605, 1968747.27116279, 
+-5154247.27116279, -1592750, 4169873.63558139, 4169873.63558139, 
+-1592750.00000000, -5154247.27116279, -5154247.27116279, -1592750.00000000, 
+4169873.63558139, 4169873.63558140, -1592750.00000000, -5154247.27116279, 
+1968747.27116279, 608376.364418605, -1592750.00000000, -1592750.00000000, 
+608376.364418604, 1968747.27116279, 6371000, 1968747.27116279, -5154247.27116279, 
+-5154247.27116279, 1968747.27116279, 6371000, 6371200, 1968809.07456167, 
+-5154409.07456167, -5154409.07456167, 1968809.07456166, 6371200, 1968809.07456167, 
+608395.462719168, -1592800, -1592800.00000000, 608395.462719167, 1968809.07456167, 
+-5154409.07456167, -1592800, 4170004.53728083, 4170004.53728083, 
+-1592800.00000000, -5154409.07456167, -5154409.07456167, -1592800, 
+4170004.53728083, 4170004.53728083, -1592800.00000000, -5154409.07456167, 
+1968809.07456166, 608395.462719167, -1592800.00000000, -1592800.00000000, 
+608395.462719167, 1968809.07456166, 6371200, 1968809.07456167, -5154409.07456167, 
+-5154409.07456167, 1968809.07456166, 6371200, 6371400, 1968870.87796054, 
+-5154570.87796054, -5154570.87796054, 1968870.87796054, 6371400, 1968870.87796054, 
+608414.561019730, -1592850, -1592850.00000000, 608414.561019730, 1968870.87796054, 
+-5154570.87796054, -1592850, 4170135.43898027, 4170135.43898027, 
+-1592850.00000000, -5154570.87796054, -5154570.87796054, -1592850.00000000, 
+4170135.43898027, 4170135.43898027, -1592850.00000000, -5154570.87796054, 
+1968870.87796054, 608414.561019730, -1592850.00000000, -1592850.00000000, 
+608414.561019729, 1968870.87796054, 6371400, 1968870.87796054, -5154570.87796054, 
+-5154570.87796054, 1968870.87796054, 6371400, 6371600, 1968932.68135942, 
+-5154732.68135941, -5154732.68135942, 1968932.68135941, 6371600, 
+1968932.68135942, 608433.659320293, -1592900, -1592900.00000000, 608433.659320292, 
+1968932.68135942, -5154732.68135941, -1592900.00000000, 4170266.34067971, 
+4170266.34067971, -1592900.00000000, -5154732.68135941, -5154732.68135942, 
+-1592900.00000000, 4170266.34067971, 4170266.34067971, -1592900.00000000, 
+-5154732.68135942, 1968932.68135941, 608433.659320292, -1592900.00000000, 
+-1592900.00000000, 608433.659320292, 1968932.68135941, 6371600, 1968932.68135942, 
+-5154732.68135941, -5154732.68135942, 1968932.68135941, 6371600, 6371800, 
+1968994.48475829, -5154894.48475829, -5154894.48475829, 1968994.48475829, 
+6371800, 1968994.48475829, 608452.757620855, -1592950, -1592950.00000000, 
+608452.757620855, 1968994.48475829, -5154894.48475829, -1592950, 4170397.24237914, 
+4170397.24237914, -1592950.00000000, -5154894.48475829, -5154894.48475829, 
+-1592950.00000000, 4170397.24237914, 4170397.24237915, -1592950.00000000, 
+-5154894.48475829, 1968994.48475829, 608452.757620855, -1592950.00000000, 
+-1592950.00000000, 608452.757620854, 1968994.48475829, 6371800, 1968994.48475829, 
+-5154894.48475829, -5154894.48475829, 1968994.48475829, 6371800, 6372000, 
+1969056.28815717, -5155056.28815716, -5155056.28815717, 1969056.28815716, 
+6372000, 1969056.28815717, 608471.855921418, -1593000, -1593000, 608471.855921417, 
+1969056.28815717, -5155056.28815716, -1593000.00000000, 4170528.14407858, 
+4170528.14407858, -1593000.00000000, -5155056.28815716, -5155056.28815717, 
+-1593000.00000000, 4170528.14407858, 4170528.14407858, -1593000.00000000, 
+-5155056.28815717, 1969056.28815716, 608471.855921417, -1593000.00000000, 
+-1593000.00000000, 608471.855921417, 1969056.28815716, 6372000, 1969056.28815717, 
+-5155056.28815716, -5155056.28815717, 1969056.28815716, 6372000};
+
+const double YSPHERE_MATLAB[216] = {0, 6059181.06531642, 3744779.84235535, 
+-3744779.84235535, -6059181.06531642, -1.56044495147356e-09, 0, 1872389.92117767, 
+1157200.61148054, -1157200.61148054, -1872389.92117767, -4.82204008791920e-10, 0, 
+-4901980.45383588, -3029590.53265821, 3029590.53265821, 4901980.45383588, 
+1.26242648452870e-09, 0, -4901980.45383589, -3029590.53265821, 3029590.53265821, 
+4901980.45383589, 1.26242648452870e-09, 0, 1872389.92117767, 1157200.61148054, 
+-1157200.61148054, -1872389.92117767, -4.82204008791919e-10, 0, 6059181.06531642, 
+3744779.84235535, -3744779.84235535, -6059181.06531642, -1.56044495147356e-09, 0, 
+6059371.27661968, 3744897.39940581, -3744897.39940580, -6059371.27661968, 
+-1.56049393734552e-09, 0, 1872448.69970290, 1157236.93860694, -1157236.93860694, 
+-1872448.69970290, -4.82219146258841e-10, 0, -4902134.33801274, -3029685.63830984, 
+3029685.63830984, 4902134.33801274, 1.26246611493160e-09, 0, -4902134.33801274, 
+-3029685.63830984, 3029685.63830984, 4902134.33801274, 1.26246611493160e-09, 0, 
+1872448.69970290, 1157236.93860694, -1157236.93860694, -1872448.69970290, 
+-4.82219146258841e-10, 0, 6059371.27661968, 3744897.39940581, -3744897.39940580, 
+-6059371.27661968, -1.56049393734552e-09, 0, 6059561.48792294, 3745014.95645626, 
+-3745014.95645626, -6059561.48792294, -1.56054292321749e-09, 0, 1872507.47822813, 
+1157273.26573334, -1157273.26573334, -1872507.47822813, -4.82234283725763e-10, 0, 
+-4902288.22218960, -3029780.74396147, 3029780.74396147, 4902288.22218960, 
+1.26250574533451e-09, 0, -4902288.22218960, -3029780.74396147, 3029780.74396147, 
+4902288.22218960, 1.26250574533451e-09, 0, 1872507.47822813, 1157273.26573334, 
+-1157273.26573334, -1872507.47822813, -4.82234283725763e-10, 0, 6059561.48792294, 
+3745014.95645626, -3745014.95645626, -6059561.48792294, -1.56054292321749e-09, 0, 
+6059751.69922620, 3745132.51350672, -3745132.51350672, -6059751.69922620, 
+-1.56059190908946e-09, 0, 1872566.25675336, 1157309.59285974, -1157309.59285974, 
+-1872566.25675336, -4.82249421192685e-10, 0, -4902442.10636646, -3029875.84961310, 
+3029875.84961310, 4902442.10636646, 1.26254537573741e-09, 0, -4902442.10636646, 
+-3029875.84961310, 3029875.84961310, 4902442.10636646, 1.26254537573741e-09, 0, 
+1872566.25675336, 1157309.59285974, -1157309.59285974, -1872566.25675336, 
+-4.82249421192684e-10, 0, 6059751.69922620, 3745132.51350672, -3745132.51350672, 
+-6059751.69922620, -1.56059190908946e-09, 0, 6059941.91052946, 3745250.07055718, 
+-3745250.07055718, -6059941.91052946, -1.56064089496142e-09, 0, 1872625.03527859, 
+1157345.91998614, -1157345.91998614, -1872625.03527859, -4.82264558659606e-10, 0, 
+-4902595.99054332, -3029970.95526473, 3029970.95526473, 4902595.99054332, 
+1.26258500614032e-09, 0, -4902595.99054332, -3029970.95526473, 3029970.95526473, 
+4902595.99054332, 1.26258500614032e-09, 0, 1872625.03527859, 1157345.91998614, 
+-1157345.91998614, -1872625.03527859, -4.82264558659606e-10, 0, 6059941.91052946, 
+3745250.07055718, -3745250.07055718, -6059941.91052946, -1.56064089496142e-09, 0, 
+6060132.12183272, 3745367.62760764, -3745367.62760764, -6060132.12183272, 
+-1.56068988083339e-09, 0, 1872683.81380382, 1157382.24711254, -1157382.24711254, 
+-1872683.81380382, -4.82279696126528e-10, 0, -4902749.87472018, -3030066.06091636, 
+3030066.06091636, 4902749.87472018, 1.26262463654322e-09, 0, -4902749.87472018, 
+-3030066.06091636, 3030066.06091636, 4902749.87472018, 1.26262463654322e-09, 0, 
+1872683.81380382, 1157382.24711254, -1157382.24711254, -1872683.81380382, 
+-4.82279696126528e-10, 0, 6060132.12183272, 3745367.62760764, -3745367.62760764, 
+-6060132.12183272, -1.56068988083339e-09};
+
+const double ZSPHERE_MATLAB[216] = {0, 0, 0, 0, 0, 0, 6059181.06531642, 
+6059181.06531642, 6059181.06531642, 6059181.06531642, 6059181.06531642, 
+6059181.06531642, 3744779.84235535, 3744779.84235535, 3744779.84235535, 
+3744779.84235535, 3744779.84235535, 3744779.84235535, -3744779.84235535, 
+-3744779.84235535, -3744779.84235535, -3744779.84235535, -3744779.84235535, 
+-3744779.84235535, -6059181.06531642, -6059181.06531642, -6059181.06531642, 
+-6059181.06531642, -6059181.06531642, -6059181.06531642, -1.56044495147356e-09, 
+-1.56044495147356e-09, -1.56044495147356e-09, -1.56044495147356e-09, 
+-1.56044495147356e-09, -1.56044495147356e-09, 0, 0, 0, 0, 0, 0, 6059371.27661968, 
+6059371.27661968, 6059371.27661968, 6059371.27661968, 6059371.27661968, 
+6059371.27661968, 3744897.39940581, 3744897.39940581, 3744897.39940581, 
+3744897.39940581, 3744897.39940581, 3744897.39940581, -3744897.39940580, 
+-3744897.39940580, -3744897.39940580, -3744897.39940580, -3744897.39940580, 
+-3744897.39940580, -6059371.27661968, -6059371.27661968, -6059371.27661968, 
+-6059371.27661968, -6059371.27661968, -6059371.27661968, -1.56049393734552e-09, 
+-1.56049393734552e-09, -1.56049393734552e-09, -1.56049393734552e-09, 
+-1.56049393734552e-09, -1.56049393734552e-09, 0, 0, 0, 0, 0, 0, 6059561.48792294, 
+6059561.48792294, 6059561.48792294, 6059561.48792294, 6059561.48792294, 
+6059561.48792294, 3745014.95645626, 3745014.95645626, 3745014.95645626, 
+3745014.95645626, 3745014.95645626, 3745014.95645626, -3745014.95645626, 
+-3745014.95645626, -3745014.95645626, -3745014.95645626, -3745014.95645626, 
+-3745014.95645626, -6059561.48792294, -6059561.48792294, -6059561.48792294, 
+-6059561.48792294, -6059561.48792294, -6059561.48792294, -1.56054292321749e-09, 
+-1.56054292321749e-09, -1.56054292321749e-09, -1.56054292321749e-09, 
+-1.56054292321749e-09, -1.56054292321749e-09, 0, 0, 0, 0, 0, 0, 6059751.69922620, 
+6059751.69922620, 6059751.69922620, 6059751.69922620, 6059751.69922620, 
+6059751.69922620, 3745132.51350672, 3745132.51350672, 3745132.51350672, 
+3745132.51350672, 3745132.51350672, 3745132.51350672, -3745132.51350672, 
+-3745132.51350672, -3745132.51350672, -3745132.51350672, -3745132.51350672, 
+-3745132.51350672, -6059751.69922620, -6059751.69922620, -6059751.69922620, 
+-6059751.69922620, -6059751.69922620, -6059751.69922620, -1.56059190908946e-09, 
+-1.56059190908946e-09, -1.56059190908946e-09, -1.56059190908946e-09, 
+-1.56059190908946e-09, -1.56059190908946e-09, 0, 0, 0, 0, 0, 0, 6059941.91052946, 
+6059941.91052946, 6059941.91052946, 6059941.91052946, 6059941.91052946, 
+6059941.91052946, 3745250.07055718, 3745250.07055718, 3745250.07055718, 
+3745250.07055718, 3745250.07055718, 3745250.07055718, -3745250.07055718, 
+-3745250.07055718, -3745250.07055718, -3745250.07055718, -3745250.07055718, 
+-3745250.07055718, -6059941.91052946, -6059941.91052946, -6059941.91052946, 
+-6059941.91052946, -6059941.91052946, -6059941.91052946, -1.56064089496142e-09, 
+-1.56064089496142e-09, -1.56064089496142e-09, -1.56064089496142e-09, 
+-1.56064089496142e-09, -1.56064089496142e-09, 0, 0, 0, 0, 0, 0, 6060132.12183272, 
+6060132.12183272, 6060132.12183272, 6060132.12183272, 6060132.12183272, 
+6060132.12183272, 3745367.62760764, 3745367.62760764, 3745367.62760764, 
+3745367.62760764, 3745367.62760764, 3745367.62760764, -3745367.62760764, 
+-3745367.62760764, -3745367.62760764, -3745367.62760764, -3745367.62760764, 
+-3745367.62760764, -6060132.12183272, -6060132.12183272, -6060132.12183272, 
+-6060132.12183272, -6060132.12183272, -6060132.12183272, -1.56068988083339e-09, 
+-1.56068988083339e-09, -1.56068988083339e-09, -1.56068988083339e-09, 
+-1.56068988083339e-09, -1.56068988083339e-09};
+
+const double XGRS80_MATLAB[216] = {6378137, 1970952.72545164, -5160021.22545164, 
+-5160021.22545164, 1970952.72545164, 6378137, 1976947.14312992, 610910.264208145, 
+-1599383.83577310, -1599383.83577310, 610910.264208145, 1976947.14312992, 
+-5165998.77753988, -1596381.41518003, 4179380.80394997, 4179380.80394997, 
+-1596381.41518003, -5165998.77753988, -5165998.77753988, -1596381.41518003, 
+4179380.80394997, 4179380.80394997, -1596381.41518003, -5165998.77753988, 
+1976947.14312991, 610910.264208145, -1599383.83577310, -1599383.83577310, 
+610910.264208145, 1976947.14312991, 6378137, 1970952.72545164, -5160021.22545164, 
+-5160021.22545164, 1970952.72545164, 6378137, 6378337, 1971014.52885052, 
+-5160183.02885052, -5160183.02885052, 1971014.52885052, 6378337, 1977008.94652879, 
+610929.362508708, -1599433.83577310, -1599433.83577310, 610929.362508708, 
+1977008.94652879, -5166160.58093876, -1596431.41518003, 4179511.70564940, 
+4179511.70564940, -1596431.41518003, -5166160.58093876, -5166160.58093876, 
+-1596431.41518003, 4179511.70564940, 4179511.70564940, -1596431.41518003, 
+-5166160.58093876, 1977008.94652879, 610929.362508708, -1599433.83577310, 
+-1599433.83577310, 610929.362508707, 1977008.94652879, 6378337, 1971014.52885052, 
+-5160183.02885052, -5160183.02885052, 1971014.52885052, 6378337, 6378537, 
+1971076.33224939, -5160344.83224939, -5160344.83224940, 1971076.33224939, 
+6378537, 1977070.74992767, 610948.460809271, -1599483.83577310, -1599483.83577310, 
+610948.460809270, 1977070.74992767, -5166322.38433763, -1596481.41518003, 
+4179642.60734884, 4179642.60734884, -1596481.41518003, -5166322.38433763, 
+-5166322.38433763, -1596481.41518003, 4179642.60734884, 4179642.60734884, 
+-1596481.41518003, -5166322.38433763, 1977070.74992766, 610948.460809270, 
+-1599483.83577310, -1599483.83577310, 610948.460809270, 1977070.74992766, 
+6378537, 1971076.33224939, -5160344.83224939, -5160344.83224940, 1971076.33224939, 
+6378537, 6378737, 1971138.13564827, -5160506.63564827, -5160506.63564827, 
+1971138.13564827, 6378737, 1977132.55332654, 610967.559109833, -1599533.83577310, 
+-1599533.83577310, 610967.559109833, 1977132.55332654, -5166484.18773651, 
+-1596531.41518003, 4179773.50904828, 4179773.50904828, -1596531.41518003, 
+-5166484.18773651, -5166484.18773651, -1596531.41518003, 4179773.50904828, 
+4179773.50904828, -1596531.41518003, -5166484.18773651, 1977132.55332654, 
+610967.559109833, -1599533.83577310, -1599533.83577310, 610967.559109832, 
+1977132.55332654, 6378737, 1971138.13564827, -5160506.63564827, -5160506.63564827, 
+1971138.13564827, 6378737, 6378937, 1971199.93904714, -5160668.43904714, 
+-5160668.43904714, 1971199.93904714, 6378937, 1977194.35672542, 610986.657410395, 
+-1599583.83577310, -1599583.83577310, 610986.657410395, 1977194.35672542, 
+-5166645.99113538, -1596581.41518003, 4179904.41074772, 4179904.41074772, 
+-1596581.41518003, -5166645.99113538, -5166645.99113538, -1596581.41518003, 
+4179904.41074772, 4179904.41074772, -1596581.41518003, -5166645.99113538, 
+1977194.35672541, 610986.657410395, -1599583.83577310, -1599583.83577310, 
+610986.657410395, 1977194.35672541, 6378937, 1971199.93904714, -5160668.43904714, 
+-5160668.43904714, 1971199.93904714, 6378937, 6379137, 1971261.74244602, 
+-5160830.24244602, -5160830.24244602, 1971261.74244602, 6379137, 1977256.16012429, 
+611005.755710958, -1599633.83577310, -1599633.83577310, 611005.755710958, 
+1977256.16012429, -5166807.79453425, -1596631.41518003, 4180035.31244715, 
+4180035.31244715, -1596631.41518003, -5166807.79453425, -5166807.79453426, 
+-1596631.41518003, 4180035.31244715, 4180035.31244715, -1596631.41518003, 
+-5166807.79453426, 1977256.16012429, 611005.755710958, -1599633.83577310, 
+-1599633.83577310, 611005.755710957, 1977256.16012429, 6379137, 1971261.74244602, 
+-5160830.24244602, -5160830.24244602, 1971261.74244602, 6379137};
+
+const double YGRS80_MATLAB[216] = {0, 6065968.75567322, 3748974.86570096, 
+-3748974.86570096, -6065968.75567322, -1.56219301231466e-09, 0, 1880188.46284479, 
+1162020.37529350, -1162020.37529350, -1880188.46284479, -4.84212398183511e-10, 0, 
+-4913156.80055210, -3036497.89479889, 3036497.89479889, 4913156.80055210, 
+1.26530477346267e-09, 0, -4913156.80055210, -3036497.89479889, 3036497.89479889, 
+4913156.80055210, 1.26530477346267e-09, 0, 1880188.46284479, 1162020.37529350, 
+-1162020.37529350, -1880188.46284479, -4.84212398183511e-10, 0, 6065968.75567322, 
+3748974.86570096, -3748974.86570096, -6065968.75567322, -1.56219301231466e-09, 0, 
+6066158.96697648, 3749092.42275142, -3749092.42275142, -6066158.96697648, 
+-1.56224199818663e-09, 0, 1880247.24137002, 1162056.70241990, -1162056.70241990, 
+-1880247.24137002, -4.84227535650433e-10, 0, -4913310.68472896, -3036593.00045052, 
+3036593.00045051, 4913310.68472896, 1.26534440386558e-09, 0, -4913310.68472896, 
+-3036593.00045052, 3036593.00045051, 4913310.68472896, 1.26534440386558e-09, 0, 
+1880247.24137002, 1162056.70241990, -1162056.70241990, -1880247.24137002, 
+-4.84227535650433e-10, 0, 6066158.96697648, 3749092.42275142, -3749092.42275142, 
+-6066158.96697648, -1.56224199818663e-09, 0, 6066349.17827974, 3749209.97980188, 
+-3749209.97980187, -6066349.17827974, -1.56229098405859e-09, 0, 1880306.01989525, 
+1162093.02954630, -1162093.02954630, -1880306.01989525, -4.84242673117355e-10, 0, 
+-4913464.56890582, -3036688.10610215, 3036688.10610214, 4913464.56890582, 
+1.26538403426848e-09, 0, -4913464.56890582, -3036688.10610215, 3036688.10610215, 
+4913464.56890582, 1.26538403426848e-09, 0, 1880306.01989525, 1162093.02954630, 
+-1162093.02954630, -1880306.01989525, -4.84242673117354e-10, 0, 6066349.17827974, 
+3749209.97980188, -3749209.97980187, -6066349.17827974, -1.56229098405859e-09, 0, 
+6066539.38958300, 3749327.53685233, -3749327.53685233, -6066539.38958300, 
+-1.56233996993056e-09, 0, 1880364.79842048, 1162129.35667270, -1162129.35667270, 
+-1880364.79842048, -4.84257810584276e-10, 0, -4913618.45308268, -3036783.21175378, 
+3036783.21175377, 4913618.45308268, 1.26542366467138e-09, 0, -4913618.45308268, 
+-3036783.21175378, 3036783.21175377, 4913618.45308268, 1.26542366467138e-09, 0, 
+1880364.79842048, 1162129.35667270, -1162129.35667270, -1880364.79842048, 
+-4.84257810584276e-10, 0, 6066539.38958300, 3749327.53685233, -3749327.53685233, 
+-6066539.38958300, -1.56233996993056e-09, 0, 6066729.60088626, 3749445.09390279, 
+-3749445.09390279, -6066729.60088626, -1.56238895580252e-09, 0, 1880423.57694571, 
+1162165.68379910, -1162165.68379910, -1880423.57694571, -4.84272948051198e-10, 0, 
+-4913772.33725954, -3036878.31740540, 3036878.31740540, 4913772.33725954, 
+1.26546329507429e-09, 0, -4913772.33725954, -3036878.31740541, 3036878.31740540, 
+4913772.33725954, 1.26546329507429e-09, 0, 1880423.57694571, 1162165.68379910, 
+-1162165.68379910, -1880423.57694571, -4.84272948051198e-10, 0, 6066729.60088626, 
+3749445.09390279, -3749445.09390279, -6066729.60088626, -1.56238895580252e-09, 0, 
+6066919.81218952, 3749562.65095325, -3749562.65095325, -6066919.81218952, 
+-1.56243794167449e-09, 0, 1880482.35547094, 1162202.01092550, -1162202.01092550, 
+-1880482.35547094, -4.84288085518120e-10, 0, -4913926.22143639, -3036973.42305703, 
+3036973.42305703, 4913926.22143639, 1.26550292547719e-09, 0, -4913926.22143639, 
+-3036973.42305703, 3036973.42305703, 4913926.22143639, 1.26550292547719e-09, 0, 
+1880482.35547094, 1162202.01092550, -1162202.01092550, -1880482.35547094, 
+-4.84288085518119e-10, 0, 6066919.81218952, 3749562.65095325, -3749562.65095325, 
+-6066919.81218952, -1.56243794167449e-09};
+
+const double ZGRS80_MATLAB[216] = {0, 0, 0, 0, 0, 0, 6043686.27213354, 
+6043686.27213354, 6043686.27213354, 6043686.27213354, 6043686.27213354, 
+6043686.27213354, 3728191.67572948, 3728191.67572948, 3728191.67572948, 
+3728191.67572948, 3728191.67572948, 3728191.67572948, -3728191.67572948, 
+-3728191.67572948, -3728191.67572948, -3728191.67572948, -3728191.67572948, 
+-3728191.67572948, -6043686.27213354, -6043686.27213354, -6043686.27213354, 
+-6043686.27213354, -6043686.27213354, -6043686.27213354, -1.55173509862111e-09, 
+-1.55173509862111e-09, -1.55173509862111e-09, -1.55173509862111e-09, 
+-1.55173509862111e-09, -1.55173509862111e-09, 0, 0, 0, 0, 0, 0, 6043876.48343680, 
+6043876.48343680, 6043876.48343680, 6043876.48343680, 6043876.48343680, 
+6043876.48343680, 3728309.23277994, 3728309.23277994, 3728309.23277994, 
+3728309.23277994, 3728309.23277994, 3728309.23277994, -3728309.23277994, 
+-3728309.23277994, -3728309.23277994, -3728309.23277994, -3728309.23277994, 
+-3728309.23277994, -6043876.48343680, -6043876.48343680, -6043876.48343680, 
+-6043876.48343680, -6043876.48343680, -6043876.48343680, -1.55178408449307e-09, 
+-1.55178408449307e-09, -1.55178408449307e-09, -1.55178408449307e-09, 
+-1.55178408449307e-09, -1.55178408449307e-09, 0, 0, 0, 0, 0, 0, 6044066.69474006, 
+6044066.69474006, 6044066.69474006, 6044066.69474006, 6044066.69474006, 
+6044066.69474006, 3728426.78983040, 3728426.78983040, 3728426.78983040, 
+3728426.78983040, 3728426.78983040, 3728426.78983040, -3728426.78983040, 
+-3728426.78983040, -3728426.78983040, -3728426.78983040, -3728426.78983040, 
+-3728426.78983040, -6044066.69474006, -6044066.69474006, -6044066.69474006, 
+-6044066.69474006, -6044066.69474006, -6044066.69474006, -1.55183307036504e-09, 
+-1.55183307036504e-09, -1.55183307036504e-09, -1.55183307036504e-09, 
+-1.55183307036504e-09, -1.55183307036504e-09, 0, 0, 0, 0, 0, 0, 6044256.90604332, 
+6044256.90604332, 6044256.90604332, 6044256.90604332, 6044256.90604332, 
+6044256.90604332, 3728544.34688086, 3728544.34688086, 3728544.34688086, 
+3728544.34688086, 3728544.34688086, 3728544.34688086, -3728544.34688086, 
+-3728544.34688086, -3728544.34688086, -3728544.34688086, -3728544.34688086, 
+-3728544.34688086, -6044256.90604332, -6044256.90604332, -6044256.90604332, 
+-6044256.90604332, -6044256.90604332, -6044256.90604332, -1.55188205623700e-09, 
+-1.55188205623700e-09, -1.55188205623700e-09, -1.55188205623700e-09, 
+-1.55188205623700e-09, -1.55188205623700e-09, 0, 0, 0, 0, 0, 0, 6044447.11734658, 
+6044447.11734658, 6044447.11734658, 6044447.11734658, 6044447.11734658, 
+6044447.11734658, 3728661.90393132, 3728661.90393132, 3728661.90393132, 
+3728661.90393132, 3728661.90393132, 3728661.90393132, -3728661.90393132, 
+-3728661.90393132, -3728661.90393132, -3728661.90393132, -3728661.90393132, 
+-3728661.90393132, -6044447.11734658, -6044447.11734658, -6044447.11734658, 
+-6044447.11734658, -6044447.11734658, -6044447.11734658, -1.55193104210897e-09, 
+-1.55193104210897e-09, -1.55193104210897e-09, -1.55193104210897e-09, 
+-1.55193104210897e-09, -1.55193104210897e-09, 0, 0, 0, 0, 0, 0, 6044637.32864983, 
+6044637.32864983, 6044637.32864983, 6044637.32864983, 6044637.32864983, 
+6044637.32864983, 3728779.46098178, 3728779.46098178, 3728779.46098178, 
+3728779.46098178, 3728779.46098178, 3728779.46098178, -3728779.46098177, 
+-3728779.46098177, -3728779.46098177, -3728779.46098177, -3728779.46098177, 
+-3728779.46098177, -6044637.32864983, -6044637.32864983, -6044637.32864983, 
+-6044637.32864983, -6044637.32864983, -6044637.32864983, -1.55198002798094e-09, 
+-1.55198002798094e-09, -1.55198002798094e-09, -1.55198002798094e-09, 
+-1.55198002798094e-09, -1.55198002798094e-09};
+
+const double XWGS84_MATLAB[216] = {6378137, 1970952.72545164, -5160021.22545164, 
+-5160021.22545164, 1970952.72545164, 6378137, 1976947.14310045, 610910.264199039, 
+-1599383.83574926, -1599383.83574926, 610910.264199039, 1976947.14310045, 
+-5165998.77751058, -1596381.41517097, 4179380.80392626, 4179380.80392626, 
+-1596381.41517097, -5165998.77751058, -5165998.77751058, -1596381.41517097, 
+4179380.80392626, 4179380.80392626, -1596381.41517097, -5165998.77751058, 
+1976947.14310045, 610910.264199039, -1599383.83574926, -1599383.83574926, 
+610910.264199039, 1976947.14310045, 6378137, 1970952.72545164, -5160021.22545164, 
+-5160021.22545164, 1970952.72545164, 6378137, 6378337, 1971014.52885052, 
+-5160183.02885052, -5160183.02885052, 1971014.52885052, 6378337, 1977008.94649932, 
+610929.362499602, -1599433.83574926, -1599433.83574926, 610929.362499601, 
+1977008.94649932, -5166160.58090945, -1596431.41517097, 4179511.70562570, 
+4179511.70562570, -1596431.41517097, -5166160.58090945, -5166160.58090945, 
+-1596431.41517097, 4179511.70562570, 4179511.70562570, -1596431.41517097, 
+-5166160.58090945, 1977008.94649932, 610929.362499601, -1599433.83574926, 
+-1599433.83574926, 610929.362499601, 1977008.94649932, 6378337, 1971014.52885052, 
+-5160183.02885052, -5160183.02885052, 1971014.52885052, 6378337, 6378537, 
+1971076.33224939, -5160344.83224939, -5160344.83224940, 1971076.33224939, 
+6378537, 1977070.74989820, 610948.460800164, -1599483.83574926, -1599483.83574926, 
+610948.460800164, 1977070.74989820, -5166322.38430833, -1596481.41517097, 
+4179642.60732513, 4179642.60732514, -1596481.41517097, -5166322.38430833, 
+-5166322.38430833, -1596481.41517097, 4179642.60732514, 4179642.60732514, 
+-1596481.41517097, -5166322.38430833, 1977070.74989820, 610948.460800164, 
+-1599483.83574926, -1599483.83574926, 610948.460800163, 1977070.74989820, 
+6378537, 1971076.33224939, -5160344.83224939, -5160344.83224940, 1971076.33224939, 
+6378537, 6378737, 1971138.13564827, -5160506.63564827, -5160506.63564827, 
+1971138.13564827, 6378737, 1977132.55329707, 610967.559100727, -1599533.83574926, 
+-1599533.83574926, 610967.559100726, 1977132.55329707, -5166484.18770720, 
+-1596531.41517097, 4179773.50902457, 4179773.50902457, -1596531.41517097, 
+-5166484.18770720, -5166484.18770720, -1596531.41517097, 4179773.50902457, 
+4179773.50902457, -1596531.41517097, -5166484.18770720, 1977132.55329707, 
+610967.559100726, -1599533.83574926, -1599533.83574926, 610967.559100726, 
+1977132.55329707, 6378737, 1971138.13564827, -5160506.63564827, -5160506.63564827, 
+1971138.13564827, 6378737, 6378937, 1971199.93904714, -5160668.43904714, 
+-5160668.43904714, 1971199.93904714, 6378937, 1977194.35669595, 610986.657401289, 
+-1599583.83574926, -1599583.83574926, 610986.657401289, 1977194.35669595, 
+-5166645.99110608, -1596581.41517097, 4179904.41072401, 4179904.41072401, 
+-1596581.41517097, -5166645.99110608, -5166645.99110608, -1596581.41517097, 
+4179904.41072401, 4179904.41072401, -1596581.41517097, -5166645.99110608, 
+1977194.35669595, 610986.657401289, -1599583.83574926, -1599583.83574926, 
+610986.657401288, 1977194.35669595, 6378937, 1971199.93904714, -5160668.43904714, 
+-5160668.43904714, 1971199.93904714, 6378937, 6379137, 1971261.74244602, 
+-5160830.24244602, -5160830.24244602, 1971261.74244602, 6379137, 1977256.16009482, 
+611005.755701852, -1599633.83574926, -1599633.83574926, 611005.755701851, 
+1977256.16009482, -5166807.79450495, -1596631.41517097, 4180035.31242345, 
+4180035.31242345, -1596631.41517097, -5166807.79450495, -5166807.79450495, 
+-1596631.41517097, 4180035.31242345, 4180035.31242345, -1596631.41517097, 
+-5166807.79450495, 1977256.16009482, 611005.755701851, -1599633.83574926, 
+-1599633.83574926, 611005.755701851, 1977256.16009482, 6379137, 1971261.74244602, 
+-5160830.24244602, -5160830.24244602, 1971261.74244602, 6379137};
+
+const double YWGS84_MATLAB[216] = {0, 6065968.75567322, 3748974.86570096, 
+-3748974.86570096, -6065968.75567322, -1.56219301231466e-09, 0, 1880188.46281677, 
+1162020.37527618, -1162020.37527618, -1880188.46281677, -4.84212398176294e-10, 0, 
+-4913156.80052423, -3036497.89478166, 3036497.89478166, 4913156.80052423, 
+1.26530477345549e-09, 0, -4913156.80052423, -3036497.89478166, 3036497.89478166, 
+4913156.80052423, 1.26530477345549e-09, 0, 1880188.46281677, 1162020.37527618, 
+-1162020.37527618, -1880188.46281677, -4.84212398176293e-10, 0, 6065968.75567322, 
+3748974.86570096, -3748974.86570096, -6065968.75567322, -1.56219301231466e-09, 0, 
+6066158.96697648, 3749092.42275142, -3749092.42275142, -6066158.96697648, 
+-1.56224199818663e-09, 0, 1880247.24134200, 1162056.70240258, -1162056.70240258, 
+-1880247.24134200, -4.84227535643215e-10, 0, -4913310.68470109, -3036593.00043329, 
+3036593.00043329, 4913310.68470109, 1.26534440385840e-09, 0, -4913310.68470109, 
+-3036593.00043329, 3036593.00043329, 4913310.68470109, 1.26534440385840e-09, 0, 
+1880247.24134200, 1162056.70240258, -1162056.70240258, -1880247.24134200, 
+-4.84227535643215e-10, 0, 6066158.96697648, 3749092.42275142, -3749092.42275142, 
+-6066158.96697648, -1.56224199818663e-09, 0, 6066349.17827974, 3749209.97980188, 
+-3749209.97980187, -6066349.17827974, -1.56229098405859e-09, 0, 1880306.01986723, 
+1162093.02952898, -1162093.02952898, -1880306.01986723, -4.84242673110137e-10, 0, 
+-4913464.56887795, -3036688.10608492, 3036688.10608492, 4913464.56887795, 
+1.26538403426130e-09, 0, -4913464.56887795, -3036688.10608492, 3036688.10608492, 
+4913464.56887795, 1.26538403426130e-09, 0, 1880306.01986722, 1162093.02952898, 
+-1162093.02952898, -1880306.01986723, -4.84242673110137e-10, 0, 6066349.17827974, 
+3749209.97980188, -3749209.97980187, -6066349.17827974, -1.56229098405859e-09, 0, 
+6066539.38958300, 3749327.53685233, -3749327.53685233, -6066539.38958300, 
+-1.56233996993056e-09, 0, 1880364.79839246, 1162129.35665538, -1162129.35665538, 
+-1880364.79839246, -4.84257810577059e-10, 0, -4913618.45305481, -3036783.21173655, 
+3036783.21173655, 4913618.45305481, 1.26542366466421e-09, 0, -4913618.45305481, 
+-3036783.21173655, 3036783.21173655, 4913618.45305481, 1.26542366466421e-09, 0, 
+1880364.79839245, 1162129.35665538, -1162129.35665538, -1880364.79839245, 
+-4.84257810577058e-10, 0, 6066539.38958300, 3749327.53685233, -3749327.53685233, 
+-6066539.38958300, -1.56233996993056e-09, 0, 6066729.60088626, 3749445.09390279, 
+-3749445.09390279, -6066729.60088626, -1.56238895580252e-09, 0, 1880423.57691768, 
+1162165.68378178, -1162165.68378178, -1880423.57691768, -4.84272948043980e-10, 0, 
+-4913772.33723167, -3036878.31738818, 3036878.31738818, 4913772.33723167, 
+1.26546329506711e-09, 0, -4913772.33723167, -3036878.31738818, 3036878.31738818, 
+4913772.33723167, 1.26546329506711e-09, 0, 1880423.57691768, 1162165.68378178, 
+-1162165.68378178, -1880423.57691768, -4.84272948043980e-10, 0, 6066729.60088626, 
+3749445.09390279, -3749445.09390279, -6066729.60088626, -1.56238895580252e-09, 0, 
+6066919.81218952, 3749562.65095325, -3749562.65095325, -6066919.81218952, 
+-1.56243794167449e-09, 0, 1880482.35544291, 1162202.01090818, -1162202.01090818, 
+-1880482.35544291, -4.84288085510902e-10, 0, -4913926.22140853, -3036973.42303981, 
+3036973.42303981, 4913926.22140853, 1.26550292547002e-09, 0, -4913926.22140853, 
+-3036973.42303981, 3036973.42303981, 4913926.22140853, 1.26550292547002e-09, 0, 
+1880482.35544291, 1162202.01090818, -1162202.01090818, -1880482.35544291, 
+-4.84288085510902e-10, 0, 6066919.81218952, 3749562.65095325, -3749562.65095325, 
+-6066919.81218952, -1.56243794167449e-09};
+
+const double ZWGS84_MATLAB[216] = {0, 0, 0, 0, 0, 0, 6043686.27224277, 
+6043686.27224277, 6043686.27224277, 6043686.27224277, 6043686.27224277, 
+6043686.27224277, 3728191.67583129, 3728191.67583129, 3728191.67583129, 
+3728191.67583129, 3728191.67583129, 3728191.67583129, -3728191.67583129, 
+-3728191.67583129, -3728191.67583129, -3728191.67583129, -3728191.67583129, 
+-3728191.67583129, -6043686.27224277, -6043686.27224277, -6043686.27224277, 
+-6043686.27224277, -6043686.27224277, -6043686.27224277, -1.55173509867228e-09, 
+-1.55173509867228e-09, -1.55173509867228e-09, -1.55173509867228e-09, 
+-1.55173509867228e-09, -1.55173509867228e-09, 0, 0, 0, 0, 0, 0, 6043876.48354603, 
+6043876.48354603, 6043876.48354603, 6043876.48354603, 6043876.48354603, 
+6043876.48354603, 3728309.23288175, 3728309.23288175, 3728309.23288175, 
+3728309.23288175, 3728309.23288175, 3728309.23288175, -3728309.23288175, 
+-3728309.23288175, -3728309.23288175, -3728309.23288175, -3728309.23288175, 
+-3728309.23288175, -6043876.48354603, -6043876.48354603, -6043876.48354603, 
+-6043876.48354603, -6043876.48354603, -6043876.48354603, -1.55178408454425e-09, 
+-1.55178408454425e-09, -1.55178408454425e-09, -1.55178408454425e-09, 
+-1.55178408454425e-09, -1.55178408454425e-09, 0, 0, 0, 0, 0, 0, 6044066.69484929, 
+6044066.69484929, 6044066.69484929, 6044066.69484929, 6044066.69484929, 
+6044066.69484929, 3728426.78993221, 3728426.78993221, 3728426.78993221, 
+3728426.78993221, 3728426.78993221, 3728426.78993221, -3728426.78993221, 
+-3728426.78993221, -3728426.78993221, -3728426.78993221, -3728426.78993221, 
+-3728426.78993221, -6044066.69484929, -6044066.69484929, -6044066.69484929, 
+-6044066.69484929, -6044066.69484929, -6044066.69484929, -1.55183307041621e-09, 
+-1.55183307041621e-09, -1.55183307041621e-09, -1.55183307041621e-09, 
+-1.55183307041621e-09, -1.55183307041621e-09, 0, 0, 0, 0, 0, 0, 6044256.90615255, 
+6044256.90615255, 6044256.90615255, 6044256.90615255, 6044256.90615255, 
+6044256.90615255, 3728544.34698267, 3728544.34698267, 3728544.34698267, 
+3728544.34698267, 3728544.34698267, 3728544.34698267, -3728544.34698267, 
+-3728544.34698267, -3728544.34698267, -3728544.34698267, -3728544.34698267, 
+-3728544.34698267, -6044256.90615255, -6044256.90615255, -6044256.90615255, 
+-6044256.90615255, -6044256.90615255, -6044256.90615255, -1.55188205628818e-09, 
+-1.55188205628818e-09, -1.55188205628818e-09, -1.55188205628818e-09, 
+-1.55188205628818e-09, -1.55188205628818e-09, 0, 0, 0, 0, 0, 0, 6044447.11745581, 
+6044447.11745581, 6044447.11745581, 6044447.11745581, 6044447.11745581, 
+6044447.11745581, 3728661.90403313, 3728661.90403313, 3728661.90403313, 
+3728661.90403313, 3728661.90403313, 3728661.90403313, -3728661.90403313, 
+-3728661.90403313, -3728661.90403313, -3728661.90403313, -3728661.90403313, 
+-3728661.90403313, -6044447.11745581, -6044447.11745581, -6044447.11745581, 
+-6044447.11745581, -6044447.11745581, -6044447.11745581, -1.55193104216015e-09, 
+-1.55193104216015e-09, -1.55193104216015e-09, -1.55193104216015e-09, 
+-1.55193104216015e-09, -1.55193104216015e-09, 0, 0, 0, 0, 0, 0, 6044637.32875907, 
+6044637.32875907, 6044637.32875907, 6044637.32875907, 6044637.32875907, 
+6044637.32875907, 3728779.46108359, 3728779.46108359, 3728779.46108359, 
+3728779.46108359, 3728779.46108359, 3728779.46108359, -3728779.46108358, 
+-3728779.46108358, -3728779.46108358, -3728779.46108358, -3728779.46108358, 
+-3728779.46108358, -6044637.32875907, -6044637.32875907, -6044637.32875907, 
+-6044637.32875907, -6044637.32875907, -6044637.32875907, -1.55198002803211e-09, 
+-1.55198002803211e-09, -1.55198002803211e-09, -1.55198002803211e-09, 
+-1.55198002803211e-09, -1.55198002803211e-09};
+
+
+class GeoToCartesianTestCase : public TestCase
+{
+public:
+  GeoToCartesianTestCase (double latitude, 
+                          double longitude, 
+                          double altitude,
+                          GeographicPositions::EarthSpheroidType sphType,
+                          int i);
+  virtual ~GeoToCartesianTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string Name (double latitude, 
+                           double longitude, 
+                           double altitude,
+                           GeographicPositions::EarthSpheroidType sphType);
+  double m_latitude;
+  double m_longitude;
+  double m_altitude;
+  GeographicPositions::EarthSpheroidType m_sphType;
+  int m_i;
+};
+
+std::string 
+GeoToCartesianTestCase::Name (double latitude, 
+                              double longitude, 
+                              double altitude,
+                              GeographicPositions::EarthSpheroidType sphType)
+{
+  std::ostringstream oss;
+  oss << "latitude = " << latitude << " degrees, "
+      << "longitude = " << longitude << " degrees, "
+      << "altitude = " << altitude << " meters, "
+      << "earth spheroid type = " << sphType;
+  return oss.str();
+}
+
+GeoToCartesianTestCase::GeoToCartesianTestCase (double latitude, 
+                                                double longitude, 
+                                                double altitude,
+                                                GeographicPositions::EarthSpheroidType sphType,
+                                                int i)
+  : TestCase (Name (latitude, longitude, altitude, sphType)),
+    m_latitude (latitude),
+    m_longitude (longitude),
+    m_altitude (altitude),
+    m_sphType (sphType),
+    m_i (i)
+{
+}
+
+GeoToCartesianTestCase::~GeoToCartesianTestCase ()
+{
+}
+
+void
+GeoToCartesianTestCase::DoRun (void)
+{  
+  Vector cart = GeographicPositions::GeographicToCartesianCoordinates (m_latitude, 
+                                                                       m_longitude, 
+                                                                       m_altitude,
+                                                                       m_sphType);
+  if (m_sphType == GeographicPositions::SPHERE)
+    {
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.x, 
+                                 XSPHERE_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "x coordinate (" << cart.x << ") is incorrect "
+                                 "for perfect sphere model in iteration " << m_i);
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.y, 
+                                 YSPHERE_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "y coordinate (" << cart.y << ") is incorrect "
+                                 "for perfect sphere model in iteration " << m_i);
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.z, 
+                                 ZSPHERE_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "z coordinate (" << cart.z << ") is incorrect "
+                                 "for perfect sphere model in iteration " << m_i);
+    }
+  else if (m_sphType == GeographicPositions::GRS80)
+    {
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.x, 
+                                 XGRS80_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "x coordinate (" << cart.x << ") is incorrect "
+                                 "for GRS80 model in iteration " << m_i);
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.y, 
+                                 YGRS80_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "y coordinate (" << cart.y << ") is incorrect "
+                                 "for GRS80 model in iteration " << m_i);
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.z, 
+                                 ZGRS80_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "z coordinate (" << cart.z << ") is incorrect "
+                                 "for GRS80 model in iteration " << m_i);
+    }
+  else // if m_sphType == GeographicPositions::WGS84
+    {
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.x, 
+                                 XWGS84_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "x coordinate (" << cart.x << ") is incorrect "
+                                 "for WGS84 model in iteration " << m_i);
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.y, 
+                                 YWGS84_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "y coordinate (" << cart.y << ") is incorrect "
+                                 "for WGS84 model in iteration " << m_i);
+      NS_TEST_ASSERT_MSG_EQ_TOL (cart.z, 
+                                 ZWGS84_MATLAB [m_i], 
+                                 TOLERANCE, 
+                                 "z coordinate (" << cart.z << ") is incorrect "
+                                 "for WGS84 model in iteration " << m_i);
+    }
+}
+
+
+class GeoToCartesianTestSuite : public TestSuite
+{
+public:
+  GeoToCartesianTestSuite ();
+};
+
+GeoToCartesianTestSuite::GeoToCartesianTestSuite ()
+  : TestSuite ("geo-to-cartesian", UNIT)
+{
+  NS_LOG_INFO ("creating GeoToCartesianTestSuite");
+  int i = 0; // iteration number
+  for (double altitude = 0; altitude <= 1000; altitude += 200)
+    {
+      for (double latitude = 0; latitude <= 360; latitude += 72)
+        {
+          for (double longitude = 0; longitude <= 360; longitude += 72)
+            {
+              AddTestCase (new GeoToCartesianTestCase (latitude, 
+                                                       longitude, 
+                                                       altitude, 
+                                                       GeographicPositions::SPHERE,
+                                                       i), 
+                           TestCase::QUICK);
+              ++i;
+            }
+        }
+    }
+  i = 0;
+  for (double altitude = 0; altitude <= 1000; altitude += 200)
+    {
+      for (double latitude = 0; latitude <= 360; latitude += 72)
+        {
+          for (double longitude = 0; longitude <= 360; longitude += 72)
+            {
+              AddTestCase (new GeoToCartesianTestCase (latitude, 
+                                                       longitude, 
+                                                       altitude, 
+                                                       GeographicPositions::GRS80,
+                                                       i), 
+                           TestCase::QUICK);
+              ++i;
+            }
+        }
+    }
+  i = 0;
+  for (double altitude = 0; altitude <= 1000; altitude += 200)
+    {
+      for (double latitude = 0; latitude <= 360; latitude += 72)
+        {
+          for (double longitude = 0; longitude <= 360; longitude += 72)
+            {
+              AddTestCase (new GeoToCartesianTestCase (latitude, 
+                                                       longitude, 
+                                                       altitude, 
+                                                       GeographicPositions::WGS84,
+                                                       i), 
+                           TestCase::QUICK);
+              ++i;
+            }
+        }
+    }
+}
+
+static GeoToCartesianTestSuite g_GeoToCartesianTestSuite;
diff -Naur ns-3.22/src/mobility/test/rand-cart-around-geo-test.cc ns-3.23/src/mobility/test/rand-cart-around-geo-test.cc
--- ns-3.22/src/mobility/test/rand-cart-around-geo-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/mobility/test/rand-cart-around-geo-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,177 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <cmath>
+#include <ns3/geographic-positions.h>
+
+/**
+ * This test verifies the accuracy of the RandCartesianPointsAroundGeographicPoint()
+ * method in the GeographicPositions class, which generates uniformly 
+ * distributed random points (in ECEF Cartesian coordinates) within a given 
+ * altitude above earth's surface centered around a given origin point (on 
+ * earth's surface, in geographic/geodetic coordinates) within a given distance 
+ * radius (using arc length of earth's surface, not pythagorean distance).
+ * Distance radius is measured as if all generated points are on earth's 
+ * surface (with altitude = 0). Assumes earth is a perfect sphere. To verify the 
+ * method, this test checks that the generated points are within the given 
+ * maximum distance radius from the origin. Since this is testing the distance 
+ * radius from the origin, all points generated in this test are on earth's 
+ * surface (altitude = 0), since the distance radius has been defined as if all 
+ * points are on earth's surface. The pythagorean (straight-line) distance 
+ * between each generated point and the origin is first calculated, and then 
+ * using this distance and the radius of the earth, the distance radius to the
+ * origin (arc length) is calculated. This distance radius is compared to the 
+ * max distance radius to ensure that it is less than the maximum.
+ */
+NS_LOG_COMPONENT_DEFINE ("RandCartAroundGeoTest");
+
+using namespace ns3;
+
+// 0.1 meter tolerance for testing, which is very small compared to the maximum 
+// distances from origin being tested
+const double TOLERANCE = 0.1;
+
+// earth's radius in meters if modeled as a perfect sphere
+static const double EARTH_RADIUS = 6371e3; 
+
+class RandCartAroundGeoTestCase : public TestCase
+{
+public:
+  RandCartAroundGeoTestCase (double originLatitude, 
+                             double originLongitude,
+                             double maxAltitude, 
+                             int numPoints, 
+                             double maxDistFromOrigin,
+                             Ptr<UniformRandomVariable> uniRand);
+  virtual ~RandCartAroundGeoTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string Name (double originLatitude, 
+                           double originLongitude,
+                           double maxDistFromOrigin);
+  double m_originLatitude;
+  double m_originLongitude;
+  double m_maxAltitude;
+  int m_numPoints;
+  double m_maxDistFromOrigin;
+  Ptr<UniformRandomVariable> m_uniRand;
+};
+
+std::string 
+RandCartAroundGeoTestCase::Name (double originLatitude, 
+                                 double originLongitude,
+                                 double maxDistFromOrigin)
+{
+  std::ostringstream oss;
+  oss << "origin latitude = " << originLatitude << " degrees, "
+      << "origin longitude = " << originLongitude << " degrees, "
+      << "max distance from origin = " << maxDistFromOrigin;
+  return oss.str();
+}
+
+RandCartAroundGeoTestCase::RandCartAroundGeoTestCase (double originLatitude, 
+                                                      double originLongitude,
+                                                      double maxAltitude, 
+                                                      int numPoints, 
+                                                      double maxDistFromOrigin,
+                                                      Ptr<UniformRandomVariable> uniRand)
+  : TestCase (Name (originLatitude, originLongitude, maxDistFromOrigin)),
+    m_originLatitude (originLatitude),
+    m_originLongitude (originLongitude),
+    m_maxAltitude (maxAltitude),
+    m_numPoints (numPoints),
+    m_maxDistFromOrigin (maxDistFromOrigin),
+    m_uniRand (uniRand)
+{
+}
+
+RandCartAroundGeoTestCase::~RandCartAroundGeoTestCase ()
+{
+}
+
+void
+RandCartAroundGeoTestCase::DoRun (void)
+{  
+  std::list<Vector> points =  GeographicPositions::RandCartesianPointsAroundGeographicPoint (m_originLatitude, 
+                                                                                             m_originLongitude,
+                                                                                             m_maxAltitude, 
+                                                                                             m_numPoints, 
+                                                                                             m_maxDistFromOrigin,
+                                                                                             m_uniRand);
+  Vector origin = GeographicPositions::GeographicToCartesianCoordinates (m_originLatitude, 
+                                                                         m_originLongitude, 
+                                                                         m_maxAltitude,
+                                                                         GeographicPositions::SPHERE);
+  Vector randPoint;
+  while (!points.empty ())
+    {
+      randPoint = points.front ();
+      points.pop_front ();
+
+      // pythagorean distance between random point and origin, not distance on surface of earth
+      double straightDistFromOrigin = sqrt (pow (randPoint.x - origin.x, 2) + 
+                                            pow (randPoint.y - origin.y, 2) + 
+                                            pow (randPoint.z - origin.z, 2));
+
+      // arc length distance between random point and origin, on surface of earth
+      double arcDistFromOrigin = 2 * EARTH_RADIUS * asin (straightDistFromOrigin / (2 * EARTH_RADIUS));
+
+      NS_TEST_ASSERT_MSG_LT (arcDistFromOrigin, 
+                             m_maxDistFromOrigin + TOLERANCE,  
+                             "random point (" << randPoint.x << ", " << randPoint.y 
+                             << ", " << randPoint.z << ") is outside of max radius from origin");
+    }
+}
+
+
+class RandCartAroundGeoTestSuite : public TestSuite
+{
+public:
+  RandCartAroundGeoTestSuite ();
+};
+
+RandCartAroundGeoTestSuite::RandCartAroundGeoTestSuite ()
+  : TestSuite ("rand-cart-around-geo", UNIT)
+{
+  NS_LOG_INFO ("creating RandCartAroundGeoTestSuite");
+  Ptr<UniformRandomVariable> uniRand = CreateObject<UniformRandomVariable> ();
+  uniRand->SetStream (5);
+  for (double originLatitude = -89.9; originLatitude <= 89.9; originLatitude += 35.96)
+    {
+      for (double originLongitude = 0; originLongitude <= 360; originLongitude += 72)
+        {
+          for (double maxDistFromOrigin = 1000; maxDistFromOrigin <= 1000000; maxDistFromOrigin *= 10)
+            {
+              AddTestCase (new RandCartAroundGeoTestCase (originLatitude, 
+                                                          originLongitude, 
+                                                          0, // on earth's surface
+                                                          50, // 50 points generated
+                                                          maxDistFromOrigin,
+                                                          uniRand), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+}
+
+static RandCartAroundGeoTestSuite g_RandCartAroundGeoTestSuite;
diff -Naur ns-3.22/src/mobility/wscript ns-3.23/src/mobility/wscript
--- ns-3.22/src/mobility/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mobility/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -9,6 +9,7 @@
         'model/constant-velocity-helper.cc',
         'model/constant-velocity-mobility-model.cc',
         'model/gauss-markov-mobility-model.cc',
+        'model/geographic-positions.cc',
         'model/hierarchical-mobility-model.cc',
         'model/mobility-model.cc',
         'model/position-allocator.cc',
@@ -30,6 +31,8 @@
         'test/ns2-mobility-helper-test-suite.cc',
         'test/steady-state-random-waypoint-mobility-model-test.cc',
         'test/waypoint-mobility-model-test.cc',
+        'test/geo-to-cartesian-test.cc',
+        'test/rand-cart-around-geo-test.cc',
         ]
 
     headers = bld(features='ns3header')
@@ -41,6 +44,7 @@
         'model/constant-velocity-helper.h',
         'model/constant-velocity-mobility-model.h',
         'model/gauss-markov-mobility-model.h',
+        'model/geographic-positions.h',
         'model/hierarchical-mobility-model.h',
         'model/mobility-model.h',
         'model/position-allocator.h',
diff -Naur ns-3.22/src/mpi/model/distributed-simulator-impl.cc ns-3.23/src/mpi/model/distributed-simulator-impl.cc
--- ns-3.22/src/mpi/model/distributed-simulator-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mpi/model/distributed-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -83,6 +83,7 @@
 {
   static TypeId tid = TypeId ("ns3::DistributedSimulatorImpl")
     .SetParent<Object> ()
+    .SetGroupName ("Mpi")
     .AddConstructor<DistributedSimulatorImpl> ()
   ;
   return tid;
diff -Naur ns-3.22/src/mpi/model/granted-time-window-mpi-interface.cc ns-3.23/src/mpi/model/granted-time-window-mpi-interface.cc
--- ns-3.22/src/mpi/model/granted-time-window-mpi-interface.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mpi/model/granted-time-window-mpi-interface.cc	2015-05-13 11:05:27.000000000 -0700
@@ -93,6 +93,7 @@
 {
   static TypeId tid = TypeId ("ns3::GrantedTimeWindowMpiInterface")
     .SetParent<Object> ()
+    .SetGroupName ("Mpi")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/mpi/model/mpi-receiver.cc ns-3.23/src/mpi/model/mpi-receiver.cc
--- ns-3.22/src/mpi/model/mpi-receiver.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mpi/model/mpi-receiver.cc	2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,7 @@
 {
   static TypeId tid = TypeId ("ns3::MpiReceiver")
     .SetParent<Object> ()
+    .SetGroupName ("Mpi")
     .AddConstructor <MpiReceiver> ();
   return tid;
 }
diff -Naur ns-3.22/src/mpi/model/null-message-simulator-impl.cc ns-3.23/src/mpi/model/null-message-simulator-impl.cc
--- ns-3.22/src/mpi/model/null-message-simulator-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mpi/model/null-message-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -55,6 +55,7 @@
 {
   static TypeId tid = TypeId ("ns3::NullMessageSimulatorImpl")
     .SetParent<Object> ()
+    .SetGroupName ("Mpi")
     .AddConstructor<NullMessageSimulatorImpl> ()
     .AddAttribute ("SchedulerTune", "Null Message scheduler tuning parameter",
                    DoubleValue (1.0),
diff -Naur ns-3.22/src/mpi/model/remote-channel-bundle.cc ns-3.23/src/mpi/model/remote-channel-bundle.cc
--- ns-3.22/src/mpi/model/remote-channel-bundle.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mpi/model/remote-channel-bundle.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::RemoteChannelBundle")
     .SetParent<Object> ()
+    .SetGroupName ("Mpi")
     .AddConstructor <RemoteChannelBundle> ();
   return tid;
 }
diff -Naur ns-3.22/src/netanim/model/animation-interface.cc ns-3.23/src/netanim/model/animation-interface.cc
--- ns-3.22/src/netanim/model/animation-interface.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/netanim/model/animation-interface.cc	2015-05-13 11:05:27.000000000 -0700
@@ -1,6 +1,4 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
+/* -*- Mode:C++; c-file-style:"gnu"; indeni * 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;
  *
@@ -773,7 +771,8 @@
   ++gAnimUid;
   NS_LOG_INFO ("Uan TxBeginTrace for packet:" << gAnimUid);
   AddByteTag (gAnimUid, p);
-  AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now (), UpdatePosition (n));
+  UpdatePosition (n);
+  AnimPacketInfo pktInfo (ndev, Simulator::Now ());
   AddPendingPacket (AnimationInterface::UAN, gAnimUid, pktInfo);
   OutputWirelessPacketTxInfo (p, m_pendingUanPackets[gAnimUid], gAnimUid);
 }
@@ -794,9 +793,9 @@
       NS_LOG_WARN ("UanPhyGenRxBeginTrace: unknown Uid");
       return;
     }
-  m_pendingUanPackets[animUid].ProcessRxBegin (ndev, Simulator::Now ());
-  m_pendingUanPackets[animUid].ProcessRxEnd (ndev, Simulator::Now (), UpdatePosition (n));
-  OutputWirelessPacketRxInfo (p, m_pendingUanPackets[animUid].GetRxInfo (ndev), animUid);
+  UpdatePosition (n);
+  m_pendingUanPackets[animUid].ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
+  OutputWirelessPacketRxInfo (p, m_pendingUanPackets[animUid], animUid);
 }
 
 
@@ -813,7 +812,8 @@
   ++gAnimUid;
   NS_LOG_INFO ("Wifi TxBeginTrace for packet:" << gAnimUid);
   AddByteTag (gAnimUid, p);
-  AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now (), UpdatePosition (n));
+  UpdatePosition (n);
+  AnimPacketInfo pktInfo (ndev, Simulator::Now ());
   AddPendingPacket (AnimationInterface::WIFI, gAnimUid, pktInfo);
   Ptr<WifiNetDevice> netDevice = DynamicCast<WifiNetDevice> (ndev);
   Mac48Address nodeAddr = netDevice->GetMac ()->GetAddress ();
@@ -855,14 +855,15 @@
         return;
       }
       Ptr <Node> txNode = NodeList::GetNode (m_macToNodeIdMap[oss.str ()]);
-      AnimPacketInfo pktInfo (0, Simulator::Now (), Simulator::Now (), UpdatePosition (txNode), m_macToNodeIdMap[oss.str ()]);
+      UpdatePosition (txNode);
+      AnimPacketInfo pktInfo (0, Simulator::Now (), m_macToNodeIdMap[oss.str ()]);
       AddPendingPacket (AnimationInterface::WIFI, animUid, pktInfo);
       NS_LOG_WARN ("WifiPhyRxBegin: unknown Uid, but we are adding a wifi packet");
     }
   /// \todo NS_ASSERT (WifiPacketIsPending (animUid) == true);
-  m_pendingWifiPackets[animUid].ProcessRxBegin (ndev, Simulator::Now ());
-  m_pendingWifiPackets[animUid].ProcessRxEnd (ndev, Simulator::Now (), UpdatePosition (n));
-  OutputWirelessPacketRxInfo (p, m_pendingWifiPackets[animUid].GetRxInfo (ndev), animUid);
+  UpdatePosition (n);
+  m_pendingWifiPackets[animUid].ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
+  OutputWirelessPacketRxInfo (p, m_pendingWifiPackets[animUid], animUid);
 }
 
 void 
@@ -876,8 +877,8 @@
   NS_ASSERT (n);
   ++gAnimUid;
   NS_LOG_INFO ("WimaxTxTrace for packet:" << gAnimUid);
-  AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now () + Seconds (0.001), UpdatePosition (n));
-  /// \todo 0.0001 is used until Wimax implements TxBegin and TxEnd traces
+  UpdatePosition (n);
+  AnimPacketInfo pktInfo (ndev, Simulator::Now ());
   AddByteTag (gAnimUid, p);
   AddPendingPacket (AnimationInterface::WIMAX, gAnimUid, pktInfo);
   OutputWirelessPacketTxInfo (p, pktInfo, gAnimUid);
@@ -897,11 +898,9 @@
   NS_LOG_INFO ("WimaxRxTrace for packet:" << animUid);
   NS_ASSERT (IsPacketPending (animUid, AnimationInterface::WIMAX) == true);
   AnimPacketInfo& pktInfo = m_pendingWimaxPackets[animUid];
-  pktInfo.ProcessRxBegin (ndev, Simulator::Now ());
-  pktInfo.ProcessRxEnd (ndev, Simulator::Now () + Seconds (0.001), UpdatePosition (n));
-  /// \todo 0.001 is used until Wimax implements RxBegin and RxEnd traces
-  AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-  OutputWirelessPacketRxInfo (p, pktrxInfo, animUid);
+  UpdatePosition (n);
+  pktInfo.ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
+  OutputWirelessPacketRxInfo (p, pktInfo, animUid);
 }
 
 void 
@@ -915,8 +914,8 @@
   NS_ASSERT (n);
   ++gAnimUid;
   NS_LOG_INFO ("LteTxTrace for packet:" << gAnimUid);
-  AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now () + Seconds (0.001), UpdatePosition (n));
-  /// \todo 0.0001 is used until Lte implements TxBegin and TxEnd traces
+  UpdatePosition (n);
+  AnimPacketInfo pktInfo (ndev, Simulator::Now ());
   AddByteTag (gAnimUid, p);
   AddPendingPacket (AnimationInterface::LTE, gAnimUid, pktInfo);
   OutputWirelessPacketTxInfo (p, pktInfo, gAnimUid);
@@ -940,11 +939,9 @@
       return;
     }
   AnimPacketInfo& pktInfo = m_pendingLtePackets[animUid];
-  pktInfo.ProcessRxBegin (ndev, Simulator::Now ());
-  pktInfo.ProcessRxEnd (ndev, Simulator::Now () + Seconds (0.001), UpdatePosition (n));
-  /// \todo 0.001 is used until Lte implements RxBegin and RxEnd traces
-  AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-  OutputWirelessPacketRxInfo (p, pktrxInfo, animUid);
+  UpdatePosition (n);
+  pktInfo.ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
+  OutputWirelessPacketRxInfo (p, pktInfo, animUid);
 }
 
 void 
@@ -971,8 +968,8 @@
       Ptr <Packet> p = *i;
       ++gAnimUid;
       NS_LOG_INFO ("LteSpectrumPhyTxTrace for packet:" << gAnimUid);
-      AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now () + Seconds (0.001), UpdatePosition (n));
-      /// \todo 0.0001 is used until Lte implements TxBegin and TxEnd traces
+      UpdatePosition (n);
+      AnimPacketInfo pktInfo (ndev, Simulator::Now ());
       AddByteTag (gAnimUid, p);
       AddPendingPacket (AnimationInterface::LTE, gAnimUid, pktInfo);
       OutputWirelessPacketTxInfo (p, pktInfo, gAnimUid);
@@ -1009,11 +1006,9 @@
           return;
         }
       AnimPacketInfo& pktInfo = m_pendingLtePackets[animUid];
-      pktInfo.ProcessRxBegin (ndev, Simulator::Now ());
-      pktInfo.ProcessRxEnd (ndev, Simulator::Now () + Seconds (0.001), UpdatePosition (n));
-      /// \todo 0.001 is used until Lte implements RxBegin and RxEnd traces
-      AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-      OutputWirelessPacketRxInfo (p, pktrxInfo, animUid);
+      UpdatePosition (n);
+      pktInfo.ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
+      OutputWirelessPacketRxInfo (p, pktInfo, animUid);
     }
 }
 
@@ -1029,7 +1024,8 @@
   ++gAnimUid;
   NS_LOG_INFO ("CsmaPhyTxBeginTrace for packet:" << gAnimUid);
   AddByteTag (gAnimUid, p);
-  AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now (), UpdatePosition (n));
+  UpdatePosition (n);
+  AnimPacketInfo pktInfo (ndev, Simulator::Now ());
   AddPendingPacket (AnimationInterface::CSMA, gAnimUid, pktInfo);
 
 }
@@ -1049,7 +1045,8 @@
     {
       NS_LOG_WARN ("CsmaPhyTxEndTrace: unknown Uid"); 
       NS_FATAL_ERROR ("CsmaPhyTxEndTrace: unknown Uid"); 
-      AnimPacketInfo pktInfo (ndev, Simulator::Now (), Simulator::Now (), UpdatePosition (n));
+      UpdatePosition (n);
+      AnimPacketInfo pktInfo (ndev, Simulator::Now ());
       AddPendingPacket (AnimationInterface::CSMA, animUid, pktInfo);
       NS_LOG_WARN ("Unknown Uid, but adding Csma Packet anyway");
     }
@@ -1075,15 +1072,11 @@
     }
   /// \todo NS_ASSERT (CsmaPacketIsPending (AnimUid) == true);
   AnimPacketInfo& pktInfo = m_pendingCsmaPackets[animUid];
-  pktInfo.ProcessRxBegin (ndev, Simulator::Now ());
-  pktInfo.ProcessRxEnd (ndev, Simulator::Now (), UpdatePosition (n));
+  UpdatePosition (n);
+  pktInfo.ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
   NS_LOG_INFO ("CsmaPhyRxEndTrace for packet:" << animUid);
-  AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-  if (pktrxInfo.IsPhyRxComplete ())
-    {
-      NS_LOG_INFO ("CsmaPhyRxEndTrace for packet:" << animUid << " complete");
-      OutputCsmaPacket (p, pktInfo, pktrxInfo);
-    }
+  NS_LOG_INFO ("CsmaPhyRxEndTrace for packet:" << animUid << " complete");
+  OutputCsmaPacket (p, pktInfo);
 }
 
 void 
@@ -1105,12 +1098,8 @@
     }
   /// \todo NS_ASSERT (CsmaPacketIsPending (AnimUid) == true);
   AnimPacketInfo& pktInfo = m_pendingCsmaPackets[animUid];
-  AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-  if (pktrxInfo.IsPhyRxComplete ())
-    {
-      NS_LOG_INFO ("MacRxTrace for packet:" << animUid << " complete");
-      OutputCsmaPacket (p, pktInfo, pktrxInfo);
-    }
+  NS_LOG_INFO ("MacRxTrace for packet:" << animUid << " complete");
+  OutputCsmaPacket (p, pktInfo);
 }
 
 void
@@ -1122,34 +1111,33 @@
     nodeId = pktInfo.m_txnd->GetNode ()->GetId ();
   else
     nodeId = pktInfo.m_txNodeId;
-  double lbTx = pktInfo.m_firstLastBitDelta + pktInfo.m_fbTx;
-  WriteXmlPRef (animUid, nodeId, pktInfo.m_fbTx, lbTx, m_enablePacketMetadata? GetPacketMetadata (p):"");
+  WriteXmlPRef (animUid, nodeId, pktInfo.m_fbTx, m_enablePacketMetadata? GetPacketMetadata (p):"");
 
 }
 
 void 
-AnimationInterface::OutputWirelessPacketRxInfo (Ptr<const Packet> p, AnimRxInfo pktrxInfo, uint64_t animUid)
+AnimationInterface::OutputWirelessPacketRxInfo (Ptr<const Packet> p, AnimPacketInfo & pktInfo, uint64_t animUid)
 {
   CheckMaxPktsPerTraceFile ();
-  uint32_t rxId = pktrxInfo.m_rxnd->GetNode ()->GetId ();
-  WriteXmlP (animUid, "wpr", rxId, pktrxInfo.m_fbRx, pktrxInfo.m_lbRx);
+  uint32_t rxId = pktInfo.m_rxnd->GetNode ()->GetId ();
+  WriteXmlP (animUid, "wpr", rxId, pktInfo.m_fbRx, pktInfo.m_lbRx);
 }
 
 void 
-AnimationInterface::OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo)
+AnimationInterface::OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo &pktInfo)
 {
   CheckMaxPktsPerTraceFile ();
   NS_ASSERT (pktInfo.m_txnd);
   uint32_t nodeId = pktInfo.m_txnd->GetNode ()->GetId ();
-  uint32_t rxId = pktrxInfo.m_rxnd->GetNode ()->GetId ();
+  uint32_t rxId = pktInfo.m_rxnd->GetNode ()->GetId ();
 
   WriteXmlP ("p", 
              nodeId, 
              pktInfo.m_fbTx, 
              pktInfo.m_lbTx, 
              rxId,
-             pktrxInfo.m_fbRx, 
-             pktrxInfo.m_lbRx, 
+             pktInfo.m_fbRx, 
+             pktInfo.m_lbRx, 
              m_enablePacketMetadata? GetPacketMetadata (p):"");
 }
 
@@ -1590,9 +1578,14 @@
                   if (n1Id < n2Id)
                     { 
                       // ouptut the p2p link
-                      NS_LOG_INFO ("Link:" << GetIpv4Address (dev) << ":" << GetMacAddress (dev) << "----" << GetIpv4Address (chDev) << ":" << GetMacAddress (chDev) );
+                      NS_LOG_INFO ("Link:" << GetIpv4Address (dev) << ":" << GetMacAddress (dev) << "----" << GetIpv4Address (chDev) << ":" << GetMacAddress (chDev));
                       AddToIpv4AddressNodeIdTable (GetIpv4Address (dev), n1Id);
                       AddToIpv4AddressNodeIdTable (GetIpv4Address (chDev), n2Id);
+                      P2pLinkNodeIdPair p2pPair;
+                      p2pPair.fromNode = n1Id;
+                      p2pPair.toNode = n2Id;
+                      LinkProperties lp = {GetIpv4Address (dev) + "~" + GetMacAddress (dev), GetIpv4Address (chDev) + "~" + GetMacAddress (chDev), ""};
+                      m_linkProperties[p2pPair] = lp;
                       WriteXmlLink (n1Id, 0, n2Id);
                     }
                 }
@@ -2046,15 +2039,18 @@
 {
   AnimXmlElement element ("anim");
   element.AddAttribute ("ver", GetNetAnimVersion ());
-  element.Close ();
+  FILE * f = m_f;
   if (!routing)
     {
-      WriteN (element.GetElementString (), m_f);
+      element.AddAttribute ("filetype", "animation");
     }
   else
     {
-      WriteN (element.GetElementString (), m_routingF);
+      element.AddAttribute ("filetype", "routing");
+      f = m_routingF;
     }
+  element.Close ();
+  WriteN (element.GetElementString (), f);
 }
 
 void 
@@ -2162,13 +2158,12 @@
 
 
 void 
-AnimationInterface::WriteXmlPRef (uint64_t animUid, uint32_t fId, double fbTx, double lbTx, std::string metaInfo)
+AnimationInterface::WriteXmlPRef (uint64_t animUid, uint32_t fId, double fbTx, std::string metaInfo)
 {
   AnimXmlElement element ("pr");
   element.AddAttribute ("uId", animUid);
   element.AddAttribute ("fId", fId);
   element.AddAttribute ("fbTx", fbTx);
-  element.AddAttribute ("lbTx", lbTx);
   if (!metaInfo.empty ())
     {
       element.AddAttribute ("meta-info", metaInfo.c_str ());
@@ -2339,6 +2334,7 @@
 {
   static TypeId tid = TypeId ("ns3::AnimByteTag")
     .SetParent<Tag> ()
+    .SetGroupName ("NetAnim")
     .AddConstructor<AnimByteTag> ()
   ;
   return tid;
@@ -2391,8 +2387,7 @@
     m_txNodeId (0),
     m_fbTx (0), 
     m_lbTx (0), 
-    m_txLoc (Vector (0,0,0)), 
-    m_firstLastBitDelta (0)
+    m_lbRx (0)
 {
 }
 
@@ -2402,84 +2397,28 @@
   m_txNodeId = pInfo.m_txNodeId;
   m_fbTx = pInfo.m_fbTx;
   m_lbTx = pInfo.m_lbTx;
-  m_txLoc = pInfo.m_txLoc;
-  m_firstLastBitDelta = pInfo.m_firstLastBitDelta;
+  m_lbRx = pInfo.m_lbRx;
 }
 
 AnimationInterface::AnimPacketInfo::AnimPacketInfo (Ptr <const NetDevice> txnd, 
                                 const Time fbTx, 
-                                const Time lbTx, 
-                                Vector txLoc, 
                                 uint32_t txNodeId)
   : m_txnd (txnd), 
     m_txNodeId (0),
     m_fbTx (fbTx.GetSeconds ()), 
-    m_lbTx (lbTx.GetSeconds ()), 
-    m_txLoc (txLoc),
-    m_firstLastBitDelta (0)
+    m_lbTx (0), 
+    m_lbRx (0)
 {
   if (!m_txnd)
     m_txNodeId = txNodeId;
 }
 
 void 
-AnimationInterface::AnimPacketInfo::ProcessRxBegin (Ptr<const NetDevice> nd, const Time fbRx)
-{
-  m_rx[nd->GetNode ()->GetId ()] = AnimRxInfo (fbRx, nd, 0);
-}
-
-bool 
-AnimationInterface::AnimPacketInfo::ProcessRxEnd (Ptr<const NetDevice> nd, const Time lbRx, Vector rxLoc)
-{
-  uint32_t NodeId = nd->GetNode ()->GetId (); 
-  // Find the RxInfo
-  if (m_rx.find (NodeId) == m_rx.end ())
-    {
-      return false;
-    } 
-  AnimRxInfo& rxInfo = m_rx[NodeId];
-  // Check if the NetDevice matches. A node may have several NetDevices
-  if (rxInfo.m_rxnd != nd) 
-    {
-      return false; 
-    }
-  rxInfo.rxRange = CalculateDistance (m_txLoc, rxLoc);
-  rxInfo.m_lbRx = lbRx.GetSeconds ();
-  rxInfo.SetPhyRxComplete ();
-  m_firstLastBitDelta = rxInfo.m_lbRx - rxInfo.m_fbRx;
-  return true;
-}
-
-AnimationInterface::AnimRxInfo 
-AnimationInterface::AnimPacketInfo::GetRxInfo (Ptr<const NetDevice> nd)
-{
-  uint32_t NodeId = nd->GetNode ()->GetId (); 
-  NS_ASSERT (m_rx.find (NodeId) != m_rx.end ()); 
-  return m_rx[NodeId];
-}
-
-void 
-AnimationInterface::AnimPacketInfo::RemoveRxInfo (Ptr<const NetDevice> nd)
-{
-  uint32_t NodeId = nd->GetNode ()->GetId (); 
-  m_rx.erase (m_rx.find (NodeId));
-}
-
-void 
-AnimationInterface::AnimPacketInfo::ProcessRxDrop (Ptr<const NetDevice> nd)
-{
-}
-
-bool 
-AnimationInterface::AnimRxInfo::IsPhyRxComplete ()
-{
-  return m_PhyRxComplete;
-}
-
-void 
-AnimationInterface::AnimRxInfo::SetPhyRxComplete ()
+AnimationInterface::AnimPacketInfo::ProcessRxBegin (Ptr<const NetDevice> nd, const double fbRx)
 {
-  m_PhyRxComplete = true; 
+  Ptr <Node> n = nd->GetNode ();
+  m_fbRx = fbRx;
+  m_rxnd = nd;
 }
 
 } // namespace ns3
diff -Naur ns-3.22/src/netanim/model/animation-interface.h ns-3.23/src/netanim/model/animation-interface.h
--- ns-3.22/src/netanim/model/animation-interface.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/netanim/model/animation-interface.h	2015-05-13 11:05:27.000000000 -0700
@@ -47,7 +47,7 @@
 
 #define MAX_PKTS_PER_TRACE_FILE 100000
 #define PURGE_INTERVAL 5
-#define NETANIM_VERSION "netanim-3.105"
+#define NETANIM_VERSION "netanim-3.106"
 
 
 struct NodeSize;
@@ -420,44 +420,21 @@
 
 private:
 
-
-  // ##### typedef #####
-  class AnimRxInfo
-  {
-  public:
-    AnimRxInfo () {}
-    AnimRxInfo (const Time& fbRx, Ptr <const NetDevice> nd ,double rxRange)
-      : m_fbRx (fbRx.GetSeconds ()), m_lbRx (0), m_rxnd (nd), rxRange (rxRange), m_PhyRxComplete (false) {}
-    double m_fbRx;            
-    double m_lbRx;             
-    Ptr <const NetDevice> m_rxnd;
-    double rxRange;
-    bool IsPhyRxComplete ();
-    void SetPhyRxComplete ();
-  private:
-    bool m_PhyRxComplete;
-  };
-
   class AnimPacketInfo
   
   {
   public:
     AnimPacketInfo ();
     AnimPacketInfo (const AnimPacketInfo & pInfo);
-    AnimPacketInfo(Ptr <const NetDevice> tx_nd, const Time fbTx, const Time lbTx, Vector txLoc, uint32_t txNodeId = 0);
+    AnimPacketInfo(Ptr <const NetDevice> tx_nd, const Time fbTx, uint32_t txNodeId = 0);
     Ptr <const NetDevice> m_txnd;
     uint32_t m_txNodeId;
     double m_fbTx;     
     double m_lbTx;     
-    Vector m_txLoc;
-    double m_firstLastBitDelta;
-    std::map<uint32_t,AnimRxInfo> m_rx;
-    void ProcessRxBegin (Ptr <const NetDevice> nd, const Time fbRx);
-    bool ProcessRxEnd (Ptr <const NetDevice> nd, const Time fbRx, Vector rxLoc);
-    void ProcessRxDrop (Ptr <const NetDevice> nd);
-    AnimRxInfo GetRxInfo (Ptr <const NetDevice> nd);
-    void RemoveRxInfo (Ptr <const NetDevice> nd);
-  
+    double m_fbRx;            
+    double m_lbRx;
+    Ptr <const NetDevice> m_rxnd;
+    void ProcessRxBegin (Ptr <const NetDevice> nd, const double fbRx);
   };
 
   typedef struct
@@ -608,7 +585,7 @@
   AnimUidPacketInfoMap m_pendingLtePackets;
   AnimUidPacketInfoMap m_pendingCsmaPackets;
   AnimUidPacketInfoMap m_pendingUanPackets;
-  std::map<uint32_t, Vector> m_nodeLocation;
+  std::map <uint32_t, Vector> m_nodeLocation;
   std::map <std::string, uint32_t> m_macToNodeIdMap;
   std::map <std::string, uint32_t> m_ipv4ToNodeIdMap;
   NodeColorsMap m_nodeColors;
@@ -621,6 +598,7 @@
   std::vector <std::string> m_resources;
   std::vector <std::string> m_nodeCounters;
 
+  /* Value-added custom counters */
   NodeCounterMap64 m_nodeIpv4Drop;
   NodeCounterMap64 m_nodeIpv4Tx;
   NodeCounterMap64 m_nodeIpv4Rx;
@@ -764,8 +742,8 @@
   void WriteNonP2pLinkProperties (uint32_t id, std::string ipv4Address, std::string channelType);
   void WriteNodeUpdate (uint32_t nodeId);
   void OutputWirelessPacketTxInfo (Ptr<const Packet> p, AnimPacketInfo& pktInfo, uint64_t animUid);
-  void OutputWirelessPacketRxInfo (Ptr<const Packet> p, AnimRxInfo pktrxInfo, uint64_t animUid);
-  void OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);
+  void OutputWirelessPacketRxInfo (Ptr<const Packet> p, AnimPacketInfo& pktInfo, uint64_t animUid);
+  void OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo& pktInfo);
   void WriteLinkProperties ();
   void WriteNodes ();
   void WriteNodeColors ();
@@ -792,7 +770,7 @@
                                  double lbRx,
                                  std::string metaInfo = ""); 
   void WriteXmlP (uint64_t animUid, std::string pktType, uint32_t fId, double fbTx, double lbTx);
-  void WriteXmlPRef (uint64_t animUid, uint32_t fId, double fbTx, double lbTx, std::string metaInfo = "");
+  void WriteXmlPRef (uint64_t animUid, uint32_t fId, double fbTx, std::string metaInfo = "");
   void WriteXmlClose (std::string name, bool routing = false);
   void WriteXmlNonP2pLinkProperties (uint32_t id, std::string ipv4Address, std::string channelType);
   void WriteXmlRouting (uint32_t id, std::string routingInfo);
diff -Naur ns-3.22/src/netanim/wscript ns-3.23/src/netanim/wscript
--- ns-3.22/src/netanim/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/netanim/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -3,7 +3,7 @@
 import wutils
 
 # Required NetAnim version
-NETANIM_RELEASE_NAME = "netanim-3.105"
+NETANIM_RELEASE_NAME = "netanim-3.106"
 
 
 def build (bld) :
diff -Naur ns-3.22/src/network/bindings/modulegen__gcc_ILP32.py ns-3.23/src/network/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/network/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -1540,11 +1540,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/network/bindings/modulegen__gcc_LP64.py ns-3.23/src/network/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/network/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -1540,11 +1540,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/network/helper/delay-jitter-estimation.cc ns-3.23/src/network/helper/delay-jitter-estimation.cc
--- ns-3.22/src/network/helper/delay-jitter-estimation.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/helper/delay-jitter-estimation.cc	2015-05-13 11:05:27.000000000 -0700
@@ -66,6 +66,7 @@
 {
   static TypeId tid = TypeId ("anon::DelayJitterEstimationTimestampTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<DelayJitterEstimationTimestampTag> ()
     .AddAttribute ("CreationTime",
                    "The time at which the timestamp was created",
diff -Naur ns-3.22/src/network/model/application.cc ns-3.23/src/network/model/application.cc
--- ns-3.22/src/network/model/application.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/application.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::Application")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddAttribute ("StartTime", "Time at which the application will start",
                    TimeValue (Seconds (0.0)),
                    MakeTimeAccessor (&Application::m_startTime),
diff -Naur ns-3.22/src/network/model/channel.cc ns-3.23/src/network/model/channel.cc
--- ns-3.22/src/network/model/channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::Channel")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddAttribute ("Id", "The id (unique integer) of this Channel.",
                    TypeId::ATTR_GET,
                    UintegerValue (0),
diff -Naur ns-3.22/src/network/model/channel-list.cc ns-3.23/src/network/model/channel-list.cc
--- ns-3.22/src/network/model/channel-list.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/channel-list.cc	2015-05-13 11:05:27.000000000 -0700
@@ -108,6 +108,7 @@
 {
   static TypeId tid = TypeId ("ns3::ChannelListPriv")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddAttribute ("ChannelList", "The list of all channels created during the simulation.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&ChannelListPriv::m_channels),
diff -Naur ns-3.22/src/network/model/chunk.cc ns-3.23/src/network/model/chunk.cc
--- ns-3.22/src/network/model/chunk.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/chunk.cc	2015-05-13 11:05:27.000000000 -0700
@@ -9,6 +9,7 @@
 {
   static TypeId tid = TypeId ("ns3::Chunk")
     .SetParent<ObjectBase> ()
+    .SetGroupName("Network")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/network/model/header.cc ns-3.23/src/network/model/header.cc
--- ns-3.22/src/network/model/header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -17,6 +17,7 @@
 {
   static TypeId tid = TypeId ("ns3::Header")
     .SetParent<Chunk> ()
+    .SetGroupName("Network")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/network/model/net-device.cc ns-3.23/src/network/model/net-device.cc
--- ns-3.22/src/network/model/net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::NetDevice")
     .SetParent<Object> ()
+    .SetGroupName("Network")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/network/model/node.cc ns-3.23/src/network/model/node.cc
--- ns-3.22/src/network/model/node.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/node.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,6 +51,7 @@
 {
   static TypeId tid = TypeId ("ns3::Node")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddConstructor<Node> ()
     .AddAttribute ("DeviceList", "The list of devices associated to this Node.",
                    ObjectVectorValue (),
diff -Naur ns-3.22/src/network/model/node-list.cc ns-3.23/src/network/model/node-list.cc
--- ns-3.22/src/network/model/node-list.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/node-list.cc	2015-05-13 11:05:27.000000000 -0700
@@ -111,6 +111,7 @@
 {
   static TypeId tid = TypeId ("ns3::NodeListPriv")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddAttribute ("NodeList", "The list of all nodes created during the simulation.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&NodeListPriv::m_nodes),
diff -Naur ns-3.22/src/network/model/socket.cc ns-3.23/src/network/model/socket.cc
--- ns-3.22/src/network/model/socket.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/socket.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,7 +37,8 @@
 Socket::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Socket")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Network");
   return tid;
 }
 
@@ -539,6 +540,7 @@
 {
   static TypeId tid = TypeId ("ns3::SocketAddressTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<SocketAddressTag> ()
   ;
   return tid;
@@ -599,6 +601,7 @@
 {
   static TypeId tid = TypeId ("ns3::SocketIpTtlTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<SocketIpTtlTag> ()
   ;
   return tid;
@@ -657,6 +660,7 @@
 {
   static TypeId tid = TypeId ("ns3::SocketIpv6HopLimitTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<SocketIpv6HopLimitTag> ()
   ;
   return tid;
@@ -718,6 +722,7 @@
 {
   static TypeId tid = TypeId ("ns3::SocketSetDontFragmentTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<SocketSetDontFragmentTag> ();
   return tid;
 }
@@ -773,6 +778,7 @@
 {
   static TypeId tid = TypeId ("ns3::SocketIpTosTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<SocketIpTosTag> ()
     ;
   return tid;
@@ -829,6 +835,7 @@
 {
   static TypeId tid = TypeId ("ns3::SocketIpv6TclassTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network") 
     .AddConstructor<SocketIpv6TclassTag> ()
     ;
   return tid;
diff -Naur ns-3.22/src/network/model/socket-factory.cc ns-3.23/src/network/model/socket-factory.cc
--- ns-3.22/src/network/model/socket-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/socket-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -29,7 +29,8 @@
 TypeId SocketFactory::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::SocketFactory")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Network");
   return tid;
 }
 
diff -Naur ns-3.22/src/network/model/tag.cc ns-3.23/src/network/model/tag.cc
--- ns-3.22/src/network/model/tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,7 @@
 {
   static TypeId tid = TypeId ("ns3::Tag")
     .SetParent<ObjectBase> ()
+    .SetGroupName("Network")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/network/model/trailer.cc ns-3.23/src/network/model/trailer.cc
--- ns-3.22/src/network/model/trailer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/model/trailer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -17,6 +17,7 @@
 {
   static TypeId tid = TypeId ("ns3::Trailer")
     .SetParent<Chunk> ()
+    .SetGroupName("Network")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/network/utils/data-rate.cc ns-3.23/src/network/utils/data-rate.cc
--- ns-3.22/src/network/utils/data-rate.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/data-rate.cc	2015-05-13 11:05:27.000000000 -0700
@@ -232,6 +232,20 @@
   return static_cast<double>(bytes)*8/m_bps;
 }
 
+Time DataRate::CalculateBytesTxTime (uint32_t bytes) const
+{
+  NS_LOG_FUNCTION (this << bytes);
+  // \todo avoid to use double (if possible).
+  return Seconds (static_cast<double>(bytes)*8/m_bps);
+}
+
+Time DataRate::CalculateBitsTxTime (uint32_t bits) const
+{
+  NS_LOG_FUNCTION (this << bits);
+  // \todo avoid to use double (if possible).
+  return Seconds (static_cast<double>(bits)/m_bps);
+}
+
 uint64_t DataRate::GetBitRate () const
 {
   NS_LOG_FUNCTION (this);
diff -Naur ns-3.22/src/network/utils/data-rate.h ns-3.23/src/network/utils/data-rate.h
--- ns-3.22/src/network/utils/data-rate.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/data-rate.h	2015-05-13 11:05:27.000000000 -0700
@@ -27,6 +27,7 @@
 #include "ns3/nstime.h"
 #include "ns3/attribute.h"
 #include "ns3/attribute-helper.h"
+#include "ns3/deprecated.h"
 
 namespace ns3 {
 
@@ -42,9 +43,9 @@
  * from strings, natural multiplication e.g.:
  * \code
  *   DataRate x("56kbps");
- *   double nBits = x*ns3::Seconds(19.2);
+ *   double nBits = x*ns3::Seconds (19.2);
  *   uint32_t nBytes = 20;
- *   double txtime = x.CalclulateTxTime(nBytes);
+ *   Time txtime = x.CalculateBytesTxTime (nBytes);
  * \endcode
  * This class also supports the regular comparison operators \c <, \c >,
  * \c <=, \c >=, \c ==, and \c !=
@@ -164,9 +165,27 @@
    *
    * Calculates the transmission time at this data rate
    * \param bytes The number of bytes (not bits) for which to calculate
+   * \return The transmission time for the number of bytes specified
+   */
+  Time CalculateBytesTxTime (uint32_t bytes) const;
+
+  /**
+   * \brief Calculate transmission time
+   *
+   * Calculates the transmission time at this data rate
+   * \param bits The number of bits (not bytes) for which to calculate
+   * \return The transmission time for the number of bits specified
+   */
+  Time CalculateBitsTxTime (uint32_t bits) const;
+
+  /**
+   * \brief Calculate transmission time
+   *
+   * 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
    */
-  double CalculateTxTime (uint32_t bytes) const;
+  double CalculateTxTime (uint32_t bytes) const NS_DEPRECATED;
 
   /**
    * Get the underlying bitrate
diff -Naur ns-3.22/src/network/utils/drop-tail-queue.cc ns-3.23/src/network/utils/drop-tail-queue.cc
--- ns-3.22/src/network/utils/drop-tail-queue.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/drop-tail-queue.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,7 @@
 {
   static TypeId tid = TypeId ("ns3::DropTailQueue")
     .SetParent<Queue> ()
+    .SetGroupName("Network")
     .AddConstructor<DropTailQueue> ()
     .AddAttribute ("Mode", 
                    "Whether to use bytes (see MaxBytes) or packets (see MaxPackets) as the maximum queue size metric.",
diff -Naur ns-3.22/src/network/utils/error-model.cc ns-3.23/src/network/utils/error-model.cc
--- ns-3.22/src/network/utils/error-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/error-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -83,6 +83,7 @@
 { 
   static TypeId tid = TypeId ("ns3::ErrorModel")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddAttribute ("IsEnabled", "Whether this ErrorModel is enabled or not.",
                    BooleanValue (true),
                    MakeBooleanAccessor (&ErrorModel::m_enable),
@@ -151,6 +152,7 @@
 { 
   static TypeId tid = TypeId ("ns3::RateErrorModel")
     .SetParent<ErrorModel> ()
+    .SetGroupName("Network")
     .AddConstructor<RateErrorModel> ()
     .AddAttribute ("ErrorUnit", "The error unit",
                    EnumValue (ERROR_UNIT_BYTE),
@@ -290,6 +292,7 @@
 {
   static TypeId tid = TypeId ("ns3::BurstErrorModel")
     .SetParent<ErrorModel> ()
+    .SetGroupName("Network")
     .AddConstructor<BurstErrorModel> ()
     .AddAttribute ("ErrorRate", "The burst error event.",
                    DoubleValue (0.0),
@@ -418,6 +421,7 @@
 { 
   static TypeId tid = TypeId ("ns3::ListErrorModel")
     .SetParent<ErrorModel> ()
+    .SetGroupName("Network")
     .AddConstructor<ListErrorModel> ()
   ;
   return tid;
@@ -487,6 +491,7 @@
 { 
   static TypeId tid = TypeId ("ns3::ReceiveListErrorModel")
     .SetParent<ErrorModel> ()
+    .SetGroupName("Network")
     .AddConstructor<ReceiveListErrorModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/ethernet-header.cc ns-3.23/src/network/utils/ethernet-header.cc
--- ns-3.22/src/network/utils/ethernet-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/ethernet-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -118,6 +118,7 @@
 {
   static TypeId tid = TypeId ("ns3::EthernetHeader")
     .SetParent<Header> ()
+    .SetGroupName("Network")
     .AddConstructor<EthernetHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/ethernet-trailer.cc ns-3.23/src/network/utils/ethernet-trailer.cc
--- ns-3.22/src/network/utils/ethernet-trailer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/ethernet-trailer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -108,6 +108,7 @@
 {
   static TypeId tid = TypeId ("ns3::EthernetTrailer")
     .SetParent<Trailer> ()
+    .SetGroupName("Network")
     .AddConstructor<EthernetTrailer> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/flow-id-tag.cc ns-3.23/src/network/utils/flow-id-tag.cc
--- ns-3.22/src/network/utils/flow-id-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/flow-id-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,7 @@
 {
   static TypeId tid = TypeId ("ns3::FlowIdTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<FlowIdTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/llc-snap-header.cc ns-3.23/src/network/utils/llc-snap-header.cc
--- ns-3.22/src/network/utils/llc-snap-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/llc-snap-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::LlcSnapHeader")
     .SetParent<Header> ()
+    .SetGroupName("Network")
     .AddConstructor<LlcSnapHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/packetbb.cc ns-3.23/src/network/utils/packetbb.cc
--- ns-3.22/src/network/utils/packetbb.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packetbb.cc	2015-05-13 11:05:27.000000000 -0700
@@ -839,6 +839,7 @@
 {
   static TypeId tid = TypeId ("ns3::PbbPacket")
     .SetParent<Header> ()
+    .SetGroupName("Network")
     .AddConstructor<PbbPacket> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/packet-burst.cc ns-3.23/src/network/utils/packet-burst.cc
--- ns-3.22/src/network/utils/packet-burst.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packet-burst.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketBurst")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddConstructor<PacketBurst> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/packet-probe.cc ns-3.23/src/network/utils/packet-probe.cc
--- ns-3.22/src/network/utils/packet-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketProbe")
     .SetParent<Probe> ()
+    .SetGroupName("Network")
     .AddConstructor<PacketProbe> ()
     .AddTraceSource ( "Output",
                       "The packet that serve as the output for this probe",
diff -Naur ns-3.22/src/network/utils/packet-socket.cc ns-3.23/src/network/utils/packet-socket.cc
--- ns-3.22/src/network/utils/packet-socket.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packet-socket.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketSocket")
     .SetParent<Socket> ()
+    .SetGroupName("Network")
     .AddConstructor<PacketSocket> ()
     .AddTraceSource ("Drop", "Drop packet due to receive buffer overflow",
                      MakeTraceSourceAccessor (&PacketSocket::m_dropTrace),
@@ -544,6 +545,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketSocketTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<PacketSocketTag> ()
   ;
   return tid;
@@ -607,6 +609,7 @@
 {
   static TypeId tid = TypeId ("ns3::DeviceNameTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<DeviceNameTag> ();
   return tid;
 }
diff -Naur ns-3.22/src/network/utils/packet-socket-client.cc ns-3.23/src/network/utils/packet-socket-client.cc
--- ns-3.22/src/network/utils/packet-socket-client.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packet-socket-client.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketSocketClient")
     .SetParent<Application> ()
+    .SetGroupName("Network")
     .AddConstructor<PacketSocketClient> ()
     .AddAttribute ("MaxPackets",
                    "The maximum number of packets the application will send (zero means infinite)",
diff -Naur ns-3.22/src/network/utils/packet-socket-factory.cc ns-3.23/src/network/utils/packet-socket-factory.cc
--- ns-3.22/src/network/utils/packet-socket-factory.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packet-socket-factory.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,7 +32,8 @@
 PacketSocketFactory::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::PacketSocketFactory")
-    .SetParent<SocketFactory> ();
+    .SetParent<SocketFactory> ()
+    .SetGroupName("Network");
   return tid;
 }
 
diff -Naur ns-3.22/src/network/utils/packet-socket-server.cc ns-3.23/src/network/utils/packet-socket-server.cc
--- ns-3.22/src/network/utils/packet-socket-server.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/packet-socket-server.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
 {
   static TypeId tid = TypeId ("ns3::PacketSocketServer")
     .SetParent<Application> ()
+    .SetGroupName("Network")
     .AddConstructor<PacketSocketServer> ()
     .AddTraceSource ("Rx", "A packet has been received",
                      MakeTraceSourceAccessor (&PacketSocketServer::m_rxTrace),
diff -Naur ns-3.22/src/network/utils/pcap-file-wrapper.cc ns-3.23/src/network/utils/pcap-file-wrapper.cc
--- ns-3.22/src/network/utils/pcap-file-wrapper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/pcap-file-wrapper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::PcapFileWrapper")
     .SetParent<Object> ()
+    .SetGroupName("Network")
     .AddConstructor<PcapFileWrapper> ()
     .AddAttribute ("CaptureSize",
                    "Maximum length of captured packets (cf. pcap snaplen)",
diff -Naur ns-3.22/src/network/utils/queue.cc ns-3.23/src/network/utils/queue.cc
--- ns-3.22/src/network/utils/queue.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/queue.cc	2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,7 @@
 {
   static TypeId tid = TypeId ("ns3::Queue")
     .SetParent<Object> ()
+    .SetGroupName("Network")  
     .AddTraceSource ("Enqueue", "Enqueue a packet in the queue.",
                      MakeTraceSourceAccessor (&Queue::m_traceEnqueue),
                      "ns3::Packet::TracedCallback")
diff -Naur ns-3.22/src/network/utils/queue.h ns-3.23/src/network/utils/queue.h
--- ns-3.22/src/network/utils/queue.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/queue.h	2015-05-13 11:05:27.000000000 -0700
@@ -180,7 +180,6 @@
    */
   void Drop (Ptr<Packet> packet);
 
-private:
   /// Traced callback: fired when a packet is enqueued
   TracedCallback<Ptr<const Packet> > m_traceEnqueue;
   /// Traced callback: fired when a packet is dequeued
diff -Naur ns-3.22/src/network/utils/radiotap-header.cc ns-3.23/src/network/utils/radiotap-header.cc
--- ns-3.22/src/network/utils/radiotap-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/radiotap-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,6 +47,8 @@
 {
   static TypeId tid = TypeId ("ns3::RadiotapHeader")
     .SetParent<Header> ()
+    .SetGroupName("Network")
+
     .AddConstructor<RadiotapHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/network/utils/red-queue.cc ns-3.23/src/network/utils/red-queue.cc
--- ns-3.22/src/network/utils/red-queue.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/red-queue.cc	2015-05-13 11:05:27.000000000 -0700
@@ -75,6 +75,7 @@
 {
   static TypeId tid = TypeId ("ns3::RedQueue")
     .SetParent<Queue> ()
+    .SetGroupName("Network")
     .AddConstructor<RedQueue> ()
     .AddAttribute ("Mode",
                    "Determines unit for QueueLimit",
diff -Naur ns-3.22/src/network/utils/sgi-hashmap.h ns-3.23/src/network/utils/sgi-hashmap.h
--- ns-3.22/src/network/utils/sgi-hashmap.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/sgi-hashmap.h	2015-05-13 11:05:27.000000000 -0700
@@ -8,28 +8,34 @@
 /* To use gcc extensions.
  */
 #ifdef __GNUC__
-  #if __GNUC__ < 3
-     #include <hash_map.h>
-namespace sgi { using ::hash_map; }; // inherit globals
-  #else 
-     #if __GNUC__ < 4
-       #include <ext/hash_map>
-       #if __GNUC_MINOR__ == 0
-namespace sgi = std;         // GCC 3.0
-       #else
-namespace sgi = ::__gnu_cxx;       // GCC 3.1 and later
-       #endif
-     #else  // gcc 4.x and later
-       #if __GNUC_MINOR__ < 3
-         #ifdef __clang__
+  #if __GNUC__ < 3 // GCC 2.x
+    #include <hash_map.h>
+    namespace sgi { using ::hash_map; }; // inherit globals
+  #else
+    #if __GNUC__ < 4 // GCC 3.x
+      #include <ext/hash_map>
+      #if __GNUC_MINOR__ == 0
+        namespace sgi = std; // GCC 3.0
+      #else
+        namespace sgi = ::__gnu_cxx; // GCC 3.1 and later
+      #endif
+    #else
+       #if __GNUC__ < 5 // GCC 4.x
+         #if __GNUC_MINOR__ < 3 // GCC 4.0, 4.1 and 4.2
+           #ifdef __clang__ // Clang identifies as GCC 4.2
+             #undef __DEPRECATED
+           #endif
+           #include <ext/hash_map>
+           namespace sgi = ::__gnu_cxx;
+         #else
            #undef __DEPRECATED
+           #include <backward/hash_map>
+           namespace sgi = ::__gnu_cxx;
          #endif
-       #include <ext/hash_map>
-namespace sgi = ::__gnu_cxx;
-       #else
-#undef __DEPRECATED
-       #include <backward/hash_map>
-namespace sgi = ::__gnu_cxx;
+       #else // GCC 5.x
+         #undef __DEPRECATED
+         #include <backward/hash_map>
+         namespace sgi = ::__gnu_cxx;
        #endif
      #endif
   #endif
diff -Naur ns-3.22/src/network/utils/simple-channel.cc ns-3.23/src/network/utils/simple-channel.cc
--- ns-3.22/src/network/utils/simple-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/simple-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::SimpleChannel")
     .SetParent<Channel> ()
+    .SetGroupName("Network")
     .AddConstructor<SimpleChannel> ()
     .AddAttribute ("Delay", "Transmission delay through the channel",
                    TimeValue (Seconds (0)),
diff -Naur ns-3.22/src/network/utils/simple-net-device.cc ns-3.23/src/network/utils/simple-net-device.cc
--- ns-3.22/src/network/utils/simple-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/network/utils/simple-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -98,8 +98,9 @@
 TypeId
 SimpleTag::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("SimpleTag")
+  static TypeId tid = TypeId ("ns3::SimpleTag")
     .SetParent<Tag> ()
+    .SetGroupName("Network")
     .AddConstructor<SimpleTag> ()
   ;
   return tid;
@@ -187,6 +188,7 @@
 {
   static TypeId tid = TypeId ("ns3::SimpleNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName("Network") 
     .AddConstructor<SimpleNetDevice> ()
     .AddAttribute ("ReceiveErrorModel",
                    "The receiver error model used to simulate packet loss",
@@ -451,7 +453,7 @@
           Time txTime = Time (0);
           if (m_bps > DataRate (0))
             {
-              txTime = Seconds (m_bps.CalculateTxTime (packet->GetSize ()));
+              txTime = m_bps.CalculateBytesTxTime (packet->GetSize ());
             }
           m_channel->Send (p, protocolNumber, to, from, this);
           TransmitCompleteEvent = Simulator::Schedule (txTime, &SimpleNetDevice::TransmitComplete, this);
@@ -491,7 +493,7 @@
       Time txTime = Time (0);
       if (m_bps > DataRate (0))
         {
-          txTime = Seconds (m_bps.CalculateTxTime (packet->GetSize ()));
+          txTime = m_bps.CalculateBytesTxTime (packet->GetSize ());
         }
       TransmitCompleteEvent = Simulator::Schedule (txTime, &SimpleNetDevice::TransmitComplete, this);
     }
diff -Naur ns-3.22/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc ns-3.23/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc
--- ns-3.22/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4NixVectorRouting")
     .SetParent<Ipv4RoutingProtocol> ()
+    .SetGroupName ("NixVectorRouting")
     .AddConstructor<Ipv4NixVectorRouting> ()
   ;
   return tid;
diff -Naur ns-3.22/src/olsr/model/olsr-header.cc ns-3.23/src/olsr/model/olsr-header.cc
--- ns-3.22/src/olsr/model/olsr-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/olsr/model/olsr-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -112,6 +112,7 @@
 {
   static TypeId tid = TypeId ("ns3::olsr::PacketHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Olsr")
     .AddConstructor<PacketHeader> ()
   ;
   return tid;
@@ -170,6 +171,7 @@
 {
   static TypeId tid = TypeId ("ns3::olsr::MessageHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Olsr")
     .AddConstructor<MessageHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/olsr/model/olsr-routing-protocol.cc ns-3.23/src/olsr/model/olsr-routing-protocol.cc
--- ns-3.22/src/olsr/model/olsr-routing-protocol.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/olsr/model/olsr-routing-protocol.cc	2015-05-13 11:05:27.000000000 -0700
@@ -153,6 +153,7 @@
 {
   static TypeId tid = TypeId ("ns3::olsr::RoutingProtocol")
     .SetParent<Ipv4RoutingProtocol> ()
+    .SetGroupName ("Olsr")
     .AddConstructor<RoutingProtocol> ()
     .AddAttribute ("HelloInterval", "HELLO messages emission interval.",
                    TimeValue (Seconds (2)),
diff -Naur ns-3.22/src/openflow/model/openflow-interface.cc ns-3.23/src/openflow/model/openflow-interface.cc
--- ns-3.22/src/openflow/model/openflow-interface.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/openflow/model/openflow-interface.cc	2015-05-13 11:05:27.000000000 -0700
@@ -767,6 +767,7 @@
 {
   static TypeId tid = TypeId ("ns3::ofi::LearningController")
     .SetParent (Controller::GetTypeId ())
+    .SetGroupName ("Openflow")
     .AddConstructor<LearningController> ()
     .AddAttribute ("ExpirationTime",
                    "Time it takes for learned MAC state entry/created flow to expire.",
diff -Naur ns-3.22/src/openflow/model/openflow-switch-net-device.cc ns-3.23/src/openflow/model/openflow-switch-net-device.cc
--- ns-3.22/src/openflow/model/openflow-switch-net-device.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/openflow/model/openflow-switch-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -64,6 +64,7 @@
 {
   static TypeId tid = TypeId ("ns3::OpenFlowSwitchNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Openflow")
     .AddConstructor<OpenFlowSwitchNetDevice> ()
     .AddAttribute ("ID",
                    "The identification of the OpenFlowSwitchNetDevice/Datapath, needed for OpenFlow compatibility.",
diff -Naur ns-3.22/src/point-to-point/bindings/modulegen__gcc_ILP32.py ns-3.23/src/point-to-point/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -1097,11 +1097,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/point-to-point/bindings/modulegen__gcc_LP64.py ns-3.23/src/point-to-point/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/point-to-point/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/point-to-point/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -1097,11 +1097,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/point-to-point/model/point-to-point-channel.cc ns-3.23/src/point-to-point/model/point-to-point-channel.cc
--- ns-3.22/src/point-to-point/model/point-to-point-channel.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/point-to-point/model/point-to-point-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::PointToPointChannel")
     .SetParent<Channel> ()
+    .SetGroupName ("PointToPoint")
     .AddConstructor<PointToPointChannel> ()
     .AddAttribute ("Delay", "Transmission delay through the channel",
                    TimeValue (Seconds (0)),
diff -Naur ns-3.22/src/point-to-point/model/point-to-point-net-device.cc ns-3.23/src/point-to-point/model/point-to-point-net-device.cc
--- ns-3.22/src/point-to-point/model/point-to-point-net-device.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/point-to-point/model/point-to-point-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::PointToPointNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("PointToPoint")
     .AddConstructor<PointToPointNetDevice> ()
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (DEFAULT_MTU),
@@ -246,7 +247,7 @@
   m_currentPkt = p;
   m_phyTxBeginTrace (m_currentPkt);
 
-  Time txTime = Seconds (m_bps.CalculateTxTime (p->GetSize ()));
+  Time txTime = m_bps.CalculateBytesTxTime (p->GetSize ());
   Time txCompleteTime = txTime + m_tInterframeGap;
 
   NS_LOG_LOGIC ("Schedule TransmitCompleteEvent in " << txCompleteTime.GetSeconds () << "sec");
diff -Naur ns-3.22/src/point-to-point/model/point-to-point-remote-channel.cc ns-3.23/src/point-to-point/model/point-to-point-remote-channel.cc
--- ns-3.22/src/point-to-point/model/point-to-point-remote-channel.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/point-to-point/model/point-to-point-remote-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::PointToPointRemoteChannel")
     .SetParent<PointToPointChannel> ()
+    .SetGroupName ("PointToPoint")
     .AddConstructor<PointToPointRemoteChannel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/point-to-point/model/ppp-header.cc ns-3.23/src/point-to-point/model/ppp-header.cc
--- ns-3.22/src/point-to-point/model/ppp-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/point-to-point/model/ppp-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::PppHeader")
     .SetParent<Header> ()
+    .SetGroupName ("PointToPoint")
     .AddConstructor<PppHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/propagation/doc/propagation.rst ns-3.23/src/propagation/doc/propagation.rst
--- ns-3.22/src/propagation/doc/propagation.rst	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/propagation/doc/propagation.rst	2015-05-13 11:05:27.000000000 -0700
@@ -1,68 +1,333 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
-.. _Propagation:
-
-###########
 Propagation
-###########
-
-The |ns3| propagation module defines two generic interfaces, namely ``PropagationLossModel`` and ``PropagationDelayModel``, for the modeling of respectively propagation loss and propagation delay.
+-----------
 
+The |ns3| propagation module defines two generic interfaces, namely :cpp:class:`PropagationLossModel`
+and :cpp:class:`PropagationDelayModel`, for the modeling of respectively propagation loss and propagation delay.
 
-++++++++++++++++++++
 PropagationLossModel
-++++++++++++++++++++
+********************
+
+Propagation loss models calculate the Rx signal power considering the Tx signal power and the
+mutual Rx and Tx antennas positions.
+
+A propagation loss model can be "chained" to another one, making a list. The final Rx power 
+takes into account all the chained models. In this way one can use a slow fading and a fast 
+fading model (for example), or model separately different fading effects.
 
+The following propagation delay models are implemented:
+
+* Cost231PropagationLossModel
+* FixedRssLossModel
+* FriisPropagationLossModel
+* ItuR1411LosPropagationLossModel
+* ItuR1411NlosOverRooftopPropagationLossModel
+* JakesPropagationLossModel
+* Kun2600MhzPropagationLossModel
+* LogDistancePropagationLossModel
+* MatrixPropagationLossModel
+* NakagamiPropagationLossModel
+* OkumuraHataPropagationLossModel
+* RandomPropagationLossModel
+* RangePropagationLossModel
+* ThreeLogDistancePropagationLossModel
+* TwoRayGroundPropagationLossModel
+
+Other models could be available thanks to other modules, e.g., the ``building`` module.
 
 Each of the available propagation loss models of ns-3 is explained in
 one of the following subsections.
 
+FriisPropagationLossModel
+=========================
 
+This model implements the Friis propagation loss model. This model was first described in [friis]_.
+The original equation was described as:
 
-FriisPropagationLossModel
-++++++++++++++++++++++++++++++++++++
+.. math::
+
+  \frac{P_r}{P_t} = \frac{A_r A_t}{d^2\lambda^2}
+
+with the following equation for the case of an isotropic antenna with no heat loss:
+ 
+.. math::
+
+  A_{isotr.} = \frac{\lambda^2}{4\pi}
+
+The final equation becomes:
+
+.. math::
+
+  \frac{P_r}{P_t} = \frac{\lambda^2}{(4 \pi d)^2}
+
+Modern extensions to this original equation are:
+
+.. math::
+
+  P_r = \frac{P_t G_t G_r \lambda^2}{(4 \pi d)^2 L}
+
+With:
+
+  :math:`P_t` : transmission power (W)
+  
+  :math:`P_r` : reception power (W)
+  
+  :math:`G_t` : transmission gain (unit-less)
+  
+  :math:`G_r` : reception gain (unit-less)
+  
+  :math:`\lambda` : wavelength (m)
+  
+  :math:`d` : distance (m)
+  
+  :math:`L` : system loss (unit-less)
+
+In the implementation, :math:`\lambda` is calculated as 
+:math:`\frac{C}{f}`, where :math:`C = 299792458` m/s is the speed of light in
+vacuum, and :math:`f` is the frequency in Hz which can be configured by
+the user via the Frequency attribute.
+
+The Friis model is valid only for propagation in free space within
+the so-called far field region, which can be considered
+approximately as the region for :math:`d > 3 \lambda`.
+The model will still return a value for :math:`d > 3 \lambda`, as
+doing so (rather than triggering a fatal error) is practical for
+many simulation scenarios. However, we stress that the values
+obtained in such conditions shall not be considered realistic. 
+
+Related with this issue, we note that the Friis formula is
+undefined for :math:`d = 0`, and results in 
+:math:`P_r > P_t` for :math:`d < \lambda / 2 \sqrt{\pi}`.
+
+Both these conditions occur outside of the far field region, so in
+principle the Friis model shall not be used in these conditions. 
+In practice, however, Friis is often used in scenarios where accurate
+propagation modeling is not deemed important, and values of 
+:math:`d = 0` can occur.
+
+To allow practical use of the model in such
+scenarios, we have to 1) return some value for :math:`d = 0`, and
+2) avoid large discontinuities in propagation loss values (which
+could lead to artifacts such as bogus capture effects which are
+much worse than inaccurate propagation loss values). The two issues
+are conflicting, as, according to the Friis formula, 
+:math:`\lim_{d \to 0}  P_r = +\infty`;
+so if, for :math:`d = 0`, we use a fixed loss value, we end up with an infinitely large
+discontinuity, which as we discussed can cause undesirable
+simulation artifacts.
+
+To avoid these artifact, this implementation of the Friis model
+provides an attribute called MinLoss which allows to specify the
+minimum total loss (in dB) returned by the model. This is used in
+such a way that 
+:math:`P_r` continuously increases for :math:`d \to 0`, until
+MinLoss is reached, and then stay constant; this allow to
+return a value for :math:`d = 0` and at the same time avoid
+discontinuities. The model won't be much realistic, but at least
+the simulation artifacts discussed before are avoided. The default value of
+MinLoss is 0 dB, which means that by default the model will return 
+:math:`P_r = P_t` for :math:`d <= \lambda / 2 \sqrt{\pi}`.
+We note that this value of :math:`d` is outside of the far field
+region, hence the validity of the model in the far field region is
+not affected.
 
 
 TwoRayGroundPropagationLossModel
-++++++++++++++++++++++++++++++++
+================================
+
+This model implements a Two-Ray Ground propagation loss model ported from NS2
+
+The Two-ray ground reflection model uses the formula
+
+.. math::
+
+  P_r = \frac{P_t * G_t * G_r * (H_t^2 * H_r^2)}{d^4 * L}
+
+The original equation in Rappaport's book assumes :math:`L = 1`.
+To be consistent with the free space equation, :math:`L` is added here.
+
+:math:`H_t` and :math:`H_r` are set at the respective nodes :math:`z` coordinate plus a model parameter
+set via SetHeightAboveZ.
+
+The two-ray model does not give a good result for short distances, due to the
+oscillation caused by constructive and destructive combination of the two
+rays. Instead the Friis free-space model is used for small distances. 
+
+The crossover distance, below which Friis is used, is calculated as follows:
+
+.. math::
+
+  dCross = \frac{(4 * \pi * H_t * H_r)}{\lambda}
+
+In the implementation,  :math:`\lambda` is calculated as 
+:math:`\frac{C}{f}`, where :math:`C = 299792458` m/s is the speed of light in
+vacuum, and :math:`f` is the frequency in Hz which can be configured by
+the user via the Frequency attribute.
 
 
 LogDistancePropagationLossModel
-+++++++++++++++++++++++++++++++
+===============================
+
+This model implements a log distance propagation model.
+
+The reception power is calculated with a so-called
+log-distance propagation model:
+
+.. math::
+
+  L = L_0 + 10 n \log(\frac{d}{d_0})
+
+where:
+
+  :math:`n` : the path loss distance exponent
+  
+  :math:`d_0` : reference distance (m)
+  
+  :math:`L_0` : path loss at reference distance (dB)
+  
+  :math:`d` :  - distance (m)
+  
+  :math:`L` : path loss (dB)
+
+When the path loss is requested at a distance smaller than
+the reference distance, the tx power is returned.
 
 ThreeLogDistancePropagationLossModel
-++++++++++++++++++++++++++++++++++++
+====================================
+
+This model implements a log distance path loss propagation model with three distance
+fields. This model is the same as ns3::LogDistancePropagationLossModel
+except that it has three distance fields: near, middle and far with
+different exponents.
+
+Within each field the reception power is calculated using the log-distance
+propagation equation:
+
+.. math::
+
+  L = L_0 + 10 \cdot n_0 \log_{10}(\frac{d}{d_0})
+
+Each field begins where the previous ends and all together form a continuous function.
+
+There are three valid distance fields: near, middle, far. Actually four: the
+first from 0 to the reference distance is invalid and returns txPowerDbm.
+
+.. math::
+
+  \underbrace{0 \cdots\cdots}_{=0} \underbrace{d_0 \cdots\cdots}_{n_0} \underbrace{d_1 \cdots\cdots}_{n_1} \underbrace{d_2 \cdots\cdots}_{n_2} \infty 
+
+Complete formula for the path loss in dB:
+
+
+.. math::
+
+  \displaystyle L =
+  \begin{cases}
+  0 & d < d_0 \\
+  L_0 + 10 \cdot n_0 \log_{10}(\frac{d}{d_0}) & d_0 \leq d < d_1 \\
+  L_0 + 10 \cdot n_0 \log_{10}(\frac{d_1}{d_0}) + 10 \cdot n_1 \log_{10}(\frac{d}{d_1}) & d_1 \leq d < d_2 \\
+  L_0 + 10 \cdot n_0 \log_{10}(\frac{d_1}{d_0}) + 10 \cdot n_1 \log_{10}(\frac{d_2}{d_1}) + 10 \cdot n_2 \log_{10}(\frac{d}{d_2})& d_2 \leq d
+  \end{cases}
+
+where:
+
+  
+  :math:`d_0, d_1, d_2` : three distance fields (m)
+  
+  :math:`n_0, n_1, n_2` : path loss distance exponent for each field (unitless)
+  
+  :math:`L_0` : path loss at reference distance (dB)
+  
+  :math:`d` :  - distance (m)
+  
+  :math:`L` : path loss (dB)
+
+When the path loss is requested at a distance smaller than the reference
+distance :math:`d_0`, the tx power (with no path loss) is returned. The
+reference distance defaults to 1m and reference loss defaults to
+:cpp:class:`FriisPropagationLossModel` with 5.15 GHz and is thus :math:`L_0` = 46.67 dB.
 
 JakesPropagationLossModel
-+++++++++++++++++++++++++
+=========================
 
-PropagationLossModel
-++++++++++++++++++++
+ToDo
+````
 
 RandomPropagationLossModel
-++++++++++++++++++++++++++
+==========================
+
+The propagation loss is totally random, and it changes each time the model is called.
+As a consequence, all the packets (even those between two fixed nodes) experience a random
+propagation loss.
 
 NakagamiPropagationLossModel
-++++++++++++++++++++++++++++
+============================
+
+This propagation loss model implements Nakagami-m fast fading propagation loss model.
+
+The Nakagami-m distribution is applied to the power level. The probability density function is defined as
+
+.. math::
+
+  p(x; m, \omega) = \frac{2 m^m}{\Gamma(m) \omega^m} x^{2m - 1} e^{-\frac{m}{\omega} x^2} = 2 x \cdot p_{\text{Gamma}}(x^2, m, \frac{m}{\omega})
+  
+with :math:`m` the fading depth parameter and :math:`\omega` the average received power.
+
+It is implemented by either a :cpp:class:`GammaRandomVariable` or a :cpp:class:`ErlangRandomVariable`
+random variable.
+
+Like in :cpp:class:ThreeLogDistancePropagationLossModel`, the :math:`m` parameter is varied
+over three distance fields:
+
+.. math::
+
+  \underbrace{0 \cdots\cdots}_{m_0} \underbrace{d_1 \cdots\cdots}_{m_1} \underbrace{d_2 \cdots\cdots}_{m_2} \infty
+
+For :math:`m = 1` the Nakagami-m distribution equals the Rayleigh distribution. Thus
+this model also implements Rayleigh distribution based fast fading.
 
 FixedRssLossModel
-+++++++++++++++++
+=================
 
-MatrixPropagationLossModel
-++++++++++++++++++++++++++
+This model sets a constant received power level independent of the transmit power.
 
-RangePropagationLossModel
-+++++++++++++++++++++++++
+The received power is constant independent of the transmit power; the user
+must set received power level.  Note that if this loss model is chained to other loss
+models, it should be the first loss model in the chain. 
+Else it will disregard the losses computed by loss models that precede it in the chain. 
 
+MatrixPropagationLossModel
+==========================
 
+The propagation loss is fixed for each pair of nodes and doesn't depend on their actual positions.
+This model shoud be useful for synthetic tests. Note that by default the propagation loss is 
+assumed to be symmetric.
 
+RangePropagationLossModel
+=========================
 
-OkumuraHataPropagationLossModel
-+++++++++++++++++++++++++++++++
+This propagation loss depends only on the distance (range) between transmitter and receiver.
 
-This model is used to model open area pathloss for long distance (i.e., > 1 Km). In order to include all the possible frequencies usable by LTE we need to consider several variants of the well known Okumura Hata model. In fact, the original Okumura Hata model [hata]_ is designed for frequencies ranging from 150 MHz to 1500 MHz, the COST231 [cost231]_ extends it for the frequency range from 1500 MHz to 2000 MHz. Another important aspect is the scenarios considered by the models, in fact the all models are originally designed for urban scenario and then only the standard one and the COST231 are extended to suburban, while only the standard one has been extended to open areas. Therefore, the model cannot cover all scenarios at all frequencies. In the following we detail the models adopted.
+The single MaxRange attribute (units of meters) determines path loss.
+Receivers at or within MaxRange meters receive the transmission at the
+transmit power level. Receivers beyond MaxRange receive at power
+-1000 dBm (effectively zero).
 
+OkumuraHataPropagationLossModel
+===============================
 
+This model is used to model open area pathloss for long distance (i.e., > 1 Km). 
+In order to include all the possible frequencies usable by LTE we need to consider 
+several variants of the well known Okumura Hata model. In fact, the original Okumura 
+Hata model [hata]_ is designed for frequencies ranging from 150 MHz to 1500 MHz, 
+the COST231 [cost231]_ extends it for the frequency range from 1500 MHz to 2000 MHz. 
+Another important aspect is the scenarios considered by the models, in fact the all 
+models are originally designed for urban scenario and then only the standard one and 
+the COST231 are extended to suburban, while only the standard one has been extended 
+to open areas. Therefore, the model cannot cover all scenarios at all frequencies. 
+In the following we detail the models adopted.
 
 The pathloss expression of the COST231 OH is:
 
@@ -76,7 +341,6 @@
 
   F(h_\mathrm{M}) = \left\{\begin{array}{ll} (1.1\log(f))-0.7 \times h_\mathrm{M} - (1.56\times \log(f)-0.8) & \mbox{for medium and small size cities} \\ 3.2\times (\log{(11.75\times h_\mathrm{M}}))^2 & \mbox{for large cities}\end{array} \right.
 
-
 .. math::
 
   C = \left\{\begin{array}{ll} 0dB & \mbox{for medium-size cities and suburban areas} \\ 3dB & \mbox{for large cities}\end{array} \right.
@@ -131,15 +395,22 @@
   L_\mathrm{O} = L_\mathrm{U} - 4.70 (\log{f})^2 + 18.33\log{f} - 40.94
 
 
-The literature lacks of extensions of the COST231 to open area (for suburban it seems that we can just impose C = 0); therefore we consider it a special case fo the suburban one.
+The literature lacks of extensions of the COST231 to open area (for suburban it seems that 
+we can just impose C = 0); therefore we consider it a special case fo the suburban one.
 
 
+Cost231PropagationLossModel
+===========================
 
+ToDo
+````
 
 ItuR1411LosPropagationLossModel
-+++++++++++++++++++++++++++++++
+===============================
 
-This model is designed for Line-of-Sight (LoS) short range outdoor communication in the frequency range 300 MHz to 100 GHz.  This model provides an upper and lower bound respectively according to the following formulas
+This model is designed for Line-of-Sight (LoS) short range outdoor communication in the 
+frequency range 300 MHz to 100 GHz.  This model provides an upper and lower bound 
+respectively according to the following formulas
 
 .. math::
 
@@ -175,11 +446,17 @@
 
 
 ItuR1411NlosOverRooftopPropagationLossModel
-+++++++++++++++++++++++++++++++++++++++++++
-
-This model is designed for Non-Line-of-Sight (LoS) short range outdoor communication over rooftops in the frequency range 300 MHz to 100 GHz. This model includes several scenario-dependent parameters, such as average street width, orientation, etc. It is advised to set the values of these parameters manually (using the ns-3 attribute system) according to the desired scenario. 
+===========================================
 
-In detail, the model is based on [walfisch]_ and [ikegami]_, where the loss is expressed as the sum of free-space loss (:math:`L_{bf}`), the diffraction loss from rooftop to street (:math:`L_{rts}`) and the reduction due to multiple screen diffraction past rows of building (:math:`L_{msd}`). The formula is:
+This model is designed for Non-Line-of-Sight (LoS) short range outdoor communication over 
+rooftops in the frequency range 300 MHz to 100 GHz. This model includes several scenario-dependent 
+parameters, such as average street width, orientation, etc. It is advised to set the values of 
+these parameters manually (using the ns-3 attribute system) according to the desired scenario. 
+
+In detail, the model is based on [walfisch]_ and [ikegami]_, where the loss is expressed 
+as the sum of free-space loss (:math:`L_{bf}`), the diffraction loss from rooftop to 
+street (:math:`L_{rts}`) and the reduction due to multiple screen diffraction past 
+rows of building (:math:`L_{msd}`). The formula is:
 
 .. math::
 
@@ -216,7 +493,10 @@
   :math:`\varphi` : is the street orientation with respect to the direct path (degrees)
 
 
-The multiple screen diffraction loss depends on the BS antenna height relative to the building height and on the incidence angle. The former is selected as the higher antenna in the communication link. Regarding the latter, the "settled field distance" is used for select the proper model; its value is given by
+The multiple screen diffraction loss depends on the BS antenna height relative to the building 
+height and on the incidence angle. The former is selected as the higher antenna in the communication 
+link. Regarding the latter, the "settled field distance" is used for select the proper model; 
+its value is given by
 
 .. math::
 
@@ -226,7 +506,8 @@
 
   :math:`\Delta h_b = h_b - h_m`
 
-Therefore, in case of :math:`l > d_s` (where `l` is the distance over which the building extend), it can be evaluated according to
+Therefore, in case of :math:`l > d_s` (where `l` is the distance over which the building extend), 
+it can be evaluated according to
 
 .. math::
 
@@ -279,38 +560,46 @@
   \rho = \sqrt{\Delta h_b^2 + b^2}
 
 
-
 Kun2600MhzPropagationLossModel
-++++++++++++++++++++++++++++++
+==============================
 
-This is the empirical model for the pathloss at 2600 MHz for urban areas which is described in [kun2600mhz]_. The model is as follows. Let :math:`d` be the distance between the transmitter and the receiver in meters; the pathloss :math:`L` in dB is calculated as:
+This is the empirical model for the pathloss at 2600 MHz for urban areas which is described in [kun2600mhz]_. 
+The model is as follows. Let :math:`d` be the distance between the transmitter and the receiver 
+in meters; the pathloss :math:`L` in dB is calculated as:
 
 .. math::
 
   L = 36 + 26\log{d}
 
 
-
-
-+++++++++++++++++++++
 PropagationDelayModel
-+++++++++++++++++++++
-
+*********************
 
 The following propagation delay models are implemented:
 
-PropagationDelayModel
-+++++++++++++++++++++
-
-RandomPropagationDelayModel
-+++++++++++++++++++++++++++
+* ConstantSpeedPropagationDelayModel
+* RandomPropagationDelayModel
 
 ConstantSpeedPropagationDelayModel
-++++++++++++++++++++++++++++++++++
+==================================
+
+In this model, the signal travels with constant speed.
+The delay is calculated according with the trasmitter and receiver positions.
+The Euclidean distance between the Tx and Rx antennas is used.
+Beware that, according to this model, the Earth is flat.
+
+RandomPropagationDelayModel
+===========================
 
+The propagation delay is totally random, and it changes each time the model is called.
+All the packets (even those between two fixed nodes) experience a random delay.
+As a consequence, the packets order is not preserved. 
 
 
+References
+**********
 
+.. [friis] Friis, H.T., "A Note on a Simple Transmission Formula," Proceedings of the IRE , vol.34, no.5, pp.254,256, May 1946
 
 .. [hata] M.Hata, "Empirical formula for propagation loss in land mobile radio
    services", IEEE Trans. on Vehicular Technology, vol. 29, pp. 317-325, 1980
diff -Naur ns-3.22/src/propagation/model/cost231-propagation-loss-model.cc ns-3.23/src/propagation/model/cost231-propagation-loss-model.cc
--- ns-3.22/src/propagation/model/cost231-propagation-loss-model.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/propagation/model/cost231-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,35 +37,29 @@
 Cost231PropagationLossModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Cost231PropagationLossModel")
-
     .SetParent<PropagationLossModel> ()
-
+    .SetGroupName ("Propagation")
     .AddConstructor<Cost231PropagationLossModel> ()
-
     .AddAttribute ("Lambda",
                    "The wavelength  (default is 2.3 GHz at 300 000 km/s).",
                    DoubleValue (300000000.0 / 2.3e9),
                    MakeDoubleAccessor (&Cost231PropagationLossModel::m_lambda),
                    MakeDoubleChecker<double> ())
-
     .AddAttribute ("Frequency",
                    "The Frequency  (default is 2.3 GHz).",
                    DoubleValue (2.3e9),
                    MakeDoubleAccessor (&Cost231PropagationLossModel::m_frequency),
                    MakeDoubleChecker<double> ())
-
     .AddAttribute ("BSAntennaHeight",
                    "BS Antenna Height (default is 50m).",
                    DoubleValue (50.0),
                    MakeDoubleAccessor (&Cost231PropagationLossModel::m_BSAntennaHeight),
                    MakeDoubleChecker<double> ())
-
     .AddAttribute ("SSAntennaHeight",
                    "SS Antenna Height (default is 3m).",
                    DoubleValue (3),
                    MakeDoubleAccessor (&Cost231PropagationLossModel::m_SSAntennaHeight),
                    MakeDoubleChecker<double> ())
-
     .AddAttribute ("MinDistance",
                    "The distance under which the propagation model refuses to give results (m) ",
                    DoubleValue (0.5),
diff -Naur ns-3.22/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc ns-3.23/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc
--- ns-3.22/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,10 +37,9 @@
 ItuR1411LosPropagationLossModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ItuR1411LosPropagationLossModel")
-
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<ItuR1411LosPropagationLossModel> ()
-
     .AddAttribute ("Frequency",
                    "The propagation frequency in Hz",
                    DoubleValue (2160e6),
diff -Naur ns-3.22/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc ns-3.23/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc
--- ns-3.22/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,17 +38,14 @@
 ItuR1411NlosOverRooftopPropagationLossModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ItuR1411NlosOverRooftopPropagationLossModel")
-
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<ItuR1411NlosOverRooftopPropagationLossModel> ()
-
     .AddAttribute ("Frequency",
                    "The Frequency  (default is 2.106 GHz).",
                    DoubleValue (2160e6),
                    MakeDoubleAccessor (&ItuR1411NlosOverRooftopPropagationLossModel::SetFrequency),
                    MakeDoubleChecker<double> ())
-
-
     .AddAttribute ("Environment",
                    "Environment Scenario",
                    EnumValue (UrbanEnvironment),
@@ -56,7 +53,6 @@
                    MakeEnumChecker (UrbanEnvironment, "Urban",
                                     SubUrbanEnvironment, "SubUrban",
                                     OpenAreasEnvironment, "OpenAreas"))
-
     .AddAttribute ("CitySize",
                    "Dimension of the city",
                    EnumValue (LargeCity),
@@ -64,31 +60,26 @@
                    MakeEnumChecker (SmallCity, "Small",
                                     MediumCity, "Medium",
                                     LargeCity, "Large"))
-
     .AddAttribute ("RooftopLevel",
                    "The height of the rooftop level in meters",
                    DoubleValue (20.0),
                    MakeDoubleAccessor (&ItuR1411NlosOverRooftopPropagationLossModel::m_rooftopHeight),
                    MakeDoubleChecker<double> (0.0, 90.0))
-
     .AddAttribute ("StreetsOrientation",
                    "The orientation of streets in degrees [0,90] with respect to the direction of propagation",
                    DoubleValue (45.0),
                    MakeDoubleAccessor (&ItuR1411NlosOverRooftopPropagationLossModel::m_streetsOrientation),
                    MakeDoubleChecker<double> (0.0, 90.0))
-
     .AddAttribute ("StreetsWidth",
                    "The width of streets",
                    DoubleValue (20.0),
                    MakeDoubleAccessor (&ItuR1411NlosOverRooftopPropagationLossModel::m_streetsWidth),
                    MakeDoubleChecker<double> (0.0, 1000.0))
-
     .AddAttribute ("BuildingsExtend",
                    "The distance over which the buildings extend",
                    DoubleValue (80.0),
                    MakeDoubleAccessor (&ItuR1411NlosOverRooftopPropagationLossModel::m_buildingsExtend),
                    MakeDoubleChecker<double> ())
-
     .AddAttribute ("BuildingSeparation",
                    "The separation between buildings",
                    DoubleValue (50.0),
diff -Naur ns-3.22/src/propagation/model/jakes-process.cc ns-3.23/src/propagation/model/jakes-process.cc
--- ns-3.22/src/propagation/model/jakes-process.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/propagation/model/jakes-process.cc	2015-05-13 11:05:27.000000000 -0700
@@ -50,6 +50,7 @@
 {
   static TypeId tid = TypeId ("ns3::JakesProcess")
     .SetParent<Object> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<JakesProcess> ()
     .AddAttribute ("DopplerFrequencyHz", "Corresponding doppler frequency[Hz]",
                    DoubleValue (80),
diff -Naur ns-3.22/src/propagation/model/jakes-propagation-loss-model.cc ns-3.23/src/propagation/model/jakes-propagation-loss-model.cc
--- ns-3.22/src/propagation/model/jakes-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/propagation/model/jakes-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::JakesPropagationLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<JakesPropagationLossModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc ns-3.23/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc
--- ns-3.22/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::Kun2600MhzPropagationLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<Kun2600MhzPropagationLossModel> ()
     ;
 
diff -Naur ns-3.22/src/propagation/model/okumura-hata-propagation-loss-model.cc ns-3.23/src/propagation/model/okumura-hata-propagation-loss-model.cc
--- ns-3.22/src/propagation/model/okumura-hata-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/propagation/model/okumura-hata-propagation-loss-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,16 +38,14 @@
 OkumuraHataPropagationLossModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::OkumuraHataPropagationLossModel")
-
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<OkumuraHataPropagationLossModel> ()
-
     .AddAttribute ("Frequency",
                    "The propagation frequency in Hz",
                    DoubleValue (2160e6),
                    MakeDoubleAccessor (&OkumuraHataPropagationLossModel::m_frequency),
                    MakeDoubleChecker<double> ())
-
     .AddAttribute ("Environment",
                    "Environment Scenario",
                    EnumValue (UrbanEnvironment),
@@ -55,7 +53,6 @@
                    MakeEnumChecker (UrbanEnvironment, "Urban",
                                     SubUrbanEnvironment, "SubUrban",
                                     OpenAreasEnvironment, "OpenAreas"))
-
     .AddAttribute ("CitySize",
                    "Dimension of the city",
                    EnumValue (LargeCity),
@@ -63,7 +60,6 @@
                    MakeEnumChecker (SmallCity, "Small",
                                     MediumCity, "Medium",
                                     LargeCity, "Large"));
-
   return tid;
 }
 
diff -Naur ns-3.22/src/propagation/model/propagation-delay-model.cc ns-3.23/src/propagation/model/propagation-delay-model.cc
--- ns-3.22/src/propagation/model/propagation-delay-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/propagation/model/propagation-delay-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::PropagationDelayModel")
     .SetParent<Object> ()
+    .SetGroupName ("Propagation")
   ;
   return tid;
 }
@@ -55,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::RandomPropagationDelayModel")
     .SetParent<PropagationDelayModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<RandomPropagationDelayModel> ()
     .AddAttribute ("Variable",
                    "The random variable which generates random delays (s).",
@@ -91,6 +93,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantSpeedPropagationDelayModel")
     .SetParent<PropagationDelayModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<ConstantSpeedPropagationDelayModel> ()
     .AddAttribute ("Speed", "The propagation speed (m/s) in the propagation medium being considered. The default value is the propagation speed of light in the vacuum.",
                    DoubleValue (299792458),
diff -Naur ns-3.22/src/propagation/model/propagation-loss-model.cc ns-3.23/src/propagation/model/propagation-loss-model.cc
--- ns-3.22/src/propagation/model/propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/propagation/model/propagation-loss-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -125,7 +125,7 @@
                                            Ptr<MobilityModel> b) const
 {
   double rxc = -m_variable->GetValue ();
-  NS_LOG_DEBUG ("attenuation coefficent="<<rxc<<"Db");
+  NS_LOG_DEBUG ("attenuation coefficient="<<rxc<<"Db");
   return txPowerDbm + rxc;
 }
 
@@ -145,6 +145,7 @@
 {
   static TypeId tid = TypeId ("ns3::FriisPropagationLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<FriisPropagationLossModel> ()
     .AddAttribute ("Frequency", 
                    "The carrier frequency (in Hz) at which propagation occurs  (default is 5.15 GHz).",
@@ -456,6 +457,7 @@
 {
   static TypeId tid = TypeId ("ns3::LogDistancePropagationLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<LogDistancePropagationLossModel> ()
     .AddAttribute ("Exponent",
                    "The exponent of the Path Loss propagation model",
@@ -645,6 +647,7 @@
 {
   static TypeId tid = TypeId ("ns3::NakagamiPropagationLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<NakagamiPropagationLossModel> ()
     .AddAttribute ("Distance1",
                    "Beginning of the second distance field. Default is 80m.",
@@ -759,6 +762,7 @@
 {
   static TypeId tid = TypeId ("ns3::FixedRssLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<FixedRssLossModel> ()
     .AddAttribute ("Rss", "The fixed receiver Rss.",
                    DoubleValue (-150.0),
@@ -805,6 +809,7 @@
 {
   static TypeId tid = TypeId ("ns3::MatrixPropagationLossModel")
     .SetParent<PropagationLossModel> ()
+    .SetGroupName ("Propagation")
     .AddConstructor<MatrixPropagationLossModel> ()
     .AddAttribute ("DefaultLoss", "The default value for propagation loss, dB.",
                    DoubleValue (std::numeric_limits<double>::max ()),
diff -Naur ns-3.22/src/propagation/model/propagation-loss-model.h ns-3.23/src/propagation/model/propagation-loss-model.h
--- ns-3.22/src/propagation/model/propagation-loss-model.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/propagation/model/propagation-loss-model.h	2015-05-13 11:05:26.000000000 -0700
@@ -239,10 +239,10 @@
  * are conflicting, as, according to the Friis formula, 
  * \f$\lim_{d \to 0 }  P_r = +\infty \f$;
  * so if, for \f$ d = 0 \f$, we use a fixed loss value, we end up with an infinitely large
- * discontinuity, which as we discussed can cause undesireable
+ * discontinuity, which as we discussed can cause undesirable
  * simulation artifacts.
  *
- * To avoid these artifact, this implmentation of the Friis model
+ * To avoid these artifact, this implementation of the Friis model
  * provides an attribute called MinLoss which allows to specify the
  * minimum total loss (in dB) returned by the model. This is used in
  * such a way that 
@@ -350,7 +350,7 @@
  *
  * Two-ray ground reflection model.
  *
- * \f$ Pr = \frac{Pt * Gt * Gr * (ht^2 * hr^2)}{d^4 * L} \f$
+ * \f$ Pr = \frac{P_t * G_t * G_r * (H_t^2 * H_r^2)}{d^4 * L} \f$
  *
  * The original equation in Rappaport's book assumes L = 1.
  * To be consistent with the free space equation, L is added here.
@@ -364,7 +364,7 @@
  *
  * The crossover distance, below which Friis is used, is calculated as follows:
  *
- * \f$ dCross = \frac{(4 * pi * Ht * Hr)}{lambda} \f$
+ * \f$ dCross = \frac{(4 * \pi * H_t * H_r)}{\lambda} \f$
  *
  * In the implementation,  \f$ \lambda \f$ is calculated as 
  * \f$ \frac{C}{f} \f$, where  \f$ C = 299792458\f$ m/s is the speed of light in
diff -Naur ns-3.22/src/sixlowpan/model/sixlowpan-header.cc ns-3.23/src/sixlowpan/model/sixlowpan-header.cc
--- ns-3.22/src/sixlowpan/model/sixlowpan-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/sixlowpan/model/sixlowpan-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -103,7 +103,10 @@
 
 TypeId SixLowPanHc1::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::SixLowPanHc1").SetParent<Header> ().AddConstructor<SixLowPanHc1> ();
+  static TypeId tid = TypeId ("ns3::SixLowPanHc1")
+    .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
+    .AddConstructor<SixLowPanHc1> ();
   return tid;
 }
 
@@ -548,7 +551,10 @@
 
 TypeId SixLowPanFrag1::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::SixLowPanFrag1").SetParent<Header> ().AddConstructor<SixLowPanFrag1> ();
+  static TypeId tid = TypeId ("ns3::SixLowPanFrag1")
+    .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
+    .AddConstructor<SixLowPanFrag1> ();
   return tid;
 }
 
@@ -635,7 +641,10 @@
  */
 TypeId SixLowPanFragN::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::SixLowPanFragN").SetParent<Header> ().AddConstructor<SixLowPanFragN> ();
+  static TypeId tid = TypeId ("ns3::SixLowPanFragN")
+    .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
+    .AddConstructor<SixLowPanFragN> ();
   return tid;
 }
 
@@ -729,7 +738,10 @@
 
 TypeId SixLowPanIpv6::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::SixLowPanIpv6").SetParent<Header> ().AddConstructor<SixLowPanIpv6> ();
+  static TypeId tid = TypeId ("ns3::SixLowPanIpv6")
+    .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
+    .AddConstructor<SixLowPanIpv6> ();
   return tid;
 }
 
@@ -789,7 +801,10 @@
 
 TypeId SixLowPanIphc::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::SixLowPanIphc").SetParent<Header> ().AddConstructor<SixLowPanIphc> ();
+  static TypeId tid = TypeId ("ns3::SixLowPanIphc")
+    .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
+    .AddConstructor<SixLowPanIphc> ();
   return tid;
 }
 
@@ -1481,6 +1496,7 @@
 {
   static TypeId tid = TypeId ("ns3::SixLowPanNhcExtension")
     .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
     .AddConstructor<SixLowPanNhcExtension> ();
   return tid;
 }
@@ -1609,6 +1625,7 @@
 {
   static TypeId tid = TypeId ("ns3::SixLowPanUdpNhcExtension")
     .SetParent<Header> ()
+    .SetGroupName ("SixLowPan")
     .AddConstructor<SixLowPanUdpNhcExtension> ();
   return tid;
 }
diff -Naur ns-3.22/src/sixlowpan/model/sixlowpan-header.h ns-3.23/src/sixlowpan/model/sixlowpan-header.h
--- ns-3.22/src/sixlowpan/model/sixlowpan-header.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/sixlowpan/model/sixlowpan-header.h	2015-05-13 11:05:26.000000000 -0700
@@ -346,13 +346,13 @@
   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];       //!< Destinaiton prefix
+  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 compresison type
-  LowPanHc1Addr_e m_dstCompression; //!< Destination compresison type
+  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
@@ -544,7 +544,7 @@
 
 /**
  * \ingroup sixlowpan
- * \brief 6LoWPAN IPv6 uncomprssed header - see RFC 4944
+ * \brief 6LoWPAN IPv6 uncompressed header - see RFC 4944
  */
 class SixLowPanIpv6 : public Header
 {
diff -Naur ns-3.22/src/sixlowpan/model/sixlowpan-net-device.cc ns-3.23/src/sixlowpan/model/sixlowpan-net-device.cc
--- ns-3.22/src/sixlowpan/model/sixlowpan-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/sixlowpan/model/sixlowpan-net-device.cc	2015-05-13 11:05:26.000000000 -0700
@@ -50,6 +50,7 @@
 {
   static TypeId tid = TypeId ("ns3::SixLowPanNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("SixLowPan")
     .AddConstructor<SixLowPanNetDevice> ()
     .AddAttribute ("Rfc6282", "Use RFC6282 (IPHC) if true, RFC4944 (HC1) otherwise.",
                    BooleanValue (true),
diff -Naur ns-3.22/src/spectrum/bindings/modulegen__gcc_ILP32.py ns-3.23/src/spectrum/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/spectrum/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
@@ -26,6 +26,8 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## adhoc-aloha-noack-ideal-phy-helper.h (module 'spectrum'): ns3::AdhocAlohaNoackIdealPhyHelper [class]
     module.add_class('AdhocAlohaNoackIdealPhyHelper')
+    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    module.add_class('Angles', import_from_module='ns.antenna')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
@@ -126,6 +128,12 @@
     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')
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper [class]
+    module.add_class('TvSpectrumTransmitterHelper')
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::Region [enumeration]
+    module.add_enum('Region', ['REGION_NORTH_AMERICA', 'REGION_JAPAN', 'REGION_EUROPE'], outer_class=root_module['ns3::TvSpectrumTransmitterHelper'])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::Density [enumeration]
+    module.add_enum('Density', ['DENSITY_LOW', 'DENSITY_MEDIUM', 'DENSITY_HIGH'], outer_class=root_module['ns3::TvSpectrumTransmitterHelper'])
     ## multi-model-spectrum-channel.h (module 'spectrum'): ns3::TxSpectrumModelInfo [class]
     module.add_class('TxSpectrumModelInfo')
     ## type-id.h (module 'core'): ns3::TypeId [class]
@@ -234,6 +242,10 @@
     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'])
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::TvSpectrumTransmitter [class]
+    module.add_class('TvSpectrumTransmitter', parent=root_module['ns3::SpectrumPhy'])
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::TvSpectrumTransmitter::TvType [enumeration]
+    module.add_enum('TvType', ['TVTYPE_ANALOG', 'TVTYPE_8VSB', 'TVTYPE_COFDM'], outer_class=root_module['ns3::TvSpectrumTransmitter'])
     ## propagation-loss-model.h (module 'propagation'): ns3::TwoRayGroundPropagationLossModel [class]
     module.add_class('TwoRayGroundPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
@@ -248,6 +260,8 @@
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## aloha-noack-mac-header.h (module 'spectrum'): ns3::AlohaNoackMacHeader [class]
     module.add_class('AlohaNoackMacHeader', parent=root_module['ns3::Header'])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
+    module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
@@ -498,6 +512,7 @@
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AdhocAlohaNoackIdealPhyHelper_methods(root_module, root_module['ns3::AdhocAlohaNoackIdealPhyHelper'])
+    register_Ns3Angles_methods(root_module, root_module['ns3::Angles'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
@@ -541,6 +556,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_Ns3TvSpectrumTransmitterHelper_methods(root_module, root_module['ns3::TvSpectrumTransmitterHelper'])
     register_Ns3TxSpectrumModelInfo_methods(root_module, root_module['ns3::TxSpectrumModelInfo'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
@@ -590,6 +606,7 @@
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
+    register_Ns3TvSpectrumTransmitter_methods(root_module, root_module['ns3::TvSpectrumTransmitter'])
     register_Ns3TwoRayGroundPropagationLossModel_methods(root_module, root_module['ns3::TwoRayGroundPropagationLossModel'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3WaveformGenerator_methods(root_module, root_module['ns3::WaveformGenerator'])
@@ -597,6 +614,7 @@
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AlohaNoackMacHeader_methods(root_module, root_module['ns3::AlohaNoackMacHeader'])
+    register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
     register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
@@ -791,6 +809,24 @@
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'txPsd')])
     return
 
+def register_Ns3Angles_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Angles const &', 'arg0')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
+    cls.add_constructor([])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
+    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
+    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
+    cls.add_instance_attribute('phi', 'double', is_const=False)
+    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
+    cls.add_instance_attribute('theta', 'double', is_const=False)
+    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')])
@@ -1236,11 +1272,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
@@ -2597,6 +2643,45 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
+def register_Ns3TvSpectrumTransmitterHelper_methods(root_module, cls):
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::TvSpectrumTransmitterHelper(ns3::TvSpectrumTransmitterHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TvSpectrumTransmitterHelper const &', 'arg0')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::TvSpectrumTransmitterHelper() [constructor]
+    cls.add_constructor([])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): int64_t ns3::TvSpectrumTransmitterHelper::AssignStreams(int64_t streamNum) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'streamNum')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): void ns3::TvSpectrumTransmitterHelper::CreateRegionalTvTransmitters(ns3::TvSpectrumTransmitterHelper::Region region, ns3::TvSpectrumTransmitterHelper::Density density, double originLatitude, double originLongitude, double maxAltitude, double maxRadius) [member function]
+    cls.add_method('CreateRegionalTvTransmitters', 
+                   'void', 
+                   [param('ns3::TvSpectrumTransmitterHelper::Region', 'region'), param('ns3::TvSpectrumTransmitterHelper::Density', 'density'), param('double', 'originLatitude'), param('double', 'originLongitude'), param('double', 'maxAltitude'), param('double', 'maxRadius')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::Install(ns3::NodeContainer nodes) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::Install(ns3::NodeContainer nodes, ns3::TvSpectrumTransmitterHelper::Region region, uint16_t channelNumber) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes'), param('ns3::TvSpectrumTransmitterHelper::Region', 'region'), param('uint16_t', 'channelNumber')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::InstallAdjacent(ns3::NodeContainer nodes) [member function]
+    cls.add_method('InstallAdjacent', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::InstallAdjacent(ns3::NodeContainer nodes, ns3::TvSpectrumTransmitterHelper::Region region, uint16_t channelNumber) [member function]
+    cls.add_method('InstallAdjacent', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes'), param('ns3::TvSpectrumTransmitterHelper::Region', 'region'), param('uint16_t', 'channelNumber')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): void ns3::TvSpectrumTransmitterHelper::SetAttribute(std::string name, ns3::AttributeValue const & val) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'val')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): void ns3::TvSpectrumTransmitterHelper::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel >', 'c')])
+    return
+
 def register_Ns3TxSpectrumModelInfo_methods(root_module, cls):
     ## multi-model-spectrum-channel.h (module 'spectrum'): ns3::TxSpectrumModelInfo::TxSpectrumModelInfo(ns3::TxSpectrumModelInfo const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::TxSpectrumModelInfo const &', 'arg0')])
@@ -4179,6 +4264,86 @@
                    is_virtual=True)
     return
 
+def register_Ns3TvSpectrumTransmitter_methods(root_module, cls):
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::TvSpectrumTransmitter::TvSpectrumTransmitter() [constructor]
+    cls.add_constructor([])
+    ## tv-spectrum-transmitter.h (module 'spectrum'): static ns3::TypeId ns3::TvSpectrumTransmitter::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel >', 'c')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetDevice(ns3::Ptr<ns3::NetDevice> d) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::TvSpectrumTransmitter::GetMobility() [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   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 >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() [member function]
+    cls.add_method('GetRxAntenna', 
+                   'ns3::Ptr< ns3::AntennaModel >', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
+    cls.add_method('StartRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumChannel> ns3::TvSpectrumTransmitter::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::SpectrumChannel >', 
+                   [], 
+                   is_const=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::CreateTvPsd() [member function]
+    cls.add_method('CreateTvPsd', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::TvSpectrumTransmitter::GetTxPsd() const [member function]
+    cls.add_method('GetTxPsd', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [], 
+                   is_const=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::Start() [member function]
+    cls.add_method('Start', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetupTx() [member function]
+    cls.add_method('SetupTx', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
 def register_Ns3TwoRayGroundPropagationLossModel_methods(root_module, cls):
     ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::TwoRayGroundPropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -4533,6 +4698,23 @@
                    [param('ns3::Mac48Address', 'source')])
     return
 
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3AttributeAccessor_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
diff -Naur ns-3.22/src/spectrum/bindings/modulegen__gcc_LP64.py ns-3.23/src/spectrum/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/spectrum/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
@@ -26,6 +26,8 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## adhoc-aloha-noack-ideal-phy-helper.h (module 'spectrum'): ns3::AdhocAlohaNoackIdealPhyHelper [class]
     module.add_class('AdhocAlohaNoackIdealPhyHelper')
+    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    module.add_class('Angles', import_from_module='ns.antenna')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
@@ -126,6 +128,12 @@
     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')
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper [class]
+    module.add_class('TvSpectrumTransmitterHelper')
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::Region [enumeration]
+    module.add_enum('Region', ['REGION_NORTH_AMERICA', 'REGION_JAPAN', 'REGION_EUROPE'], outer_class=root_module['ns3::TvSpectrumTransmitterHelper'])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::Density [enumeration]
+    module.add_enum('Density', ['DENSITY_LOW', 'DENSITY_MEDIUM', 'DENSITY_HIGH'], outer_class=root_module['ns3::TvSpectrumTransmitterHelper'])
     ## multi-model-spectrum-channel.h (module 'spectrum'): ns3::TxSpectrumModelInfo [class]
     module.add_class('TxSpectrumModelInfo')
     ## type-id.h (module 'core'): ns3::TypeId [class]
@@ -234,6 +242,10 @@
     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'])
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::TvSpectrumTransmitter [class]
+    module.add_class('TvSpectrumTransmitter', parent=root_module['ns3::SpectrumPhy'])
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::TvSpectrumTransmitter::TvType [enumeration]
+    module.add_enum('TvType', ['TVTYPE_ANALOG', 'TVTYPE_8VSB', 'TVTYPE_COFDM'], outer_class=root_module['ns3::TvSpectrumTransmitter'])
     ## propagation-loss-model.h (module 'propagation'): ns3::TwoRayGroundPropagationLossModel [class]
     module.add_class('TwoRayGroundPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
@@ -248,6 +260,8 @@
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## aloha-noack-mac-header.h (module 'spectrum'): ns3::AlohaNoackMacHeader [class]
     module.add_class('AlohaNoackMacHeader', parent=root_module['ns3::Header'])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
+    module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
@@ -498,6 +512,7 @@
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AdhocAlohaNoackIdealPhyHelper_methods(root_module, root_module['ns3::AdhocAlohaNoackIdealPhyHelper'])
+    register_Ns3Angles_methods(root_module, root_module['ns3::Angles'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
@@ -541,6 +556,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_Ns3TvSpectrumTransmitterHelper_methods(root_module, root_module['ns3::TvSpectrumTransmitterHelper'])
     register_Ns3TxSpectrumModelInfo_methods(root_module, root_module['ns3::TxSpectrumModelInfo'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
@@ -590,6 +606,7 @@
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
+    register_Ns3TvSpectrumTransmitter_methods(root_module, root_module['ns3::TvSpectrumTransmitter'])
     register_Ns3TwoRayGroundPropagationLossModel_methods(root_module, root_module['ns3::TwoRayGroundPropagationLossModel'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3WaveformGenerator_methods(root_module, root_module['ns3::WaveformGenerator'])
@@ -597,6 +614,7 @@
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AlohaNoackMacHeader_methods(root_module, root_module['ns3::AlohaNoackMacHeader'])
+    register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
     register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
@@ -791,6 +809,24 @@
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'txPsd')])
     return
 
+def register_Ns3Angles_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Angles const &', 'arg0')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
+    cls.add_constructor([])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
+    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
+    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
+    cls.add_instance_attribute('phi', 'double', is_const=False)
+    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
+    cls.add_instance_attribute('theta', 'double', is_const=False)
+    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')])
@@ -1236,11 +1272,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
@@ -2597,6 +2643,45 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
+def register_Ns3TvSpectrumTransmitterHelper_methods(root_module, cls):
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::TvSpectrumTransmitterHelper(ns3::TvSpectrumTransmitterHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TvSpectrumTransmitterHelper const &', 'arg0')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::TvSpectrumTransmitterHelper::TvSpectrumTransmitterHelper() [constructor]
+    cls.add_constructor([])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): int64_t ns3::TvSpectrumTransmitterHelper::AssignStreams(int64_t streamNum) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'streamNum')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): void ns3::TvSpectrumTransmitterHelper::CreateRegionalTvTransmitters(ns3::TvSpectrumTransmitterHelper::Region region, ns3::TvSpectrumTransmitterHelper::Density density, double originLatitude, double originLongitude, double maxAltitude, double maxRadius) [member function]
+    cls.add_method('CreateRegionalTvTransmitters', 
+                   'void', 
+                   [param('ns3::TvSpectrumTransmitterHelper::Region', 'region'), param('ns3::TvSpectrumTransmitterHelper::Density', 'density'), param('double', 'originLatitude'), param('double', 'originLongitude'), param('double', 'maxAltitude'), param('double', 'maxRadius')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::Install(ns3::NodeContainer nodes) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::Install(ns3::NodeContainer nodes, ns3::TvSpectrumTransmitterHelper::Region region, uint16_t channelNumber) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes'), param('ns3::TvSpectrumTransmitterHelper::Region', 'region'), param('uint16_t', 'channelNumber')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::InstallAdjacent(ns3::NodeContainer nodes) [member function]
+    cls.add_method('InstallAdjacent', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): ns3::NetDeviceContainer ns3::TvSpectrumTransmitterHelper::InstallAdjacent(ns3::NodeContainer nodes, ns3::TvSpectrumTransmitterHelper::Region region, uint16_t channelNumber) [member function]
+    cls.add_method('InstallAdjacent', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer', 'nodes'), param('ns3::TvSpectrumTransmitterHelper::Region', 'region'), param('uint16_t', 'channelNumber')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): void ns3::TvSpectrumTransmitterHelper::SetAttribute(std::string name, ns3::AttributeValue const & val) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'val')])
+    ## tv-spectrum-transmitter-helper.h (module 'spectrum'): void ns3::TvSpectrumTransmitterHelper::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel >', 'c')])
+    return
+
 def register_Ns3TxSpectrumModelInfo_methods(root_module, cls):
     ## multi-model-spectrum-channel.h (module 'spectrum'): ns3::TxSpectrumModelInfo::TxSpectrumModelInfo(ns3::TxSpectrumModelInfo const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::TxSpectrumModelInfo const &', 'arg0')])
@@ -4179,6 +4264,86 @@
                    is_virtual=True)
     return
 
+def register_Ns3TvSpectrumTransmitter_methods(root_module, cls):
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::TvSpectrumTransmitter::TvSpectrumTransmitter() [constructor]
+    cls.add_constructor([])
+    ## tv-spectrum-transmitter.h (module 'spectrum'): static ns3::TypeId ns3::TvSpectrumTransmitter::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel >', 'c')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetDevice(ns3::Ptr<ns3::NetDevice> d) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::TvSpectrumTransmitter::GetMobility() [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   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 >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() [member function]
+    cls.add_method('GetRxAntenna', 
+                   'ns3::Ptr< ns3::AntennaModel >', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
+    cls.add_method('StartRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumChannel> ns3::TvSpectrumTransmitter::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::SpectrumChannel >', 
+                   [], 
+                   is_const=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::CreateTvPsd() [member function]
+    cls.add_method('CreateTvPsd', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::TvSpectrumTransmitter::GetTxPsd() const [member function]
+    cls.add_method('GetTxPsd', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [], 
+                   is_const=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::Start() [member function]
+    cls.add_method('Start', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::SetupTx() [member function]
+    cls.add_method('SetupTx', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
 def register_Ns3TwoRayGroundPropagationLossModel_methods(root_module, cls):
     ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::TwoRayGroundPropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -4533,6 +4698,23 @@
                    [param('ns3::Mac48Address', 'source')])
     return
 
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3AttributeAccessor_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
diff -Naur ns-3.22/src/spectrum/doc/spectrum.rst ns-3.23/src/spectrum/doc/spectrum.rst
--- ns-3.22/src/spectrum/doc/spectrum.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/doc/spectrum.rst	2015-05-13 11:05:26.000000000 -0700
@@ -437,3 +437,168 @@
 
 
 
+Additional Models
+*****************
+
+TV Transmitter Model
+====================
+
+A TV Transmitter model is implemented by the ``TvSpectrumTransmitter`` class.
+This model enables transmission of realistic TV signals to be simulated and can 
+be used for interference modeling. It provides a customizable power spectral 
+density (PSD) model, with configurable attributes including the type of 
+modulation (with models for analog, 8-VSB, and COFDM), signal bandwidth, 
+power spectral density level, frequency, and transmission duration. A helper 
+class, ``TvSpectrumTransmitterHelper``, is also provided to assist users in 
+setting up simulations.
+
+Main Model Class
+################
+
+The main TV Transmitter model class, ``TvSpectrumTransmitter``, provides a 
+user-configurable PSD model that can be transmitted on the ``SpectrumChannel``. 
+It inherits from ``SpectrumPhy`` and is comprised of attributes and methods to 
+create and transmit the signal on the channel.
+
+.. _spectrum-tv-cofdm:
+ 
+.. figure:: figures/spectrum-tv-cofdm.*
+   :align: center
+
+   8K COFDM signal spectrum generated from ``TvSpectrumTransmitter`` (Left) and 
+   theoretical COFDM signal spectrum [KoppCOFDM] (Right)
+
+One of the user-configurable attributes is the type of modulation for the TV 
+transmitter to use. The options are 8-VSB (Eight-Level Vestigial Sideband 
+Modulation) which is notably used in the North America ATSC digital television 
+standard, COFDM (Coded Orthogonal Frequency Division Multiplexing) which is 
+notably used in the DVB-T and ISDB-T digital television standards adopted by 
+various countries around the world, and analog modulation which is a legacy 
+technology but is still being used by some countries today. To accomplish 
+realistic PSD models for these modulation types, the signals’ PSDs were 
+approximated from real standards and developed into models that are scalable by 
+frequency and power. The COFDM PSD is approximated from Figure 12 (8k mode) of 
+[KoppCOFDM], the 8-VSB PSD is approximated from Figure 3 of [Baron8VSB], and the 
+analog PSD is approximated from Figure 4 of [QualcommAnalog]. Note that the 
+analog model is approximated from the NTSC standard, but other analog modulation 
+standards such as PAL have similar signals. The approximated COFDM PSD model is 
+in 8K mode. The other configurable attributes are the start frequency, 
+signal/channel bandwidth, base PSD, antenna type, starting time, 
+and transmit duration.
+
+``TvSpectrumTransmitter`` uses ``IsotropicAntennaModel`` as its antenna model by 
+default, but any model that inherits from ``AntennaModel`` is selectable, so 
+directional antenna models can also be used. The propagation loss models used 
+in simulation are configured in the ``SpectrumChannel`` that the user chooses to 
+use. Terrain and spherical Earth/horizon effects may be supported in future ns-3 
+propagation loss models.
+
+After the attributes are set, along with the ``SpectrumChannel``, 
+``MobilityModel``, and node locations, the PSD of the TV transmitter signal can 
+be created and transmitted on the channel.
+
+.. _sec-tv-helper-class:
+
+Helper Class
+############
+
+The helper class, ``TvSpectrumTransmitterHelper``, consists of features to 
+assist users in setting up TV transmitters for their simulations. Functionality 
+is also provided to easily simulate real-world scenarios. 
+
+.. _spectrum-tv-8vsb:
+ 
+.. figure:: figures/spectrum-tv-8vsb.*
+   :align: center
+
+   North America ATSC channel 19 & 20 signals generated using 
+   ``TvSpectrumTransmitterHelper`` (Left) and theoretical 8-VSB signal 
+   [Baron8VSB] (Right). Note that the theoretical signal is not shown in dB 
+   while the ns-3 generated signals are.
+
+Using this helper class, users can easily set up TV transmitters right after 
+configuring attributes. Multiple transmitters can be created at a time. Also 
+included are real characteristics of specific geographic regions that can be 
+used to run realistic simulations. The regions currently included are 
+North America, Europe, and Japan. The frequencies and bandwidth of each TV 
+channel for each these regions are provided.
+
+.. _spectrum-tv-rand-geo-points:
+ 
+.. figure:: figures/spectrum-tv-rand-geo-points.*
+   :align: center
+
+   Plot from MATLAB implementation of CreateRegionalTvTransmitters method in 
+   ``TvSpectrumTransmitterHelper``. Shows 100 random points on Earth’s surface 
+   (with altitude 0) corresponding to TV transmitter locations within a 2000 km 
+   radius of 35° latitude and -100° longitude.
+
+A method (CreateRegionalTvTransmitters) is provided that enables users to 
+randomly generate multiple TV transmitters from a specified region with a given 
+density within a chosen radius around a point on Earth’s surface. The region, 
+which determines the channel frequencies of the generated TV transmitters, can 
+be specified to be one of the three provided, while the density determines the 
+amount of transmitters generated. The TV transmitters' antenna heights 
+(altitude) above Earth's surface can also be randomly generated to be within a 
+given maximum altitude. This method models Earth as a perfect sphere, and 
+generated location points are referenced accordingly in Earth-Centered 
+Earth-Fixed Cartesian coordinates. Note that bodies of water on Earth are not 
+considered in location point generation--TV transmitters can be generated 
+anywhere on Earth around the origin point within the chosen maximum radius.
+
+Examples
+########
+
+Two example simulations are provided that demonstrate the functionality of the 
+TV transmitter model. ``tv-trans-example`` simulates two 8-VSB TV transmitters 
+with adjacent channel frequencies. ``tv-trans-regional-example`` simulates 
+randomly generated COFDM TV transmitters (modeling the DVB-T standard)  
+located around the Paris, France area with channel frequencies and bandwidths 
+corresponding to the European television channel allocations.
+
+Testing
+#######
+
+The ``tv-spectrum-transmitter`` test suite verifies the accuracy of the 
+spectrum/PSD model in ``TvSpectrumTransmitter`` by testing if the maximum power 
+spectral density, start frequency, and end frequency comply with expected values 
+for various test cases.
+
+The ``tv-helper-distribution`` test suite verifies the functionality of the 
+method in ``TvSpectrumTransmitterHelper`` that generates a random number of TV 
+transmitters based on the given density (low, medium, or high) and maximum 
+number of TV channels. It verifies that the number of TV transmitters generated 
+does not exceed the expected bounds.
+
+The CreateRegionalTvTransmitters method in ``TvSpectrumTransmitterHelper`` 
+described in :ref:`sec-tv-helper-class` uses two methods from the 
+``GeographicPositions`` class in the Mobility module to generate the random 
+Cartesian points on or above earth's surface around an origin point which 
+correspond to TV transmitter positions. The first method converts Earth 
+geographic coordinates to Earth-Centered Earth-Fixed (ECEF) Cartesian 
+coordinates, and is tested in the ``geo-to-cartesian`` test suite by comparing 
+(with 10 meter tolerance) its output with the output of the geographic to ECEF 
+conversion function [MatlabGeo] of the MATLAB Mapping Toolbox for numerous 
+test cases. The other used method generates random ECEF Cartesian points around 
+the given geographic origin point, and is tested in the ``rand-cart-around-geo`` 
+test suite by verifying that the generated points do not exceed the given 
+maximum distance radius from the origin point.
+
+References
+##########
+
+.. [Baron8VSB] Baron, Stanley. "First-Hand:Digital Television: The Digital 
+   Terrestrial Television Broadcasting (DTTB) Standard." IEEE Global History 
+   Network. <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
+
+.. [KoppCOFDM] Kopp, Carlo. "High Definition Television." High Definition 
+   Television. Air Power Australia. <http://www.ausairpower.net/AC-1100.html>.
+
+.. [MatlabGeo] "Geodetic2ecef." Convert Geodetic to Geocentric (ECEF) 
+   Coordinates. The MathWorks, Inc. 
+   <http://www.mathworks.com/help/map/ref/geodetic2ecef.html>.
+
+.. [QualcommAnalog] Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. 
+   "Technical Challenges for Cognitive Radio in the TV White Space Spectrum." 
+   Qualcomm Incorporated.
+
diff -Naur ns-3.22/src/spectrum/doc/spectrum-tv-8vsb.png ns-3.23/src/spectrum/doc/spectrum-tv-8vsb.png
--- ns-3.22/src/spectrum/doc/spectrum-tv-8vsb.png	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/doc/spectrum-tv-8vsb.png	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,406 @@
+PNG
+
+   IHDR     9   PRA   sRGB    bKGD      	pHYs    +   tIME+9&
+X    IDATxydU}>{鞙aPTD}!Qs>.<FkLAFFD}ff{ǹ֭ꞞUTϭ{s0PcBdKa3_xtlK7u״b{cPJ-޴mko.}b2۾1)咙e?k6ݎֵjcooI KZ?襢f[qLEDQzzN\XF5q/Pc,"0\bU][$z.鸟m{*qg5>'ÁTYR.)`1]unv?[ϙ -V\a)X t.ٗm:vDV*Ek$, 'sTiքaH=yoܲpb12e3	Z7J\LۑыzluGr.̲{ѷBg:4?f*KJ*{~c?>, T
+`_|oeol  \@G 8888888888888888  hB>ՄþW]_tppppppppppp|A>9\uU{gӦMwl]%VB2P[r駳gsuzo+?D0/:)ʣ[!ZcAJ +Wodʕ l޼/~r-\xuQ]O~ӱg<s9f',(oau8."# |ca?  ضm^z3rkxr~pK Z#}={ WN8.`&y$qV|W!
+p*z)%J)'kGj(}) pppX4x:s ]vQ!}3)xY(8aaN1rJM~r^g.e78KE+FwOZ.lx0Q2AZgRDp"{ݯʝYӵ"]sw M$@XTOABIINwX4_sOC4d̴h"cmJ1VoG=O*i&xӦM|[BAh[ߩ^ҺX!1}BNIZt· FM&rC__B!;I3#1haA,41G4}LHD߮_/_|_O?d1t1hνrքxm %?qppXPH}(晀$F4~ѬktWb;>}n~k-S-[pwZ#W~?_NGt, pѱZo)e0]7&a|cX. -@$
+@Zna&7?wH)쑝0
+6uo;M,ҚXǖdr/}JFEad9aV(woIaEQ&Eb#c1H"-ܧ;?3_u;8>\.EQӮ}+Њz>ma+_^ͳ߫<\N	zu"kf盩}#VámKcc-
+8$[ѲR$:9AENV1=dROQulYHC9CѡM?\ޣ1<>l)t7O,]oWK6~H7"GwضmJ)
+AT+M=f[{X*aA LK
+VQ(&'D0yg_)5EHɁ4Bz>wz+	i>r+
+ׯY	/BaZSP5Ѝ@H	jy&sZ+0WKvny^l6o=/%pR7^Zy&;vmZYR*ekjvZaq:nj8@5
+)Z'T~4,''8վâVB-E؝J8cRyYH#LFXQ
+JS&̀"nI#cMqyH)cSbVFӺL록9l;Yd`&sL	4>1SȨ^̧&>#QJ\{tn`Hb~6)()q!hc{ҺiM-(JձLi?Egк&y1!eEKs+DH<AָoyUhUz{*owZ0̮K-fguwdovU]rj{έu NKv7HF}g:v_Yy5RM`iWmBSMvP5,-tR
+(qΔk6s@EBԎi ]J
+ԱF9rɑBt97zǷl`VkaDO|*i?};ֹm.F7]<r:m[uu^.L$I:_qdBSX \:>(%Q#:#(eI_?A|ֺm Dm:>F:P'Ǔ8)Iࣤ]ܳiޡVZ};	y?{.5O- 3[3UZIV+/piUb*܍Zv;b}^qm[`K4Z)m=Jc1h!TiUڿSRZ4O&X2d@jʀBnKF|!B57&0 ʈ&ضu'R)1{@
+
+>:!QV24mG6x'M"y(!d)tVZ	AΙo+K3-1K)Ela(OaExoT29Od)ϥqb2_A#n(	ú55
+aB2j![>]B)&!=p?QXRә%;P;)*!JI~d#J&/{\w1ZnL7gUj[IV+VRUY;6
+ya3MFZ[tT2锑NDHٵ(ڬ2ڦ`yR)y(aY>@ e#afw?e@F  1I
+94[jib_MQm]Z>qBY2#!B$`jM0:2|#;D@Bt!ql֍v}ȓZuo5៭5D't$r6Ute}jJ-ɚUP|ZckRM@yyg	 '1
+LvpeFCZ!6J	|m ʓXSGؾLs3yqOWW1""Bd.`kka	
+occ^FOOhSe)k[˵
+ƭBt&툅nU]V"voӧ!.D^0ϛ#\IG7	wڕmW)'HJ$.ш&=)2vn3F4h;:-yjqC)Vvn[dAL$gSdy$0hkB.בǍHB
+HkNʦd8A	QI,JI|)hRTNmԩUYo7&;ePJ5acӧ]}% ;ELkڽ%`#[:Ym<"mdDzR@%`rEI)]@KttCOYy\?spp9gi0&EX"
+|WM$ZJ5_?9ы0<HB=ot씌:R.xe^l٘wz^ `3dmtny^Spi^AhUnge1S{TA+ z=b}8Jh,WE\?BO8CGl=6DqPȄ] ZmtSmoaZfUZT!si+"6Z-@d F2휳/vivYlI|܎v;{3gN7w;̵$VnȺ܎hvÆe.
+#${(bnC ü{?J988̫קJ\c1.W=_|DPLBKKxK.[o塇; )fDRӐO~3>m;!}A=|(U۹[LwR
+g*IN;tJbv6;! (!QBN	,Zv?SkCɠ/a(\ڨMH aLn)Lק%m5	MZ6:njͽAD*#lZZ-,~_R*qXքqKߘ$9!BG L]170o>﹁ۯq0sMN"BT[C>Ŷm[	#fLLcq,_1D^/(*i $m!lDXʄi2N	oilnRkA=oܺۚfm70Bᴦ3[7_xfsq>> lZC%k\tF $iYhDHiu3hO})LJ.%5kN䁁D&&FDhauI  B8	4j}a.46q@bAs!Kw0_P%uk&va&폸gppp7YПz5~y^-Ī5ch4J{T͏oX,!ĠM?\k@HڻVٻ !IdJT;@;րw	3EkvW>{Sgu`F/{6g6[4Q(VSovw'Ҧ]tN}'5O\+iO=$Jq"9ֈ`}!Q2(X!a25b@7cg!e}2]ٌR"h5#OlL7vHN"i֪t$."A rٺ˭V()Ql)ADQY*@lڴC9!W\q{,󙜜uks	#;$0?o~A{ۼ[6!`|udK2<J-cTJ2)|% M v`OyP3<<Ҵ|
+ϷڄM
+JS6W~Lu0ޖm>?zF/گ]g:`D')"wdGDA")O̽S0`!撅(|==S!%9E1n!Tg;S ~B,ȧ)0qDq@t0i%mS)f~I cؽ{wz|[n#?fubyVM#ܽY8p߇^Σ_pp8~I־TߠLLC$Z@xD֔P1wϊ\yO0c`ttRdNq+"kZU`'5˴-Pܘ7T,mfꘚxhvC"1I@@>>!*ժ($hK%%(B8JŢͤ	 837"裏fE]Xy޾!溓VnqY2q888;TU{1^W#fÆviڵk>g6/zRf׮jMf4aM7L>ζ[/~5c$9ƒ[&aS*l4E60>Ʉq^4_ݽK׍Ytλ"OgMWs=0'zQ`_߹S׹vzZ6=%Y~3|Sʯo{Lw>/sv}i^ӵ}=,hSFEMel#$amgG/qiקfIl.X"70qy>bq;wxr0e>ul߶oYӈoa1&B'mY JMʤu{7ls~#&''3Ժy NSJ ,JSN9c\sz謮=3KLPX7l`X{[97,`J{vVq'B.~파׿e˖k9Lp0GԫUw#ZB[W'?wm	LRzju|ߛEQQ!gr!<cf-CC#DDq6%]
+Iߩp(e**aQ* AZ%0$)Za5_P?~&K)Xtrv'5ѴTR^fwkGG=RPgۚğ9XRjLXH(3:DI/ɎTR!8Hxb&"8Lڇ,(BPլ@DQH֝$I1R)4bBaYk%UfV0	rBP ֶnY:O)(SI1
+SIO)n*mFS֑DQO)bm2FFƋzFTJ^:IF!5pKRZAN4R0I{֓P(Kk(g$8cW,RЪZl?5Zf3{J`.gцX"isj6^d)2u)ؾ;Z)ZPאR>cdm8}0
+BH)(B)N\$1=MjuNj|/2Ѷi520ҾjEM˝>H8u/9AIێFLhXwtRVˑ	阵/`j tNF_ɧisIV\Z]LzMԴR6,jz]Z<j[}3oq`Pv]&ȤD_%a|O$m&$gksƟ0ȣ!|OƸ	kpg?:G*tch:HNspMeD$ZCPFG88#\vٿ7Bw<WSOyq9p9pꩧrGBj5"RJFGG׿RBH^_9xq<!
+{8Z%Af͚ҭ}(v|+V,^ן	rJB!G)G=l߾a0391N8Ν;}rdөw۵kWObhzHZepp(l
+.u5r J%X눰R+Q&Z%h˖mlڴ>VCb{>۷octtݻdOR$BcNGVw=(ZǙ?99i6IEsK)('lTu!tJ:]y388֚(:BX]j z)%w37@Z^gAŇfq(zZzBP(\P,zNn{իP*!RII{$$%҈a=DkMX$qSJ<)
+h'ʈ`رsbTzw2    IDAT SRD1Tʔ}xG^KTblR{}dv"J%n֯_oa i8B Tʶoc(i lS~g8S	 S*S%4LtzS3K%
+kujG\fٲe~}DQD\X,fXPR0>>壣I8~6G~V1zXT
+xGXvmT]~.JMNN244ă>ȑGDyBJBܱA;0H, D1R$Ĉ٨q1#|gbrB)aQ(2K8)a(aS4k6&#-Tl?/M0e2'xBPU5hMx^esRVX2\.S(ٜYV)	Yy/Gh6vS%hVٹbZT>.299%G&Rd}6%~DRZN
+6x~!tFclJ!Jb``P餿[1n	cOzғ暅KAa^0qǍΓyڗ~H Dz?|pv&llS>)OYдI]y+_hZOgƱ浯9mHSs|cB	}}}*c92j<P!N IZjJEhSGvĵ޽۷'?9+75:1ߜ^)TkU&^aw\pu.B^2FFr*쩯ϵ
+m۟`2°nŰJS.Op裩$9YV1lJBZan(lݶ߷;F݁Uؽ{7CÉ-V5>t?>FٓB1Qdb`BrJmZV]wܵxc]`V"%'
+SLLS!aXGÊbR?ݻTʬ[EDQΝ;Ht||;v`d(qQcΝE
+ jZchpjX5
+rggBP`|b7kaBn޼R$MLL066֚JL(%yXfj5$F^PV>QkNvŲ?O!غm+RH<8ZjZF` (jU6ԇkÐZFTHI
+BfJzvQH!TVa<?B0D}}LLNuLf#<ֲbbbD<I͛6ٹk'aNZTgݺuرD9 }~,}e-3JZȦMٳg!C$)
+ )jZ-d``MV100];`ƍ|%%jURZzXOly(B*ERnqX I)kl}b+V19Yf0Ў%h@ Ijֲr[-#Jکb	(^180DZ&
+	A*ٱs{6WתU ov'*ۇ_t1Y={=-QQVAJ)QSx'Xn8B;GF2+zaqlɮP|#m?K_R*
+y00F399**? ?r^r<O)~ @4cbb˗9~K Hy\urk mLt6-ppX&C<қ13Jw~-[ak_L]B=݅mM%XvlREabMb
+ZL b&f)]w$ (Tn.N6=V^Mfz35^fMδCCnxj77ݺu+g8餓83 2?8cxx!iF!ZW귦#1qlF$yγKVgxxYb 5##6(_5'QR&&*SVvHS`naj:B
+!l^iK}HiwB!1eb61R }_J	BH]&έm<Wxh!Ĵ]1FVNNeX`CY3zsКBY[:dݺC1FRA
+EfR4LXX3}KLuYz-đ)5Fgڨm"Ж|k% ?EB%&^nBbzoLl7Yy45a"S|ߚK Kvº)iBʕhOQ%} mwdvz(dVĀC+Ql][ԚvdZfZGu)׭EHcYd0hK<>uPJujT[=_ȒA	Sv;fE6&.M&c",v"NK@eI:4I
+T6SuU$úH|Fec1Df)ߍOYRV28o%O]Wm]]c=fTZ^u!u9k,N{!|w8,7Bagv@ JT߸Ǹ
+qLs+wy<~H Id^@3.1K/c>o@ytE3%2r*ӀG)*Q _u#Rh`L7Ol4X5QKpJL)%ַXr%ox83CY2X+^ug(DI/W&k(//zWd
+bF:
+65mdH"XŔ,5BDv~8i,ַ?:eMDI#/7=Sv¶a? g$3I|\o-$_R>[$w }Vd&?{}/hD"1{2?s~RJsTfTڴ=l?gAz}ll9Qoic(i]ʬh"5Icٺᨤm@ҴA%sTRc]F0	b!2HaUmO#0\FSI#dt_̵WdX.Dv0/ iDh3Icrc8!?]6͕|־tmh>?MtIց"ikSJΦSw|;%חJŤ|<5mvLNT?UWnQ/O~bi *JF]!Ћdׂ]uVrBC!}79;	2ePWaRߨ^
+x{_g7Gi!&!>M4Sƿ;G㘱cMczʹ鰄DQd''կ~W&!85_M]tMS56X{;'_-QEǚ1tWNY}E:P-dma^LNQṯL]/hFv3ڮCO2uձD27ڤ6-r޳m:4j3n)rЎ5^frpy\Zs[r^1B	xŧ1RؼfN:9ۋ=3Jx w
+c],
+X3}S]?ߋU/AENr+؇  fgwZKES.[4H̄y'm6e^Dկd;T˖-c֭nSrvi=f:ɐv.s^!Yf]]KϷևa1@-3dƓwEtcܩ;mO{ێrn36ޣVE|ZD &ߺ<y\ۇG}݄aGZ9`oYDESx1gr;r7űs 3w\4;&x6yFV媧G>0!e'zs$~9;1`R'MT6cmj\/(ys81N#ۈw?=/`]s5,_a8hBqxorhC*3.@t6ʐnyCeiьc;.vZa3ZCchoN3l3ɹkܘ HqInGQX~ŏGp>{gVr# cA\pݳO֬w;{/$lW<|TX~WroWnE 	г%q60crc`.B{jtmHg{|xN=Tn߭4ϣhwNj߻٨rk-s1)Uz%2y/w{}w$=Wd
+oޕsyfj7E۹W acL-"@,ǚMo?!/˳ud0")}Grna~ =s#8?cQb㚟q۹/Cdgm:0nt{UkГ{-I`1yID$vV&$M(x	waÆ,:xo1˗vy2=Rz)KI!;NCSFӥڬ )B#\Vo_lXϓRԏ&oxg}6/˛W=} ຓ\r}G*a^P {ng_X!A`%/@r+P}p|~,S܊\,}O Mf=_X|{<ϤVe9\(4tTbgs+6i1)dT79xXpYi,LWիW2
+LƘl?>d{A
+wN'gb-r@wM`;Xm>nW={!<;wDeLe|(WǍ7* BP# CzNX+?RB
+r866آXB B`&7׵>|תxӫ.nH:mDQI'ݻwCw%hNCy''^㔄Ƃ_}0xr7):Cτ;r\p{Cvv	~ɿ܎74L8`!#FFF%]';j Oӹ:tvpppX0H#X4}~>kb6]DQD__>ՁZ],n)I2883dŊ\ T]w9%Ƌ 5|4p@˿=}`5:vcoSs$ߒktlC*
+
+:]R<#y*K#?2)$:erRf*B~9@EQUC7. <#c}Q=yJk 曹ꪫ(JucŊMO2G=Op9Np_v[&﹥Ӭzgwzmz:Vpʯ:` !Pb7"<S,%f 1s;BPTZS,$CO7ImIҹ157f~6BSttNZvA;ke 5RIժ
+E
+6̒"ؘJ	H22`rLNͧM*$&N{E/J_2Yv\U6;YrüM0<
+&}Y\jHI+x`@Ӝ|os!E HH
+jM5
+<O.o~;
+?OT*uYn;88w-n`{3v> d#Bdwu'~zk!є)<۶?NZ!JhVq$bF@MBhX_cPrj0d׮],[l8 ,K 뮻>;袋8o_by䑼/^5"l>]ʗө#YvsvOgℚpB`Uv;]OgY,	?]s>/%QM㭗0044XSJXwpp1ꞽ.LkBV+U
+U63ȇIhGǦJ0#LDٹ;SɓXVͻuZt9o1׿{OOY]G׿3838O>ge_ſ,qٖ}mJoxkK.RDPN<1k̴gcΝY>OGJyJ%%>#+dϞ=x}!.c"dÆ|s#Jvoo7n{ߔ)!toOYRhΨw J)/_!8?qxMLupppphY|&"h'&'3l/tzz7(	Z|)	xrzqIom* Z_w>|ӟ4/JYJ1{V6	c2?av~ǩ\oyZ-[P.j,.:e?WAFFFK+2cʕT*&6l]W5Ӟ#<QG]Ro]r)ַ8Ϯ_	6.J߈S:R\TAg#[M:뮻͛7~n SFUUvؑq|<<j'wu OzғЍst~'eӹJ) @)EnL3M0/)RZ	<O&&!*Ͽ !FIT! AQ"{ZmFtit]KuHd:'x"gM ,ZA6*>|~ٵ|χyk^R.\}Aԑ*۷os塇3,/?7vw?#_|1I:%(9鹧P7~{ 8㋟k73K2I8K}P p;Kq?pwpr}?|+l۶ ;6rEחuRʞtRq1rY̹9t9ίez"uc%wB<5A)B5kd&'Ʊ8Q.AŘ(q856
+ޡ!KuكRoChLcZLki(c J%֭[8;;k!6pΡ13'wTKn<Uwr8袋 زe'|2zSO=O~}wٵi+_㪫N<ČڰakE_G<=|+_^RtRL-*{ G
+2(GP~~=ܞXi/ }]!6w0.;裹[9x8#8ضmۢj3TR)
+:OK))TUN:$|9i9g'sMt]I+Q )ș4gSJ\V 0(!GGջR4ȟbeD:c@
+6>ІHYvB
+LrL.;N	|P /<̏73xdw {	oˮ_N{QS3&]իW+V088HP
+FGG	5+5)[V:,pYY'%	y7կ|+ᥭAvtqo ~
+[:    IDATS씅J0cn xZ2>;wj<֭n".rN=Y]
+n\;888̏<ЧCRڹ/WU-KH(`M)aז(	-)ntP(e˖YwLʿ	RH!t,x2h9"/`O1t	ggsMmณXf;Wco|# Tv?Y \vew}cXl`qET>ϟ'o
+/}˸x^h<&hbw]۹!mM؊{#/xŒ}#PջZ3/??\v:
+[6,\4;֠ǧ??'?M7K^sR?oVV
+Ѯ]v-[\{(χ?]TA:.io2ǱugAkh}LW*<HtZX`	FG1M X,R2¼sЙCfȑ]ȴfz'¥^:!'!ʥd3zXbCXwXN<hZU펵;7\q>SݯCY/?tq.@΁+wx,E I*f?1
+X#ES7~y衇8ٳg=ֵm>ׂTĸ+˜~KMS Cnʹ:pk_ڮR:8888H?oMת}kS鮺dxg>dVdT S`#: #/	Z0i_hDgMZiY BX\ijKbCͲS^$v]c>3]իW+.Ycv])v7ojo}}9Xy&?#ƙ/F];`~8 CCC]_Zy|>BjP^[ibYgEEMVP9묳)"Cw|ޔof[C94[{emQqe__p'c#i'uL43,I&7oء^Դ$~p{
+>}G} Bo|mW^8<v]MkJu\p¿޽3!lVT1nFa˿_̪*eqi鉳FFT*9[51?ׇaH4stgaqWXT{ZEA0ٱcǂ^g|cwO,yaޱo 9+_62Z~^L#q[^hCT"Ȗ2X.}l>g|wK kYa腫;#Sw z1w3
+,A"BH=d<JB\ѷ?!6x3wpppXd@/PS @8Kh׊s~d<T7!<?wePp^cݹYgl"bW`	f}pƱ[|z@#&!~ͳxgU/E
+]n = Z!o7Za'wݜE:vx;e-þ[?f6[h	L6H8栃|` (뢙"p7}B"<(tĬ"	1?xr۠u]D}q'o]d+ U[?8tH,JigqgV^61F"Pqh\rB 1sג9XJ"}vl̪UOO;vZk0ϿDͿ?:ga:vzm8%p^W`-͍o|01%_~O7X
+Yl4A/ ;߁
+A$4R<.O7w2w#0~y6_P8q̪UxGYjռ)"j` . ʙ`%\{:nsEBb/
+w|Ok	P80P}pǻӎc2$>FOe߭B</Bxb[ _vmb?3pqǱk.7^8vލ^09APu|g۶m[XEgv DUP\ao#%3nz)=((I a/4a%.rĢ8tQk:vN C!%,{5	!¿4aXj߲e6m:`daMVFr8&">;8kDT9l1,:@W_!|RY3m'k,p0~Woh"gF:Q ޷0yNX4
+i?.`Wkyoc^R֬]9(oJ֙v]$) JaHkeaui!8}{ٸq#~O:k#ʝ(8ar_(ষ>?Ll- @q>\ಅ&ӏaˏ锊0B|졵8TX,f3!"/_Ξ={eÁ)Tu[Hy˗/,͏,wWfBA {Rr'e˖Y]o~ϙoHx:Kb_sW/wP>&~Ю-!}ov  {qA fBUe,(kע59i&֯_ߔa!#Xy{c{K<8Z|0p=aÆy3_ < 7p|}ӛD[::^[`*Ɠí_.Ղkg	7WzZyh
+VQT)g~(B)kC~`c&cnݚ)^zpVbl/c=5kpW0?m30TmZ>_p+SKDu|Y<?e':ѽ&Z)3ml4gU6nwřUffr IH"*B69&@6c0ƀ138sۇ#8&`" PjsU?{vWqWvӌvw}zI&ww̳i```7ef|ϋ*@2̳,3kD h8q"-W2lKCvAlXʾkZ@s+8!;tHs_yv_!J=CpB.v8; O).,q8OqژH$hhhG(۲
+aK*  fc.zmXD2nQ88+,JXh^v~7(/u2tPO]1zvZ|7=?$ J\C˶mñmp0?۶o	H);_r^.fuZ: h+O
+A2dM!?l
+|'zߍQ@i(^T+p饗r]wQ\\{[T*E.@/P;3=>⿗Ԕ/kڵkh
+fNr Ui	P 
+>-
+wt`! Xo_AASH:U|~mO6f׿uP7r\'Ƽ֚cvpvO	SUU`b& K3wŐm1AB}k=ʢ }91xfrI^=SLl0tL"ܳ`5{%|]@]mCJG׊vS;ÆP
+;<=p RJr\([^q0000_kԎ)Sp¼xmO8UUU==^=(rmh{(%}He;Y4сPv6au-?={aΜ913x~oTƒ8yeܝ4551qD lFk*;r7000PJPJyNubFO+	Kq 6kU\=B@k}> 3FpN93ѣiMǬ[_ʷyX ;'ޕ,իWo;ŋn:\58>N)aYAX<\ͯgF "JM
+0QTCrkMg j]t!v`,G9oW[)qP`w+v</w">cƌ!v8ACEEt$u9r$@i 6fr\ @0L=	`6
+VK@ֶ)4>E[b¡V[B91sůy9lq40000蛈5h,N?5ee[<#Lˤ l(M=0؁Ov7o~yqBz ]xlv >+ÌOO	;rBKgg'p,S?58]S￿w۶MΎRs YPpCȞꫮ)}&`k/p/
+7&@4w6`字GΑn;uf ELB)ͦywaCbJKK}:7F}t_.u6jNT*t{h?HR;5.43ސQ04$r=/teú[a ݺЪH)xG_ôiٰa#|S[r9n6,X{U7n\"&@4!W,ӊljyP8NRJXA5c}oV	`;i	4 ;?[Oʐ	` ueRiqV @Yy7w{4LBuuRw)ziƎW/'x.6?.c8}|j&O>n>q#%`6ݱWZ2S(;!<T0ڎd;ヾkx3mG뱓/9/ LSO=ɓ'sEVGH''yy&QP8C[r[D=aXqK޺H}?T2{񿄰 Ͱa9SL45kVbQ<H\O?O%E`Y(*Iq²,jjjfu6 tR{ƳAyy'{g{F`444 #p|ub2_MMMx~|iؾQޫ[P\_R}k h}.C:Ϋr]X`UŚ^'j	WG?WH@),	o]ǡNiW% kw+.PA,`uhx]5wVI}.e```w1j(r9;C{_)S,NI)<uʽJHSS3gRGw}5*\r}I`ƨa!XBSdI/cMº?:8'wѻ6¡Cf͚L>Z~k4)ErL4\ΏrH%STTT' e#~& yP-+B<<_})ec(w~;---d2*x͚533fp|ʼ\pWi}q鶢F:mH|V77nՍG/)	i>^:1p@FCkkKzTWWL&9ph-:.KQpOk7Toy[:>:֋[?}DhHLN&|l¶R\p(N e:````}&ѡt6f7(Hy#z(#&܂CJw}Yjl::N?.#vh/xKH7AQyԵNT;!$dWOqؽ4ձt_ThbᎽV6/]@]&|o?ͯ*`Ywߟ5k&ŉ8%J{A}d^h}<TSZB$St,!\.  Ooj~jZRRT^0:=qb000066a09Ud~t_`|l;ȋn{"Geܹ\wufA 0L= `MoȊ/f=]s4E{9jjj89Yl޼ٳ/;@Xt)'O;ܱ4\	L&a=#ˑNfA@6<Yhq )Ex_L}L&yF%2h|p"^2v(nyd22q0%Noq=! tRP8]B7, wA3L=`XNE	`su'1Ws̎elw{C%0Y|#ҭNN2 o6 PHiyܜ;$Ny󦼚=܃m$ ?x	!.AP[[رcYr;maZq饗1a>chhh RVVFkk+%%%dYJ&M@})Ae˖QU58O옯)9 ,bɒ%;4ϓAŋq#n{`998蠃zmmmű]g ! ]߷	H+dZ+$-xe7|o?tʇs=f)++cpQ,
+,²Ԏ'L@&:j?Ow0ױn6euzfΜ̙3{}nuRQn¶-JJJ={vWZڡ͎㠔&n淿#FE kw-b*++sd```:;ﷶJz6t\RBCf߮/"&2t?]H {^]ySSF^~wnhG|{kG!=n"/;duBXEG
+)[9 lﴷVAS^^5$ծJMЃ("Tʤ|I(Df```Wk9蠃BݍuQ0~ Сr?khmDTCO+M`'saM6cC^gò
+qFfΜɔ)Shll,Px?c|A[/"zQVv~o<qƎ˒%KBkՎ$ڽn}D"öIJ|P}3ѱ    IDATkɓYpa\ӈ#ذa=/k 鼶t6?zHL	o?{2A,to7ᱠZ#P05g:TgB=_welԄOq`¶nmηg+tHAF <KV*++{,XAXh}> 3кf<;Ua {srxwѲ!QbXXԾ ~pܖSrlEx|J(չCj8;c|ȑ'PTTW6xYtg&m,(.|G}Ks2nX*T2}t~i4D"r8p	qH)d2t˗/BXkcض(:/<b[h|IXVM0L=pL`O8o?.h&yU6~v˱+xꩧ8(++K3;dn רB]#Dt]!9OMH%\[$*w;A	qK;ò}Y?<\Fh	F 	yrf"Jv`(ebخ{ή_scB}׭YՍqqyqGދN3CJjlHI:F
+!dtyVk4rAєnmI|wh|1t}Duinn8>xmߢB\`twAXi@Sdj/Lev68eʉ3c m#0O
+r1?Tʜ7[ҢA7X_ׯÏV+s:Zyf4? L "JJJ:o/N jo{Cxhnߋh {Fpv߷O9I W&@nL0ucC,4RZ]S危5P`6T
+)7AX1[YdeY}cƌPegζqhmm{Y'PJL xfL !Y
+kqKpR&Phإ	10a @F~D]2rb Bequ1~x˩ a[_zA^vi*?ݍs9׏ ї&GO4;PE<27~:ࣞ8g~ǘ ڍ<?^ LO4 od4NMC_˗LKGN=h</f100004\kⵧ%K~m)e9
+P[o7Mq2^x!_=?z[qm#/E	c5Fm}`ēhQ8I3
+^9~pt/ VàkdF.GLB<~mzmCdW̞=;nso[=tȥyzPѧ_  &O_TWW3c~vA[6?P){1:,fA/1o;Ʊ&1LV!ugS"Rb|O#BJ]T %JZ,9ϑ-Y!zg濹thi:p,]g}-[;#gίآqhiiSLs!<L4B(m.S@u6l=Ð!C˰r  JBoW0g.BָUYF.Bc+~))`~g5mQcaNqVTVCPg{H0F4/-@"{SPR.M4L>I@ a(^g*N9ᔭ:O`m5Hʏ8Dmmmw~5бUJ ApB,bƌy-Pᮼel
+/T=2
+r Akڵ/--e 5K<c
+C	lPb{و\% 0ge$cf(A7c;_{ StN%:X8ٜ,[4uc]oLOSS-= W"lf700(<l&LBBeYd9jjj6lX^?\GTp&*++}?!ޓأ[@eQRRBQQ =2fos/Bm)fJ%E=@چ'?&*d[)J ?
+&@Q
+?-G!0B ]rރ ?Km'4k>c>:G
+CR*$A*:@ |Z[,/c];F1uT)?Rq_r:sYlw+1.b``	SyMN"8SyG}EVҴAͲjUYÇg 0Qt+|xȶgOa%Q @IG^css9$d=]R*'mhd~o	"4_VZ-h(**"@H["5Q yPJDN>BX u-k\xT&!J`l}]cKC7v٥q\H$p]7?t  $-#;{yVBl).49op|8L(tǯ96}oCcM8y3Оv4ZTIZc WVVvѺ~e[a %&@ P
+T9W
+@H%B&
+BZRjhmh;䣔B!-!iBdisX5Z+PCkDXվ e:Aw̅"fFE^C`ߟD"ѡԭ	 R4:a cFDa'P hzv-M<-QPٞkn C'硔"i:2mRJ8 -Bb߽R$(HFǱiimȦn m?;;92
+`[.J	ltNok?o'[t'ƊWT*b޹A!eacɸy;>(600{Aۚ߷!SMQ@YG~c|tp馛,˲
+f v`͂ŏ\K(	RX/\Zۂ=1ӊ^4Ch d2fϞC=ěoٛ͠N&ΔF؎e"cJs:fB6MHl6b( җ/0b Θy<(0_3V}!C8'd2>oW>o:/iB=AVh[x⩧88̓8dd9t>YA;ida |,9/ @BAC+PJGwJE%XUtDu=BVGG9a=\|̧rټ+cS8|~˟1gΓX)*ȁZ]jc~Qf}֬FK+PN@QZY/ ^SkXQ?6lZ:|Xx<d*oc[/#3h쉾sa  YflrFg[;c&v)y\+"/z	E Aǽ^.G&
+(Ƕ.}K؏&Yq3БF,2f9n@}}-߻qۏ#O>G10uFuF~*ֵ_΂O!IJP*w@J@	^]*w~7r;yǸ0ނH2d= $GcB솰@kAtۺ҇Ȱx^	/$ǶB-RT@rhlKJi2E+%eC
+w5cQװy{}EMz<4NYR: l%P7A	 ٜv$Z)'!m(QsysIBAϖ30wH$y6vQ2F 
+!btwemj
+`/]A^*?C:;:	^ki3{3wjO2m`avx=hkُ3k;%,7oӦM㩧;b#hW]	t`5NWUΩ=!w65U8̀(JChGb	-RZ)Pѹ-iE`(1g@e%	!aY;ȨROh@\Kr47D9(plKx^K;%t۶-K
+,K":ю8XM]}=QBb[5!R D
+I2.R8d aKkJJ}]3qaCrߊat6HڑBHLoIl&K&J"
+ǶHQW,;
+rHS#>9'{kіAiqmř%^ڧO}ZwslͼE/q1re^vp\(Z,O1L^1|fAsjFQ(;RD@f 4q\s5{<Kqq1w^o٢:fiջ8*e:!O?/a[!%3k/:?Y~p\44?ӏ//luo~[jj6Ϟ1#yzSTo^1G9,F9)!P*7
+lJ/2=&M9.J|{<奥/3"lذO:z~;xfoPT[~ġaG[iij[ny357zw1h lY|~LĪ>%'t2W]y%ɄW/
+.}dQSO!$<C]w:R8N|sTz(47Z[(<M?\.ǧ=_gccr	M6PZZl Yg_<'</K6m'=}YnFޗL;=:\#ם b}lf	;|z1M\}pTUUuY+o2WKC˔QtH
+[L `dVһx5-~o 4>4@hQwc{_c=̞=38}z?-ʗ nE	P]ww{AXL;VTTDyy9x7%UR;eڿtm4Q>Zt$:ۑdUex\/Pn!w}7v6l+;`EG|??7^2~$$[QƎR7~>֯\ҪR[cCo?oLJxgIq'A֫c#_9S%߸"R_9T8|2K]_g)ܹܧK?Zm?O&LǐA%~xQ[_֬YBbGsshEµq,.bܸC(.	rW_o4gy^< dJ0VqQ/\ocXڍk*CSzT\ճy+>ZUN:a])gő=ҥKill;H0.XI[[93RhNwpAaJAcv	>`UJ7 F.ӅԿmNcѢE(-
+mhihl7^cĉ[o~-;-,,+}L q	D2ފ/+Wlw4kx3R50CҌ|462b`S1l0Xp< v$n(HPkO>&Lɧ߼#G3}g `JRD-՛H,bx'(Ɓes}^Yï~s,Z7o.k׭poC&_{~[`6Y?A8cDS]#kYΛv$.|ϱI)6m+^N?GN?s/~+KJp@i,K!}0VfuRD
+[^_|33X=>8nOYO?L8
+>{s?/gyi72lp* =ua``mOR: eeRTU.Լ#4NGH0L:h}	nȠ	NFf݇}McszL2qг:w7n|0qH$l</K"bYL+˖˵?L>C>~uvF*l6hmIgo9j8t
+/<1ϔDi+4GLDils{J(>uq+vBA%*O{c'5sׯ]˖sY3	PlXZ/Çbsb$A Y#\)Xbu߾r֙PYQ8p0r `C:	#xɧXd	O=˗-c~I:nG{,}y\ʻ+W(M/g	YB0cƧ<ypNmm=I%zr9աVmH+Bpo~o UŅod
+ ZX:< __Ͱa4pz&%sO?M?eo//57P[ӏ'nhl[5io_4\
+!7\.W?a B ik"<a5؉hÄ8:CijXݍxs8)t^(]Iv
+!zum.#1g6oĢwd2/4hnl!2x𶖿]eYTWW>JmL]ۋs'H:[s6.T5d _%x,V`ժӚ554668ȥ[ys̲)**0.Q;Ƕxu?gl3xp? =ME,^dh%2Xk&),cՇS^%Z4obݚdrּs3~,LS;SO:CG>?*c1<l^xIC<t -yN96RT\M$I,µH$SP^^ơff%7m;7}FRr=ǝ&
+@CCŴQJ2i"R"PS^z$D"iĒ!CԖ].]eY?~K/n3<.kjlļ+z"uC4/ BbDLD1qf;Ƶ{}[|~޷{jϷ[cƌæpԩo:rPO֑Jȶ6
+    IDAT:aCQT@DZqtpJ+"+_ollltaNugڔoI{Jʱ!,Cª Z(M͵$Ee?Syzͼk\xPQIei9tTjH<YYd	>'|?R-46SYQŋY}ǲ$7l9Ls<<8NEE|lڸL0\6MIqqtL8^|#F_{~}^.ͪWrgf;j_KKhosx>F/+hlg>V}HyY	|3<'x*-'?)ZP4K
+-7夳4O՜5s&իWsر<Clڰի>)C]mC Ӛ#EyyuudrlbPΪHqQ)&Nf3?o`"Ny^Tk0d2[vo2ƶNN!^ 믿N6墋.ⳟ,^{.EC=HؚX'gX!vZ}g!RM'Nܗ^ޫj@7ZWv</s=e99xg"4xMzw3cT~x򋀊isdBRzC :,XQQ`)ÚBevf?MB(,o ޘk/6BX!dI!8cQnVDsr]u5>pG2h@~;Y}{~q`96 q\ͷ?syg33ӹ[|+_a[oq9SaI6u'#~vׯ\1!CRW¥]unN;T4}GG}cs7Sࢯ]_8䐩vM1i|{s?9OwfLf_r~	;ɰ!?䌙\ŗ\֒AΟ#hMgF~\z	_KsFWs3qd::_z	^}gʵǆ}ʊPpl%4|qrwq_	ϳ狯0b>0Db<e``D*UitƱZY47GNuNG5h9'"Bx*~İaø;R9}){?ȩG$>JO:B&@HPd 6oϷy܁FM
+Eq7-`o8p X6H)^ ,[bɨѣxra敝V-
+;Wn L&$btxH)0a"SNXE.PT+VcO9O?h^ѣFaE AUW_ŷgС<? !T>)'SO9iG((Z4a	+`S'$/> E-|_c[WL@Τy G0nx{67b>_/>٬ǉ'ĉ'M7N:D*Y_`Y&LdٲTDzkk3"4F-2f"@kg}ү!$I[RjժyY-ZeYxGdX}ò,s9Yn o,TF-)A*<t׌q\;l
+/g>K"4au̚5y|r?0_җ	y衇P=ak漾O6m &2M	`Ѓ pW2*&P%tmuy9F8Za#4_崦<o>ye{^h%k
+"FI]G֚TQ*,9hFR*89!QJc٬Gqq1--ca	yhͤotr^Yb2}/2T?[~CiR@yy҄| mٔ
+
+Vض+JKKLeE9(\!ɠtHG{v*DEk~}Z	l%< GK,ZCQQJTTTsGDcEҚ 	Tdra*._yQ@@hT*J)Rr9,"H Ķm\E >TDw3r'!%vRÇrn>|ϧ ,ZbM@&WVVrsEQ__ߥs~_Jn]NZ2坲)f	`ЃFޘy~}^(me˖OP9p ͤEqν<VN_+*~ksϙQ
+
+utd@g7[an_m#w|KJ;	;)RJ0(y9F΋	-rV!EeRZh9Щ\yŷmA_h)T`!:-$tx [:H,?@aK±%X8Hf,d2vͶm-bG9nVcDk-ĔV)m;Œ!!lW.aYB]!-A .	7amg ᦈ"{ߧi X8N!g+ l8+y<VDkdwxf̘/S &MDKKK~\.GSS]ve1u.36621bFAښg^#Ű̠A Y4̆As8O/PcPt ^^^^Kꪫihl`!?d~78'{4~ʒ262x@}v?0ZhW8vSDJ
+w]_-J4kMeTg"c~Xe#Ad*
+B7qQGС	ڂ86Ɓ+Fe9%R2̇l˅|9\$A
+sNeCd)--t"Bo~$El
+A86ע`D>̣2Q_x݉D]_Y-skhw-86bX5R[Bgxo]*ރD>?t2Gs*bժUr=Zkm'2qD ׿n]2~0} I1p>fcÂpʴ1%?29}$(2,5 =+uǾWSVY9vX4.Gss#
+>]%_ӑ7o-OkV/`KX2ZZ[p44Q*eڏq]O>~z6nRrG"R,7zںAr-innw3pPuI&AҥK,AU9՛)++˷:|q)D,\Kk83,S㯣ǺKxgggd]EG
+@IqXU+V R<b1*(888wos)-"|&Tmov0tfo?-pn1EVVlf\}ջmynVW:'O"8H^ 9ؚ^]Cfi3(Am1L c0SU<ؽmso:ܑm?|*=l~fIkK'f?Z2MTUV_ޝ?G6w{lSH$l\f6n@mm-ƍF
+h|_cY#dظq=5IgC<3iˤR)fL;ujřƘc(2e
+p lwW 
+lڱ+6gZҲQ6}gvC~G  ۸Ně"*A̚d``yHHMJ&R)FͦM<h"(k>.#},)k^Ȧ?ˆc~@R, LֆpsC\(kͽ[~#NviEe~y`uO	s?/v04d"m+fg}>?GeU'M&D<StDGThgy^\%կr)GSM;T"2t	Eܲ;^-k~|-z@Emːݹq[]w:La```гkLάka3sओND i.۶y>d߻$ڼ	$!.%f'VP9L*PA$؋ܫBS/Njʭ覣w2 ~%#O~ےw&}iI,(_<NZ[Ul,-.?M>ݨ1j%yQp
+"ȾRQ]=3LLw33˧>LWWWW:sܬ4"(sj ?Ӑ+,Z1nC'EƿLak;}ѷn2BP9SX/E:8k8Goߎm9+VuY\-ҿSۍHG	d$ ;cAjӧ`TuV@lҿ'JhӨk{֕+b;aFbBKwoMzm{-dF
+MMtkWdGW(i"зoĜkrw;QUtѠ>69YU*Clhzxw'B!٧{'ev.LݭW#2^v~2&@<ny6Q?U֎7NP(
+yͶmn;g$d?|Ɏ*jѹE]U4,?`I.a0oSSzrwh`[Q(#%{ bPm-ysܹsٲeRJ=Xŋ]er/ёNv|4KFҰ6mH<ohp\h"{D(BP(*_|K,I:3-Bu4Mc۶׻j8ʾܴiuuuض3GtZwcC0Jvl(?S=܏cm=jKXYMNO7~oBd !o&<os)qFf͚ǅH'rvmql4Vb$_CLMҮQP__Ó+
+kŐRbfMf2_uMV%2kB4MꜲ(eu9cKsٚ&YrJ0<,[d+roxG dE `W'o'}#oxS<nqA(56hTg̘?M61uT n;.|>P^[-Ydr9j3if"eu疨'&#
+B5	8;Mcʕ?@&1MM|ݻw2ͶE].L	඼)wcۢB}GZ^:P<2:-*m:y69YNLRl>n~Iq0ZZ[bIT6rYg?wիW5jT#Reg{_Ϟ=BO>x>?c&dȐ!'W
+B5mx<UgoDKHDerf ic"\XO$ߧȾE9mi/w">Hßv)'*"g(!@S[?5Շ#ᛈ}nvQ5yIhx/`7{QGQGT܂w0m4=X̙C=mǉiZmǘe׿/7p~_R:8Eϲm˗	P(]'QG&/nj='c믿2,ʉ9 @PrV/2B?C[ <xrl,?^ş7ȡ9kJ\]t=. Mwנ!ND+X	H*v̡t} ziޭF`SЛf/wE]7Liv'|>~?YhgYGZ!L Ks2H)vFit]%	*
+b6~421/d阦adgV_~:tJ
+R&
+D&fF3."55!YaUq丩ت b7*"檦âIMtFJV擥KC7 OMB8B_[_	H)Xm:z"n$6!BCt|>F(JTE 
+b'# O}>B~0e.dql ^
+~PUUť^ʎ;ѣO<g}6HsW}euPhTU|'0]Z9%+f1=3ʐcD	 %k7+AҼƎXfƪ|z{Bwp1" AU`|N=Cp]?i(%裏4e/ܪˆaPQQ((b][Ƌ*u
+*
+b3ޅɖ{|oN~< >"09a6a47 2gFNUU&L%'|rF:l{8Ry20$Rgmy$ITՎ B*jH~/y	m&(1@x~cW֫]^P9.`+E}oq{➻:n^dYVRq˲b	c=;UUU<~G,'<x<B&2B?ψ# h#y[,+T=PYYɛoI=۷/sW]uD2:3awql?=WS_b9WNa;ol,Ka\*O	1رV4	'!y>}n&h_I=먔K額Iav!Ǉ@FlJ7"%l
+\snh}_$>U\ i㭬$ %ۦH4	[5I(**BJ8H)U;@B袌3&9dnI>}9rkP}}}=~0G
+@0dܸqlذ~K/![laݺu 0 cr)<3Z/{`(Pggq\4gQUwMR+芜+P_	HpR,Q8xeL:6ynx&Z3."DA+ϘOCǇSrAʪs)#\ǿߟ?=#pw26 )%~?QO&C3u(9L!祔@ \qq'gʗBP(rO E=lii)o]v9mgvinw 90馛?>555|ǄB!8.¬n@Q|.>~l+jgР|ZyVF"hPQpLhXs4L-KfIߓ~nS{"䣜h]<y:I g+qWa[qˈjfLh]q!xjp5]G iOnH%O8)Շb7Z0tBҍz
+xyjP(݃۶_Ӵ)A Cuu5W]u6mg2tݍ    IDATfJqq1={LΗ]1|py&F^l.0jGQC>4Ɋu=V 
+ƆG!# J{]s+oMx6&1lEopD =XbKؗA̎%hW̘6",öeɕmO^ ۩0DlIZ5*g4u8d`2UXԕQpY={RJ/^LAAcƌQ7LP(0`&`0Y S@w^[~='t
+/";!弼<#t"~tr_{_= A/>aP&jzŀ\^tUN㫕w*[-;0@Z}onv$6ay&]`t>p|3iNб	J/?Ƙ+hyU M4vU;v˘01i^RP9eQWW&4IX$ݒ,6l&:Bf|Wt]7}Q B\π2֏ܨFIg6پ};FzN;v$" ΄s8kM@i}#G$՟X7qLzpCJ_|
+K:0@4tH	`G[ȷ	/n ({X+S1տH˯gJBi/;`\Aþ$˫nft%2F$@{3۱ߖhh8%r/]#{3QlJXil۶p2MÄaPP(8dtZ6:ײO&Qnx]euNi&\Ԣ16j0cY"e]LiGvHnmKkPc_Cg'W;cA^KPctWzR_e3l)8.̸լݩNm|f=ȾHx1%	`Ep,m= */+窉 L0	ǂ0i;A$WBPtq aFV-Ͷm0?VJY-I)|.4FwRJzgJ/*-ToP!$߬#g7Q9vh:ئ=td!vDA4BpOvPrtEL/tT/9ظ< O8)xU6So@Kqnb^76lB"N4u8蠃BP(X,<{/͝4c{֭"
+2דcJ+LVn:o5+1I?^ j4Sbe2=ڟ2]	 iq'%zN1GW
+| re[N >˪Oz&2J㫊ӊly90r)C-1d$- tvI0l (..N>?iGuMS(nl>­g#$߲5 b6h4'Nnֻ}ңG!dVzCrYVtX\>%N܄Z:P2Vt3\'m#@0 >	
+m^[Fo BE5|eG &VvsRJlhM din- %/eb\`FF{FA$i#(
+ey0i$\2sڶm[rՊV 7e͠2@%9Wh+!/_脴%*Vʧmsn/*6[)Z򋂼'tW\[gX W&8B9vB\mmH۶muֱnݺDn:N5,Zv7>Sqx<9)1۱JQB
+D,(
+EкcYyyya,ˢH$eY?z&J3@IYww,SFtȹ8>P )j"Co|85߶捿`ٴBl:	4GJ7`W}`Bhz%0@LJ߶HHZ`N"6]634΢Kâ]6ZZB}YƎKyy9˖-odլ^D{pk %bz_aD#qÇ'i:d0'z
+t]gJ)
+EǫoۙG	+ %%%L)%O=}M®4@p(
+|ne7 ޵.H!ymIG	ԂEН[*q-6Wo7ܓr_])	?73d4iDeaG()GxJUE8%!&.CGK,fqyv?ǖ8ƦAe;k+	P&4?IͮmcN?t(P^^ҥK9s&/b7]^k=x<#V\~͛7cq
+b1H`2\BY4nJQQi,RP(GW,Em+a$+{sƨQؼy3[ٳ,9ܨ 9PP^ί}ef&&`z"r̡0-GCWj54d<	5) CoY}zǭ,N):~&y'vۆ
+(&)%W~?r+ѺMul`;7."ArKwYW{>eZ.e f3R,%t|	ȝx3fpi.&L_2nƤpUUU86qdƊΟ'>l
+Jfԩ~8)"9RJ9~2TE(
+E$yGJŋ?~<l߾={1A9 )t1GM Tu1sGu|F}+4pzڋ>M>K@cRZ6FK{cǯK>>agBJъR'K^M@"Rew6yV3^8$a5;߸Ì!`G|Ѥ&aMaoA`Ni\;8.ӧOgI7ޠ3jԨn&d5R0$/ϟXuqeY:c!@ضmV]nޟEYi&C/c*
+k2f̘ܒӸ~@MMPX,F0L83׈B) GNo9MlXH9ȸ;Ǒ .y5ǡvc$[vƲcD݉o6{ԓ)9Ar.lm>۱Y{+:Eh"Jez`I.Z4\ןW὿}?~bN9'ճoG_a |_¾	?-ӎВuPph&8#)**N駟fٲen,zR,0Hie=K.eڴiaaB!7ò-4@00PE 
+sLpO?>3g2p裏f޼y2˲r ) 6\Tq)zF qxo7D ޑ2E`UzZ HckjW0mzK9lYVcPc%fW6BĨL>2"q l`)cX>¡"
+K	S-WȺƕ8hjͽ	w3nd[e ~-ǡi^˖e&VH4MK&MvdB kz5I]ד
+
+B^R&xAשF8CbYwϱT4 Hp$o{9kl[_8и閕lC8djXZ`եAz}8Hɥ)RIO	}PҁOkah]XNaN bw}d"{D*r̥ZHME<|c?XXQ5A).YkGα&g_>f hTo((SWBlF44M|l0M/}8eYDфs"w
+B{ld2Y?kaӦMwV<,r3s He$zT]w5ů8}&xA4>/:E`anͱCТg'k7Q HJ@G!wwWѵ8* ;`}*%Й97SQ]QRiT|lʁƜ04X_SfJs9b8D{zri8[j#q:z|q++;ࠃcɸ/BP(***RRZZ@JX"P[[8)8iZrT Sqq$d-:[7qqnx5L0= "Qɾ Srb09#uL1~jF~gT u;qkj/bh=XNAF&쨚MA@)%O}?){i	Fbl[	E\k&N,uq)3zk:HDxCA;_ӴdXw_D"
+]9D߾}
+B5Y|9@t]HK	C(`l޼4dTj 	E/kb_qq?VnϜHl/.:U3s:+(UklF7ֺ{%4rHxRF;ڵq;葎tHj,B:R]sPm(:,Ka?sG[:SpnF/	MR;
+rhH;đyTc=#_A($H!t# Z^
+mK7_ٺu+}GJ&k ضM]]V(
+ŞE0LۻEԳ@ @0LQn!sfuN^[ mcV|G49K!9TA%}'SƼV]Sމ+Io2ks8 Q n8锰Rp?FM mҳb,Ktv'fsqOk_K1ghSۯ^8d1s .i2w6˲ٲeCui;<"LD|!׷zJi2)@IǁLBP(l<gu˲:th"w?x<D9 QH5Ghr^Ts|@^|/	`q	kQ8/	ڻ"-!`e8^GtgIj1,Ei4;u 'Mycf7[ZYNkzݮ5 $Ɔh!zƊQcY{UB>2ymۄBD934Ǒn@]k0ع{qq1>/㹦jR(G,Klq~?ǏOl6@ 4M*-/	k`f=t,ucRAȥѨkW>i@v=ȧ%fE@|+LV2k%{E[kcM	0p/5D-[{1+7/ޱL>NǗ^{cHP$6Q6:qW( o+oYvG#ф%1RJq!Hn
+hd4<;sXv-@ si{9KP(:/PP6՛/eYhaL<9΄!C4*^F5Bĩ#73'K3ͯ"E 'ôkl ]Z}c\oV͗H1";n{<;lbpA;.~ ?˝SEvڶwL WS;C}}=efl({+.֭SNXRs0˗cYVN 6BPt>x9.. |fv2RNcڴia	e)%_}ҩ ?9c&BAUAϬ	஘8&@tXre̸@<`@';`9E$@/ш;RL/i1i_Nx7yx >Yh
+vY'Q%V;nv2Ǳm;#VWqiYXM,Kvq]&q,Rk3ma۶ KNJO72;W]ٶD-+
+aMMM{:S
+R(NKgou/Rζ4Mg˖-ضlJGjPlI)l79_%Ј-B[9RRvzb#FPv8=' ]խZ]sqps|UŊRFHT79|BF8c}FΣbRCvۺjo{)	D )Oiifw<p1^}0L*HB@uu5\{ׯG}R۶|9B~Қҽ&P("x</)E Gt4M۶ظqCƲsJr ||(@`Q6gϹ_u=PzHϣoqg"-[	 X+~t
+ȳ>5cb$	+vۺb@ՌS0iaZ:!e|$pWK8ׯq2S0U ]wJ#AdvM
+Bѩ:t({N9ǥ{rq,\e @ںZj8a׻lU
+@W< YE+ 8rPkF>])?k;>~{hVT݄.;C3$/P@ݟ=	p~kErľ~J-eaNn88N"҄	7g͡tWSt}]Xh[VVP0~t[hBP(&}W^(LG!DH/--M躎@P\Tq_`FVE`7Q#<@g|b݊cC x![*&bZ&s:sBs&Q eh"?!tx
+E8b*NQT$-Ȟf"qek|+BEeѢEv:c?UA;OpH4ܜ|]sqjcR !zĻ^x
+
+#A>"|ٹwT
+WG9?ReVK+ednwUVhZUU_|ec!elPvH7?3/Q* x*[s.]ޗRۺX;s4V\."Ī?UჯǦtÛx^fOľ}6Z*]j*R /~-L<7k:Bxu#	_Hhފ蚎m[	|hp@$Aya~;GO;ڭ)%0q
+@G"QiӨ8Fhɟ|iYR(;t̾Kcٲ-:0EEMV4_pnY9N9Lo%2r C/)[CP9{XtN,/1cW+CqWX}L}#˶k5zEQyf^jj~?uuudҤIf߻#'2FWEP>PC(v;m0a}aڵٓK/ѣGӟ{ｷS]ƹbf,ycol<<-[6Sx    IDATOPTT7qt]8·S:
+^Bp=p'^{KeP(Gnl7.PCmm-eeep{sHv[
+lB]y0Ĳ&sLZ:JMzR=)%7v.e,}'	;
+g@?>^Ō	ðU.0M3vtvĎo9+sS5WP;篥棏>On<l0xf}w%_`_8묳2/_M=R#O9̸f)|ZO>M~g5kg}6Vbܸq̟?
+Ǳu]ǶF>SW$#F@\%7o&RROMM-<_+cա2&N>75yUd_M(b̘1G}5!c&~Ǳ|d;B&9QF5IkR(eeYP9 v+>Yf>R20k8D 9=wGJM?D>ݟS͟Ò
+>Jx1%W t.lf'H~~~96nܘ3yd*/^̄	,R>HԔ8,~}_Q [9?n\~駟駟_WɓYt)Ǐ'3<2ضC#f(jΛ7;]3 QBJ(,(4MD}㸥PPPSKPĪ(EAiJ#&o5V ~۶BPTTi9NKjJOs0#^@GDRrۛqG,[s}1@3n[kXU3deYߟ޻ɶ>mMh4͛YrenyJGJ)[c[ux߳xؖea>Ϩns޵2e
+x ض9묳(,,dΜ9n]ױ,܉E!|0>8Xkoڴ`0BeiݽhusV}YPd/Wv~UEFR+#ezUܱ斺l'fY6n`&Zl'@`YYYVκ(Ww	(o/×h|b_ǡ]e~|5ڟP`ǢsհX6l&b۬!Q[[˗KX?\pAX nذ!1l]yOu]ǒ%K;vli6}@ebuӌHNW@ݛ޽{7~Gw깪Vt20Xr%SLI+w
+!2QmXJ(':R)xMܖ{RzgDeܽj>/֘ۏ?18YQb1Hh,ׁH)_piXdV=@17Q+س).@U،"Hv,Y/vܐ+|clܴM[aÆ&]
+n5k?(RJθr*z>U;lS	^~n/7p!$/!5554ݖJL6BaPbBWǶ3|9-bM F²,׹kjjС̽?G8y ȵaFɗĭ	Չ;	evl()*e8c9c9#|:3}ǳi&-[s;cnA	4*YFmF=x$X4kB{Ѩ[ *FՖE^^*@P(8`Öh7!իWRX,Y⶞u?믿	ERr;rS1lO먕kwK$SU{@χ ࿞ʽGwgkaɒ%<c*_Mo*[pLҾ5*
+0˸@4e˖-BB$H8	7ضoڸqcC>BP(.,0tP:h.j8Ưk>c6l\^ϕ> 9l8p8̾HMϰbu#;1]u5ٞ{9zO9D se:SO~[ɲOܗILV	ǧ
+4)pWG}O~3.b#$	$gr4daQV(eYD"# ~jkk4ɜ؃~%F3ҫvG `_鉞O!9"m hH^pG0EOPQMKձ#4{mذavaR__TA~gy	̞=;~]eL/,?B	) :~lp>v4qIʤLxbicϼyeڴ̨Wɲ,ugXP(#55nWχ/Ǳך6SWWG~~~9C_>}tjcAJɷO\8V}"0ey>S'Il1'Yb o۶)`֬Y<3hF$!
+8]woVFׯ ]h4J("p77~:>l0 7Ա\W3R2\b 214ɟL]ד9^ 6BtRzӐbN{JP(.8[:B4ƊMZ~^x~7Ļ?:)	#G"DQ[M7`ŧy74kYL5%Seڍx:`E* K֮]E]7yyyq
+QI)ꪫxꩧ xׯw\~t>{$*i&`ITE|[nG+Bp܅O	sVΦvH6;Y)@zAq[9s&izA߾}?~|Xd{vsP(
+,^"\C5ۚ9y(UX= &RoU/:Flu ]OܗycVڑ ɛL2~ߪK"N<2]t5<?o5yW;，x8\~;t%26ÇW^N`j{Ypc쿹ϥeyp'&πF%ߨJHBiZMm	}rJKKD[`YmcFNW_
+B	-3=&t
+]YXbE`F>h DogoR.0g"b$%>|d?h׺'ϛ7W_}k={w8Jej1BJPB֓ﾛN;{[Es n\sVFj[;8	`.χm(趜m}#GL߸ϔL*aUUUT2ҕdL
+B~&z]דbR$bz-~|iwĈ|>bXsr oog܆/ۡaYN"<Ibuig:'x"Zc1w܌֔ƐIp:s (8{#gĈ<s̘17|[(sn_Z|G>;s}I#PFHi'},`غu+eeeH8]Eٳgs3qDձBP(0k֬0m0,+ٝg&EE%q7oL<'deS(j0Um/t=(o~irhhNi;*xS^o{ｷuYr%Çdw4(E( h+3-g?ӟUww&"c)#4||n(iM}a;ZT
+kF^^=z͙t4Md\OBa(--2\P()//ѯ_
+6:۞4MKvB"݉	ǎp7 >V/3X?>W  h;;{a֬Y~iϦ<СCYz|;1l*\n~%!v1?OLV.ùw}έg-E7aV8!(zR`2NVqH{DD\gO?eY躻	ICJ'rxr~T!T(
+ŞPd}85	\pNcnf0߫'x>!	gum0LcCc߰to8:c!;w.}Ylƶf9sf>GJիk lr<NR¶wgZJSO=Ņ^ȣ>ڭZN9 kR3(*FlٲC"Ĳlt]k`8N3իĳf#qEiZ"%A B4M2GҤN#KIP PQ:1fN~=y3!6a1'upho?CXhQמy㎔VK3oQU}Ny-a~ )`m<va|J[ȍ=|S&P9 0ˣWY#oEkD(((`ժU5B"x5L"2 ߼y*DVBPtM~r߶m~fa$<ȝl6n؜Jk@,+&" wX)9POO?-|N>X95l%-aO֭[l4M^yzծ/ڸ?}3!Ew1ov(BV\itA\ves=*`i`<<ŔM˾ZoR^x۷3bĈr+RRPP~'<m[|F#٭%Vc$ 2|s<xpŠ
+W(躞lM>9ǡYVVGJ!ڞS.I*0`a~rgv)<eh;u\n> ݁K.$9vw+Y}<"v|h>etuee 
+%5V<꺎eY!0M!C&ZɄizVjR(.eYUlR wHzO$ܿ~ ۶s
+Pi]>C{pQC}f6)ZI%yyB!lJc\_ I:4q^zٳg71(ɧ,&JzԠH)mWWLN5'xN ]	[c&o,h\xG:Y9'.]1P(O: vUK^˲,ڴ^-onHF5yn|G-~
+BBLY
+\Mcy~y=ʅX4xt4~jptjx;@|Iz!l-	BP[[˜9Wa&B>7u9۶),,:P(
+EפH$ÄTUU5y@  q2X5k-@9 )}.tdڍ@Q.d#E>uuwJtĕ`p7|*)yA+嘳'`b5Ul!M
+Z4I_溺:˓ƿg[E8\kTTT d@uN8*
+k2` +)x&[ۍ4k3ߛ C jABp瓟QM"ӲA8/~.I
+EG]Wnp#?Y
+^Mo߾p=[)c֟`2Y1M6FNKo,8fabQҥKضg!bMzB+
+2p@JKK	Y;'2||i&k9rf 
+sm=sa?x&M&N9C]]5յHiss̔46wJRH ½뎀w}k[ґ,vZi{^׫.=!}j/m.e8UUUXC6I@ ֭[)++K8,,3"%@@+
+Ewcr?q~oy/-3<CEE@ ghU{z:&Fk={֭[ĉ[IpRL8s	 b8{g5e^yU{.M/ !	 	TQW. UA,\P]".JUBQ H/ɴk2̜L$_>9ZZYli?B
+? AF9Ô)SxWvRPלΞrp+j3	A0EPIĘF87nEVCRi ,3Jlmd?{{_&H AAX*lMٽxeYѾeYAÇ/~|۶+$
+,̇(7.]LSO=w>`VW8W]Z:64I$lN75g\ao `8#͂?Aߪ!2w\.2>]M?ㄖ(w֥	)E:CH$F	W_}|Uu)CP[[˄	p]Ӵ0!3<aĉضV	شiaDIi& ,iӦ
+//YOyrpq;A}}}ԙ3g2|~l6˾˞{Y>|8?|϶X444(}k/8v9=EcRMBH?xDɷ֌7unuI+Ws9N|4$g"^Z,!aR[[_7LtTh|.a\e>gum7edɒ$	$H`kƲe˶f ],YRM_,^t:]wܹs}KrJ&OLkkjr6m/Я#-/dڵ]o/ˀB;%>5l)m_5ġ,jy=#QwK.ޏ4
+dIbՍCJɨQgʔ)B/s!22yz/Y<wMB;}S)i( za!ynPM0RT1 B[Ec[[ֲ{DY$H 	۶,4I**ԆC7nq,%XӧG{vN~z>p~L\@ww7W_}5./L&ìYtϛnwߝfǡc6< ,,ZSINb}nYPܺ	@y7sR S<ܘ' E%}tTj*,XٳMHk͋/G?]*9v	qd-Ҿior
+z(]s5q}M+V\Emmm4w,f[bJRT9Q'H Ԑ,U@I\,&'BF}/֭[GWWWt mݸ{=z4 ߸=z4ͣ3fprW={6ƍcƌ;?0*{LIcXhÐE6]	uK H~pQb3'&Eb=}Q&L/H:NZ	4<ðZEU9dIRxs1MRϗ    IDAT+@ERLdmԴ	$H iFm]d2>;n6b:-Z>SE}5/H^^h_×[▱q:]ճ(2E.к:{WȻi=,$d"
+_yZPqE`'H:i֚_?>L`H{@*-\VY2iib*t?L&_XJ
+B
+Lr#+
+ܶhŊ^:!	$؅x7_yWGUǖ/&t+e]FssvB{G( BO<̞=}ݗVXr@CH>=<co9SN?{;	w")nްMϯ绁'H )Hk~ȱRBsOω4Oʼm휾5j$JҋR*־ t^V2qkWB
+JEn!#laGquh-"ئ\.GmmmlK A|}`3"ﶾM;g<B)?$yFInw
+OP(SL[o}[[xp	hwK8 9w.) q~Lf  zt+W.8Ku4v[-@ZO}Sg$F/qA$4)o۵/nG*}p>ɕ4B	d$[*Zkd28'H Nt:M6Ųma(R3# v 555qxo&MgĈ[}#<;'x!ڙ:}߃Ao)D HWiS/'VovސtTq477Gu$&/ePxǆR)ɐ
+<3Tk˗cfPpXww7zdM	$H`8QjPUc=6JT[.Qfwjm!e<BEPl+dyCK*qLhkkc̙'@!3(P,RCۣ<EXDWd׿E粉'	6M7g2͚S(hmmex{	$H'ݖJ ae˖U=TRgY\%c;w%"?s1c2)Wi՞ E{^ D|	!Xr%7|3BH T*G5w'aض<<\r	rU܇U1֌=:RhJoue2N?tƎ[)A	|hjj!RlaF/=Uω3gdΜ9H)4D7w2=XLu _%hjO "+%@;l_ve{uQ<\wu|	`5kz*?5?N:75=NK/JiW*Plg>~_}JOT; 36i~ A;1ƏϨQ0Ms)!嗤5jT=*o(iƢEBlWN (,]_W(->}:GfjWBan<@RTo=WRVzH
+)\dH`Ckg<>N;4fΜRTbL0?{l^xsw`~_##5k׮4R\.5ttl樣b̘1d2pkR6 0)en$L A]kZ("`
+ w/q*߶nݺ]
+`Xr%v8ӦMcٲetwwprWh"N>AXkO<A}}=w}7>(RRļyvJ!7|;~Vҹa{U	 ޔOh׼ A5塇`I̞={ｗ.蚖ɓ^aq=pgF,CBn	&fM:Fo<>3$H @(ˑ>Zkf̘I^l6CC6nQ |qRg{#e˖qGfyPu/IԦ߻.muNky=c %@/%H֚n!r7KC>G<amXpbMgQoYfW3Wr'b0  3z{=7!ࢋ.矧P|_9>h[lޡjڟTܥ9}5}B=[5#4;ӑƆ}ӿCy4}ߧ"i>T[@Zb>yUn[lCQ;tN!|=v)VA&%ouwߺϛmR*r㯔is2IӑBzÆ<L,YR]hqz@y"i۴.?8KZ3qDrG1Cay>Oq뭷n{y'4sI.sݫn~'_ZO&w;jN>9--.&k!ѻ56c6=Egg'9PʍJ{S:n^})Ȟ{m[<(OaҐ8Nqd3(Ð0 aX$LkZM?m~!$iF*
+чkbm]+*5vr5"v)m]Dj]Q׿tN.-ӖCU/p>ʴ˂{1iac= ~/Ie[d?mKPkS(&Rjt!t-~ ã&z[qߡ#cP\'{{iNC4='l[xrJ3:ަ] -{gEǷC%Au9oIt{ASm6]Z#^xl`}PRGaT@{h0*Y//7'YN<$fL;eL6F凲!>R$vw&a+nҗ{^:;;8s뭷2~x-[(256/dI#H-A5<͡exy@'H4_a-yLwr3f/ K"A'6Xڌ27!>w
+#G\v1_Q%(& e(4BJޣX<B\¶L{
+81^I+	nm7[[@i0нH= # PWЕՏEh!T#Gᑄ2AxN^6t\ժW-Dpϸ'Hm -Si	&zzя	w pS	PQ[G &DqO">N{к ]-"MZѳuL?;ҭ*hg}3'+zE	>3KHݯziSR}S"E@jwr+,}5d~PǛ?i 0޲P*Jب$ϵm4"vKI5
+rG[s۶6m7g;<n f̘AOO77qFu_GQ-+ MMMqK
+swl9䓹vO yj>2r*cc0M-	$xkS' :Ę!瞋{tww===>scm$PPHn4z5\)E&fi>|X	@ْd%+Eq ͂a/ȥ?3B䈟#;}t%C]DHD{F)Y|Oј^hU)#P=&{0/OA8|!D @" &]Bƞ/1J}o[!z="ODt ,Dڷ
+P[/@/}
+!6cd\# G%H$JDH	$ޛ~^HK} 9K0R-3RuM_#"Wϊ84N,}M
+_ZWV$jBaWO$3R1-	
+c-9`y֭8 (KddOqX[|-\ϫPW^RwZH\K.Aᡵ⮻}DK$LmbxX$'rXf.އQ1DϼWk.r%@%˲$.3bn!;RH&Sm[L0<0&<ŗ^G^WuZ[~F)
+%u]4J)rֆy!\.G*reY|#F$H\*̟??lZ)jkkٴiRN8/|f޼yy䑴%=y֯cђL0&:::ؼy3Xň#Xb);Egg'tvۍ˗p]c&QMNulhl}&VZڵkŶm<V'ʪU 3zFkk+BV,ˤ˲d2xR
+!v*Œ%Khii,;::7n<BbITR١\]۰m<LRD6O\SSaHlQJqc5596o`VS"JCMMM446yslذ&,b굴N.7o2);aI)OڔRM}]-RLq5%J6)E-fjLڋ|Lʲf3u*f2L1XE&%)m5`͚6Z[(s LeJ]_DRv2)böǷ{,`钥L;eG!@H_ZV
+m=4L)ǜ8(%t\&:tr@J!]jj0TB tO|t6v]6wuIIu]j32e/H6M6lDkSh%8LO	M鏃ȋ0Li*Eʶ{xA(^4󘄊D	J%jI!_>qk<ϧ0MF9ex0%6}iBsa[q *M@i7
+2$DRH	bTF)aHiDBzfih
+/(*C12qu0
+RӐxʯ2S.;QJJ@W@T@IY2<iXx^&1$x*TjjBN\{o¿@}:t(|!騿Cy- EonaҬzm#}DVzhj~7& 	H/sow+owuV\ƍ7@pI'uԽNa%!{/\`ec[t<NΏLӔe2v*rt])%iL/PZ!\L$_#$e%,<_H9s>Ρy4xZR
+۴hkuS6u8eZN좔\6bT:1RJJ2mQv\63sR MݛՅƆz<\5kײnAKXB)EC}=r==yr59@q,eR,|Aɺu6l7"R8+ J%b@uilhˠzI&'\6ZwkT*Q.q]a#Zym"ƌS.S,H60оG!rL]}=qL4)J%2tWh8%::;ikkcԨQE6%&ev:I3ׯ9~L<ϋ_7oTʿeYxG.e5477c](aZ&aR,I2Q>?Gm$yYv-MMeY\us=+JKKL!bџ)<=z4K.Sˑf)RRYI0M7mL6G9/MMdsYظ2ٰ~=v*E*bD\X,2jH^|%ZZ[fk1cXv&Lc֭bH'O&a7˴$AH+0r(\͌;MmdӬ]9b$!)pL:;:)
+diHuu
+ҤR6R,M&G:¶S((y GE:KaR(wǴJXE\s]Nt:Ccc_[ȑ#)lڴޛv\esr\T*iB~GG---hl]Xņ>|8BjjjxW<y2H!q\rٟT
+˲X~l˗1|rlKzzzhnnfӦMK6e͌5s2vH)fem7b&|lˢ;Buihg466r6˲RӃix4i/,W2nب8]fL[FLӢS)ET"N.eIKK^yɟőG%KM&a}9q bB@sS3himEh%DgW'eSSSRo+d3D5hmm:l_Vp$A,_-Z`U žEGyndaRV۪Xz#Z4y[Ao-<Ϸ.|VD>HCƬ3ICxK#!pӲzhgo,d?A%=ax'Խ}Զ Q1wȧ8td Fi'2}aHT hJD94
+|Ka>>h7hG6}=EHTZ	Ooq 3vBc*\AjR @H?v=iʘSFw++Om]]|TҷmҷZkn:?11/u@;$-*ȭ"%MAF,qf~?t)J!|aK^ 7cຮ/;/)J~ˀC_k2?/Lk/(	!B <3 H=ŐA&>e׏vKe0?ĐzYTB)iP.2ip=Ųm)c3-?!|rٟr\K)\i(4`hJ>C:ŎBd`UWb;ȭ< (,+zh]1|%(Xv"9eY
+lDbl6o_WІOxaqŗi(DeؖR྾],˦
+!:T` 0xJ 5_{VЀ9>C*b&& Z3)SX/fRQRn!,E:G:)0,?O{ȥs8uT.I޹y3tvwSA
+p&yaC])UQoq'?Zj*/U?_;＝mSIA=	 BhQV.s{M:iE\hZmEPCBR/ IH_6SQJ1(3cbځkǅ)UCwT*5]jl<|w6.wKshnC(N5*&aq<O+<lq=    IDAT܇tz,@V$h)'A
+xBM!),0$ʐ(J{80VhO!<D{O@%0E:u|}NXH$SZe@i?L
+!+ 6WJJ=r/H'߽VJx@y DhP_	ixe@b]Bxe<vMK?)a&a1PA{|F"u Dr}k0&(WCP%ZaYmZ -yHLOD(i"1mXf
+qJK4&BgQ@)@K0SHif
+H0Q
+LZ&%DJ6 PA!DR8i^Z ,hӟ_ڐ`Hh R\O4:l4}&0DImXxJHR5訏}ŀ(NsD&ZJa"&JK<i)%e\v*KTtl&(+YL,kT)_R+ebJ"چ!1sն\'X{%e4MLSk%e?$D0`Jd|Ez"[+JjY24TL:Ja $XRb 0 2@	N|Rk?Q)ͤ|=L4WݑԊ`JT~A45(E&ec
+PCC&i)1]Kk4`*44+HѬx 'w}wD7|33gΌ_/>\pÇ"b6[|'_bnn
+<yTm'Hӿ9hiiI<vQ06U8yG;ipG5)B)p/SRGMM7ć>!jôp.U
+X0YW>9<Lw߀z\<}ʼjP4̷rlRT--YbXDY*ooK+W*U(蛹+WvZ<}EȒ*gs 4?Zweݯz|tn}#ZlM8䙕m?~?++%]'tE.*R.vN-Ӷ%uL~e?gG-aoj]u}GR4qu`YOehCUIHUI
+N:uo a p%tXbVI Danh[SzI)#/ܣrQ%cH?U!;]w1	7|3db/;n.@}eh)ꉯr8k9;$xi|+}<CINoI)]ڡ>bS,xy-
+z(4Rb
+֮]$2/_opJe\?s8qbpbcsݷjU
+
+Ğ2v/fD}EdW{u"ʞ;X߾AyFTޣu;]Eۆ*+'>Oc3o/QDU^jX	/Ph=sNH_ڮpg`**<5	ӧW<jmas_*rO_ip1r_Mq֮-ۚ=?muuui??l0.l,}h?Gsέ DưLॗ^'s#_)?GYo4g+?Cr'O|BfW-1`tظK
+%M5ns'HWgŊ^$KMo477G1qo X*r:nлGb~Ĉ\?_XA-C<m5'O&E;RRTM͓ VP>}x@D	<&t[UoǜJ;'Nd=3 xi\{oʡ]AsqBIAW!ϗeʠwwB!IV] vm va駟fĈCRvկVafv^'@gМ}(@	ށNٜz꩜uY<I$n{I(FF|4M:.6烌FLQҽP)穫u4Hs'8ߣXA6){~</*!&z']؎&x{ҧ$C^n}n/PJG| Gž؞ xxcJ(b~}0$H#y<+ǯ`6y{ӆaD{	 -$R6?nHM\;JV`~?s8ù[윀/ISS.CNK9zpObO9YE$xc7x#˗/gٲe	`%!텉 CP--wy\}|7R(Euý#z$կyOseaY6F0(*N IwàX,F"
+rLOOOE2pNŨ@H!=%xT0*s0(}aq=<
+CzR"lwwwهs BפO3j(^ut	֬Y~y'g:Ke6iYU3vXvw:@_~{:fذa444l"i&.]q7 %H"aSN駟N:%v({0C?GqW_}5#F`ŊQd˭T&Vfĥ<xM7Tψag67x	zzz*=Wn_HRCpb#<?΃>)ض̙3[oﾓR)O4鴅i<'WJj ]]gW?]7b캜sCHgR\kYzUqӟĢE"Za|s;===twwWۇervkIɲ&$JEe3R(Oq/ȑ8G3n(::ڑB[5a\}A2!!tR?L,J*~RrJ#Aw@v-xb-Z4d7	̘1vu$H))
+\{\q77\Ӧȑ#pe1<Eׄ	_'̨#_~߰qDN\/rw[ׅ~r)~|ߌ]6g̙̚5ϝr2:/φ:ڹvm%* "=tt#{tuu74.\Xq,&s,ƫʕ+#ڸ.??rRFCBz*?r38w>tvtd3Q( B ={6?6lإ ?|L>xl' i$ vw}7sw}7Fbʔ)I$xۅtEݡ8J-3nܸ {({'e*[eQ(شiSW?LVѶiB 2LdI-,Y'|_y%_h<75o,|%^^zq.V.^GۦK̚^u:^k(֭[τ{?o7g~@.cXP[2"9zh-\DCM-J+~tHgQv(4eY!g
+mq}SO-,$H}`>֯_aJ<̳,ׄW[IP,ɤ=e
+N?),
+4iQ-	@CCbfvܥX-unsΝ̙3_14}1wsw<w +$H?_/"`%$1Gwh`\te<Zj)ҁB(YYh9C<J)f̘͛;~<2`oҶ	4ޟJHR2['zodkjHפAc&ä&n:Yx%Z+N7)ɴi{ˡa=LฏGƆ&/կ{43˯, $4m!oG{?˴}Kp
+Am_Ǽg(<s76 <hou|gpߡD;破DJ&BxkHb)[ BG%#PGGGmrw)%Fwwl
+M MÇ'ɠ{.3
+K,SOeΜ9q\s59+\.)+8< 3I&qM7<ZӥKLצg^xoJ'U $x`UO:⢋.bԩIG%xc6555г8`:?w,\s5;6r4d\q)Jc9&ڇ
+O|7ֶ{M01\
+;7Vʫ1m:tS>iE0-:](H*J>|>Ӹ[Z<B떰,<z/z&NDX|Le6|>՟cQ_W믿>p<3yl6K6-Bs{lظg6nw׭*r.C#cg?
+!\K}JHOf	({ߡ4-۶ 6FOh9C</n3)k~{OESs6c~I*/Lgg'l6R.e q^ȨQhiiEqGsiqqUU ąrG_}k\z12o+X"'H֚ٳgs7P*'[NcByfÇrA8nEW>UW]++={6K0*0_<9's{}&
+y:0,CZ;LW$$HVY1ct\`'
+YӒ]}ж5\r޹(V]=ݬ^uH&vڢX0_P(Nv؇x8G1~h?XE&eתT*3}t-ZȝwŇ0e0vHF4+XƹgGSkē>c1x~?@k0xd%B M\LCC=t't";6aH=0}Hz@`&MMMcǎ媫<>9bS4@]]G?JKKvw@:fĉaż|;aΜ9d٨j@<i0a;ƍc~Y(Zk~I9	v9p'ssW{&-$htfAF˲Qcڴ[aʔ)q"i,!q+o5ь;f]0m
+0(٪JZ%x+A6|wcj6OnZ&M̒e˸sB/Z3a"+bgG'^Vx+:8@pQGb
+$L:CwO'֮c6s,ɓ'dk8q"a&Oԩ{?@.dl[Hپrv<M-pomr\#%s-8
+i1eh_pqC;Їx0
+t:ڇd0fX{|;/|/i<Тk9&JEo>˪>0fRaw0|rD	 %vm<S<3Do^gbLӤ0-OZ4i#"7ae8(;)$ZIs@ Rv[555dc<SS.\ysS A]m|͒/q߽G*E6}̟7쐲{)i1v(RʤSs'uk6,$
+Fq Vt*+\֬Xb3?k;z_/Q=tvtb?<iBap淿eiRؾ'*gvJE(G?r;qCh%<<#t/2B1_0uiz) bwMMMT^p{X`ܸq |ecz行?kr1pꩧn0#FDX$H&r)\qZ*oZFZR	|2Ʊy!FT5 T(ZBP0iS췾xQJQ*Kb)̝;:͛OS|yG"4X9®k6iĘ֚~>ꗿB:d==ؗ;ﺍ[n+{Mi4&9)Nmmcfٰ~mAHk֓0MbH}c-Z+^Qog}6/^=ǟ:Q$Fh+O(塔ƨ3Я E}p~{aR h;ZsA1o<~E_ve<uQ[ iYfַ RB	$x׮߸yꩧ,R*EF:m! |E@PaϢ('?x+h!B28V_|1cƌdW~C|A?LO$d,KxBBT:J̞=Ӳ~?A>xͣ=΍=O_:G{]|)xi[P~RL?
+XIss3cǎ\ǧ>u"3e2y_ҩRvbذ23wsC; 殻믿1axN$ؾmLsz?Ra!0"qܹsz!3::?=ϜU׎}	իWcYV	$xW2BN<D~ܜtJm%}<y2aUZ hӷVJ^O
+S(ʤq⬳bSWW(8Ek9' k࿅#I͍հʹwv~`>Տ렽C+]Z;xo ۶7o_{'}ݶgq?fJ|hÆqRx$H]$ϼxtu;Ύ3喽w{I/$ 	1tU ]U4)OEP TP!ݔ);w[|u_w3gN}NUUoF@!6h\麎+%H]7~@!fB^ M<à>qڈ'J~\Pz BlL@먺/]c5{G:ߡq{C?7O׶o`]RT;߅?ٵ솆ZZZ¦@ wo1c]"DxGPTTzL&̙35,ARhR).ߎe\;WU4LJKKI]T{.L&pWbd6څ} c{>UWWp ; l2B% |;{Q:˲j\E^{qsdɒC٬<tV6*    IDAT>pǆf!qPJat@0fi@	hCх8۱L >0RQC"D`6YuttlfX,F,dʖP Gy!Cb
+ .b~i n\瞻ֲ Fx7ygyj0D!6)SsLSah|ض]9iBgM0	&9sl4b.D!Bl}"H X1cFrd Hx|'d2 >l: xW˘<y2=P\|9?O,+$,BE
+LSN	5!\UUUqL _ZaA`X,̛:\.C0}ޣh!B(]r_̞=ٳg_cB7
+o7b,0"VRT}w`ժU(<xp~Ypဵ!B`=?q)D:sidO4WJm{PRRaauUϽ3C$ϕ
+*PdY\ݤhC@/jY ӟ(--sow'|2/ӧO!Blivas9@3D́?,5>2~|iKqN:ivTd<JcClOGRnQ.6kD"BlI_`aF7
+_'8p$4
+)}{'3f&Ld>!BF.[o5\B1 	l\&)|{R U }d
+Ѻ9唓喛4n$Ħ1;@rX	B :x.!YǲkZBxe9ip]3秉q,r0BBJM	B	x)4 WZ蚆˲MוzJL-̙Ā
+z~arͲ`p(!Ε:BpGs1cƌpq"6E]Z>B:kEXz+`zKM 
+(.U7RPȆe Dh
+GRvoC$I,X_x~
+St:zu>LnhD>|c6G}ka+Gdqcw>~iF:{!T+~C}Qt 
+)
+)'p)oemO
+4kN)Jƌ|!Bb1uTnv?Pw#oj.%TTT~-P|Ʃ=ԥS<tRr9+dZBlrRcq**yo=KJޟ7ts2
+v(5_7fS&i'L8¥KqGy3!L0qd$]"8ԮqcFѣGזģqm8.)4DiJ9A@Y8Bl.Hicl$LM8Du]ǬY֚N0D!6'G?
+̶`:?яCw=@h 8w 4CӐJy]cx Քy<`ۖW ŋ(+.( bDTc>iuuudn6F؊_\ΝˎvfM~C[ǜijgp7Kghmo@tECFeu̚5<GJe	V4a)f&Ik:Q3vۍ8O)PpYm2v
+RXk,/c-L[h]
+ 6ÍwCO/̙3mz'C9?y&Ls]:/a#u@>юMӱl/WшIaYa"(%4DWҒ)lBMFiJ+>qk'6K+׏7m&8n5vyZu]FImm-V5𭣾xdI^~ov,,̈KV>PV^СC#c[,_}ۓ6/I'Q3d(mhr6_ģ{˰$A1W7"-o  <ÛpLkӈ v0Mok\}!HuD pge	 xoV>3ϟ7@SSwu---}݌;kzrzʁ5\ot:itttO"DX㚦qgrr׆ z#Ja&cсJgE^ xtL3'2bƌZgsE:#k[24:ʊr^yU믾!ȼ?A۶Ǧ;cښڊ?^|m'lKYI9G` ;ȪUdvxL6s?KUUÇ~jXt	w涛lVvq<q3_}3w]{*H***4( hDz^Qi|'N\'\`q ` ?:z!~߱d[Y`=z+/C*bpc"Ė!{r
+>`(_11RJd3YZ[[&볿 Ш,S <AJ->|gqA{Hƍz%[|SQ4goek9M QHB_`]vj
+Q?<Qd[%՞PSQ˖q'r~G|ȝ3Æ?q<b*s/N~N6c3lh͌?믽:6RhB eGiFˈac;.$gYDL>2tjoo(uy)))$?A ,9뮻/_N]]1l0=2òaڂ9[oų>!B`&53jP}G]RiZ#lbp]7v>
+u6lH%q]/"HU{
+
+mqޟ2
+۱{z<?w_UޮS<{ J"(()(K1zH̌D"Af,o2lP^^I:ʥW?2bAJ%egR=r?Gue%fǀtttNgLbȡX@&%je-RW9sJ-e~5ӆ<p\׾=~YZXZgt[uVvQ]4#\uU?k~S~_du]Z[[7ʘD" `3<?3f p'|r> 0h 3O.G7pÆ_!Blk>Å^
+1vЂyiF6uiǇO1\#2f`&=wS.\J4QƤ{RZY#2]iYCaeӁ{i
+	!d2]2(Hmﮔqw!QS.t	jl! SJaYVpζm~۶zץB~ud2A{w~uf<'Ȼ??dr9
+et)V>˲Yti¶)\Ut]c9?+<d믿
+RVt]Ga3S qCGPY1ںZc2\eMә?o	s>M)nuW!˲144r,ys Ns>/>X,f~:	XV׵q]#Ht9{c̲rC)}#L\8V<6m*}^Yelr: ܜXlU8DJ[)ms.\_*>\W@pݮuY	lS%۶kSek;(}p,;n%plJOmc[ux0A3?$L0SN>w&+Pʏ/;x/]?~³7)4 >7(D/u9餓(**oOcw_D3{͏~#4G}tHKbDQQ]vv\rI1!ata2.<L'\\3g駋;-"^^IEY9-5"AEY)t	v䣏> OQY^ɽC9t&MYYTUUJBF1t:eYR)FSSd4illMVUUua
+{5MCu ގiD"Lw2$`YLr%%%4558@fTVVbL&hX,0RJ,崵ǉD"A`T*"֬YCyyy_z"f_˗SYYIqq1;$@H"4 6BDEEEAuu5fyy9L&={6[mUP~"mH$pM&+`6m3zhR#JH$:!ͼmqlPFYY\.7'N}u2Z
+QVVF2[n"Mx2ɧ岜tI9H$­[o͔)S8SD5.]ĠZ}}=ÆCJOR[&Sʒ%Km;?uDP`&O>s~ΤI~1r@bkLѼkxi;N[P/G𭑄B<ϻ,;C,0<aF`"(GD˳5`yl=f`A?WRlF0&Dhi޷	AA V߅H$d;Y)r4EEEO;nz~L.izi"%yWGIk%=t4Ѕe+2"^ٚ-1Lu*E,nb&mmӌ3b([Ģq>qr
+'Nb0LihXر[Ẁ} @w[K;/2dvqǵ^石d;͆QJr;˾^x㍼<3~!"D-=ܓێc9'x"l)|w	8C:4ќx1Tɓwڅ-ƶsr6lt%%-$IR477ڑ9խbSIӼۜv4=e_|A4aضMQQ0쾖ײ@>a_qq1rH)@,#gcc#X, |t:M,#J0#dȐ!A}fΜo"XMl6K"Pu]'b
+D" LRSSʕ+I&Zvm8ضeYA2dfH6"xiq2hV\A@$!`m3tP4Hu]Y`C	+mmmD"@ȑ#?ˊ+H$`2rHZZZ3ftttdaXt)mr]ŋvY( :1x`^{6~) Vo<$Opgt2xJrwr_6nFʤ*D"V^ͅ^cqqq`1QVVe[A
+\2tPbΧsG: مꏐO#b$8chkkJJ@*I,a߂S__a5
+ZZ[HR$IVZᚚ0M5kPUU0iL&iii!HzjFR6RJ8exw`(--Od)cǍ㔔j*b|#0%>|8TWWyeQVVV[m_,f岴SRR[o)S0fb|'J9QWWoRx"f[v-V"Q^^NKK+MM!hhhNt:E*KTd2YAmimmav+VL$<dmm)/ uUVwкxf0s5».PUUM6aѢgw=cDL.]LuM\V60~6 '}$^zE3fl{'clRObʕ=pF;0eΝ`k_gرl6L6{9sfBmm-SNO>h4!GɃ>HII׎h+9蠃8CB
+2D[$'O>a֬Yy晡%װ}"״2M13.^nwNv>|f7g$fM=Lj\W`:;Nؑ뮽!>d*+4ﭞ. on9'Lڦr_?X[Z@4dY_(l,M$RiŋQkm0D#H&muk3M{5۶1M3rYxIgȿ}i;s,HWp-B8#˓q%DX,Ttr
+>nlZ˞STTܣàR,!~H;0Mt:M"APWC#C&aҥ,]>?ɓ3I&?FZ[[Ffz"H MMML0+WRVVF}}=TW{A&g͚p"JKKwimmEhޚюR\!JF`:mmmTVV2w\N4@G{;BD$8 him%oZ"(x0@o Jcl.MEE%)FCc#khnlfժULuBˑʋvG:S[^ .:,n6x Pݬ Fxiq}q%rkq7s3m4>j$ o&-bȑ{nСN~dѢE԰pB8#믿N}}=C9D[vaXf{.wyg(_32҅~@`ݿ}3wy睜{4+5@
+@joGDLG'/{,=<@Cjh`^_& /Fo]B^s>smv~Ck}jc096!Nڢ1˷^vݿFbb^}׳d½\OMh|'b1TAE7D]%G]Vun}:D`ke0{'OIKhӟ>譬@4)Wy'u>S"Q[oW^L,e:fX,SR_ʴSIƓE㔗PL^~e<Mr
+ӟ(**B)էtcbOBf[rG3sL?xϟaKǥ    IDATXEGGG  hkkcرR)9aF1m4Oĉw}1M>hd7}هޛc=/Ԩbsc=Ƶ^K&a$co5ѱ/5(y1pW(MErtCu%\zgyaBhrbOVFt_c?c0]uq}r{}im~Ko;*w2H]벾}9P&S@w{pW7ZO8+KtcYF}Eg:7Bt>}ױ?}:Kq]菀%dM!H{ת|z|ABO?˼y1id,YiXmFS 綥k:r?~C/x'D|eY7/Emm-}4gg'+!O?4^{-{77|3o_~9'Nap%sw.YO?رcYpaPA@?_|EHibqq׃|Gvm?~(@eYAP^xmن#Gn7sb tj.P*,ҕ l$e%e<)իWJ	07RVt֍IԮwr=]˻fyS]]uHupr
+oCkӖ[|㨋hFE $(s<	dQgkJ랻]w;'B"iKk@a;`'~)?_7l(՝viK =!Dwذa8å^gy:Əϧ~JMMDbI$ɴimݘ1c~8;|?ӼK*⮻gРA,Z?rf͚5\ֲJJJXpadիWb
+zBbsdu]g]ҥec
+n~,y%	%<_)t0"BH4!q\g엑J-ς !6<s)
+X{=.?̗wLH[rt93o{\ۼlJ\=wo*H{,<q@(o϶mYוtL3㶣z]DV	M4MGJ=ioW\qEEE=L8p pg0m4MÇJ(..f=|;`ٲeqƎM3fxbD"s=|̟?!C0s /<.ď+BJ)^u&MٳCKi, }5?@0KZ@n|I:\Vz2dX*!6%,&8.&=}F.zм 
+v1KQ7C:"buWItK&B O&]A(Pg&:x txtBՆuojRM8R`s)0_{3 t
+ <mky2/8aDIG/1z4mJ.)Pc_>4YuM7ѣ*eWJ1j(-RM7?|X,Ɲw7#<BII	D"H0hР~Y^^G}%\CBbc3a0{lvy^4T!Ƚ<A#$REބMal?ZKu'ӣgy(!bSxCpB!d7k /eF\30:Jif!!qgm[vxÈx/[z#5!1J)]]SJ0l -QB?Cy^+ۋ
+?^Zڦg[Pr[Q:Ouu~uY"^ǨRn&bpC9^{5LC!NCQ^^駟뺜p	z.{Ŋy[\p!B(dmf(L7k,jjj>|xhhuK>wdyGgfAp,ؔkR^˗s5?	rov\GYz~H^>L[[<a"gsN`)*?/^+0lH,;KԌqerLes?evax\p73n8}nioۼڼ0-d8߿^hooxiJr3Ng1y_ǿ\o9y^uN"'SOlС|GBbK4y?~|uђ x@Do@tL$L:$r=Ў;H,cSsr&ni'и[gy,+]ql>܋Z~1GqiaR~_/;>ƦF\z/[g?tXb1
+˖.gAC/l24%s9fɒE|6o ,#CG6%BonsВ(d~H&:>}˲6x<Y` lP˗y/+}ݙ9sf="V*3gp µu]ǲ,r9t]yf-X9qMm=5ȶ3DM3GZdsY4]F3xwǣ`Y`\+xSOR]57^z_Ț5暟p	'1q]LuU 55n /ϿC1|$MyF)AII:)()IRRR̼%hmm=ƶ-L`۱1u"ʛo)k|-juttleժUTTT{QF1sL1BYIAmm-/rqw܏hDmh4eY;hoGG̬龦id2"DMhsh;BcS#[m5HDG 4/@}}=&LƆ&zo2GQ"V[m:FKkSs̡I&brS,b)?rV +*hnnbUv3kG[\.>ϥsw.\x!D#/ݺY"+cKJJ6ʞQ]]M,0M- lW_
+BY3+p p Gy$79xxꩧKLMMMtI{.ĦߣHD{[;htkaUgP0He:c@GG
+41M㺿muP<qbn5cCi`m'^l6ͮ?SeϽx	`t6/X&<^ӌbF"Ddz'ͽ9ͦ:tlrbz+?2;vIJOd؈j+{/bEQ.]1G_{oŊyHgAvkCR~vڔz^;}aRRJV\IyP zܼC)ESSSpu]:ƌMօZjk֬aA!B1V.!fW^W^a\|<<~n?Cyc={B :Gqn?i*Ul+ q$򕷷7rrf}.`96QVQ4ő.R()m'Pl@:HEx1ԭXtm|=|?B&σ/cҋ(NpK""2P\|a.v-7)RJlF)	ᢔX(6R:AtxNn>YntyN&^y-Ny|KRA֧
+ik
+߻~?oC(=O=&d>y0HE mĊ{_
+3Iye~;Nn~{ʒXYW{gzE2xP x_:\!N#G*$guk.~<`.;<.Bti4MCWWO'~TƯup{\nGY6:]P"?_*}}Y%:UvO|.n>)l%^. ^< ׵uq\+X]W"X老FQQz]_1 "p!Xr%ir7SWWÃ1}t,f׿5ƍRJ>"ַm89C2=DAD<qضڂɵgCnqE{/'m}]=ܰ#p(%qDu4M	ǵ1uO뮛K駟SOPQQJ6棏>f'wwPܥkɏ=&J$Ry"S|NÕ
+]%І%:" PJ4CC e>{t)]4Mi`a'ȿzfںu4ݻND^	0C3(YyDhD>B5@i>.;祣sH׽>sĭsuR.Bah;j
+Ko^K0ioo_z#G\Lc*+m{}n[uRhWIvvXx1#D(ϤTW`4_~9oN.g҄cضM6`ie!P䤃BQ]UҥˈFΌ?7x3N?#d	э ?&S^s=HOTD	}jm ֏vZ%uk 6PxTo^ݭDqu\TB4=/w@C_~Dv؞q:H魑0g̨ol,$~_	 _&LQGE[[Gy$L}{L2%nc,XW^yWэ;_vi<3a0!d2=B8C*q|L2G:*V\N?('0b.袠~>VXYg?N";we;	BM3]nRj_wԈa$Ivy'E&>xʪ*J&%,A*Ԇau\WLh4is|Vl,L3&`Fd-@*Mdf>Dv>չe{ڠhD*3˲1QyfA2u0kht?%=!4+5vR
+t]CJ?DhE{'tMLS
+46tB)ᵵ	pvޙp={B[4quu 
+Eס	(,;K$3|V^ISs+Wb\h4Yl9~>wvmaYcbd29ƍ:EQ_@&;ʴSN=$tf 5k]t1#e3rŀQuuc5͍TyG
+]pywXWVo~ZP0"+ЄU чR_%Fl`D,|PA)N3WbR#%<ѣ)PZ/kMP\R	D !|gК47㾿̣!CxR^x*+u+2/UJ&:Rյ/]v
+ "訣+{I&1efΜ~ONGG Db>?G}4?t\soy馛zO&;_[na4551cƌx[[[nƅ^W\^{v{M|I&g뱣2t0CF7t4oʪJ$"|'\R\V'!e9rC$EI040@7t"";g۠GD"]GKQ5NZP*@wc] 5Ae)LSi7(WR5p<~t] ]0M=Bey;g`mt[]#_'<<gKj@z@(iWOH5c{fq]*TY='(;
+m[_i8fbA-X=zcGt d4t-yoM4IŹmݖ\.|0uTO\va9ē73#_scS7yF0bpjW4uaR,bt`b;D"\;СCy6+c *@{K XKėmXK7^u_-&-^ςSދE vP
+z!BֶqQBH
+E5;!Q8K/*vA2d((.)a]wǘq[1"<9"	ѿ|< |Bpaq73n8R̝;)S0}t N<D-[SO=.үrǏϣ>GZ3d۽/_]׹[8SIdh6DsꫯQ7of+ė# 7oD<3^w؆v@:-[[wƲ,mK,<4773nXJKX0\.(/J;=z4Xx<Nm]]>Çu|c,_oMÚF**m**+ԅhdҀ-b\ xbƏUXp;3jjr455Q\\B4%{0Xx1m3|p:::-J,+Gii).tRI&yfKfH&IR.qdҥ3!mmDQ :b^]N^iH$hhh0ZZZ(++MHR(b?˃pcNf}ܹ1"6A.cW.0,4T=R^^N.#:d蠬}+WRUU<4\zP0t^?ۖ$&3N7bҥH%I$??x*+L<dfܹL6H$[oM4"4݋F6e׿f̘13qļ8ASc3RB*"H2|viy }9mM&#7Ǖ5}3̺/,5Ȟv~V:	WD>CBcyu={z?_&rw.tΡ+z6WN硾MT{_*ft\BӍ|q!%hBgЅYd2\P.tV&N܉0ay晧ys11mi6$RJ!C1l
+)P!஻uO<m}GiiipC!@[wG8^RRW_墋."LrGƟ'̙ýKmm->n-Æ/; &~ _xVx0~ƨQ#ijjbcuCcShںZvmwVZԽrȤDQL@.mTW,4p1bRd92,E""(ksqS3h(v.C,q1MX<t],H$&6lT*EEe%,.rlJJJXfhƦFӠx<:ɤTWWxbꙃF"hA[{Hd"I:&IDrfq1uinnt~    IDATijjıDQ*5)%
+Gb14Dplǋ! A$t:M$AZ#,qYzUմ4RUUC[[tttL&IRaYYrH$!ڊ\.G<$֏toã*{Ϟ\IHH1P=UPx-VEks=O[W 
+x"sV(x+VA@.Adff&IBL]kk}W,F~~>_}UPz,ߡCV^Mǎu<СTX,_d:>l{Gzݶ	|Ǳ@-zrssspxlz\0?=_"ǵ0t3aбTQزetv<]'LC}]-a@2B96w/y8KJQ\\LCCPXXHj<ףNڹ+oڴ	[mm-hݻk޽_~%444P[[_#jkkI8Kaa!vSNضMjwҷo_n݊ñRhFrb=:.o/y=vTvl^U~xɥ\zi|tԉZlgߟdd2Aʲ0t>***ۧ/.XO>M7:K:eP6mknTWW5ˎ;89I]򨫫#?d2ܹ׵FMb8h~ViX)vN4$jAa444`6uuRԡpR_O0|Ksq.]PUUEm::ω6 =ӥKvM]ʺ䐛KQq۶m͛7ktBQQ1[Tq晧ѐ#Qϱt(*S¦Mٽk?Ƕyx<3Q* R'cȐ!rB!qm@o\uN;4V\.__r
+?o~Ô)S5j,`ܹՋЧO>3Bvn]Wҳ>C]}Ps2c;bQ[[CNQ_X,FMM-9n&FHmȡi1´06*<Hh88T3Fodt^h/-<]7UkB}jPUJqW;J/3>CzZy ;O@ھz?xKR7~yce5Ep]geex>{{8`$\'I4M*Cn}c@uLfx\uLwU#wOZD#Q0!8nu!aH$N0bx/Z	nh|oX6DcHTkA3>	V#b)i$m~	v,]1su}]]'Z4M36:~p쫯Si'\8 ۱sc)_5]u\RVxvߠm{iH&xO2ؖp`tpRq$y<q?0H&0M3<*u]q=6pt)fwjwq1eJu<tƳ,W?yI$Xzƍټy3$9910M3Lm۶Q\RaFmCi?g͚t%??M6wΈDTUm ͥh4}~_JBh@!N0Tp4nMĉ
+h_Ot#DK,	Zӧ^{-d24N$tB'M~AH$99~Wx<ɷNKq]D2m_gPU8=}&W54#Hը5FxNohz#hط)v0d]]Ձ达yD"@u4czoui W;NWWk^жlF׍pwR5Dxx{|䧂˶3?jD14mӂ]^e[DsjӌNJOF<hy躙Tw@<Ԫ6[ut_CfPAiÀ¡ϞT(ihA 8r~H:;{eu+>X,t0XԂ鈮LYD?pD8{xpOi߭C:8k8.&z5LI蚯P_\J;`RD"=ixfD	bGpS6:|'=nxMDl7pJKqlX$DuJu\WC5Qvq1v\w=xmQ\!긎ŢA7sL\]R fʟ 7tu/@خG aD('vsE,	p,!bD`8yIzA]_k%'õzKyYRDqpeӱ-۷yK5eeT}]ˠ"7^'6lX8n<%7ǭ!G 8<3gRPP@mmB38q"t
+*ָN7d4iӦ}ӧO.\W\#
+(*`_иDN9}0ˮˋ^dذOz;04t-lsGк7<vP|C-jF|GB(-mq<:|uRU&2@8vηm[nm[hZܠP>4;.`na۾#А 77|_czA"W|4HRch}zv:('so%1C;=_zvdT)MUOwPԚMK?= TPN
+Co/iki̠w&u` +o?0Gq/pfrb=ǲM
+Ư$33MsQDǨʶp;^o;ߕC0?WG̈/FOs됓A4_SOzZ08y}{sh`i.Q=D(|flL]#ژf׵WSN:;c;u?wL6p5}AE;8ce5`aį~@0@n0U580pY]#\փm{.HG05OZD'u9hՃy,"AĈ`Y~u=쪭sy9c	%%D".jVpa;ZS~H	m<q.r?>3$8 ޽;３xQ_|@6Ou{ОY61|z-.">7gΜPW䡇b?2BޣX|9ݻw$m&͍ď=mYVHw?Lrqo=%Th4Ѓ}M;\ngoY}q Pcۢ9ǳy8.jWsg}y:T~yy]>czMbDzyVk{5o$،s֜{Y_]]9ͶҾe8/G`aI~B?&"/WfС{QSSѣ1'|޽{3cn~s뭷QCII	 |[juc2|&3`_~D"ۿq)pB >c.ٳh&[彨q/_NYY'pBVIoJ>}:7|sonA8N֥ jr(=_%<ma`!]`kʍ7ԩS)--m7[MJ `nv6m믿/ٳ0aaлwo >6o̍7޸dTWWo|}2`&9 xwXxqǿ+6n|;ru]8~qvZ~i,XQYfǏ?[zN8+ͧ6^LӴ}o, e6/yZ(JT&izSs|BhA*+ܹsbʔ)kaڴi<XŘ1cB&bc
+^nݺ/f8XGicǎ婧jﳥ],[(y晌3ɓ'ӱcG-[F4eȑ̝;|ƍ'MRVWi[k.PSޔsVg׏/plӸ4ck_l;(qeCӃnZVIsFՑv~ qٳٺu+o6 `?Q^?r0C/dȑ̛7/l#mп;,[,ccǎuK)͜9s|o̹Kii)ƍ/_~_^^9۷ogĉr!Z)6fN֟ߩ@Bqqq/MFf H@\DU0ZegHmOxͰ9abX3$ pJx	n{1***(//7 :s=h4l/]VjV9z۩gԩQ__ҥK>|8qU]w]&6b͚5уSN9^zxPPPp<~dРAr!9<<L,
+wUcsמJ.**jwo.]0NA8OD"TVVuxkN+W%T׮]		#MD PuMK/DNNX=c5(?p}vR\{\~\z饘رc:t(+V`̙$In|}C(-mw[ځN<-=ܓVv6wq+tԩu |i˲YA h})}hҝ$.RzP+= prSqsꩧj*qjsG_޽-[H$2w]7D_bڴi|'wy̝;	&0x`ϪU0aַx7_}ru]'JDȚRTQx}k{t
+{}uF}6mbjj@w[.,ׯ;[ cԍj*ĢE͕Eqo"s뭷6;Vs3<ݻs'2sL***4-[ ~ӽ_w]|MpKjihh LRRRТ .:t`ZlL z  LfצS;S1 /tfe48_v@0vɂI)6mhhgVYrʬ/fxGnn.\ve2aÆmY]	ptxz9餓(++kyXE,#Lbf(I1M]!//O.p:i,vmJ?yל3<M>Ӻup]q$  4&޸q#ƍc?fҤIL:0h ~sWy/M38%K/|CN|; oaJ0g}O?=l:L&TƸK[dg˘1c=z4T˗ӱcGf͚yxG1baꫯc|.uq4qo隧 SW1k:u$:8 Ǚm֗ZgT'yWaʫˣ !Y~='x";wdٳ'2o޼Cٰa6l7k+**(++F[gto<4Y~=X|~p']z5_8qq=A	UVѥKvb#G+-]t)=yEG?g&p8LYǩ4ͬ˾T&Zz[۶x{d IQX\pZ9stR |I˙>}z(QTTĺu{<z<x0vEbY˖-h2mۚ~̘1<cӇΝ;sEuV~iϟѣٸq#rzj!|$q=A3 -OiQs/̰aZ<Y%spDr
+¡AuKjMM:thx=ży裏߿? W]uDɓ'0rH>s{ｰ`AySOSN;U^izO>~_b6eeX~=k׮S4MlfҤI|,ZZ>c }Y,XN^#6('FiἷhѢV}sF1CRAc
+u^uիWytEUUO<{/mrJJy8D",ZYV׮]y4hz:&%g7y~ٲeMҀ
+
+
+8p`]vQ__@7՘_WTTTЫW/}]zy[Ν;xbx|Anʄ	֭A97ݨQg3_\7l'ZCIe'(]uA8㭚UZzk֮WN '''26	 x?~|csk׮D"_VNy<<3]/1V\iwya;"=sLlْLRر#hs#tR8>,EEE9d2ܹs)))	K0)ƫ GJeeQ86^{wJZ;EQ4M#Jeh *0CJV[ɓy衇.Y	@ GM|Zꤪ\y啌7~ >&8ѻwo,"??\ץ!CPSS;C,oSN^{TܷU;//?/F)<ҹTjӪ}eڶaa	̧ .-eODkh-m{  ᠆֬Yx(++cĈ8:ӛh4$Lf<8T/˲ѣ?0#FG%HpW?K[opB{=~lb
+p$ʡFqw^asW٪B Gj׾;hJ3Z
+%@h;#\^{p8խ SUUUM߰aw^b6nܘg6l\r	.'?	?ZO>~mOΟgaA 'It]_~a?Ғ Mڬ-ѣܹs_A;w0,Ee_ivjϴcrss# Ba cǎ
+:t]GE46nmi߾OG=ݺucԨQweʔ)M/++o"TTTю9Ȋ+8묳x:t(_|uuu|ছn./, mL,˘֏}Z]:VK޽{ǐ Ac
+0(((hqaR)rssWKh,4	 L<|?9˲<y2wuٳ;Yl7h?e	s9ضi0cƌoׁP?7|3у+VJ8p l2 fΜK/eY<V  	IDATsuYr -պzFGh
+ -*KA.T YAeK,kނV1m|GL0_\lذw>֬YC=شi~)+WK.	vԩl޼JL%K85jC.+[loVAAh<| g?9X]ݒ_FBpl}E1{lJKKCPA8XjhZ4ׯ՟i̘1<<%H8 J1` ~_1sLu1w;~jLzJKCC0k,LB*bΜ9xGǎ馛ihhn`̘1})A8 uq+Ve$붨}ixxxA`@
+H$iN r[2t]MvI&xmr8gah_L߾}ꪫp]{|TUU.fߺu+oXn>h(WXXyann.tA	  bIadn~ H$q|O mgF=x؂I2AmT)Y_-m~0~QXX@ ǉ6n8ƍ?5ٳgi_~9Hq2nBٳg2 GcF藔O2lrpT4Mh>Luuu@ pMW-{nYګ2_ 8M߳gǏsΔ:T;| .n6v]w%']hDwҟO|	¡_{84D"eYѢ^=&Jq__/o6FT݉D""(p؞-umLn{u\qD{. Ofܠ{okN:$Ν+ΕЬ	?gѬZ*+\4~m4i~! SNz.?O֛H$2k.^xƎ+C1PPP@4ŶmLj4O|FI$ qS"''G/Actڱj]SY[9mn565{?ӦMcƌ {<shΝ;͢EB':t(W&Jdɒ0Z~著g͚Ō3<y2EEE|',_\. bTٳzh(2E虜aD]Ӂ)F\ayd t҅VRaxV;\kNveȐ!\uUz\qvm\~|嗬_[n+˗lٲRbYsw}7W\qEWk_sW7bQa&X,4x T&SҫWc/j³
+$r6%P( P\\iXբ b;ZieY$vӢ A]1=zPRR3gǎlݺ_|9s0j(|͌I :t(s̡cǎ?ŋkq5DH$>o[ ͛B!$=^Jڶлa62?8g8a	29ZZA8,][:Ш([fMxq%   dW^^ĉ;v,SNl߾Gy$cr4Z4MI&fsȐ!<̚5x<ӹK'Ν;C<8d2TWA
+xخ_Zm۶;x4w'_\fA^LlqW9mgtEk,h$@v{pe0|nzɤIXd	z+gqFDFb駟΅^ { 
+%g}v^~e͛0a\A8Ĩ.QQQiF-mh4J"ࢋ.
+8)/p]%L&3H$m5IMāRl?~|?O׮]9묳c_m zgrwc_gnt5VOP_AhuM	UؤI;h( A`Akk՗ >vU0 L%;d_Ahz(q&?Dx<U[	  pD:Ul ;V㌂2hƶpQu]k:5^c  mNc#-%gUF#3An]k%   L#% ;cQËAA8uC qdcG)AF	1t1@	  AA8IOeA		񉬖  AA80)2̤u-    IENDB`
\ No newline at end of file
diff -Naur ns-3.22/src/spectrum/doc/spectrum-tv-cofdm.png ns-3.23/src/spectrum/doc/spectrum-tv-cofdm.png
--- ns-3.22/src/spectrum/doc/spectrum-tv-cofdm.png	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/doc/spectrum-tv-cofdm.png	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,409 @@
+PNG
+
+   IHDR     \   Vį   sRGB    bKGD      	pHYs    +   tIME+Ԓ    IDATxgxTE߻- ;" DP(EO)"`E(UFD( AMZ萞ldɦ.r&}}`wg{fι3gM4AAAA(D     AAAA$      AAAA      AAAA  #'
+  IT BiqE5#g@w
+  ~,AJ	I?X8II̦    Ai<L%մC3"90X@+oS4YRAA @q:: /{_~|z`#Vf%v*  ~@QϟϘ1ch֬?			[ѫW/n6iUA֓8,vgu9^a {7-CAA߶ 2իW̡CxG￱ZٳZ% 7}ۙԿo%jCs_QJN!躏T&LAAfe;x7HLLaÆ|TT3gpM7a/DϞ=Z XV.\(=B=+QSwa{ '}V  P\
+TUG,Z60zh4Mcɒ%]wyxU^hh()))2Zbb5Mu8!.Ml  
+@ ̙àAgŤ2` "##vvd/xyqsPHO8;c?]O{q0)$.TK
+  ~0- @%qb	ȧ#:T8 W.	Xe  W5~w
+/Jo]s\ cXVkU8 %    H @.Om=}#/  s2Y-\
+8
+}>{@AAv- Ňj;ȧ@)2v
+>O^)ES5":K`H(Ѯ?(p뭷P\y̙qűcѳXv ͛7eƌUA*@V 7<]rN
+(fѷ?
+؎|c(v^Ms<H+oDVq:4}_D}   jp2v?^yEΓJ'$  XV^wl6ij}9|4lى8t?W&JA	 Eq];8|m#IќKX^yA(M(
+8N!J,[JZ2e|۶ S^Kq|TF|P  4 c áPH15jNle_	E!qBD' \=zM+oğs[p!W!ǐ!CZA E!99z۷3aڴiõ^iرb@<8k.^K'{q  KZZjU祗g2Q>lZuI"&8SU==듓slܸqhZf61.vU\g00/͊bf=r@R)EQX,͖o92nϷ~hts88˖d2a4mrTUEQ\N3׾ZNn2e/'voeoe41.MsrW9Yeϯol6.SaCA2y{_yc+
+moValE^U*=~9w
+kkD;e;d76D  {9ڶmKݺu;ݻ7/`0#0{l`ft2v>~.D(i ]tik4	fΜddd ;F$'']?**Ya E*\S5R^=vޝhF޽YoGz\_re~aѣG1>|8}Gh/qHNN^(w̘1^ʓoqرc=`}Y`ԩS?~绯9~GUVo߾h2ePvؑf͚?k֬aժU%iуk9sptƎ#$$sz੧ro%ٿ?fn3f̘|jzȽaZh{Gzzyx<|뭷tMիuq_3k,:Qwll,w?z(_~%v"&&(y"""L0TrܹY|Low~mizz:6|w<퐗N'| >|3gڷ}'}լY3N=S4rH>ox8\ݺuaÆ ;vsM7yiСDGG_QN{y^}UƍGZZVѣG{8`nmĈ.Sn퐩ϓ'OH֭4h'N0e6/&NHRRG_G@u9|ӧO>tԉn~?DDDO2` ʗ/υ6mgΜɷg[6_~C#(
+FNV<t.\Ȏ;<.SCu?{,}Gn'LBRR#F'55zѣG5;v`u9Nqfܸq9v-Zp_ٸq[5kְr@Պik׎AԩS9|0۶mf͚P~ri*~}E&A( h@}{Áh4pة[/?Æd޼?~{fZ̟?nݺw)Sݻ3eg2d{,j^`yʓ޽{ߺ?ɔS+Ů]8t:u1Xӵkb0h޼yqѢEԮ]uVgBB3gt  884;z('JC#O<; UTȑ#nuFEEqy;<=?xoOߙ0aeʔUVhтÇӲeKiٲ%%%t:/M0'PEϝ~&MD1^zdΝ]O i[~=GtֲaAA|lر#;vgaÆvvڅ(4nMزeS\&M40(X!Z0 xD	R¾}{xϿdd$ccf@;sqPP={jbNE[мjtޙ_}@Uӧ?="	?S4XZXB 59ll߾_NE!ut@PuAq-G	>/>%$$?A48xp/*U2nrs~8']Ĵi_ߡ(*3fL{/SZ_ll,aaa9}t]U_=߮k&Mҵ(] L6M*V둪W޽{ZunM&vk~Ю]ZiBhh()))^]{p1T &[AC0w"*]v`p`2SRRVcƼ8zT	'oGR%3c)!7ՋYfASSQ(&H	Bo%7AhFA9YpMq72e$T:=ݕ  H  U  M
+>rT^Kp'O-'0h/v\ 2.t(B`;)[ AEMɤT	=JFFs΁Wg՚q*u}֭{n^PS=z_رcl޼YW^]eܽ{7{Uݻ*ƍ9~555%Kٳ^ZW>]e<r[nDQ^v;gUƾ}*cJJ
+?s/iy|2L
+?	@_,
+i\{mC^}UzxU̙DbbѤI#Fאn68ztH@A1v{2ϟk}ɜ<yDxy}5͛7ON<{2G΁ts֗αctԵ$N>۶mQ-{n]\hl6<(+1<V a4H]7P8cQ!
+EQ4^{}I7r~bb3/гgŐ%xRJUbc+/ ;IϏ4[rV  xaT;č  Q5jpk/WRU*UZ`  >*@套^k׮[={G۶mYpk8 xk mW0@r  ŀmxi֬=*U⭷^]vi|WQ@Mg:#	P0@_#o(C9p FX,h4r5!Jcիk}-cPP9 144EF#eʔѵ:uZl=Bݺuu/  `m]uf͚֧(
+ѺYvm:۷C$$$`2RJlٲH^y;G!eddPKop6({[k"?Bx~>c~;̘1L6mcPtzŬY㿞󌒜AdDwOU:d-3<ìYp8߿ jԨP۷ϫBBBHMMosa|kT: x5(F_ԩS)kߟݻwʕ+1b,_jժIci @AJ~@4Ə9~8z+d6nȨQP岎mҝ}bB2Oi['lQx8MYG?swǊŋ3w\7nlaÆlٲp-ŻYn4 $)(Q:e*t̎i+Vd4h@.]c(p&1 ,ڷ9@vkuŜ)8Y;jZ,&\]NdN'P]MTR6gCNU
+lƅ5hc(T[}acL ֭Çgٓ.]ꫯvZ.i'ŽS/_8@׮]u`0.U0lٲ8o<իGuL2fŊ<%Vm۶q1:w߿?SLѭptj2zhƎ[bιs1cO?tlоv8Mмw Mင$Mzh_{+4ȽCqξ GP
+[AD,4Dށt{:S'!$~&/~Š@4w]\<7,>	?cllh8i(8@YSΝb]v5b6С#GvsFSɤ^b.(<
+7`   @l@ă˨wRNEQt) zi2nJ4A&nwqwkXw*OlKdT!{G*
+AfgfI-}͖ϲz Ue'`.mNdxCl]Aa@'O(hs0`2_[,L:mlJk%N_ovNWX;3M6u7AAvdT^sE[ZxJ~:0k<"Cmp-OKFqvjt1@u෍&~Z͑l.,`!3Ԉ Ϡ(A
+dnc 2Te߶@~ɐNR 		Lm*ԋA 4SAsHL*Eq9A9h`d0sY$xFw3h[tV+`\h_'aԨ[3( T'TtW/8p\i)gÂ?]lr[||S Iќ(QHa N}eÝCE(]d[4Td/SU8NgVwZzX6@:G;EƢq|=75ދFS'`;	Z߸hV',9jLFM-	43)А )3	&2A6
+?@ %O]JFf0sj$-Z0s6ӕ _ObcgќjP>\N:_Oӎ\ E}@:K+{յZjѶm-7@&MJ~;5jеΰ0ݒeg]닍-Afq:up-n^{5]O>k۷o׵|B_V MGX]P D򫗿~/y.$Z!<PCP4aX'/M?+l	fnktƵ3Tkb4q6sR
+55b]i\iƮ,=Cwc层S$/o* dxqm{IDFYZ]TRe;q\q-Ѩ{bZjZl=A}'  @D ʕӵի;Rʖ-k5k+hZJJJJxch.I5P\Kґ|&㥇YW
+0h<D6Eqc[uG)ʥ 5u۰"c;	iTQ@თ}ScwA[LՋYf]7dٙ  [vZN>dbСC.]itg]R@  @AV'_Q.ȎcFns9rųr-zbA+ڬQxNv xMbU fgoRڸ؇.)ɫpDFA*}Go\]urM7aXnSLa۶mܹ	&_ލr'`͸_iqJ%yYLZe/d*5JK]RTo>~w]eX2nܸ͛7h/_΁tIIIL6MW֬YSW?*cʕuqݬ\Rw[/Z_ftիf>U*cBB_}U9FTʖ-KFF-bڴiŹ2tP4̙3T-ύGZ^MyJoNTfQ[;8|SNK#p8(2l6C1##C㪪zq	]s:hGdOLLԵSN7&''Zɓ'E @Q矉G\	f2d3]rwgʆ$l(
+d PO	2v%&Qe*A3	EA}YvSY	 P
+I&1i$ :uČ3 1b/#G^V>[ؽjZUm_!vsPq^،3i;L^F WeEaӦML:I1L6ԩS_8ªU	
+
+ii׮=L  +~ $#::.]0j(^z%j
+`BS	 dSV_/j#/L+(K r黁_z%Yj͚5_~aҥ1M    IDATԷ(;6mq)nmuOƣiҟA᪘7㏎8FBn'Z!φVH ѝsi BV9q7LѷB`r8eaйwML!qI0]k.\ȡCزeo{nǫs9駟஻f1l3W~Z_dd$+WֵG}Tʕ+k+䩧U繚JnI:ͱ+*T_kO<UR+^Ov{իF4ik}ѵ 5Rznhh()))y~>06T֏OY ;I. A.c lN"``wp2t4Mc̘1tEQ0aժU[n$''a^zR3fL㡇EӜ?66ɓ?K,Κ5=q9JgVaNg37Jb<1"#i()#	L(t)3[-A	
+P0p\[8RUZ9ʥo6>,0|povobK&,\0 @n&٬h7{Q  Rz	B[F	 Ԩͳ{Ӣg("<P$
+%FHYQ.@@N2Y\w}7_g4qiUc"Tld+СC:uo6[K<ϓ|sMAZ:/*
+l)K{,6cbGlsfUn	 xIҾs4F^%pl`ŵO~f)明|GF߭ @#OG6+݆]UUL&cJgdd0{l22r8ݎ<4hcǲo>kժ>HQzAhhGpO?%22}͐!Cp8L4{fΜѮ={$8846kz!44O>6~φe<xCu/o۶{쭷Z|rCz;to?>?TfϞ!S޽ݿ7s9tP6m͵UVرc			ԩ4W%; c=(
+aaa|G(C=#OG߾}i۶I&_[ldT^9r$kݫ2˹]"1}t3=aݺu2dK0qD֯_QFLLGP⋘lU^΋/ȹs2e
+&==n#gƚ5k<ypEQxGQUωL=ԩ3g￻yfS9 +8lk4	λ1"Z@-PP!֝CeA
+o?웲ӍqW w|>Te˖tؖQ{N=1<	V^S+d2z صkcǎ=M}ڵk14o%+gz(
+P'uY dGd y^yQQQ?6;Ο?o8{tD2zfEzr(:&HoGnPLahD
+<,45jTpp	Gsڵw@шll6c4rc(^_s9A(^֬YSdRl6׶ P*VHTT6l`ԨQ)S\llNQKhp|[+Keŀ&#WT;{	k{1Lqi	^:u6qOD	~@UUaÆѬY3}YD۶m>5W랇ڔ*M79FP i B6Bf 
+ՠ+y@y)?}%E{J/%ÁhC"u/))Iw+sHLLwڣi^%- UUݎoɀ h߾=FTRk-xlxxxHAOF'Ƕ@7Ry1.! AUan;%ks rJ)-Z --ݻNllyt;L/To)*u'Oֵ]N@@ cǎUFөe˖婧*jk3<ڵFy8۷'-ͻIIIi^P⊼Qu3U 8m}mujK>Bz[R檐QVB[F
+ 3>Э[7###aѢEoorV#$ 3vQDד{JMѐs|xΝA	 \ks?衇8s_.1e` xi7̐w;QDv[u+.c˄	xٳgfС_^Vgs8ICz)[( \Nlk
+WX&\JsdC
+ד=Aop^vH6{x>wyo^8ɹ ^~ej׮3<Cll,'OO>|'x&%`>J@߰sN-Z`]?K: \E׵
+*jwV+2*0aBo[Vub !csɱ>,	$S:wM̀b 69^+Kl!KR`+tBFF7'N{<<7]ogXŠCV4`R Bjg1I_bx{^2e @n}N:QLE8Zٕ@!_c y'kalK0K[NO'{̟? ֬Y(4nܘ۷'M6  xc +t1`	i $990q8]9auu:	m8Nfs13sd.|r  _at}9փ'm4TLe ^3mDp%n"$UM^FE%D\-nJ׮]Q'qF?~4 xI[ X4;|re>*oԭ[J*t6mԭΐ]:?<+W{)2t?~֭[^Yk ο kkhr:)V ίțE xXq%b55}]33hܸ1K.usyDEEZh&@2edL>d nGAFFuf_ҭ֗{R5Պn}x֧(
+AAA%0^GZ)ZJJJJ}"(ƻ4K߹BlEŁ9Al)B\u`1}S֡2A:Y1ѫW/f͚uk:OMI\2\	mڸ >L*U>>Ean	C69E[F*{}D^Q \Я(Ug (jbAAJ>D (tOǿ"(H)r^KTŋԩ{_~<Ŧ|ξa
+(\H
+]A(n 04{bփtPK
+ PKW'`ɒ%tޝѣGөS'uË6,RCQ́ҐVTL`; ݲi69g
+V?k}v]ǎӵ>Պf+2_}jXKp8H+JvW?;a tĉ㚦k"Px~ >}GZ*[n^-B-hѢqqqE^=prgCE<vҙj\^0B{JϮfKV Zw^/_k+Wֵ6q-/t3))ɓ'#>>}KI;vbŊۺ#FZ_Ftf1n8]Y%$$0mڴB/r (СC1cV?gƍtЁ5j(T$2Z*G4*
+/5%Kpze5s6 Byai|Â pRX~ p:rOQ1֧Aih4S__zgUWEwVgcz>w)GQe &L ))ƍӱcGzA~ҥ;wO?,ÒۍXX<"\  \dUwk|G֯_Mm  0u<Q<}Ve鴚Xzjϋ/*Zuw^S`?Z* `K̕`*Ӣɮ9mƪ`۶t܍`'%&&`lA;D~y
+@Q>׃[o(z.dP3$ ^F3jvJW P} %7'`5ME=z}gٺu++WIMee@>ө{}z'ÁQkl6i'KOO׵>UUZ%$=tQPR:3{	)g/	O.RFig:- AS7]d0fߔu8	qםr|sN([,gϦM6(ʕ+PBA<OKرohF>c5j`WՋYf]Qr]\2\	mڸ >LTh0dŋZY0~|qBZze]Wbnevo-c!Rw/8,As*a
+0
+zRn\1sL6mD\\Vd͚5<: 
+'k|ԪU?|mלCc:)	JI#2/t(iLW EÑ5f!:3'xgЖ3qmK3aKՂ^>P`6+!-y={p95jÇy1޽ _l$'O?눎.m{Iǎ]W`ĉr B)E Y'Ιb|_m[jwg
+$րSHQwkflhuӥw˘`eK'-?CйsgvIJJ
+v[ɿzoC?JDEp3M_f&2
+rN	+XǬgE2	(ꃲiӁ,E+GM5UG/ҷ)5`UK/ze#@kݺuiѢfݻwSk{פI>|8oov߼ys1ad7nvvO 6"$cWEۿ˂]V?,2Λ7;w_/\{WÇ_hmŋuu׵p]jZ1bD;Ν> D)q_.jCE ufA9hδR!ˑEO?yMԵw^|4֬Yނn91g6KNM&&S^ljXt;kAAAg0pֵHeԻ)SFwP/cؽ{77ZvZf3u֥bŊWTSH:y)`?4Wb@	PqpsN%_VwGWNV97'ZOZQﾛŉٿz݋e(lذU5Ʉ+'lL(a%  \E
+{ｗk=z0sL		~h"NP	f鴂 xa{wgSVQAs/QL!!!L&"##<^jՒ6b4nP9r??<W\
+*T_v xA VDGGO?QfM7n3fnNpd N'{c	Jc?.
+$0Kau|
+J" 1Stԝ;0{\F~q04v;?mRڵ+O?#&O~QWo?l߾]e̳)a١C]elJ*֩w@*Tk~RlYm]zt[nѵ>@͚5um۶ۀʕ+~~ɣC2cVX1bӦMc8L&kf߾}^IHH8QS?TGJL٨a	-bS#SA!s1xoF)H*.wve޻w=$==y~@Qr_)rk֬ <L2?lQYd;sǈhV^z1k,wBϠJI>9㪐qJh#pa9Km>Ean?<4!t7+ &L	 WLUU"""0` ۷gΝ02UU%::Z軦)$Dd"8j:(R/0"̱=J 쫂CիW1zXڵc/f͚>	 ԯ߀L@{c^֕=e+Qn=OG|3(N(^-	 .Xtd">>VZq5\2hx۬ÚZ!hA(!m!%SHwKQzCpp+Wȑ䵼`ͤL(tqm˞OQvIf̱;.s5 [PgA	 \&aaaepAE?n7H 4;$sAn8.y.k_u瓲Ev5M!,,ӧOJj5/{}ZZ*񗶫Ĕ#"#NpO4LFVkqҴiSmۖs!==UUСGҥ9s:v~?ydz8jBjj*#x;e,KA՚c=gK+%RSS5kX<EQ}͒%K8{G˗;p?vv;>z(oٷow [ne4m4c4MM6TZ˗k9Ν#   #GXbLC7fGuoӦM:tTL&<݁&Mh׮\_~ɓuGEEѥKSNtRf3b۹	49={6ԩS͛رM6yȔ/2Iz<*̮?InG8qe˖yԕٷϟ=ܓk9otزeKqHh߯ʣZnM52͙3'G_	[nt=x=?QNiݺIrF~<tW_yQ@>}<t5c fniO2ώv~/^Qw~1w\<Y&-[̡;wqMR~\e4͛Sn]O<Qfppۖf#UUK.DGGd:uĂHLL̷goON߾}=t_{xзo_kϳêU<	=zrϟORR(
+UTMN?гgfΜcA֭c޽yqYBħΝPRRRr pZ반Ȋǋ6+\  xgyqV"tRxo:.Jk>Ν;HMMFYiܸ>6lv_С&oȑ=)Sݻw0d@w+WqCȑXW~itޝ[z<&Νfy\oX<jܖ/_cBw) --.Qnnd_ux	{LN:e    IDAT.g߾}>|):{,v=_222pB=f=N1AuSmyPn2e;n79G'k9k׮d2QR%EneL3s +W@jL:)))$%%gM&*'ONA2nfm6s믿RFjԨk}-k`(z۷_6lX}r3::\YVw			!<R2%%}fmi'N('22}~ѣG駟r$6L+SLLG08Gy	$--\Vvo{ɓ~dʞ u@^{mƎG}L A҄=1+WΫUR%;ƙ3g<*T<y2f[VFɳ>g]dsdsL&ժUӜ?@wP-3s.ߜLaaaDw'11yK/j+ z)\8RՏ~+d`B
+JfJAotV\z=w4ZGQ5|8={t'&MtX~Csug5֭;8oߝ7o^C̸*44cog{50I7p-'e\ffM^~cn2GՔ_TTTz<F&oOCWf~P`9ɔ%**\yL'9UXY<{oEDDFoe͙A}f*L},KyYMoH`Cf)J{zs:Dxxxy#l.P?2<2-yhՀ-sc(BE1APgUX^MK{ڵkWUFڵСf+2wbݻ'O૯fо}g~MVX͖uy1yq]yTRmаk_lp}6vAA 1(
+RCb(tI3$mA(8
+K	[`v^F piA@A rm1a^u5jDNmǨX+ 5kV@UPľS\[~7ӿhx~qG{L02W P|
+,7{]겧PO@I	=YKoN{ݳv)w{gu?ʔ)CÆQ:t`׮]<Tݻ7SNO>|r4j/[`FOLOOϱ\q7hOxu;^iTUͱ?*%=Ք,'ydOfx4Mw^'#HI;(j Y*~7bP27FÚRck<UGrP1+$,PZrFw3P/MTeYI[(¸q믿?~<ڵFѰaCڶm[,kFZh۶; 1}D@:5ط̜d_`2Xnii4hc^z4UUsd[R\wu\wu;zتUb	8)c׮]u﯑<Ӻ+ZJ%4lؐw4Mcĉwi]1ct1--MWI@_ &?fd6|scQ	ߕ@r%E1u%F"
+IK/W@ԋ)cs=?@ժU0aZjɵ^?\<#`6HMM%==ٳ[}:6fϸ3M?zMފLDFA)cn6[Z:e4'ŎP85k?(g^=-kJcAlrj*!!ph%=YRU}i4ihiF&7WLI5v%Q^|)}XSNZ"L޽{3n8FŢEXh?|'?BQӒ@qZէ{n4*K\[,9^]w8C^088XW=޽[ו#CO/֯__e\x1{յ&&&駟׈]cǎ*cPP}gǎ>/; %9>(
+5kԵXV|M]e,_2^p/ seÆ7SҬY3T3gg+={y'm6ow}RIAe>E@QB Rmcx Q۷;ӿDGWly\^~{qȨw U*2 cQHM {{iӆ{ңG_0222裏<v51w	qB&G0Ra	%>2y|'Ƃ   (<sl߾p{1^|EnʦMxWTGf]6E{z0HKY\X ׶'}H?P4^~I&)vsokqA?{Um鍄PB A6DA?"vVPD ElR,(J*ldlM~;sϙ9g93sFAAA!@4i'ӎxtLp#0tepWbg"* ҡA&"$)+ 1qs]chѢCA  PPPPPPP @Ua]	E~A</0e^\ {!}^R@e)((Ņv^)kR 7^o_eˎhѤi 7on^
+أ1Z/Z_bb'ilӦцDEFFryh_D_CZ&jܚ\z饆OZ_pppNRΑ9J#LIaI Jȇ5B*NAASv[5t6KYG$~C|b)~ttgԨQ̝;LU{jV}ILLTQPd a_<bj E#r6Ą<.J#=9*WImYJ88Γq<6)@)8ƒ/kSPPPPPPPZ!m$L#ɢ3dvDcW^= AM@UP$<2vj }@h̍(Iӟ`aCףR.J\t:qݞv; 6Z:%R
+~i1O>$knd-~̚56m)*U'fM(_U1>wT fUÑX:&©^lr$-D[*U!
+\@A\pr[M6}J_LA'+L}K:=/uþ&:qÙ4Sӧǎ.O>!77	&зf#E׮s}?];u]G۶IJJW^JK	w}L>ݰ:9y$۷7{ｗ3fF={BдiK͛[.ՙڵk9Bz!Nj޽/#GF۶B0|:{ꩧͯrXl2G}W_}0Yn{VQ^p>m0mVm`	sbW @e	VmT*(Ti/|zT@"t	^D]^.ʚD0,H=HT #̶k'!dlB\SnswVdl(?|0]veԩO8NR- !K~X9v ;#<Νp-w^%Хw5OMMe  yCd4M TfY9LZ v;7o6T{ 233ٵkaNȑ#  V\iX  `ن n7a > @nn.[l,U;Ii7{sϧMJq<ܴl/]ε
+
+
+62zb	Ș*8$U/j_.d[Kt~9K3Kٲrۥ1aig6h!SLaռiӆ9sгgOlZ,ŋ3rb1/XDnnAAJB3(>((((T3*  `ӦM\\.̙Czz:]v4`ʔ)=,X[ÍSڰl.7]>{>2g%3A:ATgWa{Ta.Ak	RߞvaEE0g[r^5
+CҌRufҐrepr +f#t@WJɤIg#ݻ;３c7ߐō7Xm_{&u~'Ôpn`
+ (&LX,\}ߟ믿z1z2,tN.XD]=P`eiiCr$A@\@wKj;-gtFcʤJL"d<D3,,e=bJ2moJ5s$]KYn*gΜŋ={6̛7=S=KI}8M~yɼ`źuwx̙R/
+
+
+
+
+
+
+ HKK#77O>.QFQNzɅ^͛2d-*Sy"[saIgC{w5Ω}MixކʕcMZuxtDJqCM!YH8Epa[ATpziμtR!ĔFU	4[C&2'":tC#GV+BV;wnkfk		%22?koVYˀ8c{Ʉj4Z,4M4ZVL&c^4`C댍5\>l6[l6cXuaaaWNw*2 6|Z]vUW]Ν;YlVɓ's1ڵkT^hhgH8d뾌Sn<]f.aЬJ-MPp*yv^BX߃yh!K	"'skc8ȕalwdgn}@&+_?ퟄFG'h22`/(7ٙ>|]iݺ]@ըQ;wݍ:-B#K^DՎ( g 77e<P}D ٳ'={K.hтyqQ6lH\\6l(p dDZEu_ooT=t;Q5vi2`BʖX2^{m1ZtN $H'+w$$2Y2>1ѫH-[rX1~>V򊜓}fLAsff&iii		N,Y&#3\uQAUS}G 9s=FNE>yӐ{+ 涧`E#0J8br`.',1cz[j/]6{翹&EZ[pdjJ2]bI֜f$gX$wn@L
+O?2=Azz27]_niS4*(4VOR|4TKut?!33;iDP	uC>RV#?ܫ͐^dգwঈ>DB.ZHpFbs)>8.kM&'/f#dT)'7 Q.R<3RZt@Hzj2RJu-1`@NP٣2)0x۲e|qNʕ+Yzu9i/ٶmӼ5Z>8G}Tiܴi}2hCjy'l6Jɓ'6mZp `>l)s}::{r.cro 8Ϧu_;+^Nai=hJ^o)sg/
+Io6/JA~Os${F8)4O25)-<e?,_ˡ4dew^ٯ^dp"7Ʉl<-(nܥh#!`xI%8hi1:PJgxx~	$#""J>jm  ͎u [ي9>+b#^"ih&p;*_| %G<3ZJs[t{WQHZ-HKBhMdY8z|=tÍp9&kcA'Oe[ 
+b֬?=ｗÑZybzLb9@A||ᆺBË/³ςs6 pv39	  d!L%;{/E:dqI`]K
+ !7mz5uq<q̱~@wbPiX9
+w~-O鎩\  4<o}Jukː[n<п<yJ`W4lXׯ][ٴiwMgF ,[!tj7VͰJ+n3d<	Mrn6IpDz1s75-;ӈt`BMqtәtL2\qR4-=`JJTD_JɈsҥ=SN'66-غu_q՝~@zHNNSN[9/pr?4nܒ@ԩlذN:vvr^-4nh}.X:hUQ4 %:NƩ"L*):t-jn/*4-7/Q\%CtgRZ_6oAN|DJ@n\RUNBcQZpVźa\l7k\ p#ٟTbf֬Y̘1O?lnxg+]Ahhqзe 8FTMw&%aQsLtѮqh^}Gyoߡs_hҤ	7UVZ_ǎmM!cϞ=ȑ#3))֭ˀjh޼952\=ÆgdS1fC\lEDDpV|L7
+5(9L,M	q\VJAqoAFs{V=lWuB ;%|0w$rڅ&a9ڏ "ش,zF&d꓋n&44/fzLFlq$Gs|`>ߡCl%\Bݹѣ			Q$8l_qF,Y!C8y2x;	!سgM)S=Fbܹj
+:@AXdpt/fkcb@+ 9y1h ?#BmwA~xT^R̛3W v/KWՑܶY|V`䟤~CfָJzstwWmR2Ka*lmKfĮeVRplG;C`|쳳S,ci.X<ŋ9ñwJ;ا	cŊ|WX,x֭ˤIuj׋'"44/?l#&&۷~8ɓ](@WlPPPPP␙woɓ?~<u]L8_gy-Z^[Ь]BM%JL,! MqSpKA=-g%a	ήԉ fy~sޫ8UPTG۞XX܌	KO纺aCD!K:m
+\ =ۂ^|v<v    IDATS/
+A{<]Ws=,^իW3k,8W\g}F-ڵk RJ&Lw73xIfvIF$%- ߿dN<Y5Z1Xr
+~gJ{TrʻY)_JOew.Sv09GixrW+홪9եkݞ; {Ue޼yű|ry&o7M 0` N*Saaatށ&Sd#`N˿|:6Y:џdq۫Oq;+DːP9
+
+8Xw74$&W>g&!͆/r8Ȕdm*LJ;|饗ңG}Yoΐ!CZ|5/nݺi^E4t͈7p啃#37u=<wuqIL߬,4i]$ t3g*֭>.૯<Ftt~NN[nnݺgڷoOZZ111:u
+ɱcǼ"##=ߥLݺu' Gcǎ&4RSS=e:6v֍{>㏌=,#M6deeylܸ_iӦHSllv]י9s&W^y癛o+VxIMM%336C11J_dBNTTtN>jK/1gN:!!!رZhAHH?г\Qر#خvZFApp0nl6l@Æ=tܹH@릛nbʔ'v{<^4y]^=,~ÇB֭=4n_p/жm[ /Gȑ#Vff&\| En?׻db߾}^۰aC<zb\uU ?~Ν;{_|	իiٲݻswr#F0}t/]ѬY3O %%y&!!&Z޽ۋWDDD`24f͚|r3ׯgРA^m^_!袋<|\{L:&$:O<ǏGAx,䥗^bўx.\UfXvϾt:Yd	:ub,]K/]vL:MIwA=mpi222~mر޽{c-p|brz͞={&55!f<^}px!7./y'={svv6))) ]tG 1tP^z%l6\s?#=z`̛7vѡCRۈRniƽa*|30?no-4eD^o?/s!K=-~ Vt$StZ&r΅7~ͦ־b=8W\<*fjƌɄۭs?A ӯ$&6套eԨ[=t?,Z75#<<Y>*zx>o߾'NxxZ^^+8P6X,8NS۲̼<r{{hV٤w(قS^.k֬8` PfsA^Nr#X3+VM6W[o_>Q,	!!!dggWj&<pA6lСC&o6}fsUWyߡСCto2/s V@&>O7VNbb"v;o6<HO][N`_yʩh;||;RJ>QN7dӇYf0qD˼yhժU"ÇsoFK]j$[PaTeV^9	5%̄"$CR#Fj5ҏՙ [lڴ7i&k ~:>}.W_g˖͌uSٶm[lىN/'l͚?2dIJJ\/^YI=QߖL|Y3--4oBS])?˿ޥH5RAYeddpiOi퐿<_w/g!UOKKM* *_eVyd<PxTYۻPx-O9iSNQa} 
+]r݄qF6nHFR2|p~,XLLA3bc9S>J,gmp*T=h
+
+
+
+L&nB0	KNC)t?_NƱhfݻ2 f\rc,Ϝ#=ySWdddMӰXd[Fy뭷_{-qsg\Drr2^{]A_
+
+
+
+
+
+
+UI+t.LDؙtD'<LN,duq(lNKRP|H)k9~dgDmXC̡plf)s2!X6g}Kg^k͕g͚pa	4nq\wr}3|@+/ejܸvWt:ZI)֙c8 x!77
+1
+Fˇ4VV> U0Ң}U`'x,Mj@$A
+
+CK8+. tBM&QйH|>p] eu_:e?Õ'>/<ZϟRt]BBCBbŏ[Y>r5j(Ν2ʺ8PQUcͲ HkT&X8  X,Q}܄ Lr+3'} }(nER|N&N8XlʟWP|	'?v%3HwV4rLH]OoY5t2p.o;'xƃ0ntJ.]l>ѧeE@jXF&Ƃt*nU  vmdBwkY8)"GKg¦egݟ@$ooGx#kO*(Ԉ簋ʇ4cғ7C'"tS( y UV@?].X,p?~wy8jgQ
+H	(((( N}[q".l""nNdlCZ?ێˮRA!eؗ34$&Hd3;D~[% ;]dOP O{HaF,_cȑ#JJҎR4VBvT}Ghht*nB\M
+J$
+ޜD ͤq,l!Q!SI
+*1{$/W 7|.8)eב#G*Kl|̿-[k4IIIZ*É5ƅuVCkjj*j;]Siܸq#-i!wy|7vF'O2uT W<b`!;&a|f_b7r~t@܍+PA\Iy6D;|tŰ,ejI8znBhCy݇NWd2^b<5͘5{j5!
+2vipp6aj(@HHEGGNh (7=yAER pC q
+a))n,Z"pCJɼC򛜂. a.ug!>*aCnn.|	~HO??Z瞇YvO
+
+
+
+
+
+
+* Prs>\lA{K4>g{jfϾk9PPwf|=;ԌuiBeqI?]%nFǎi۶-?*YYY<xw}GR2oC} 22ҥ
+*(((L6M1AD$@Jɏrwuzݛ90Dѥ݇Q%p6tmo `ҢO1jk a[в&h
+p]n}'k9o&_|N/.,o2um4bgrk<ݻw7ߤsl߾$v@=?~|_^nv nt]7ΚB׍:C_d-t:kpev333k|MceC u29^qGwf<}!DE3	lCKVb8U*( $dNapݩ|pVZ' xS"|(J&x¼'n$ƃ/?vrAuN'Bm_ϩU %#++ڶmK6mjz%`Ԍv:t_#!!oFءCڷooLe8ӧJÇjZӧ/&&{G "& [AK q'1c嶧avѻ-$yk_,&0-]	RJx8bq	8hJHӁ !Z%tז@J/yIOO穧b߾}<8&MTmcՁ{YK	[ci0CCCWht|7:duȇ2RuF'4:!_mҨ %]rO7nX L>FY(xnii&7~NqPdpT+(< e`I8L G~ʇK+R0;bx۶mK5yG|oڴ
+ (S*((((TTҌnMpmd&7FCb'0]wI-UP@4iO0pvV'q<Jj8VkS)%+Dҽ{g-J	NT^ni'B|(AkQ Ш=yfRQB
+!$GDu$$ˤRAAX8*D;Rark?,#c:wnWVS>l6Cn۶Pf_kh/^Ijxkxxq!CXIҥKu>5iPvyCi5J> ehQ]NbJt_%D&\	sxc6u,Bpu8.tyF9noN!q9~\	|
+ƞ|tv:2=g4QXl4VG5}ȱܪs4VV>T22y?;NqR:mj9IȦѝt[SA!J;ߌ2
+Yv5ՙU:Htt?XKpÇw{CkM_L%<
+27b
+ T޳W>`i'QJZ>j8H] 4@A&f9)3 G5 ~r%7S|/Vرw1}T%4
+
+
+
+
+
+
+* P^\<=[V)򽆙46EH !$]иW1ccus4CA!Qicr8KqC}Rq@[ ХK6oަQ5R<#y4ZA衱YZma&NW^1x8*(,n|b dkWHK`9x.a̜55?*KB ;R"q!%?ӆ:^8p++'SĐ!+<m۶4P].cڵkﯨBN4<VZ_###0a}'==PHHH`ԨQh}\~[ӐR2m4Cw^Cjxꩧĉ͸qT ^+G-ƽg90pAmU	v7@E~.9vw1 s∊1ŋ:~),OyVi4*P4F'ًKװrRJ\ Q϶V c 5%TP!:eFHdPьùH_NH /euK3LUNxG]y~.%0
+Շ}Fb 0xa(b|"%͐hTǑ]iQ$RA .!= C0	wV큳^ǅ[s% `ÆlْVZ#^z̟?fW,?+N~ѣoWRdeeouX94>ۍч+M媖#NEcx) vegg.F   ~F:Ny;E۪% ɭPA psf9!d\3nf	KQˉVM=~2n8ϟѣ;v,]w]-ѣ/6gul޼ȵhJPʀ0C۶muZߚ5kXlJYi\h;v0δ4z->4nٲKV_ pJgBB9&Olhцw)y
+^m W\{M.GhcFHloAAV5ʢY۴-s#}cg᪐1g1g\K2%xq&.ѹ-^\.:u]wETT={$%%1zh>jlѴibWANNy8kV-ٱV { 0fsZWxkQUCb:v)=2*at`:h++j@EgҸ>j!E&	&ɾp*f*((T="-!0`KF?̵@42s⊼pHf{~;ʕ+OYx1{\x޽D.2j_СŏG%!.WJ@k+fxaoGRqEA0;+B-V͊7ƽ~5sX&C] 8qK˙ejBtr}}dZh[Vsulr9Qt*«n7;vSN̙3Gظq4!xy+:ulV	̟17Wˉٳ>n{11BxPcBJ+V Tx; RsJU ,Հ
+
+5T' 2/Iؖ٫?_.#e֭[3gRJ7n̉'<ο9 n>|.=0-[6e|^LR
+իWYfl߾!B^{?4oޚGr߀pnh\.
+8+h}gD0H)5vkONNnxF'6XFRSSK4J)+%BÁ)t3zZ17vrGC/~.se3>ڎRPPZFMsq_ ž@/Wߞ-Ώ:-0/eerg͏?MKlL&nvP֭[ѳgO>bba|,RSS˻q0gnFβFbܹUyTjS'ش	I;F>Kg<OӨV Tf)	߹ 4f]0 (.]
+
+5};Bެ;үѹ $:_.W`.%u&rx
+ڵfu R7o{EN    IDATС<9v'u_qzn ""ŋ9?&䱱Zhw󟧏T;h4pvQ(*U ?3':>DG:/	v=(IAA:g2팆9hKZjѱ$/"% 97t;Y tБ	qV0RӰa"N4k۷7qA4G<S~\r1K,Y/ch>5I7NkC;֚h0""">U_k9* KJ!X4	qo;rE+*((TZ'\59G"4aAn~9u;RLƁ\N2	|.v#!11H)WO>oqx_[ٰpB7nL歈4j3#::-[_{=JϵbE9J2^r:#?뫮LOOgΝߖPZ9B,e,::HQ<׽,P/cmVʴgY믿.Ҟ%+#F(q5QyhYp	Oxi!C_u
+>iv7Ͽ7j(BCC=9y#(ȯ+!rKZ>T{Y|QH;!h,O9m+VT8 ~2NB9F KdT
+t6TZAA8_[r9. Wd17n~
+ɡNX/CoGvvn Wu&kל֭z'<J6lO>2p t]/90υɸq=ѣG=∍%::k<x0^WAO4L&P;UN͉cѢEԭ[s[.Xb≦i{=Ӫ)@G!44sqƴnSiذa^,[giҤIrN)gʔ)^fs
+oll,111|^9r3&)]4Z28;w_+BSHHHv0^XV/#^XJMM%$$ċ~.2r֬YCTT]vQFq!rڴiSGyī3fp;DFFi'Oz9ij_DD[n<Dtt3AgťKz*,W&MziӦ^z^MPP~:uX`k׮E޽GΝ;/Rwtbxb֭Kll,6+IiԩSǫxєApppv(ܞVX6mʅ^H^?j;i	:/FG{lgiE.66?ЋǏ/LNڡd / 'MVPPYYY^_3qqq^Έ#|;ＳM\poNDDD=YvJ\\nͫs;Mӈ/>ӧOĉo߾^1 g0<":NفSžO;NppShfQP-+:C7t)GRuL %_&iK^`+Kؽ{͚w]`ٲ_Q>rǡ޽ɇ[uAbcf7x
+D}	ݺ]+L+]vq{f}>IT1~﫜>S{a޽\z饥oyh)AB:II^ϕ'~q4'9WyaҥjՊ&MTН̙3G@YBBBήP_H;<xkrMK+l6r*+vСCo2/,,8?CSG;|!11ѣ\ v7x+o;p)l_eggg1f̘
+uUcUW9>Y#Xr7}bfQPrq8dee~4MI&ݻs\jj*'NGaΝL&<c<CF[/mഫ>2.M*m{Б~Js		3V7oˀ}hԨ6w23˗ 1	<hKM8u*:S::ېCJJ2_>kٲ%-cIr[Ll$g<	2oyhW^Bh6ϸkz:ڛ,*Z(8ʼOitgeSɬWE9mvFxq\v{<Hɶmm!:c..p8*{5gäH"u՘EX	z(XH `4i҄-[/йsg7o΂׿Evx8q'8~8v4233y8~8G%99
+&)#97h
+Zώ62$/W'.8i3gӥEdffqa~wN8Vv_o̤n~nt	WOp7CTbچ:usT`vLAA8ݰq)bif?+qӸ|U\{4wrK3iOBDYgmFz8x 4lǏc2hԨ_|=9>(ǎg߾}̚5N:h")wÆZ^{5{կ_sY׫WX:~7V 5^n=۲zkOx:V'91csπߎ+i@~ܵk-[d޽Ӻuk>͛7i۷7Xf4;3׉LL'88Kҥ_2p0,ƍ{!7nٟ`6^]6>8SNgيd14^}s^иqlǈl6u6wYV
+$4^<`,OigpAA||uvXL
+H ?Oe1X)D(V$]r]sd#@ P̛7?7rmѠA&OLzx曙<y2\s{%''ƍc6i׮9r0V^M&M<BD<WR\dj㚽oEA<q8kP)S9r$IIIL2w}N8A~ꪫÑ͸qw|y槟~f۸yx?8yKSRsQs	uV{%b;y2={i		_FeTF'^hnwVXѯ~Ny˴iG ~rk-Q DĄҲ]#n=VhEr-Qş-,EϘOn!PcBE[iXfű}v4M]vlݺ]iݺ5'Nd>.G}OmFVV'Odȑ^e3wrr:ux=׳gO~bgHÅ^ʕ+5 мS	hhj>H'/8R_z%Νݻ7nݺu{eʔ)˞$6, A6adee2t0Ǝ͛ЯߠʆYT]bc9+S	˪h$oɿu+i>jGwFpU< 
+ *g;n"	+dBid%t-a G C9ͯ⎾W(rѣ&Mol6駟2~xN>G}۱X,hfC4ߺc6裏5j,J)Yh9;ĉ믿-:,Ǉ1{Hr6.IMHn:L&K%Тys?vX[,YBN<YnwF@xFo;7yG=\;?<,'cƌcϞJ)1Xw+W%WPf<0<3gєoP U,y{|[1<EDS* pKS~ u]5P-?itܙݻwEӦMBgt]GJ9>gرc<=z3fx7NIInqξ_tE喡C.:: 䯿aÆ>|td椯pⴳ>Q#z.JoL<͛sϑ-gfP&MČ38}4wU֯_ON ڶmAFF(XV^M=/;;\bbbsժUٳ*aZvF 			DrԩSb|\.?Ns͚5\r%gIOO'..G!deep8{=z`ҥ_@ϞrفI
+IJJWn@{Mbf5b>2wW`2\*d믿fȐ!ԫW'x3gRNڵkǂHHHnݺl6bbb#44Ph֬d߾}3WZŮ]x9tPFbwV'OTZPbƍ^[wr&RJWa9J~rJ{ILL' /gȑ1°w5jzEII+ق_i۷_:{Uu:-O ::ڐUJULϟoh}5Ǐu`kXٳgk )%K,)2)@1k ,\¿W+ AyGU=}sv;i$H3 4QP#(E}B*H%@(e}X-Hvɖ2g̜)4lVcϡbk) (:@Ee	!%%t	J*ٳB#<®]Xb;wf͚5l޼N:#0~xݩ_>gϞ]{iÇl%BQEȀhrrrv(WWWYt,:3f;حU"B	C+$-c9mۙ6`1QZ5"""lIW!o˗,V)S\QWQVa$S﫸XT1(P/9
+]QacmCGk~z:v e<sp7|P΂٤ǐG^pDx	
+r(8 `.K7H۶m믿חjժ$IRvm*Uu֥N:xyyQvm>cww}y'9vƍl۶T`r	h{3aP,X`WW$ݎdi>J	 ww76nO?C 1bǎfϞɹ8QZmq\\jrN:u_[M^:Lm~c (g̷=f=+3ųH԰^}m}B?D-y:gi%KǖqQ-Zѣdee;6$..	&K/seѠA_.7?E8nd>**>\ʍ4mYݧ7 \EՒ`r70k,b74xB~}o@Zr㚪n4߈>9N8Q~48&
+
+ zVV-槻N8M|9k~m %%K`ڵ0xPb\)5df:X=8~<	WW{xga=	\Q@WIx{{ŋԩL:![ߟzz iҤ	q%iӦnݚ+WgDƍ"h5Nr9q
+*ܶ_N_~79spI$$$KӦMիǪU:6	>#KRɹ fuU8=|aɒyL-۷o-^6`jrE{:\w*6#Vm'o+jtvHRl<[5t:gfڛ_
+$I={M_쳃	mLv3rDx{`s#$IwJ>>>hK4Zڸw	DG M @$D-wǜ"G9>}:4nܘFڵټy3
+;SOĉٲe[l!>>X>C?J"Ju/2uT8}h4Q,ؼy3Z[;x4Ο?'dggsj,dzRdԬYHN:ɓ'ܹreʕ+|v-8Y9NKԇjuxNI5{n~~))4Cz=${&C~XpMXڽ}+>˜(9M2ȷk׎k}tX[,j_rĉ~4h;aX~&33Clw:uꡍC~1\YY7PrnРAC||(,øФIS#(wadggr)@дiS~ eΝ(.7+hؿ*U11s8]gPn\EkE(viF)8:?
+>xd8ر7_MÆyy'Q*,[}Baa!Çgʔ)M||<Bٸq|_ck׮1GRmԩX]nIbo|!XbtЁ4֮]K`` ]taÆ2|'׆9ISu1i9BCCyWѣ]I3dƸ%t"KQ4y8CBpI{n[AQ(^)OG/Ʊ{+(ʾBXOv`?˻w>>
+!,:?3DٳaV8}5u4t|Z*UwupjkLBvƍrnnndgSjM͚=Į]enǎʹmۉ<Kpp vmzH@pI~%iiW }쨨@AVV:5dł޽cNf޴`yē3H$(P ]ƪrUh4NٳpӦMcԩ={?~}1w\0` [ne˖lْ[ҿ,YoL^^zB$4;w&++///xG\2!!!xyyQjUTbӚƛq}{G#!puu-gc\r77V˱c˖-[B˲ede˖$Itڕ: Iaaa<3tIҥ|o///ec($v>C\ I&
+Xv½s曯m//o4w^?F4΁*tOqd5}rJMbGp쐙iٿf^r4gEn=bԙTT	77?js\+k
+<Kj֬yS#,,ww~u\Z	޽#34oކ	˲!CY3!uNh0:>r̘Jronn6+VK=yYTB-bݺCEOr27=8cN}*m}>>>ZJv^p!:tÃQF@>}ԩ+VgϞ<ӦMwNݺu8p 6l`޼yhтDiѢgҤIZ
+Ix7)KDllC-␐N<i(*F^̙3={Mw(YVg͚}mhBF}U'$ѴiSZj$Ix{{ӽ{wݻwϯLKW    IDATիsVxos\d3B( Ps6K&	;kՀ^WWWp-Bl7N8Q.n1$$lh[oiyиl صkgϞ?c)/bSکZM5%%I+Vh>;v6PB0nܸ[xb5*KR@I|W|Է8ouk,>vy8|ףEfIΝ"zV6UelĉTRIԩS={/RӣFV7!-Snǻ~RƁʔ2221c`C!WWk8JVD D6RiRBΏkok.mF\\ԯ__vR|ۗ}Z,^Cیk{xxx~#G:<RoRE$[\SS &22WWWN:'+W&--бcG /_NΝQ*lذ*UPn]ڴi#[_1BfY]]]e!]F;3B,Y"ۛxwر]b^o$>"IqMU*G N[	ǅ^yzjөSbc[]Ɣ)_+#L$GEt\zզj6OV&}4Wn$4o۷j'r<T*$+(mk׮|}},ꫯ2n8Vp+4<8KO24	!ؼy#/03g.o7M U 0045-nѨ9{4>|MUY/""AH/#ORBMKV#1q?ܲLy$tz XPt(rQ \=(jشj-۷gܸq,_㏛(E$eTq/k<5^^^#D6siӦ.˯Z
+!׭[Zj&+$ѭ[7J%$Oݺu$D7{`-^˗uL~W؀WH.P;#Rk8q<-ZϏ ^%'	ߟMcʿw.~a;v8	' ￖ^z˦-OkBcלB_/CC+qZ)tQ*VA:I@_t3q ##NN_Z]A}hҤCх˽F֣\[/	餤?I.]HHH@ѻwoB?:| P
+\'-]!8q{777ŧz4I>|0IMM%##hZ-q!2e
+'88CC\\l޼YV_xYd$nFC||Q_wG~n4tΜ9<&5Fq$NMp,C'ybJ2D>)I+:̉S´d|]Z5yOLN8Db|En"
+ߚUY ++`[m;Y$s.
+}חS2`g9;v+#ЕF\Rv((3(:vlKVVׯ_%((T6flڴ Z-uԡPG}irŋ^ݡ 0{FV%::j5Hh4o'V.':[b|9o<:tR?^z5CRzuFѣY&u2>t
+b% 8@iuVÇ[M"gwssN9r3g?$00&]
+r=rH$$IxzzZu3E|dd$vr2Uca|mv/Hf@sM=7֫א3g2mڴb~>x3Awϛ~d	WlpQ{N8QÔ)SL>!  ,?_r/aӦh۶mɟPSZ(/8LɧNʕL,g;!}}v7Y`Y:uJlN0aO=4!!6!q؊+ 5j3f?`ذa1y1{l^|WPPiBׯcȐ!<lܸ)S0p@&M$	ZM׮]enhZ^x\]]|}}I'ڏR`EWp(G1c<СCj!11&'E%3$e޽={(,nعs'GAAzz:6lɚ5kh4HyG$̊*݌%?U.KT*M3xJ/J~ء6pKȯބ(
+ٓl騼-#$ЩS;nH!={vAS[	K=ڦϫPիTh̘1wתe)7gŠ]vDGG;^5j(Z*'ӰaC>sĈ6}uֽy@PPUV-tС(!E+U2wo7ےFqqdɍ׋xyҋ:FZZ
+}>`i큯o
+.7`k}f>K\]QG_EttÛ`Q* _	7e+O?ĬYRBzyxx͇tbMfؽ{76:u͍G%+jšm۶^ZVT5mOa$ϵPWV/RPJJ⃦&KSksGq.+̞=[N88uTx	*VȟI^k1?zeISzЯܵcEk ٳǮc/FSWFG!jɃ!_a©:ޘA
+|ӇgϲkN6mBxxVmgԯ_?.\h4>0}4>/b{n#p֭ٴisqa_o?C{ｒ4vx33E%=BomjB(L1/=m%I\V9	<]\\c<ɕJ3$	WWPj
+!h47
+j{M4ܹsCѴiSx"M6-=ׯFǢr!(3:~\uue@*1?u#HIDzz;v_۷7\tPS4kڥ/ȑ#_|+"Iz2iq ofmQ6}֭\ršxɱcJEwf޽{eZKNNXXիWBpQN>N33LNN~1K 
+\E+_Gtuq޼$ތLHHO>@P2v{NRYi>ּwчt|&gwΣs}8h3+Ey	ׯQH777nEm\ABGR*eWqpss2[J%xxxTRD'!< }QPP@F$}P(hԨBo5?}tzIPPu/%T6s4[MQu0Mz tUK~`ذa3o<j֬I\\Geǎ:T2A7n{I wJ˖-shv6Y9s3 IIIIԪU777ΝK:uȑ#ܹӄT&Iׯ_GVۼq4*--<xyyR3xQ3qg\nzsbbbXt!/0/yO NXȑ/`^nBxRN8a;L<7|bq?w	qO4(:8qxzzr	,<󄄄%VXY<*|M	D K.skhI	Z-Ǐȑ#>hlB~~l9~8B_֭[=z4rܶ!]zL(
+Ư7ze=gIII#l݉ Xd?7ȴ}v
+
+
+Bo>Bp5"##&fs3Ӛ<ːքo5όJt +8 xᅑ4_7zO
+oO|6}իW9uM'|ǍT7.ճ,X`y,e'Oڼ~|AAN4ɦʒs̙roqgreK0q)pfϿ{ `ݮQѵkW	 0ܟxI\4ffn2)[B֭['3/\!rz!-DFFR楗͛7٪U+HӸqc$@ZhQlrm(Ė;5kV%*	7n?@ANN	M:4R24o\6"5i҄H$I"(($.N:v`9sPfMSF"68a{HDDD44aæ[Cv矵^9P	l.8q¦|wW1c,;W2o1yod>z M9Ѡ6{˗/h.gb%?.^!&
+ĉPN  P^p,K	lR~1J(ВRIq TY͛63_t	!޽[v7!رc\uIKD~LܞOGVݭcfGQL͛Mi---ƍ={rv5$I駟F$|||Lh_$,,XZ3~_}]vm۶9Aij*CJ>$7>
+);cj|$.]m6|N78s&j"'aݱC/T5S\yrᄇ;	''nwg@߾>{N i坘8%响XzK	5%I:R#J\ZmZ.ƱTSJ5*
+Z;66֢[Q	l$ƖYnӧF)([{mHFgNBΝ+? <7o۷oGAXX͛7ۺ)ѰaC*U$'T*f<)裏:r4n8.]jP ?Aۑ:P^Jp|ŵr[e&N5#ʜ7}8+"z!!.
+fyK.IRWNpps̝pJnG}t{<:>nz_?ॗ`[aCF2d*Ul*cEA@@$N@	1bѝ
+E^!8vIf93]\w\-mɅIJJAZ-:Cy+˶t&m)I7`ҥ2>|n6mia׮]+O\~]&(.7CQJSNUt;##)Sص]#
+<PH>Nv&z4izϦoߧϗgGjj=aZw/i4v`pS}moeJy	j#I_
+tTU<䝼<ۓ3<];_66_^YYY w<uVTT*:ݧ{,[EjHe8P*Iiٲ%$&&L~#--5k(qo}V2JInjɝ_yX|g|ڵ<E۷oyęWN(⁹ZZZhӦuaͤҷo_9s&FJŽ՚5kCq:~8իWw<Փb$HͮN 8kkv\cg݊U~$%@MHH:t !!ԼU :Pݽx"..">9	<>yyRW/X2b$&"h餝  m6&MرcZ*'O&88={0w\DW_-^ϟب
+7naaaƕ+Whذ!$g5kvW
+VIeuB?DNIAcTt?yY0 8jt,zma
+
+"""TN8A6mdJvBp*VHXXӰaCt:{-5QQiذCBa2lxhNKOn딄T(^sO7Sb<^6 ޽w''7R8 3ƌ8n;JubbbHOO?;z({Nܯ2e
+/67=$+W_k,4 ~bcc>}:hтurb?0` *T`>/J]+Ut;EC5b 0w$ߍS)FU?7-k/_Nnݸt+Wd O:wwR{ .]O<PW"fxVQ*(
+Zd(YXX;cǎ嫯BTX2yքIst@lܸ={m45BQXIǎ]ha _[C5gnLPlN@2&'[23Z@7ЬY3s	'JP~رcL0sNClZ6~ `Z͛ŋzқ[F͜9s={hW$3lX4>$ʵ$g^^KΝ;W\7VT?rڵk~|sNԣ=r{squ$IT\Ç9r$6KjWn-~zkSJJJ1E.<wBN8-[d@[ ǎ&''˵U*NoF$4&LDrJwBHOo[#IԬgqMjbcY𹈈(=P2}Zx9}\oiZ7r% OdwxF믛~n=O(j]O{v '/+((ח۷3l0HOO'!!_}%*1` 9=P\. 	]#CTCB'@Yz )K{aa!nn*Jk.5j:S2rH f̘A-`֭$''ӷo_[1ϧNɡ.ՠhpի+*
+Bf޽<Ieښ={6*WSNv./QAۊ`(~n$`C~~11xx2hᎻ|0:7 Ƿ4 x۷&<x ))X6߿|oV+'W rrr,j4ƍă-33#'## ߘG$o
+B.kE%%%qYw[}RV5LڜS[o9@J7U>Y\$I]vܹÇETT<^`S`aXtdffҖRdrJ֭Kݺu-h+++B)pssK~_XXh`4󐕕Œ%KDld>փ<dmD)((σ$I%.j*Y<ԧ΃ Mm>SqpQRRRرU*>wB[Փ[    IDATW_Z5effib˳HhyP(EBul	+WCJQy̴0VB}]Ə_OZ"}qssߟ222puuV8JHhfk}2|1##0v;SMԬYVBÃٳgR1bM4a֭|I\%I7*DnR&{z/Z E(7Q4]{O)+W]ve_>)))9rBSLLBΜ9CPPԮ]3gB`ȑb:t,C96eQ'syW㟓c{VI66gffɊʕ+ӓDiРYYY$''S~}Y0gΜB
+TXbbbӖ_c\|Xm=+p  ++colźuJ}+V+_~ ##%Zrr
+T*ˬj46<xȶL>t:O<ժUHMM5>,,>}7Pռ&!ӧO';;W^yŢƂXaa!Nnb̙&ɴ<<<6li|MZZ.]21 Zʤ|@Jx'.]6jW_{M߯R/X
+>umۢ4Z哺x̘1D1$Ν;SN5kp޽dddm1CŋYb	TSXXkfPFa"K$u&'i}^dg(/_&!!Gr1xMEY(`'>>^~QnZ,m͚5D3QT
+
+
+,|VerTORTk&
+}6lH֭M? 6*'h>}KD-[,3F	MZ(rtA~O?!`QXXȫjBg6yP(L.j>5~JFF*_z̹9]$$$X͢Lu'%%T{2̃a{988{14h uVLg#%	̙$BO@|d$&Co||>U*/	mϝ;1f}q?s)r6o̩S,Ã61̙3dtRP*2ԪU.]ל9s5kX$6g̙ca xGM*رÇ<`w.KN"{Ji\"h"~k$g@y >77+WPV-T*$NP, 88e˖NHMMeŊ6< CAAFGIxgUHuѮ];
+
+puuETe޽; O<!!!\!;w6yfqDVl6F@@ v/Y?g(>$/gܹX
+*0hаzƴi⋯}^^+/IyV!11Q:jk430w\5lش,߱c8{xGP@ cZɸ0>>׳m6
+͛7f}nݺjddd0{l^z%=)fyŋ$&&ԓ<ä"l_~'X䲖57KpZnG@jsW<I&1ai`` ׯ__΂,*~ΔE`ѢEvT	rUx!.m
+؟VªeqQ6l j
+!X~܆t$FVk4$ݻӡC$I"<<B7$n$rzG1$%&&:L}CoIdW?~8֭qhZzΝWrSUѾ}{Ç'$$Iҥ;w;ݻwۼpq3g+=z;Thvp HDŊyqVvs6`?LRQrIy	ÇSQy]Ƒ#IJGÞD8Zjsf.#^rUo
+֯_N80xRek =]_2A	u{g>r P֭[y{R5":,/PǅbۦZ
+kD~Ara̙#[ʧN*+K;IIIHDzG$ѣ|CvT5j `r[9"""]CRZZ#
+5嶤qO!,`׮]!8v&'iWF9Ԧ]vT*eRJ2I˓BAn8{]5Tˇa]>	Y:_ƲeKx\zYى?&""ZI`` 5jFPӈF0Ӝ<yp=aLq_hX\//o7o#l3g,hСC}-u{ҍkg>3kժe!M>]PVmӹ3|/Z7\Kj0rҎ P#,,LPދК51\#8#c9BB&@3ț/(aDFF:s'#mƎHD>}sںzdHvcagBi&+NAaw~r\$I2mGOjN:lN#55n$I,J%Jyq#{N7_#((ɓ$--yJaaNW۶mx衦&mhZlOǎ쳉L=a0ZxMWJ"J+SP^7K4f+Bq|OHH(3Ollg*Us DFFaq->͚5RJ6}7]v3JY^
+
+UV5TV.UI:N6mL2dH$$}%UnU(
+PQ繺OtLm]AD߷9 J,\Q0'...ֻ._\i>}:=z 88+Wv:_ف&9DPIt
+BiIrBөZy߿()Mvg5賎 eggၫ+hZe21c]v%445k֠jMGyTB$&&ҲeK#6m퉺urIWX?7>	;i,d+#(œs;k$Β|Я_?Yx<Mc^ϟ@}!!з/L7SP\n߾G};BV}Np~ї?{6ٸVq4(`H]9Mܷ Bƍ'uzz:o&BvI--RVzjfΜiua!X|9gϞEÇjŋJ7dggsY14Ks='w҅<CVۦċҎb7Z
+Mr8{xx8/I(boy/XSNnVRWb9^jB[}ooo9ǂ$I:P$I}tԩLjZlp¾q\G'O_ٵ#9su̟?zkvԨ9{6yu ։"@uQdLر.^+Tnʿa.Lb!pww'??ߩ;=/uC=f=cKuvm=ڴ1ƙ35 ҲeK6ocǌÁ ꫯXl(QIر#C%((oKHDLL;vD$\]]M\kժ%'	J*>ݽX+j4X&E(RS!$ֹ[kOff(/t˚+nPjڄT*쮷xb9^ĉ̝;W_Uw׮]SVoHpP(LJ0լYSba).]0
+q
+Pĉ'pgΜ	!t;s-ql:bbb8~ΟB!pl}>_
+^`QQz!/.KZmժ/,Aٶm/w-V)t˹>}t~'/*?{z&Iz/j>ǉ!_<)E['pel,\Pj۴iS䴸I}7vşq:9$OWϞDU+s#>-r(:0d9A!Ȑ=;,ZH6|I4}222>}8P~alro`^_(,,5::zmQIPe#++E_ѹsg6mJhh($%%Yy=
+-z6tJΝ{߫FN8_СC'\]ݝU:رc+	C[WjVc۪B};;))2YwQ'-ZXǏ/r:rǎ<i/^)䰴(#Q9knl:_f8ww9w2Ktt4O=oJ\
+ömmX>8tfzr^zٔv￝ S(8}4͓'OOK-/$<<\6 z4}<q+sTT.液~wzj\ׯF1c|͞=˗/#`ժUr鹀 ٳC$z)=<<}FOOObWBP(:tH>..-777f/xxxP~}=J57nȴeTPP`A[HD\\\eϏzJwϞ=Yj{%336me4?C38a??`ԭEttﳜ':cӲѣp$<^ #X4Q1WH}?I#ܵ{ڵknݺ^q̴y8nq2QZh4lv(c$Y18=z_|wq/^̧~zG2cbb
+м-^5ka+VHN֗N-'oM6tj5ɥɗ  nܸAڵr
+ԯ_uұcGzͱcdc@I`jjɉ٬:!>V\{	AU 4Ħey|!GɧǏOkV^zuB~~\JMRF///ـ!IbE\Ba]6...FLiK"%Ǐ篿X˓Ȇ"
+/uY%I">>޽{;56'd<yΞ=ٴi6l̙S[˶%O5]t'jjꭓ+E6ɿqV-^i\rlOy7Y|wǏ駟~b|9w߻tVM_:Ihz@qyct>|I5j			ϥRJ^5;}5ɺ%=chm"Y(%([SZLsFFT*ҍbv<HAAO>͂߿?
+B>-B$իgRS>  @nGʕB
+YbVVc%+r6m*'tŋMjޗ/jIV˴%'?__5cٲeءOy9R*HD=ڵkDEEѳgOY2ηPre9G͘0yg9S~c_,իO֭yǨVMxL{ZARVFphaQ)%%ɿG}/']2i$-Z${ة^jYS 1bc=67$}k 0(YB6'w%66.J. np3P{;ʼL͛'+>͓3F#+x$'!+xڵkӯ_kʛV*,]ԡ3gΘٞ>  
+* au޽M
+!ضm\e#;;ۄV\)ϯVJ[$1x`<==$ݻ$IԨQDh4:t!^BA۶m9pSv\ڵkOՉǠAOsJ Xjԯ?o@/~/9ly]O&Mc륦)~Jym	[tt9#4!+$[oj*ƏO\\[X RQ<K-~nj4C;%dp[h֬k֬t|y^y+CCuE)<n1lIˌ&y)L6wW\å/;xedݤҽ{w
+
+
+Xx1</AOŊ*#%8ӧ^Cܸq麨Z$Gnnn닗{%99=zRXp!?e˖&.1Vyϯ#QYڵkSV-'s~@aLgcYx))dffгg7>+""3}ׯ.0:qm+WJ^3zSGVkKJP
+uؑddd8tHIq}tׇQZ|',ZHfcǎQZ5<==b\SOKz u_Ў pW^
+zy`e漩Khcb T*IHH 228@ʕ	WXg`ãD6l >>[4.\H߾}KT_0 ,YB:uhذl 		#B?бcG'ӖGyx,BݢE#88+NV-g޿R146?yyz%ب`6mU!!UJҹ:Z7*T`dwu=0Bش	ay5(4".@aR:]I	.]$
+Iץ,:I-ߧ+:,4ݛ$IQF3(h)on+mLsIl2hKYeG.m;m^*O?ͥK?>yyy!Xz5;wDŋruz$I'aÆH\Nh(㒽觟~rv>N7޽c_i!xwpuĉCA*	6֭K1%+ժOS( &''i&FmUOL't*N8`fǎ4j___k222ij.[w&V}U]BBn\/[z9\x ,X={䯿BR1d\7|CTT[B
+V]KllTiF!55jժyfrrrҥYYY,]ˊY@@ ...dff"ZMvN6[1Pp$$\]Nsss$m]vѴiRLJ:;w.[jժ$&&An!!!!CH[?{Ź٥# Dhk]LDTIfr5&Xk,QXFEA",,lyR68uq1;3o{t[rY jtKZΝ+scᰶ+[~bPX;s0;L;Zـ"djbbRsLL\]]_Mv6̳
+F/VZ͛77mZ.)0fΊhBB .P5E qXz8oooL6K.Ev0eV*]֨_>.^'ObѢEW7oݻ#22%+((`9ٳg"B>}0l0ۛMGGGngg[[[ ).    IDATZWm'8	n55>rq*˱hڵ+r9yƲ넄dgg8ܻwǎqPTMf͚ЫW/1e9sQrY\ԡbd2XqW[ŀoyswoGx(ӧ 5]d}^cӧBkDߺ_hU4W8d2`	`^blPpŊ zXUWq}A:##CPm>Xl۶V188t{9sT\So8::T666k~~>>3cnd], ]ua}k2Y Biiie a}~Yѣظq#;///L2Ay l߾...\v-Z`.^ZN2U-(v&m0]`aNtJ	חm,>>>PT,ݭ[@D4WթSfff "mÇԴBYJkӠADEEC7oެPEiŋppp@ݻw"t6lgƍHL|M6#??hӦ-P{`D´l	3,O	t <x!H00Yb	\////o@||<Dnbb"=*aff&#qLKKKA˓d077|~]4˧î+DDDm۶E֊4ۛ~iW.u`Pn? *YuۣZWy8R㕲 <<<0n8,^ϟG۶m2Ӎyyyu)p/_1"_صhYFab^xUL_򗏉av@yB7n88;;cƌ5kLMMAD?~<:up%r>< ԭ[ծ"2nDwyGTҥ=ZAS :7'No:u ==)))P( .<yh!<Ξ=umּv1 <	а2*JwP3Æ_N;yz]ӧOcԩh4+޳gςФI*[$HP{*ܽ{oFBBB|}}K.H*n?hB //#F ÇlۯNm'OW`=۷oZj\xYYY޽;cƌM憘xD6BC  !X:`ǎӧ\]]T=
+{ٳ c}L&ÿ/v?~<{[
+ѣ`ܸqԏPS)\D0gϞpwwիWS;yyyصkWӒL&Ð!C->Fq.*
+;cHOOC~~6÷~e~D:V[	Jɀ[N_Z08}y}|_J'A[naذaEӧ7nV}ݗ1Y~~Ѻ>pO)K5tk;;2+V τl?h_%"嵰ZΈBHH憻w"88A+[d6m !!FǡkoS\(q|Aښךfff޽{' xVVl9~8>|"j<x r}FѣADٳYIfAMLL5f7qe,!((i+-޲ٳg%։'	'OCm͘1 "cǎen%і-\^!""(
+Cb_16l@^;wn]rG5.&&x qV$3SS[>x`(`` 5c? @ZXʮqmwq%fk}lؠhjdVLyyyEncI0sL UbСѻw"=}III_><<<ךQ??WW࣏cۏƎ5YY/8=nQQ@K3rGUjq8f͂O#/'l/LoAuE_j*$|BBo 6n܈3gwɓY𻂂0kc#Μ9v܉iӦ*ǼX|=rss]ӏ4[ܘ?}N;@g3cXXX`Ϟ=4iRikݘ:uh*((;vB	5VLgahРƍ%tr<&.Hx	3hė[FnnnΟ?_}}S
+=~NNNT*uj[b$C ??bncUAVVV]5Zmp*	CLL*7霜"
+O>-=A0O*ZW{{$ 6m#ƌScu{Ą>oz{|;}(Wh-[ <xf͚
+			"++/^ȑ# G`mmK.:u*ʃXK4ggj,6m
+kkk$&&"??...F@@ Fh7߄ann]Vm1UaRR0ydiq~pe.G~
+)))X|/eJ
+РA́9#ѤY
+
+
+b`IJGCYs%H :G%j潼l2K.Ux:|عSw\	JN-	 jq!`?vϽ:K0\ʕ+x7  ۶mC޽Ѽys"11Ǐ!//Igsssann\| 0PSSSۗZW;v쀷wQuPP^u ѣGxzzիĉK-???>O,BuǍ4^u#;;vvv/_H" :!ڵk_˳; m~`L/]sΝ;	&@R!;;?AY	$H
+ ٺU`bbBjgII/	y  &7:	_,]Z4?C;8!33L֭[8={pwwGTTbcc1` h4<}US	AMʂB@||<1Çh޼k=QQQB&M'OUV xxx ::8p Z-UAEh֭[#bٳg1p@Qm.Ě5k-kp)9R4u۷~k78/FLc{qB16tacʔ)eO2v*rVj1ԯR%qpС2C!33KcH^Qr50*lF\݅q>gς8$$$``7;d#J䃃.oyxx8+@DhڴiQn]Q1.Z-DUjhϏL|)-@'uvvF 0  "c "d2T:u]j~.|{P3w/;-vm/mKӞ:54oׯ/8sQ_3f&MT*ODHKKc?>>#m~:n޼)8:88SN!22RPzƍ&Mگ?mw8p -1cw)Ѣ8&(ddd`˖-~  Μ96G0qDL6ӧ1tP%.q4h!Xk֬z{ ڵk89998'ODNNoc6m9s0f:Vtoڭ pEIcaaQ}ye]oJ.İh4Eh7MHH+Wq
+N<ԩSaȑ,"tƍhkpcffI.xA[;T*E#2(0h@:u5[ͭ2@%$ZA4nq;r6oތ{8\~Ůyc2KKXPՂ"GJ%x"bBAh)<?jc_Ug9;;;L>Dp̟?Ե?cXn]k'YT
+ڦv 	DDdjjʮGI}Bjbcc믿.yVK)ŋi&R(DD'FCDD*gcjIUfiZR~Ou#66222DU]v	VVq.zڵ컭[RXX]rYV;mn:tHTQTt}Q7LVd%>dsSڵ%$>VC~>=&M"-W.Zرc7ߤ:uqJb t^|^*hBϏ-3##~7A˴8Af5H(,jFEV%RI˖-f#&v~!VZ_~rNNNJ9VaӦM;w. wL2GVV[qLLrL2|UI&O2$!77033CXXLƢ}8Oƀ q%899qqqA߾}vZ{ݼ_GM[1jF-*_=d
+ק@
+ر# ],maaag͛7ndBP`m]~~ǱdhE>I?Z*+*U""h;ԌT"0
+ -x;lA*fÇ)))e>;uTXYY?0Z]	:Q4iIN@2ŋCV_-^BQtݺuX`Pb:H ̌]O>222O?ٳgSDDڵcԻƏ/>V
+b1r???:v%&&aZMjZhJƗ(77WZ,iyff&_}aJII!"Çٽ4Rػj5(˗h%^h4T*)77]s*pSD`vOLLofftʕrա, <>5jʎ}HW\ fyBZ ZVk [VRJ{lSJJ$qtjßa |uւ[ uŋ&z)--T*}ݻwW,:Cc-"x
+fRPP͛uV""%v߹sٳgF	
+j$%%Et 999b^Z7[nQrr2;ܾ}222HRхϟT""
+7n)XPypEEEKAAnZ_hv
+W PpMt.P)M<=3cp/W=jB /D
+~iʕ\?N2-ZD999%(Fm:qϏWVAޤaÆ ;wnCvv$>JM}J K56>DD|	}g]!	 Jf$!~8NF]Fl۶m5kְk
+		a
+h4㞙I=*)D:T}Kׯ_'"w2V55kRIؗj._,KhzN_%jiΝԡC?uXЃ!)<鴉&&&$K 摕ELj+_f A[.Ę3# =V}~xTyWLF2/YLL #)+V@i Z-{=Q֭[#duPPy=<| ׯ_pEB~8C\\fΜ|xy";＃֭[w ϶~DR)!zUQ/	չ4?p @vv6W^E~~>8?pT\|3OkDӧk׮ "mo6%ӏ͠/`nn///"5uelFZc͚-ؿ7D'pQ|W5㐘1?|ϳLhn݄bZS`ҥѺuk9VKw'Nħ~T6nZVY @TBTO>-:w)ٳt8 ~Y(&,,hW^ѣk-aaacG!))/~ɒprj
+ssS=7o^;oqطo'ڷ׭ioٟgիWS03C\l|i ]|*>aɒ%ϰxyǳ_?6H1 $TÇd*ei37l@DDtQd-1jBs*&	1ZoWOyIc\_1i{)99)))T4Yj믿6 ࣏ޥZRZf5l؀2e
+um7{E%"SϞ<7}0QZs"ɓ'ט@y 
+
+w	X6JZ[3jРڏ}&++]s- 23ɩ1lI
+E6_"ݺ	G& FC2f͚ױc+jڴ?!"/ BFDDqqVZNDDQQ!daaJ&&rfV ufosrrʽ69^$v0ɒغJd qqqHJJB׮]hpݛiQ===Q^=DEE!'':t@~~>n޼={%2#"")>ڲefϞ-ŉ.{BY__tPPPѸqc"55;wFիWѫW/ k	{{R.
+ ZT(iF4uի;wn;wϫkːdV&**
+۷oL&VooeEK  
+:tS8qw¥K77sTܹEχ;<yRl]>0-[V^hs1X
+
+
+O?Ef?h4_ddggcڵOaii	KKK|g˗||$&&8<wʕ5x-bCCCak|է~Z$Gرcѯ_?~?~NbbӦMϼY`fBw6l@XXXx"llln:XYY{T*8:: ޽͛7nAA֯_oPs'//{̙3<x0/^off=P('9Dsm۶잵k""" f͚O>1'WÇ [[[|wppp`|1xoI&Ν3ܺ.\\niӆEvv6>S,@
+7o.j54i҄~wR*y)>}`ܸq3gpQe2VZe0g]t cԩԩ{6l?6}WhԨnٲeHOO7xOΝ>{Xn,Y<(J[Π}w`Ŋ}vaҤi}BX{ڵ~7bu~SǮT?,ø    IDATg}"3'0dp\p}	 qAܻwAAWѣG/\v"Bjj0`@_ԯ {~_{|ŗ6mׯĉ/?GHH(<\l]dJ_V^DZz3:t!CPn](JOヨr?#rss|wʕ+k΀~:OMV3|A~qԨQ0` _!00]PPܹ#Y T2hZJII7F/IY:44|||}k֬amݺ޽+h;1K(ɫl+
+ښ5k(??t׮BBBEUǒǸb>dgguk022ҨaCGXKޗׄ|W]\R*7_Q͋Ñ#GܹsK,oܹqC!Y1111Ĥڣ;vYװ0K cT5c_y-J;Me>ŵ~vQ{,ߪʂQc^Ug츸8ڽ{wSZ;--d2PoPzz*z%յkWJ @q`ujj*q?@)˗R۶H_<YG mٲŠ,	nӍ辪5Gߔ,fWĊg5edd+<M$IQ)۷gtǏqA1zqXbӱl2kwY[[޽{ejۊӜ޾}puKKKܺuhժ233nݺ1k.]`bb`888^^^0n8&˗cS>˼onDEMk[W}׿x":t [[[ܻwDv!;;oF>}u		7oLDEEݺu\.g|Y[F֭P%}_qs玁fJ,bkx'w^lq	/'oC*g;4kuօL&Ghh(jɓGݝqR7x"Dݻ,iam]h!_z7o(qlܸ@___蹴J70_CɓF<VZRch+ƴɘ>ZS{j+O}*}?UY]\yU1Ki{hei2kEe۽c&8992gΝ=}NƏV=!99Ju[[>/|NhIOϘ6^&iSgW]kNq;ﾃ9VZbפI(JfizXג \?~<Ǝc۶m5kzꅃ"//F<`N?;}Ϟ=ӧ7n'N@RaԨQHNN6Էo_FH9nݺݻ;)ѭ[78qC #G'8?6Z[Z-r98͛ѿHII	;vw1mllѕOC&`p->lҤ	P^=џ$%`(fV5+	NNNq3GFXC`ذ1g{0r9lYyq
+,b鲸uJfKJ\be2r9T*U[	//"Nɓ%>W-~7<{#m1e8}֙-= سz17;`~Ν>&&:׈7nWX@U?q
+DO?{SSSTRŻ ox8ٳNMC uӧptt\.g3.]+ ЧOR  _2Fh9/AeJ*McСJ9,@U2ӧOŘgb8Dd(
+uP?g~:u0訤ySt4}tV%޽{׮]<==^B6`b_@Dh_~]cc _Çń	Ѱa3\t>±c' Ѥ3//ĝ;P4ؼR{lq~	Oّ8~x}= ׏	Kr2̃ZmC]RϰBD%jqyyyjDX9Y:utΣo_,==۷]v21vssbJ,]z-[z37'O Xf-mYcZ=z~ƍ=gpf^zpww[guXF%eH}˗r9Q>r*X|ʻ/Wz(R(7тycLkZRTh,?&VKK.xjlTߤ֭[E-[yI?b!QU*j""7֮]KJNrQV|U_ttďCM).*mzu-L[?T""ԩSDDhY2lR	FTT͚6҇֬YGo/h+<M6MH!!7]ƤIhHPB`> KKK%K8 R$w	R
+F-п5 P.ԩSk@mxZ_Svm%{{;JIyӕ5/3 '[wFF# Ԥuږ М9ެj56 PN ͟+WtY ߿C ւzHffԼ;={U+iQ(77`/hc 𒇩S⭷2PZ8I?/L%K?_S̙LlٲVADX|9=zuŔ)S2[\$mM"<< qF̛7Zi
+
+p<i;w{{{"//]tA^^Yl۷o戈\]].6>~NNNݻ1eʔjվ  <xT:wtCLLT*<==T*h+22-Z(ybݺu
+]B[GWF1ydݻ`~{Ǵ*8x`Ժuk,\E"|Kf$H
+\r!!RѲk0``&%=Ap@=?g"(:EٿF,SRRtff hǣg>̒SN"##]vAA!?w#G#лw?ԭ[!==~~'Y65k#wڅ, ۶m}711^A~	K.E~~>8q"d2=z&M`k.~e_~%fϞwww?...vwy_~LHн{wܹKx3ÇǱc^Cp(ά8Fqrrh4h4A`ƍX` }􁇇.]Obĉ%2 pQ1B4Rn/c]b
+
+YPP SS"`x{{CbÆxw [nEϞ=ѢEbٻwo՚@pp0$H
+ JS.
+HMMEݺu]k3/uZjԯR%
+憴4vNAAs!"UfDDD3HajjJAAA@DD]v50'pwwיp3ڵΝKtR*W|
+"˼ͺI7t}f|߿ODDĞ1ִe2{h4.:iIL&?~8sŸt0swܹ\߿OIIIilJ'yzzJDooJS~-mٲlbٳmǏ)88X2yAˋZ;wӧO-SP +Xza  zRÂp2M=z;vF<}Q[ڵ+5nܘ^4%""kkk:}4d2277/	 RSSwߥ6mQf^)j*:{|ŕeYnxFCyyy췼<TlJHH͛76l@F1\B2T|$PCY8AeA<>y/L[7ndo~~~t:p %&&ҦM*KHøuXhtZ $''@dmm]l.Ձӱc-Sh%˗ի~~~.ho	Z&
+qqqk.AzP=P*l2Ay抜ypG`+ˋ"O<aQs322  Ϟ= (
+oơC0` xy̝;YYY۷/0pWD8ԫW˗/70;i̘1H:#!44ϟqχ8q8~8RSS III,JBtt4{Ott4K[oa "899a٬#99H_WG_EcFDѣG4]m!   AR1fꔜhKV3""̝;aĈ8p ƎR9s	.b:tET둄Wvvv&?'lق4#''-Z:P	$<aᳲVEzz:Ç
+܋FKjE_~eҥK)++땓JURƲ4rrr/(( "ڟjÆm۶QDDD, j|߇UۻKsJe$ںwikVZy1?K*	~N:5yYd Y  *Y6
+gϞ	Z^JJdPEŋёue%I#HX̙3ADE+,={6lmm_
+SEX3|[Oϖvqo8;wwqC\\?>>ʃh߾=MC&aLK;sLfiO<M䚰8(>Ǖ;Cin`qa8?wqǏhWbb"._ hӦOhUѲej<9{H/XXaÆؿ$ :?E$H 68w.^XZj%vY!>>7opJYUWã̊pf͚49q{.<==䄸8ܺupvvF\\Z->xzz/]Fxx8bccXp-[ ==رc8{,8ӧOuV@=,Rrv@Dpvvkg7ozS~"!a\jEE!O%]+
+ @NNj5 @T"77.[Bvv6[88qNqpppȑ#[oҒG@D10mٲ%ВB8y򤨄7OfcUSӧ.+ALMLL`aa!hB̌eWm<L&C:u-I&'aiiYiVVV4<777[[[AlܸRd٪*?G}+W">>>>>ʕ+={?ҥK?bʔ)ؽ{wPbРAAj^C @)			hڴi7رchժ2*
+GEaaaRIII(((@f͠RAIlt$ٹ_uafڵkX`,--Ѿ}{_ה P8૸NHm(lԯvM ]r%n߾> ~~~??GV ]FcR5B.M'\
+\LUaKV#77Fff&qrssq=taaa}6N
+ ؼy3^7|p֭[u "b̘1ֱaÆqظq#͛'ۦP(טV
+$R(J2,ڂ8߿֭"""pL6 o>,X D333$&&M	Kx!67/R~Xn1r`ٳgplmm1o<Sd23vpp0X|||JPh߾?$$DX I_BpYܸqEdfddw{ "j
+SNe7r=N0o#FŚ?E|~F[Gvv68Ù3g@	ӓVa֭6m+wĉ,rzbb=zҢ/A	$HPK!	 Ĺs]vؽ{7Ξ=E]v1h 6ik׮0555*qRCP ++]18Î;ӧO3~Ȑ!0aAD8p v
+"\\\Xnnn̼8MqǍQh_AchO5YK(ϤV^^mÇl}aǏbs%SCs҂/DDD3ŁP:G^^KZ[ۘcgUB@ddT*ZZSmW7SuKKK̨( }cy! 0X&Mɓ'h4|.>|Z'BBB#GBVڵ+ 4jԨ'T@RRM#44+,,z!!pxzze˖Cdd$F"B||<OHH=RiF촵`_^Pc #::ZP)\=z6B!33۶m| XrFpEL>ν{C
+ƾXn`5lIII
+V~,[L2椧cΝXhQ, \"'O*ɱ:y>J|ef&G/((@jj*-%%ZСC,\dd$4۶m3\	"B6mXT{:?~>򪃃Ϗ1vWࣺE׺uk_UJei=i+!!?Fjj*Ç3S|>'?Ϟ=L&aԨQhٲ%s5m t5#-FZ-
+~zd AOEm)jZRSm^B&  x
+iUm$ pa۶mE;"b&_Sq޽1vbLJbAZ?oRGD3f:v hѢ&M}fث?D4ZthKa88s8CVVm޽	ej5-"BAA6m
+333T*/ɓ':uTX7޵D,Q`` =z$-$H A	 @$6mϴŐ{GGrr2J% ٳg̯&//}rr2ch
+"=LS P~}laaa-urr2J噲f5ZR>?Q瓓hvv6 Q*{nW^4hvvv5eё477gq	ׯƍ/_})0l0QE޽$H A	$hQa$qu5JL@XX8CHHjCV3f0`4h "՜V8oIX"ѣ.
+xh48DHH8Chh(8P10)SQFpWP!1r(Z 3_nZ_JD$&tӖ    IDAT0GVJk@B?(LB!tPN" VqqqFbb"/^ٳg ...x)r߾}*ɓ'III\.󑖖ƴo߆qQ4i:uBtt4nݺŢxeutATu:q\#\%-D
+
+LV,mڵcƌ%?k׮יD[			ptthh(%%prrcղeKKAQA yj/oF	x5Xg1v	I P	?~쐕CR!   >8::o߾uVC	Խ{wl۶Z(((g@g>ͧ
+JN,̛׉|! 0&+#G0j(\t	6l={  ___1̄L&-T*XeMlRǏѤIi$j	$H@V<l0?X`޽9s࣏>Z˗ 777Oq:t <y			offff|:X%]h3 O<80MYu*ˬs\\#cǎ8D߿?zb嶶ff3f`Vueejjhz28ŋED"&[QجO<aA+h͛8u0o<xyym۶hڴhKJP{zm8Hm D;BOI Pq6oތ_...Xt)aaa'''1c~?!C
+Mo7ܸqCTgrZq믿ppw;S)۷AD0333\?~xԫW
+iłXmB,HOOg6KqbbbsN6>>>̯!^ç+tA6m⣏>q=C Pt///AÇpႠm|m۷\A5;;kD=zT6jJ6FFF"00P~	گXvm֭m®]* kZ-֯_~fff8r wpuuӧ3ppp
+E@ OUX)˼ѣGhܸ1͑аaC(J$&&>77VVV8sйsg$$$͛,@߬Y'L۵kg|{ >%1EDDh%XZZnjժ(s0}jf-0i-55/^رc Fb3nnnpssc,=xXXX1.nv؁HPQZ:*ZƼ<}bnB\h&tfJRF6e`тGD*RQQQ/ Y T͛???<yGaO۷\/ÇEcq'-?yiZ&ݏa#G8dggǇޞfayƘVVV "4;wiӦΜB-D5oZ-߿/*3n_}`˖-Lc$$$8\p~~~,և+Bk;v,+w	dHՑuoKVo>ɬV	$H %$ Zw20qzݻKpPLĉ|҅(4+77֭c/AVVKCw)pJRqg2mi>}0j(lll0k,Vgmm,3LLLXydBM[YpkjJT=qsg=Bzz: ]
+}K.1:z(=zi>}gft퍦Mзo_9D\hH?~l@k%1՝F8?b 7M+A	$H  7֝sXl߾1:6mJqػw/n޼	`jj3gg5jĮׯ4[Ɛ!CXqƱ:WVq8{h%={$.eYzC#l߾L&æMV̷ׯ믳w1 "i.RfEKR1p1:tH*āŋ	=z@X&}v[ĆJ4#A	$H 	5,K
+8+""yyy  :G^ge&ѷoqpqq̙3فrܹ,ݤIХKN_;gB tLMM
+WՇSSSS8P4Z/[[[ A`RT*<x}(JpWڵk8Ğ<ƌ޽{ZxWkkkMy~E{cj :F||8?AȂKc=M6WG>}͇%K>ĤI1a[:_XC?m7nkcի':&t7nlph޼e=Z򬬬ЬY3Ac6h@NPÆQF	ZY $<QΝ;&Me˖'m0d:u
+HLLرc]va޼y t!ˡT*i4b/[nSN1/5Yq9001j>>>?> `֭߿?\\\pyddd`̘1jP*,SBnn.,,,0=!|2z)5@LtӧOcƌV?KBn}׷owXYر;OL: Xɓ'c޽sUkR6J*;ﰨ.ґ&JSQv^bG]b-bDc(AE鰰| WV,d93ޝ3s挲dߖy (#G`Ν|˗/c޽{qŒGg8XjJ4s+ ϜFDD?~ϟqJ,*aذa033ðaФI> 6|||<555#Br9W+ݖ[lT䳢͖6_C=y*;^8S?{,#.\s3ÇDVZA (lTI9mPNߺ_i/_f  q)c/qΟ?VVؽ{G);Xdߖy (yYfD6m{rxzz"77;v,&Ncʔ)%Fk/0k׮p +!___6 i&>jjjػw/ JJ1.yz T֑:򖛛qeݻwɁygˏ=
+}}}n8<\q\(Zi EYY2ngmm]Aqq1T[  0c\z	7o*<G/1<{Ux/1` hسgR)quL:ݺu^~0$$$C###B̘1
+kJ2ēCSS`jj\
+P\:Ɂ#$	>|ڵk <x {{{hhh 88D --7n@ǎ OF˖-Qn4JB"pss4zCԬYp}7o999Z* ۷2>29wUU5DG?S]hh{hذ>޽8|xz	|W/žqi`0F84%C	ѣG_~B2tuuΎ]FΝ+5-\NDDժU+xESo^^^;wV2|V]H"І۶mh\Ar%LVjSrRij/TJAAALgϞVZ)%m $J  ===j߾=eggرcIOOi.]xH$"uu5Dt  zRkGMj9T*}yE2d nQl^}؇}؇}؇}0 %0tP۶m1m4C X`LLL><<<*<g)뒉`"Յ+ Μ9;#QQQprr w\x5RXKr<L_"[lAJJJi%''1GJ8z7Zh///B,_K,O [p&$$y2*?/^ر8r96m5hjzjjB,ƍO?"33WA5@~wa?@<} 0i$)U^Hu \\\мysױ:֬Y <y2rssghh(n޼zaÆ*)S֭[		ԩ iT.]R^'NDt9cbbpY8::V.Gew  DFFʕ+U5k|֭[  __
+=ILLѣGajj={B.W39~x>V2ɓ'accΝ;W1aL0իW>+(rss);;)''rrr(;;adCbf]]]+w*OA=Lf7nHDDt
+$"XڲeD"H$L&#DRCYo=RV=yuuuRWW'UUUJ***$ EGGzU짰GYucrrrhJ͚54?y
+7 _
+x4޽,,,(//Ο?O (66ZA PRR|_<5 ;vlYQ,_ М9s2~V\Y2v_[" 4p7o& 4aK,<oݺE iӦz=s]cd򧸀]
+E}jN.cҥx,--!|M*zֲSPP\i山̄$	BCCѠA~0;wzzzT*Ez۷oM6 "~c=z4_T}?3ByF\TI2d^zssJGǖ-[P^O^?~2L&Kz-Zݺuða`ddFGNN;rщhժtuu=@a3ge˖c̘+<ycGb(_D"iU1n~}D"`ذQ[UZ)Nc)`deߖ ܹ3LLL͛JdOяkhh`2dd26mڄ mۆ-[	(=wwwDoyX`e+Â2Uѣŷ.
+5ˢek555O(lw)cǎ!((ׯ_ǐ!C	gggk֬A@@ Νz
+;w.nܸŋCUUϟ?;f͚_7i$TRc/qgԙt)e2Xڟ.!`nn"P(ĳgJ4` '6m>޽{W
+Í8<}>^>,,_wMCEEaaaӃM .]-[8ܸqDQ~}ހ?~<?h0rH²"b䗵<dȐJ!'%.W3i$hii)))Z,>5qFogΜ;p r9ADU9[[[XYYwAuϟG~> p!9J|9s`Μ9e\a(0;ƾlm߷yHNNCXX 9>M6&nܸ//
+sGMEТE CI=*}бcG,]B8ЩS'>}C<Ǎ۷oWX~qSÇ#::+ѣG
+˳_~HKKZj pvv<=:u*+,ի@N޽{_΂ (\7jԈQs	tڵTƍ߿?ZZZh߾=bcca``*U(\pԩS#[efb^{{2WZ"@ ez*"""0f.^sΡO>ظq#lقcb	ӃMHHФIkǏ1bL6۶m?1h ̌o~] J_&;,
+*q׫r_+cL2VPPB!cy.--k=KF6 PI:Q)LIJDD8z(7oCC[nƈAjj*իD[nQR_:u@KKQQQCڵ4mڴ˓XTvG5>^EݺuzϥKpر"ǵ! ɐ555hkk#''
+R
+b066g".+8v޽{ڵkCCC#F@*UXuuu!((K,RD.cƍHLLallݻw>|8j*L6H`0m2* LF&L cccZ4堠 ե3gmmmZj4uuu")d2q߸qݻG;v˸nݺ2E/.zse0(GGu'&;wnihт,,,{DD4k,233={۷	 UZKeG'"
+gΏdnnn7>>f͚`0y T)))
+
+BQn]YftׯPx{{cƌ
+Xpas̾rC$Յ-Z>Ѹqcܽ{>+/qΝ
+]{WDV:~(kz>}:D"ͅBZzzzF6!\ЫW/ԪUF	-ZKw8|0Ν$`֬YJ	
+
+¾}@Dppp1ydÑ#Gpi~P `0, @sA|SNakk˗c̙pvvFdd$ O@Vo+DFFl*.\(v7ҐH$ZΈ(U_݆R;wȑ#ѬY3;w[lIJQsU.g`0(O. Dff&-Zo߾ C.^z9s&5jhBxxx|2MРA,^oAE)+B<y2I^.ֶy"+pb]t_֭[cĈpvv6f̘ 5k*}_ӂ]#G­Z*  ;;nnnpqq	.g`0(~. ޼y{{{!%%YYY}6:vcH$|@2o+fhhJ#w +t_O!Jmc<77k444eWP|ሬQxz08q&&&HLLD#%%SNŉ'SrFB`` /^ooo8{,f̘իWpuu."""^$`0 5 w;޽[)dŐd^#;;4V\RԄ'ϛ7qqq_c~~~gݯ]}nݺ5jRf򐜜333̙3xZl	;;;]t}`̜9¶)`0`[(qY5&M7o`ll͍$uurs/==k0~xD    IDATxzze+nV^&>}zmٲe<x07nPx{{֭[عs';v`֭6lF6App0<==accCCC>|NNNԩ|O 8~8f͚{`0F)n7ovQiʴ~4hЀ_m:::4۴iLPW I&?3֯_q N<gbhܸaȑprr1at CbΝ  deeaϞ=J1vr9?$xyyHLLDǎ g<=XP^@m-򮈼*Sz~ƃl9(%*z<^Wu/GJ S9y矦;_BjpJЦ?A\rz*um~^^^	
+-88Y&D"ϟcǎt֭p2*k!KKKd2$&&FwFFlقnݺ)(p]v^ˌ;o߾xz<RH7o=FZ*EVT{ؿ? CPR~8CBsܿ BP$h߾GiD\p	'Tj>opAܿ{A-<x۷uuL1R8DGGaX`R8}8_BѸq*}HVUcnnT  22\.C>^pvv+S 22;vl%+ )%LܺЇ'"XZZFJ{2qП?={vC ʹ-9p\.Μ9m&мy{)AFɓHjjY05m׮]Sj^ZHH]]]rdeeaÆprrñadddTX[[s6P~e˖ҥKQvm"99P(DXXlق+.\0aʕHII?i&bĉHMMT*ž};Om65
+#;wP>VJ~|3g)"}qvpfŹҥ_iӦEXX8"Q#mvhRS3!)+
+CC#ښɓJ:t}EϞ=`={A&"!!=KODHIIEǎ>>>x9=
+?9?{Rǿ@ÆPJsh{PC޳g`gHTZ96tw4h_+Wnر֭R͛waܸXvukVwLZPRz>\]kPr@~@g畷d 8<xpuԇgԩSkW^8\W@nn.r^P3'`6lغu~q6/^D"7E"Pbb"%%%L&<JLL4TJLL$DRjZrnJ>,r.;;J (Sܹs444f͚tAʢjժ3%%%ez-lZ~=QXXڵR)?ם2(Kʛ`0 Sgee>-^I]]HCCpͭ.uViڢEC!\NrmIGG ZrQcc#9sRr\|aѦMIEERRRgnn.}L0$ dll|I<{uВ[3P3&±޽Qݺn$=[ 
+	{L ֭J45j	B@)J͛h]^ 4gBGr˙Xa}vSϞ^$$& :{4իg%<[3glll#7ŋvZHRL2Z۷oO?q޽;LLLЩS'mꂃ믿BEEAEۻw/:w}}}}Źs 
+1rHׯ+^DEE!''۷oLܹ)))8y$ZlΝ;ԩSJ)GY92#w'$uu5X[[͛WJO^~:ub owo8t(@܁Niu{m6꓿=kd"Tfӧ䋊	ڶ-'O)%uaL$0f/|}"//OiV_q8|xRfT_1###'N~JqY
+h7+ٶF͛uH|qܾڵ穡a ===DG?EÆ,Ǐ͛ZoD:n=~ q&:۷oB*-6,Z|g)eOd %hhh HIy}}QƷ$99޾}KV'O39sիt""rppP7''^xA񔝝Mr^|IYYY
+edd(]ÇӧOٳԶm[[.ΎBexd3?w%9;;ӻwݻws@!yJ}x2 Phh(]zƏ]PRRLKK"heԽ{w]ۅ6lXM999
+3MXm@IIoiݺUTF
+˥tz((R}I$(2''')4h<  PBBn\x
+rݻw}"Qhe˖IRhvv'I&Yvv6pQ8߿[ ĉյ:CqqJyr={6ҥ)//Գg7JJzKԦ'j|v
+fr6$	5DGPd${œ'O۷cڵ3f.] ?sL4YBBB`oou"99-[DDD=z֭[WheK96`0ߖ<
+ŧODL C_pvv.mfK-x0w௿߇~ ЩSG|\XZZbBPPR򌍍agP}|FF:={nTjXnQˢW/UE۶hS)coPו[.Y3Ohzzz.Ǖ<D
+_,,,V)}z/*P:;1{l2gq?~;vlKKxzvq#Ԟխ[czu
+ېP/+++<y\)}hiiO<6Zꈶm[+۠iƨVR*Hԩ8z/J\pgߐ&MPhh(^<x@ӦMܹs˗s7o0#ޞ233uXLC!"ѼyH,+MD!7775nXaDQFADD6&GGkrqq Szdb@mxRZZ; _9G&rqqѣ峴4!C۬ŋ\\΂N<Bǎ" 4{T#}ц26iҐ$	ǿ͛RnvUywu!"}Ҙ1>u7Q :=zըQ\\ںxV;{B." 4vدݻdjժ1/cϞ)//4lP@-Z4̯֝w98%(rCs0ǁ233nHJz[!3+_ߕ >J.(<<ON hJqydnn߿4IDu|~&FruA]Z茔 P@NOxx˗*UW#" 2d I{ 9qJ ʕ+pww3Ν`уٵkWyWw׮]ֆX,T**bϟ?W8~"#W7oOu`0[G@("77X~=444>пP9s۷oǂ!~YE[[Cy:;Q{.ߢ;UF6###?)&;
+'NCRR8!CyUUE8k=z={1t秡!CA*͟Y466AZZ"<f<	 >>qq	hf;Cӳ)j԰q|̣TY02>45Os+ox3uu50Y  SSDBpWaʔYs{7֘ש#[j3***JYf=ժ9 d2R#$LMMx6r͙3;ӧG`ooV ))oA$)ll ~bc`ǎ!k˖ڶm"7qVڷƍa
+r	8èQ Fs
+}}rа*4i+sҥ<~AȑðA픪۶m&vY?!(:N.]9-6 Dǎ:::hӦ5%yb߾}8s4iȑ#C>}  Avv^֟bό`5jFZ*ͅZZ
+p##: aioӉ:wRnfR HKKqmTTT!~U~,# g N7 !x4jRE&T8yACC  px	PQ~+rl={}oW}pL/
+ihhǧh{bҤ>}/}AC7~X>\9޽<K*ρÎlo8|xz7`)8qo$%%+edd剷7Ғbq:  n<~ VEV_<<~;<ZndVZJբbJVDea=QWB^_(bΞ=KW~pwr
+]v+z*İ@w<yz<|WNKKK:tRvqE#GR[ltGB깐\<O*&++Kꢄ<  tQի	 R%kɶ\ ǽ{lYAsYdl\NgOfϋ q'UU5JMw厊
+% cJKK 
+tOCCHw\
+<E (0$͛XRSS3f(M8 T@Ǐ''Ǔ**^F.XwرcRR^+=/]H xYG' s6Xvv
+>}XW`0FezR  lG QJ5:g]!rfddRzn:]e0`}uIWW455ׂR)]אkܹs	 铍	zj+MwY'?r:ԛ,-Ò22ݍD"9:Z Sa @ #mmBD)::iD@diiH YFRDD!55Ux<Γ65m	 jһr%D"LLt8ZxRoZ5JMM{H$"MM!~۷g+`0R,8			ENNQ3 N
+rDFF ++UhN (nGHHxUUʪʓ"55J՝/#>RF'Nxx(DKRr9=W|,T<DDD!==}]:Wd2<zPSSWJ99و~ZlPk(9yׯ@.5
+-yRnݦ8Ԩ˩"ׯbqMP]i2䙘? AEİ/]#J1>>/^A*vv%Gl `0`0 V`0` `0`0l `0`0 `0a?>7VYdG`06 `0qسg|||>+bhA.N:qOQzupggg>͕+WB.Iɓ80`0UB*bƌz* GuPQQAHHmw^xK.x$˕(>D @ll,bcc!Ѿ}{<{!!!pssc`0`T !/_bΜ9Ě5k`jj~	_ƍa``v);m4<Rd-6u}{uuuaoo]v z聩S`0`0  P6B?~<XØ1cPfMTREǏyyypppL&CJJ
+B! @EE͚5Cƍf 8A`eeGF`0`0  (444@D@&Mlddd(\odd4p:uCW^͛71n8 ۷N:8$&&ؘU>`0 i߾=a``"++>>>pwwGӧ3|8<`ddUUU w0zh"<<?k`0ህf0SD/yH$=
+$mۆ#G`0`0  LrL6`0` `0`0`0`06 `0`0c>v'"cŝg `0`T2޽KllEl8j
+Up̟|lp"18%ƌ"9 `0`02 u^x*b?{CJJ&$9xde~3  `0`0 J ˖-=hiiK$J+f `0`T$ݺuABB>|~̝=Bz?tt>zzر&e0gCD
+R\W~\q?Q_lmmvZlܸVqY9r /r˗ dM6,te̙3[e `08ϞE[>xP)"Mtذٳ3wEL8::ۧP|C|Ia$lm/Opuu˷X|1b6mZ҆ZW^,^ZZZҚ6ڵk7󛫴3`ܹ8Nm6('._DB2\?86;P7ڵc8Sb\NWűcc022a
+mzqƘ3g!D&aɈ۷o  [l@˖K' `Ӑ򠮮pA,f͚½{Jc `0гgO1T`/|.X1+
+<WjZE많vMIi+ʆ8Ppr_5mwE"__o?@ff&el%0GΝӲ9my=ɊM4u(oagg~*zZMI:_X~VdeeB$۷g/ȯf͚! `Gѣݻ{tSǺ?|pDEE!6=z `0?	F!++/^@Ϟ ΝMkE7 L>	4Gc,\89	4@ƍ{v;֭ =Lz#w^ܹ}fMK/_Νӧ'jr A}VȠ&F.!C( ҥd*9-E\ҒѮ]ie  eIDAT;grhѢ	4is 'G\z5''lK.L&T}pN8N<Y@.cժ%8rd`Ԩa8~AqEx{DNN:'O"1yxAغusFOFPeG.|aAYݻwƮ]J4r۷oERÆ۷/ݼy=uG_pukk´i+ ?!2	Np;v GAzx* L4CͱjrHb>wY		I1b8 0|L07cǶpv##%%QAc3:vl<y4 $>n]-Twr,;wX̘1nhڴ),Y𾞀\1&N5kжm[ٳ8aa=zЮ];=C^~ؽ{{L&æM7$];gu~upX[+ߣ`0hvH^,VXH82XI***ZBCoR@@ik׎tQq"YYӍ0+>Ԡ/㈈ƍKƎIߥH$DDu:RQ tErss]Ӏ,X@ᷩE23Sرd2uI P|"si ѱ={ц\BǏI wn}Vur	 4B @6lXEիRFui%͘1TB={x_f9EDD$gڵkN!!whݺu~b< `:&-\!! y{{l@}rn]O hutejРB;X om۶޽K "5kژ̌ԩSt4|ݽ>-[6~a*C5yH5kNh˖MVX\DDwNݻ ==MZWJKK 8,,iΜ˸ К5+)2.5iTAƽ{ z&NMkW'==md {$	999Ҋ(;;̩vmG{޽TwDDJVVlO`;
+q .7 aaƍ EGGя3@ n{KILL *ov""!mmm20Цիי_Rhg*6Muuuׯ2ڿ7MVT*U(6 `00קQF2 !CC]eJt.=~A @LKje HrޖFpW76m2?  GDoW'""CC]ڶm3>##͍h||Փ\\\O e:d7ob Ӄui:wޑN[h0 ~dhXrs6@aauЩS+֭BoFǑXYl<R	5n܀tQLСTڜ_~翿|OFtI|PP=V4ex""Zv-ׯ҇[޲e#0a y&g898TS'*Ae/Ϟmdg#P@#F/"ŋ?iUZW""rvA3gNUEU%KR:8}$	BTV͊\?2Uh?ӳ%5hpohĉDDdffFmzH+W.'}*2#I$l.v Q6^ ڱC=ZXX {׫٫sN-ڵ#խJn(cjZUi2% `0`
+. ԬYm~Nڵۘ0a,B!b1b1TU5hCpyãQ!oQ6mT$%C\KFnnϸqqQ:SSc8::UUU!
+>47w˗6l( `X`/#Gle`]WބWie
+UPf׉"2Ϟ=kr9RY$%%#!8ѣa``  ӧ/Wbt	Dm흑H̞=Y[CMM׮/Rwƍ=cx2]tիWajjgLrǏADC=<megg8[^
+o}FDhٲ	5j^pL82ϫjUc"&aK$"d29.ƍ022k->]@;  0o"֭[2oر3d2^}F, ̐8>8z:p(֮] 5kBBB Xd<=[ASSCm8Ź|F.C"@"Ƀ\.g/O`bb
+"С>~ǃ`iY_
+#CϞbQ:u~ "ׯ `0q211-*VAժ:02CBkܸqY~h˳3q5j@ϧWx"HGHT DD=~()۵kW<x))y .]zipT*EFF:8mual\		/AT1]ԪCê>gΜG֞Iܹ3~ 0{\xyyA  = `|YVAj`ffO-J;;;㪪"TGE	uuUů90T-Z<2XsuS*"++3f̆z!-![r޾}++3>]--  .TvACӃoOSSHMMdYYHOOjM2ɈϑQF@&++:ull,1`@ll-N?|{i~*?6 `0bTU>YgggŋW
+za8#.%%﬊D͕g
+y ;[2rԨQr9
+fO8mc={|}GӜٟC^E"))W-rC\7Ie6}}<x08Z`wT(Kff.бcOCCC\tS!l1ޡaEquLJ$X'ܾ}&&`nnB %%WR>@ @VZDL?싍Tcc"%%CAoSg! 6BB+>dX#x.M*?;[Wޢs.,ttٳ|-[W:t	T;USx87,[d `0ҵk{\g##Cajj ,͛;dyli>x&7`͚kaa{L6[!}{S'2"LLaXhTvڵ:u
+;v)(ѵkg=z_r  QPSSEzzGRdddZ5BG%Xf=TTD
+]@ԩ8NaFCOO[~okKؾ}=[ld몠P~eB6==}16lL.}y-^ks~G^MfXb+Wܰ;ѫ޼I͛"~~3f3A!C@SS}رck? Z˖3H?YNMԮ}(UN>L:a޼yt;ǫWɘ?w1Q^i Lu`D\.)D,RY".XQt&M㺲66PxhQ׊
+^.l r30.|2{s{xw016L@DDDӧ$--_¿ɴib6*G&LY֯_#ɉL}++*WN V 4nh%7wx{{mv~R +̖ߊh㏷I )筭)r%!訖PٰaՐ^IhVWgIoN,77M$iח^
+ggHFF '],I sr2^\K W_+-e}*""Q̰fc1^nZYt5!JOOQ}7EDD:;I/͖Yʘ1r%ȲKf} +6I<DJW=ٶm%t;qvv.Y4g. slqsJnn[v	vۿwNyE/$ 6geGp77*m!:8>X#Azc& j*IH1cHppGN*j\-@lbM0&{vJ~EDÒ30 7f˸q:ɤtRAZ[[&]j[?OJ"""BL< kX[t *+/bx=f~o(*
+UUpԷx͋Ϳ^ž}֧S}{̟PTT%pu@Ro0Za0".M  n._wY''pGG;,EL \r'N&DDEbeѫZklG}/BJʊGK`5_1**NC#$$qqKJc̙ ())Bex{⭷`$l)c$477"/oܑ'NBC(ף￟
+M8t/QQ56+wd2  weeGqLL>ݺZ	Cy	 **ی3gQYyE||"4ܹsHKKSmmmѣǐ+mΝy¦MqRȑC0DD̳Z\vK,	%%WWMgϞ0LŢE	j)on7W9UV/@UU%}l2ܸQ=_QSsļH^@Hxo g--wQ\xLmpq̙<П܃fDP4>\minn;hta hL~wv' 10A corfaִy=7Dz!∧9]z'?kTuk`a$`4m6=^gm|r^=1]] ڳH 'z㣏rqB``bK")i)PPP(. """]lgl6x$S=VgRǁeHNN8I@N=RNU<O3ocs$rm0;Hݞ.uYYUn@@ rrr`4ANN6jjjQ\jkG(XG !\pwzj{L;9cbEs3jmm&\PJ=E[nEB|ٟj/h+ DDDD4I0!℟F """""""r`1 @DDDDDDD  DDDDDDD  1 @DDDDDDD P]+n    IENDB`
\ No newline at end of file
diff -Naur ns-3.22/src/spectrum/doc/spectrum-tv-rand-geo-points.eps ns-3.23/src/spectrum/doc/spectrum-tv-rand-geo-points.eps
--- ns-3.22/src/spectrum/doc/spectrum-tv-rand-geo-points.eps	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/doc/spectrum-tv-rand-geo-points.eps	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,5740 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: MATLAB, The MathWorks, Inc. Version 8.3.0.532 (R2014a). Operating System: Microsoft Windows 8.1 Pro.
+%%Title: C:\Users\Ben\Dropbox\FUNLAB\ns-3 TV Transmitter\randGeoPoints_35lat_260long_100pts_2000kmRad.eps
+%%CreationDate: 12/06/2014  19:20:57
+%%DocumentNeededFonts: Helvetica
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox:    96   238   515   553
+%%EndComments
+
+%%BeginProlog
+% MathWorks dictionary
+/MathWorks 160 dict begin
+% definition operators
+/bdef {bind def} bind def
+/ldef {load def} bind def
+/xdef {exch def} bdef
+/xstore {exch store} bdef
+% operator abbreviations
+/c  /clip ldef
+/cc /concat ldef
+/cp /closepath ldef
+/gr /grestore ldef
+/gs /gsave ldef
+/mt /moveto ldef
+/np /newpath ldef
+/cm /currentmatrix ldef
+/sm /setmatrix ldef
+/rm /rmoveto ldef
+/rl /rlineto ldef
+/s {show newpath} bdef
+/sc {setcmykcolor} bdef
+/sr /setrgbcolor ldef
+/sg /setgray ldef
+/w /setlinewidth ldef
+/j /setlinejoin ldef
+/cap /setlinecap ldef
+/rc {rectclip} bdef
+/rf {rectfill} bdef
+% page state control
+/pgsv () def
+/bpage {/pgsv save def} bdef
+/epage {pgsv restore} bdef
+/bplot /gsave ldef
+/eplot {stroke grestore} bdef
+% orientation switch
+/portraitMode 0 def /landscapeMode 1 def /rotateMode 2 def
+% coordinate system mappings
+/dpi2point 0 def
+% font control
+/FontSize 0 def
+/FMS {/FontSize xstore findfont [FontSize 0 0 FontSize neg 0 0]
+  makefont setfont} bdef
+/ISOLatin1Encoding where {pop /WindowsLatin1Encoding 256 array bdef
+ISOLatin1Encoding WindowsLatin1Encoding copy pop
+/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis/dagger
+/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef/.notdef
+/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet
+/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef
+/Ydieresis WindowsLatin1Encoding 128 32 getinterval astore pop}
+{/WindowsLatin1Encoding StandardEncoding bdef} ifelse
+/reencode {exch dup where {pop load} {pop StandardEncoding} ifelse
+  exch dup 3 1 roll findfont dup length dict begin
+  { 1 index /FID ne {def}{pop pop} ifelse } forall
+  /Encoding exch def currentdict end definefont pop} bdef
+/isroman {findfont /CharStrings get /Agrave known} bdef
+/FMSR {3 1 roll 1 index dup isroman {reencode} {pop pop} ifelse
+  exch FMS} bdef
+/csm {1 dpi2point div -1 dpi2point div scale neg translate
+ dup landscapeMode eq {pop -90 rotate}
+  {rotateMode eq {90 rotate} if} ifelse} bdef
+% line types: solid, dotted, dashed, dotdash
+/SO { [] 0 setdash } bdef
+/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+/DA { [6 dpi2point mul] 0 setdash } bdef
+/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4
+  dpi2point mul] 0 setdash } bdef
+% macros for lines and objects
+/L {lineto stroke} bdef
+/MP {3 1 roll moveto 1 sub {rlineto} repeat} bdef
+/AP {{rlineto} repeat} bdef
+/PDlw -1 def
+/W {/PDlw currentlinewidth def setlinewidth} def
+/PP {closepath eofill} bdef
+/DP {closepath stroke} bdef
+/MR {4 -2 roll moveto dup  0 exch rlineto exch 0 rlineto
+  neg 0 exch rlineto closepath} bdef
+/FR {MR stroke} bdef
+/PR {MR fill} bdef
+/L1i {{currentfile picstr readhexstring pop} image} bdef
+/tMatrix matrix def
+/MakeOval {newpath tMatrix currentmatrix pop translate scale
+0 0 1 0 360 arc tMatrix setmatrix} bdef
+/FO {MakeOval stroke} bdef
+/PO {MakeOval fill} bdef
+/PD {currentlinewidth 2 div 0 360 arc fill
+   PDlw -1 eq not {PDlw w /PDlw -1 def} if} def
+/FA {newpath tMatrix currentmatrix pop translate scale
+  0 0 1 5 -2 roll arc tMatrix setmatrix stroke} bdef
+/PA {newpath tMatrix currentmatrix pop	translate 0 0 moveto scale
+  0 0 1 5 -2 roll arc closepath tMatrix setmatrix fill} bdef
+/FAn {newpath tMatrix currentmatrix pop translate scale
+  0 0 1 5 -2 roll arcn tMatrix setmatrix stroke} bdef
+/PAn {newpath tMatrix currentmatrix pop translate 0 0 moveto scale
+  0 0 1 5 -2 roll arcn closepath tMatrix setmatrix fill} bdef
+/vradius 0 def /hradius 0 def /lry 0 def
+/lrx 0 def /uly 0 def /ulx 0 def /rad 0 def
+/MRR {/vradius xdef /hradius xdef /lry xdef /lrx xdef /uly xdef
+  /ulx xdef newpath tMatrix currentmatrix pop ulx hradius add uly
+  vradius add translate hradius vradius scale 0 0 1 180 270 arc 
+  tMatrix setmatrix lrx hradius sub uly vradius add translate
+  hradius vradius scale 0 0 1 270 360 arc tMatrix setmatrix
+  lrx hradius sub lry vradius sub translate hradius vradius scale
+  0 0 1 0 90 arc tMatrix setmatrix ulx hradius add lry vradius sub
+  translate hradius vradius scale 0 0 1 90 180 arc tMatrix setmatrix
+  closepath} bdef
+/FRR {MRR stroke } bdef
+/PRR {MRR fill } bdef
+/MlrRR {/lry xdef /lrx xdef /uly xdef /ulx xdef /rad lry uly sub 2 div def
+  newpath tMatrix currentmatrix pop ulx rad add uly rad add translate
+  rad rad scale 0 0 1 90 270 arc tMatrix setmatrix lrx rad sub lry rad
+  sub translate rad rad scale 0 0 1 270 90 arc tMatrix setmatrix
+  closepath} bdef
+/FlrRR {MlrRR stroke } bdef
+/PlrRR {MlrRR fill } bdef
+/MtbRR {/lry xdef /lrx xdef /uly xdef /ulx xdef /rad lrx ulx sub 2 div def
+  newpath tMatrix currentmatrix pop ulx rad add uly rad add translate
+  rad rad scale 0 0 1 180 360 arc tMatrix setmatrix lrx rad sub lry rad
+  sub translate rad rad scale 0 0 1 0 180 arc tMatrix setmatrix
+  closepath} bdef
+/FtbRR {MtbRR stroke } bdef
+/PtbRR {MtbRR fill } bdef
+/stri 6 array def /dtri 6 array def
+/smat 6 array def /dmat 6 array def
+/tmat1 6 array def /tmat2 6 array def /dif 3 array def
+/asub {/ind2 exch def /ind1 exch def dup dup
+  ind1 get exch ind2 get sub exch } bdef
+/tri_to_matrix {
+  2 0 asub 3 1 asub 4 0 asub 5 1 asub
+  dup 0 get exch 1 get 7 -1 roll astore } bdef
+/compute_transform {
+  dmat dtri tri_to_matrix tmat1 invertmatrix 
+  smat stri tri_to_matrix tmat2 concatmatrix } bdef
+/ds {stri astore pop} bdef
+/dt {dtri astore pop} bdef
+/db {2 copy /cols xdef /rows xdef mul dup 3 mul string
+  currentfile 
+  3 index 0 eq {/ASCIIHexDecode filter}
+  {/ASCII85Decode filter 3 index 2 eq {/RunLengthDecode filter} if }
+  ifelse exch readstring pop
+  dup 0 3 index getinterval /rbmap xdef
+  dup 2 index dup getinterval /gbmap xdef
+  1 index dup 2 mul exch getinterval /bbmap xdef pop pop}bdef
+/it {gs np dtri aload pop moveto lineto lineto cp c
+  cols rows 8 compute_transform 
+  rbmap gbmap bbmap true 3 colorimage gr}bdef
+/il {newpath moveto lineto stroke}bdef
+currentdict end def
+%%EndProlog
+
+%%BeginSetup
+MathWorks begin
+
+0 cap
+
+end
+%%EndSetup
+
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox:    96   238   515   553
+MathWorks begin
+bpage
+%%EndPageSetup
+
+%%BeginObject: obj1
+bplot
+
+/dpi2point 12 def
+portraitMode 1152 6636 csm
+
+    0     0  5039  3780 rc
+85 dict begin %Colortable dictionary
+/c0 { 0.000000 0.000000 0.000000 sr} bdef
+/c1 { 1.000000 1.000000 1.000000 sr} bdef
+/c2 { 0.900000 0.000000 0.000000 sr} bdef
+/c3 { 0.000000 0.820000 0.000000 sr} bdef
+/c4 { 0.000000 0.000000 0.800000 sr} bdef
+/c5 { 0.910000 0.820000 0.320000 sr} bdef
+/c6 { 1.000000 0.260000 0.820000 sr} bdef
+/c7 { 0.000000 0.820000 0.820000 sr} bdef
+c0
+1 j
+1 sg
+   0    0 5040 3781 rf
+6 w
+-818 350 3052 94 817 -350 655 3211 4 MP
+PP
+-3051 -94 -818 350 3052 94 817 -350 655 3211 5 MP stroke
+0 2578 817 -349 0 -2579 655 3211 4 MP
+PP
+-817 350 0 2578 817 -349 0 -2579 655 3211 5 MP stroke
+0 2579 3052 93 0 -2578 1472 2861 4 MP
+PP
+-3052 -94 0 2579 3052 93 0 -2578 1472 2861 5 MP stroke
+4 w
+DO
+SO
+6 w
+0 sg
+ 655 3211 mt 3706 3305 L
+3706 3305 mt 4524 2955 L
+ 655 3211 mt  655  632 L
+ 655 3211 mt  584 3241 L
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 120 FMSR
+
+ 417 3365 mt 
+(-8) s
+1036 3222 mt  966 3252 L
+ 798 3377 mt 
+(-6) s
+1417 3234 mt 1347 3264 L
+1179 3389 mt 
+(-4) s
+1799 3246 mt 1729 3276 L
+1561 3401 mt 
+(-2) s
+2180 3258 mt 2110 3288 L
+2012 3412 mt 
+(0) s
+2562 3269 mt 2491 3299 L
+2394 3424 mt 
+(2) s
+2943 3281 mt 2873 3311 L
+2775 3436 mt 
+(4) s
+3324 3293 mt 3254 3323 L
+3156 3447 mt 
+(6) s
+3706 3305 mt 3636 3335 L
+3538 3459 mt 
+(8) s
+ 935 3748 mt 
+(x 10) s
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 80 FMSR
+
+1161 3674 mt 
+(6) s
+3706 3305 mt 3782 3307 L
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 120 FMSR
+
+3817 3419 mt 
+(-1) s
+4115 3130 mt 4191 3132 L
+4226 3244 mt 
+(0) s
+4524 2955 mt 4600 2957 L
+4634 3069 mt 
+(1) s
+4764 3447 mt 
+(x 10) s
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 80 FMSR
+
+4990 3373 mt 
+(7) s
+ 655 3211 mt  578 3208 L
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 120 FMSR
+
+ 408 3251 mt 
+(-8) s
+ 655 2888 mt  578 2886 L
+ 408 2929 mt 
+(-6) s
+ 655 2566 mt  578 2564 L
+ 408 2607 mt 
+(-4) s
+ 655 2244 mt  578 2242 L
+ 408 2284 mt 
+(-2) s
+ 655 1922 mt  578 1919 L
+ 478 1962 mt 
+(0) s
+ 655 1599 mt  578 1597 L
+ 478 1640 mt 
+(2) s
+ 655 1277 mt  578 1275 L
+ 478 1318 mt 
+(4) s
+ 655  955 mt  578  952 L
+ 478  995 mt 
+(6) s
+ 655  632 mt  578  630 L
+ 478  673 mt 
+(8) s
+ 655  362 mt 
+(x 10) s
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 80 FMSR
+
+ 881  288 mt 
+(6) s
+gs 655 283 3870 3023 rc
+/c8 { 0.562500 1.000000 0.437500 sr} bdef
+c8
+-14 -160 -100 -37 3825 1795 3 MP
+PP
+0 sg
+3825 1795 mt 3725 1758 L
+3725 1758 mt 3711 1598 L
+/c9 { 0.187500 1.000000 0.812500 sr} bdef
+c9
+-100 -37 15 -160 3810 1955 3 MP
+PP
+0 sg
+3810 1955 mt 3825 1795 L
+3825 1795 mt 3725 1758 L
+c8
+-99 -36 -15 -161 3825 1795 3 MP
+PP
+0 sg
+3825 1795 mt 3810 1634 L
+3810 1634 mt 3711 1598 L
+c8
+-15 -161 21 -36 3804 1831 3 MP
+PP
+0 sg
+3804 1831 mt 3825 1795 L
+3825 1795 mt 3810 1634 L
+c9
+14 -161 -99 -36 3810 1955 3 MP
+PP
+0 sg
+3810 1955 mt 3711 1919 L
+3711 1919 mt 3725 1758 L
+/c10 { 0.000000 0.937500 1.000000 sr} bdef
+c10
+-99 -36 45 -157 3765 2112 3 MP
+PP
+0 sg
+3765 2112 mt 3810 1955 L
+3810 1955 mt 3711 1919 L
+c9
+15 -160 21 -36 3789 1991 3 MP
+PP
+0 sg
+3789 1991 mt 3810 1955 L
+3810 1955 mt 3825 1795 L
+c9
+21 -36 15 -160 3789 1991 3 MP
+PP
+0 sg
+3789 1991 mt 3804 1831 L
+3804 1831 mt 3825 1795 L
+/c11 { 0.000000 0.625000 1.000000 sr} bdef
+c11
+-96 -35 75 -149 3690 2261 3 MP
+PP
+0 sg
+3690 2261 mt 3765 2112 L
+3765 2112 mt 3669 2077 L
+c10
+42 -158 -96 -35 3765 2112 3 MP
+PP
+0 sg
+3765 2112 mt 3669 2077 L
+3669 2077 mt 3711 1919 L
+c10
+45 -157 20 -34 3745 2146 3 MP
+PP
+0 sg
+3745 2146 mt 3765 2112 L
+3765 2112 mt 3810 1955 L
+/c12 { 0.875000 1.000000 0.125000 sr} bdef
+c12
+-42 -155 -99 -36 3810 1634 3 MP
+PP
+0 sg
+3810 1634 mt 3711 1598 L
+3711 1598 mt 3669 1443 L
+c10
+21 -36 44 -155 3745 2146 3 MP
+PP
+0 sg
+3745 2146 mt 3789 1991 L
+3789 1991 mt 3810 1955 L
+c8
+21 -36 -15 -161 3804 1831 3 MP
+PP
+0 sg
+3804 1831 mt 3789 1670 L
+3789 1670 mt 3810 1634 L
+c12
+-96 -34 -45 -157 3810 1634 3 MP
+PP
+0 sg
+3810 1634 mt 3765 1477 L
+3765 1477 mt 3669 1443 L
+c12
+-45 -157 21 -36 3789 1670 3 MP
+PP
+0 sg
+3789 1670 mt 3810 1634 L
+3810 1634 mt 3765 1477 L
+c10
+-209 -32 42 -158 3669 2077 3 MP
+PP
+0 sg
+3669 2077 mt 3711 1919 L
+3711 1919 mt 3502 1887 L
+c9
+15 -160 138 -32 3651 2023 3 MP
+PP
+0 sg
+3651 2023 mt 3789 1991 L
+3789 1991 mt 3804 1831 L
+c9
+12 -162 -209 -32 3711 1919 3 MP
+PP
+0 sg
+3711 1919 mt 3502 1887 L
+3502 1887 mt 3514 1725 L
+c9
+-211 -33 14 -161 3711 1919 3 MP
+PP
+0 sg
+3711 1919 mt 3725 1758 L
+3725 1758 mt 3514 1725 L
+c9
+140 -32 13 -160 3651 2023 3 MP
+PP
+0 sg
+3651 2023 mt 3664 1863 L
+3664 1863 mt 3804 1831 L
+c8
+-15 -161 140 -32 3664 1863 3 MP
+PP
+0 sg
+3664 1863 mt 3804 1831 L
+3804 1831 mt 3789 1670 L
+c8
+-209 -33 -14 -160 3725 1758 3 MP
+PP
+0 sg
+3725 1758 mt 3711 1598 L
+3711 1598 mt 3502 1565 L
+c8
+-12 -160 -211 -33 3725 1758 3 MP
+PP
+0 sg
+3725 1758 mt 3514 1725 L
+3514 1725 mt 3502 1565 L
+c8
+138 -32 -13 -161 3664 1863 3 MP
+PP
+0 sg
+3664 1863 mt 3651 1702 L
+3651 1702 mt 3789 1670 L
+c10
+33 -159 -200 -31 3669 2077 3 MP
+PP
+0 sg
+3669 2077 mt 3469 2046 L
+3469 2046 mt 3502 1887 L
+c11
+-200 -31 68 -151 3601 2228 3 MP
+PP
+0 sg
+3601 2228 mt 3669 2077 L
+3669 2077 mt 3469 2046 L
+c11
+68 -151 -89 -33 3690 2261 3 MP
+PP
+0 sg
+3690 2261 mt 3601 2228 L
+3601 2228 mt 3669 2077 L
+c10
+138 -32 40 -154 3611 2177 3 MP
+PP
+0 sg
+3611 2177 mt 3651 2023 L
+3651 2023 mt 3789 1991 L
+c10
+44 -155 134 -31 3611 2177 3 MP
+PP
+0 sg
+3611 2177 mt 3745 2146 L
+3745 2146 mt 3789 1991 L
+c12
+20 -35 -44 -158 3789 1670 3 MP
+PP
+0 sg
+3789 1670 mt 3745 1512 L
+3745 1512 mt 3765 1477 L
+c12
+-200 -32 -42 -155 3711 1598 3 MP
+PP
+0 sg
+3711 1598 mt 3669 1443 L
+3669 1443 mt 3469 1411 L
+c12
+-33 -154 -209 -33 3711 1598 3 MP
+PP
+0 sg
+3711 1598 mt 3502 1565 L
+3502 1565 mt 3469 1411 L
+c12
+-44 -158 138 -32 3651 1702 3 MP
+PP
+0 sg
+3651 1702 mt 3789 1670 L
+3789 1670 mt 3745 1512 L
+/c13 { 1.000000 0.875000 0.000000 sr} bdef
+c13
+-68 -147 -96 -34 3765 1477 3 MP
+PP
+0 sg
+3765 1477 mt 3669 1443 L
+3669 1443 mt 3601 1296 L
+c13
+-89 -32 -75 -149 3765 1477 3 MP
+PP
+0 sg
+3765 1477 mt 3690 1328 L
+3690 1328 mt 3601 1296 L
+/c14 { 0.000000 0.375000 1.000000 sr} bdef
+c14
+-89 -33 101 -137 3589 2398 3 MP
+PP
+0 sg
+3589 2398 mt 3690 2261 L
+3690 2261 mt 3601 2228 L
+c14
+18 -32 100 -134 3572 2427 3 MP
+PP
+0 sg
+3572 2427 mt 3672 2293 L
+3672 2293 mt 3690 2261 L
+c14
+101 -137 17 -29 3572 2427 3 MP
+PP
+0 sg
+3572 2427 mt 3589 2398 L
+3589 2398 mt 3690 2261 L
+c11
+20 -34 73 -147 3672 2293 3 MP
+PP
+0 sg
+3672 2293 mt 3745 2146 L
+3745 2146 mt 3765 2112 L
+c11
+75 -149 18 -32 3672 2293 3 MP
+PP
+0 sg
+3672 2293 mt 3690 2261 L
+3690 2261 mt 3765 2112 L
+c13
+-75 -149 20 -35 3745 1512 3 MP
+PP
+0 sg
+3745 1512 mt 3765 1477 L
+3765 1477 mt 3690 1328 L
+c14
+93 -140 -81 -30 3589 2398 3 MP
+PP
+0 sg
+3589 2398 mt 3508 2368 L
+3508 2368 mt 3601 2228 L
+c11
+73 -147 125 -29 3547 2322 3 MP
+PP
+0 sg
+3547 2322 mt 3672 2293 L
+3672 2293 mt 3745 2146 L
+c13
+18 -33 -73 -151 3745 1512 3 MP
+PP
+0 sg
+3745 1512 mt 3672 1361 L
+3672 1361 mt 3690 1328 L
+c14
+-188 -29 93 -140 3508 2368 3 MP
+PP
+0 sg
+3508 2368 mt 3601 2228 L
+3601 2228 mt 3413 2199 L
+c11
+56 -153 -188 -29 3601 2228 3 MP
+PP
+0 sg
+3601 2228 mt 3413 2199 L
+3413 2199 mt 3469 2046 L
+c11
+134 -31 64 -145 3547 2322 3 MP
+PP
+0 sg
+3547 2322 mt 3611 2177 L
+3611 2177 mt 3745 2146 L
+c12
+134 -31 -40 -159 3651 1702 3 MP
+PP
+0 sg
+3651 1702 mt 3611 1543 L
+3611 1543 mt 3745 1512 L
+c13
+-56 -144 -200 -32 3669 1443 3 MP
+PP
+0 sg
+3669 1443 mt 3469 1411 L
+3469 1411 mt 3413 1267 L
+c13
+-188 -29 -68 -147 3669 1443 3 MP
+PP
+0 sg
+3669 1443 mt 3601 1296 L
+3601 1296 mt 3413 1267 L
+c13
+-73 -151 134 -31 3611 1543 3 MP
+PP
+0 sg
+3611 1543 mt 3745 1512 L
+3745 1512 mt 3672 1361 L
+/c15 { 1.000000 0.562500 0.000000 sr} bdef
+c15
+-81 -30 -101 -137 3690 1328 3 MP
+PP
+0 sg
+3690 1328 mt 3589 1191 L
+3589 1191 mt 3508 1161 L
+c15
+-93 -135 -89 -32 3690 1328 3 MP
+PP
+0 sg
+3690 1328 mt 3601 1296 L
+3601 1296 mt 3508 1161 L
+c15
+-101 -137 18 -33 3672 1361 3 MP
+PP
+0 sg
+3672 1361 mt 3690 1328 L
+3690 1328 mt 3589 1191 L
+/c16 { 0.000000 0.125000 1.000000 sr} bdef
+c16
+116 -126 -71 -26 3463 2520 3 MP
+PP
+0 sg
+3463 2520 mt 3392 2494 L
+3392 2494 mt 3508 2368 L
+c16
+-81 -30 126 -122 3463 2520 3 MP
+PP
+0 sg
+3463 2520 mt 3589 2398 L
+3589 2398 mt 3508 2368 L
+c14
+125 -29 88 -132 3459 2454 3 MP
+PP
+0 sg
+3459 2454 mt 3547 2322 L
+3547 2322 mt 3672 2293 L
+c13
+125 -29 -64 -153 3611 1543 3 MP
+PP
+0 sg
+3611 1543 mt 3547 1390 L
+3547 1390 mt 3672 1361 L
+c15
+-76 -132 -188 -29 3601 1296 3 MP
+PP
+0 sg
+3601 1296 mt 3413 1267 L
+3413 1267 mt 3337 1135 L
+c15
+-171 -26 -93 -135 3601 1296 3 MP
+PP
+0 sg
+3601 1296 mt 3508 1161 L
+3508 1161 mt 3337 1135 L
+c15
+-100 -141 125 -29 3547 1390 3 MP
+PP
+0 sg
+3547 1390 mt 3672 1361 L
+3672 1361 mt 3572 1220 L
+c15
+17 -29 -100 -141 3672 1361 3 MP
+PP
+0 sg
+3672 1361 mt 3572 1220 L
+3572 1220 mt 3589 1191 L
+c16
+126 -122 15 -26 3448 2546 3 MP
+PP
+0 sg
+3448 2546 mt 3463 2520 L
+3463 2520 mt 3589 2398 L
+c16
+17 -29 124 -119 3448 2546 3 MP
+PP
+0 sg
+3448 2546 mt 3572 2427 L
+3572 2427 mt 3589 2398 L
+c14
+100 -134 113 -27 3459 2454 3 MP
+PP
+0 sg
+3459 2454 mt 3572 2427 L
+3572 2427 mt 3672 2293 L
+c11
+-287 -25 56 -153 3413 2199 3 MP
+PP
+0 sg
+3413 2199 mt 3469 2046 L
+3469 2046 mt 3182 2021 L
+c10
+22 -160 -287 -25 3469 2046 3 MP
+PP
+0 sg
+3469 2046 mt 3182 2021 L
+3182 2021 mt 3204 1861 L
+c10
+-298 -26 33 -159 3469 2046 3 MP
+PP
+0 sg
+3469 2046 mt 3502 1887 L
+3502 1887 mt 3204 1861 L
+c9
+13 -160 242 -26 3409 2049 3 MP
+PP
+0 sg
+3409 2049 mt 3651 2023 L
+3651 2023 mt 3664 1863 L
+c9
+8 -162 -298 -26 3502 1887 3 MP
+PP
+0 sg
+3502 1887 mt 3204 1861 L
+3204 1861 mt 3212 1699 L
+c9
+-302 -26 12 -162 3502 1887 3 MP
+PP
+0 sg
+3502 1887 mt 3514 1725 L
+3514 1725 mt 3212 1699 L
+c9
+245 -26 10 -160 3409 2049 3 MP
+PP
+0 sg
+3409 2049 mt 3419 1889 L
+3419 1889 mt 3664 1863 L
+c8
+-13 -161 245 -26 3419 1889 3 MP
+PP
+0 sg
+3419 1889 mt 3664 1863 L
+3664 1863 mt 3651 1702 L
+c14
+-269 -24 76 -143 3337 2342 3 MP
+PP
+0 sg
+3337 2342 mt 3413 2199 L
+3413 2199 mt 3144 2175 L
+c11
+38 -154 -269 -24 3413 2199 3 MP
+PP
+0 sg
+3413 2199 mt 3144 2175 L
+3144 2175 mt 3182 2021 L
+c10
+242 -26 31 -153 3378 2202 3 MP
+PP
+0 sg
+3378 2202 mt 3409 2049 L
+3409 2049 mt 3651 2023 L
+c8
+-298 -25 -12 -160 3514 1725 3 MP
+PP
+0 sg
+3514 1725 mt 3502 1565 L
+3502 1565 mt 3204 1540 L
+c8
+-8 -159 -302 -26 3514 1725 3 MP
+PP
+0 sg
+3514 1725 mt 3212 1699 L
+3212 1699 mt 3204 1540 L
+c8
+242 -25 -10 -162 3419 1889 3 MP
+PP
+0 sg
+3419 1889 mt 3409 1727 L
+3409 1727 mt 3651 1702 L
+c12
+-40 -159 242 -25 3409 1727 3 MP
+PP
+0 sg
+3409 1727 mt 3651 1702 L
+3651 1702 mt 3611 1543 L
+c10
+40 -154 233 -25 3378 2202 3 MP
+PP
+0 sg
+3378 2202 mt 3611 2177 L
+3611 2177 mt 3651 2023 L
+c14
+51 -145 -244 -22 3337 2342 3 MP
+PP
+0 sg
+3337 2342 mt 3093 2320 L
+3093 2320 mt 3144 2175 L
+c16
+-244 -22 94 -129 3243 2471 3 MP
+PP
+0 sg
+3243 2471 mt 3337 2342 L
+3337 2342 mt 3093 2320 L
+c14
+76 -143 -171 -26 3508 2368 3 MP
+PP
+0 sg
+3508 2368 mt 3337 2342 L
+3337 2342 mt 3413 2199 L
+c11
+233 -25 50 -143 3328 2345 3 MP
+PP
+0 sg
+3328 2345 mt 3378 2202 L
+3378 2202 mt 3611 2177 L
+c16
+94 -129 -149 -23 3392 2494 3 MP
+PP
+0 sg
+3392 2494 mt 3243 2471 L
+3243 2471 mt 3337 2342 L
+c16
+-171 -26 116 -126 3392 2494 3 MP
+PP
+0 sg
+3392 2494 mt 3508 2368 L
+3508 2368 mt 3337 2342 L
+c11
+64 -145 219 -23 3328 2345 3 MP
+PP
+0 sg
+3328 2345 mt 3547 2322 L
+3547 2322 mt 3611 2177 L
+c12
+-287 -25 -33 -154 3502 1565 3 MP
+PP
+0 sg
+3502 1565 mt 3469 1411 L
+3469 1411 mt 3182 1386 L
+c12
+-22 -154 -298 -25 3502 1565 3 MP
+PP
+0 sg
+3502 1565 mt 3204 1540 L
+3204 1540 mt 3182 1386 L
+c13
+-64 -153 233 -24 3378 1567 3 MP
+PP
+0 sg
+3378 1567 mt 3611 1543 L
+3611 1543 mt 3547 1390 L
+c12
+233 -24 -31 -160 3409 1727 3 MP
+PP
+0 sg
+3409 1727 mt 3378 1567 L
+3378 1567 mt 3611 1543 L
+/c17 { 1.000000 0.312500 0.000000 sr} bdef
+c17
+-116 -118 -81 -30 3589 1191 3 MP
+PP
+0 sg
+3589 1191 mt 3508 1161 L
+3508 1161 mt 3392 1043 L
+c17
+-71 -25 -126 -123 3589 1191 3 MP
+PP
+0 sg
+3589 1191 mt 3463 1068 L
+3463 1068 mt 3392 1043 L
+c17
+-126 -123 17 -29 3572 1220 3 MP
+PP
+0 sg
+3572 1220 mt 3589 1191 L
+3589 1191 mt 3463 1068 L
+c17
+-94 -116 -171 -26 3508 1161 3 MP
+PP
+0 sg
+3508 1161 mt 3337 1135 L
+3337 1135 mt 3243 1019 L
+c17
+-149 -24 -116 -118 3508 1161 3 MP
+PP
+0 sg
+3508 1161 mt 3392 1043 L
+3392 1043 mt 3243 1019 L
+c17
+-124 -126 113 -27 3459 1247 3 MP
+PP
+0 sg
+3459 1247 mt 3572 1220 L
+3572 1220 mt 3448 1094 L
+c17
+15 -26 -124 -126 3572 1220 3 MP
+PP
+0 sg
+3572 1220 mt 3448 1094 L
+3448 1094 mt 3463 1068 L
+/c18 { 0.000000 0.000000 0.937500 sr} bdef
+c18
+15 -26 145 -100 3303 2646 3 MP
+PP
+0 sg
+3303 2646 mt 3448 2546 L
+3448 2546 mt 3463 2520 L
+c18
+-71 -26 147 -105 3316 2625 3 MP
+PP
+0 sg
+3316 2625 mt 3463 2520 L
+3463 2520 mt 3392 2494 L
+c18
+147 -105 13 -21 3303 2646 3 MP
+PP
+0 sg
+3303 2646 mt 3316 2625 L
+3316 2625 mt 3463 2520 L
+c16
+124 -119 99 -23 3349 2569 3 MP
+PP
+0 sg
+3349 2569 mt 3448 2546 L
+3448 2546 mt 3572 2427 L
+c15
+113 -27 -88 -143 3547 1390 3 MP
+PP
+0 sg
+3547 1390 mt 3459 1247 L
+3459 1247 mt 3572 1220 L
+c16
+113 -27 110 -115 3349 2569 3 MP
+PP
+0 sg
+3349 2569 mt 3459 2454 L
+3459 2454 mt 3572 2427 L
+c18
+-149 -23 135 -109 3257 2603 3 MP
+PP
+0 sg
+3257 2603 mt 3392 2494 L
+3392 2494 mt 3243 2471 L
+c14
+88 -132 199 -20 3260 2474 3 MP
+PP
+0 sg
+3260 2474 mt 3459 2454 L
+3459 2454 mt 3547 2322 L
+c14
+219 -23 68 -129 3260 2474 3 MP
+PP
+0 sg
+3260 2474 mt 3328 2345 L
+3328 2345 mt 3547 2322 L
+c13
+-269 -24 -56 -144 3469 1411 3 MP
+PP
+0 sg
+3469 1411 mt 3413 1267 L
+3413 1267 mt 3144 1243 L
+c13
+-38 -143 -287 -25 3469 1411 3 MP
+PP
+0 sg
+3469 1411 mt 3182 1386 L
+3182 1386 mt 3144 1243 L
+c15
+-88 -143 219 -23 3328 1413 3 MP
+PP
+0 sg
+3328 1413 mt 3547 1390 L
+3547 1390 mt 3459 1247 L
+c13
+219 -23 -50 -154 3378 1567 3 MP
+PP
+0 sg
+3378 1567 mt 3328 1413 L
+3328 1413 mt 3547 1390 L
+/c19 { 1.000000 0.062500 0.000000 sr} bdef
+c19
+-135 -101 -71 -25 3463 1068 3 MP
+PP
+0 sg
+3463 1068 mt 3392 1043 L
+3392 1043 mt 3257  942 L
+c19
+-59 -22 -147 -104 3463 1068 3 MP
+PP
+0 sg
+3463 1068 mt 3316  964 L
+3316  964 mt 3257  942 L
+c19
+-147 -104 15 -26 3448 1094 3 MP
+PP
+0 sg
+3448 1094 mt 3463 1068 L
+3463 1068 mt 3316  964 L
+c18
+110 -113 -124 -19 3257 2603 3 MP
+PP
+0 sg
+3257 2603 mt 3133 2584 L
+3133 2584 mt 3243 2471 L
+c18
+135 -109 -59 -22 3316 2625 3 MP
+PP
+0 sg
+3316 2625 mt 3257 2603 L
+3257 2603 mt 3392 2494 L
+c16
+110 -115 173 -18 3176 2587 3 MP
+PP
+0 sg
+3176 2587 mt 3349 2569 L
+3349 2569 mt 3459 2454 L
+c15
+-244 -21 -76 -132 3413 1267 3 MP
+PP
+0 sg
+3413 1267 mt 3337 1135 L
+3337 1135 mt 3093 1114 L
+c15
+-51 -129 -269 -24 3413 1267 3 MP
+PP
+0 sg
+3413 1267 mt 3144 1243 L
+3144 1243 mt 3093 1114 L
+c15
+199 -21 -68 -145 3328 1413 3 MP
+PP
+0 sg
+3328 1413 mt 3260 1268 L
+3260 1268 mt 3459 1247 L
+c16
+199 -20 84 -113 3176 2587 3 MP
+PP
+0 sg
+3176 2587 mt 3260 2474 L
+3260 2474 mt 3459 2454 L
+c17
+99 -23 -110 -130 3459 1247 3 MP
+PP
+0 sg
+3459 1247 mt 3349 1117 L
+3349 1117 mt 3448 1094 L
+c17
+-110 -130 199 -21 3260 1268 3 MP
+PP
+0 sg
+3260 1268 mt 3459 1247 L
+3459 1247 mt 3349 1117 L
+c19
+-124 -19 -135 -101 3392 1043 3 MP
+PP
+0 sg
+3392 1043 mt 3257  942 L
+3257  942 mt 3133  923 L
+c19
+-110 -96 -149 -24 3392 1043 3 MP
+PP
+0 sg
+3392 1043 mt 3243 1019 L
+3243 1019 mt 3133  923 L
+c19
+-145 -109 99 -23 3349 1117 3 MP
+PP
+0 sg
+3349 1117 mt 3448 1094 L
+3448 1094 mt 3303  985 L
+c19
+13 -21 -145 -109 3448 1094 3 MP
+PP
+0 sg
+3448 1094 mt 3303  985 L
+3303  985 mt 3316  964 L
+/c20 { 0.000000 0.000000 0.750000 sr} bdef
+c20
+-59 -22 166 -84 3150 2709 3 MP
+PP
+0 sg
+3150 2709 mt 3316 2625 L
+3316 2625 mt 3257 2603 L
+c20
+13 -21 162 -79 3141 2725 3 MP
+PP
+0 sg
+3141 2725 mt 3303 2646 L
+3303 2646 mt 3316 2625 L
+c20
+166 -84 9 -16 3141 2725 3 MP
+PP
+0 sg
+3141 2725 mt 3150 2709 L
+3150 2709 mt 3316 2625 L
+c18
+145 -100 82 -19 3221 2665 3 MP
+PP
+0 sg
+3221 2665 mt 3303 2646 L
+3303 2646 mt 3448 2546 L
+c18
+99 -23 128 -96 3221 2665 3 MP
+PP
+0 sg
+3221 2665 mt 3349 2569 L
+3349 2569 mt 3448 2546 L
+c10
+9 -161 -345 -16 3182 2021 3 MP
+PP
+0 sg
+3182 2021 mt 2837 2005 L
+2837 2005 mt 2846 1844 L
+c11
+-345 -16 38 -154 3144 2175 3 MP
+PP
+0 sg
+3144 2175 mt 3182 2021 L
+3182 2021 mt 2837 2005 L
+c10
+-358 -17 22 -160 3182 2021 3 MP
+PP
+0 sg
+3182 2021 mt 3204 1861 L
+3204 1861 mt 2846 1844 L
+c9
+10 -160 323 -16 3086 2065 3 MP
+PP
+0 sg
+3086 2065 mt 3409 2049 L
+3409 2049 mt 3419 1889 L
+c9
+3 -162 -358 -17 3204 1861 3 MP
+PP
+0 sg
+3204 1861 mt 2846 1844 L
+2846 1844 mt 2849 1682 L
+c9
+-363 -17 8 -162 3204 1861 3 MP
+PP
+0 sg
+3204 1861 mt 3212 1699 L
+3212 1699 mt 2849 1682 L
+c8
+-10 -162 327 -17 3092 1906 3 MP
+PP
+0 sg
+3092 1906 mt 3419 1889 L
+3419 1889 mt 3409 1727 L
+c9
+327 -17 6 -159 3086 2065 3 MP
+PP
+0 sg
+3086 2065 mt 3092 1906 L
+3092 1906 mt 3419 1889 L
+c11
+16 -155 -323 -15 3144 2175 3 MP
+PP
+0 sg
+3144 2175 mt 2821 2160 L
+2821 2160 mt 2837 2005 L
+c14
+-323 -15 51 -145 3093 2320 3 MP
+PP
+0 sg
+3093 2320 mt 3144 2175 L
+3144 2175 mt 2821 2160 L
+c10
+323 -16 18 -152 3068 2217 3 MP
+PP
+0 sg
+3068 2217 mt 3086 2065 L
+3086 2065 mt 3409 2049 L
+c10
+31 -153 310 -15 3068 2217 3 MP
+PP
+0 sg
+3068 2217 mt 3378 2202 L
+3378 2202 mt 3409 2049 L
+c8
+323 -17 -6 -162 3092 1906 3 MP
+PP
+0 sg
+3092 1906 mt 3086 1744 L
+3086 1744 mt 3409 1727 L
+c8
+-358 -17 -8 -159 3212 1699 3 MP
+PP
+0 sg
+3212 1699 mt 3204 1540 L
+3204 1540 mt 2846 1523 L
+c8
+-3 -159 -363 -17 3212 1699 3 MP
+PP
+0 sg
+3212 1699 mt 2849 1682 L
+2849 1682 mt 2846 1523 L
+c12
+-31 -160 323 -17 3086 1744 3 MP
+PP
+0 sg
+3086 1744 mt 3409 1727 L
+3409 1727 mt 3378 1567 L
+c14
+21 -147 -293 -13 3093 2320 3 MP
+PP
+0 sg
+3093 2320 mt 2800 2307 L
+2800 2307 mt 2821 2160 L
+c16
+-293 -13 63 -133 3030 2453 3 MP
+PP
+0 sg
+3030 2453 mt 3093 2320 L
+3093 2320 mt 2800 2307 L
+c16
+63 -133 -213 -18 3243 2471 3 MP
+PP
+0 sg
+3243 2471 mt 3030 2453 L
+3030 2453 mt 3093 2320 L
+c11
+310 -15 30 -142 3038 2359 3 MP
+PP
+0 sg
+3038 2359 mt 3068 2217 L
+3068 2217 mt 3378 2202 L
+c12
+-345 -16 -22 -154 3204 1540 3 MP
+PP
+0 sg
+3204 1540 mt 3182 1386 L
+3182 1386 mt 2837 1370 L
+c12
+-9 -153 -358 -17 3204 1540 3 MP
+PP
+0 sg
+3204 1540 mt 2846 1523 L
+2846 1523 mt 2837 1370 L
+c13
+-50 -154 310 -16 3068 1583 3 MP
+PP
+0 sg
+3068 1583 mt 3378 1567 L
+3378 1567 mt 3328 1413 L
+c12
+310 -16 -18 -161 3086 1744 3 MP
+PP
+0 sg
+3086 1744 mt 3068 1583 L
+3068 1583 mt 3378 1567 L
+c11
+50 -143 290 -14 3038 2359 3 MP
+PP
+0 sg
+3038 2359 mt 3328 2345 L
+3328 2345 mt 3378 2202 L
+c20
+124 -93 -96 -15 3105 2692 3 MP
+PP
+0 sg
+3105 2692 mt 3009 2677 L
+3009 2677 mt 3133 2584 L
+c20
+152 -89 -45 -17 3150 2709 3 MP
+PP
+0 sg
+3150 2709 mt 3105 2692 L
+3105 2692 mt 3257 2603 L
+c20
+-124 -19 152 -89 3105 2692 3 MP
+PP
+0 sg
+3105 2692 mt 3257 2603 L
+3257 2603 mt 3133 2584 L
+c18
+173 -18 99 -93 3077 2680 3 MP
+PP
+0 sg
+3077 2680 mt 3176 2587 L
+3176 2587 mt 3349 2569 L
+c18
+128 -96 144 -15 3077 2680 3 MP
+PP
+0 sg
+3077 2680 mt 3221 2665 L
+3221 2665 mt 3349 2569 L
+c17
+-63 -113 -244 -21 3337 1135 3 MP
+PP
+0 sg
+3337 1135 mt 3093 1114 L
+3093 1114 mt 3030 1001 L
+c17
+-213 -18 -94 -116 3337 1135 3 MP
+PP
+0 sg
+3337 1135 mt 3243 1019 L
+3243 1019 mt 3030 1001 L
+c17
+173 -18 -84 -133 3260 1268 3 MP
+PP
+0 sg
+3260 1268 mt 3176 1135 L
+3176 1135 mt 3349 1117 L
+c19
+-75 -94 -213 -18 3243 1019 3 MP
+PP
+0 sg
+3243 1019 mt 3030 1001 L
+3030 1001 mt 2955  907 L
+c19
+-178 -16 -110 -96 3243 1019 3 MP
+PP
+0 sg
+3243 1019 mt 3133  923 L
+3133  923 mt 2955  907 L
+c19
+-128 -113 173 -18 3176 1135 3 MP
+PP
+0 sg
+3176 1135 mt 3349 1117 L
+3349 1117 mt 3221 1004 L
+c19
+82 -19 -128 -113 3349 1117 3 MP
+PP
+0 sg
+3349 1117 mt 3221 1004 L
+3221 1004 mt 3303  985 L
+c18
+-257 -12 75 -116 2955 2569 3 MP
+PP
+0 sg
+2955 2569 mt 3030 2453 L
+3030 2453 mt 2773 2441 L
+c18
+75 -116 -178 -15 3133 2584 3 MP
+PP
+0 sg
+3133 2584 mt 2955 2569 L
+2955 2569 mt 3030 2453 L
+c18
+-213 -18 110 -113 3133 2584 3 MP
+PP
+0 sg
+3133 2584 mt 3243 2471 L
+3243 2471 mt 3030 2453 L
+c14
+68 -129 264 -14 2996 2488 3 MP
+PP
+0 sg
+2996 2488 mt 3260 2474 L
+3260 2474 mt 3328 2345 L
+c13
+-16 -142 -345 -16 3182 1386 3 MP
+PP
+0 sg
+3182 1386 mt 2837 1370 L
+2837 1370 mt 2821 1228 L
+c13
+-323 -15 -38 -143 3182 1386 3 MP
+PP
+0 sg
+3182 1386 mt 3144 1243 L
+3144 1243 mt 2821 1228 L
+c15
+-68 -145 290 -14 3038 1427 3 MP
+PP
+0 sg
+3038 1427 mt 3328 1413 L
+3328 1413 mt 3260 1268 L
+c16
+27 -134 -257 -12 3030 2453 3 MP
+PP
+0 sg
+3030 2453 mt 2773 2441 L
+2773 2441 mt 2800 2307 L
+c14
+290 -14 42 -129 2996 2488 3 MP
+PP
+0 sg
+2996 2488 mt 3038 2359 L
+3038 2359 mt 3328 2345 L
+c13
+290 -14 -30 -156 3068 1583 3 MP
+PP
+0 sg
+3068 1583 mt 3038 1427 L
+3038 1427 mt 3328 1413 L
+/c21 { 0.875000 0.000000 0.000000 sr} bdef
+c21
+-124 -75 -124 -19 3257 942 3 MP
+PP
+0 sg
+3257  942 mt 3133  923 L
+3133  923 mt 3009  848 L
+c21
+-96 -15 -152 -79 3257 942 3 MP
+PP
+0 sg
+3257  942 mt 3105  863 L
+3105  863 mt 3009  848 L
+c21
+-45 -16 -166 -85 3316 964 3 MP
+PP
+0 sg
+3316  964 mt 3150  879 L
+3150  879 mt 3105  863 L
+c21
+-152 -79 -59 -22 3316 964 3 MP
+PP
+0 sg
+3316  964 mt 3257  942 L
+3257  942 mt 3105  863 L
+c21
+-166 -85 13 -21 3303 985 3 MP
+PP
+0 sg
+3303  985 mt 3316  964 L
+3316  964 mt 3150  879 L
+c21
+9 -17 -162 -89 3303 985 3 MP
+PP
+0 sg
+3303  985 mt 3141  896 L
+3141  896 mt 3150  879 L
+c21
+-162 -89 82 -19 3221 1004 3 MP
+PP
+0 sg
+3221 1004 mt 3303  985 L
+3303  985 mt 3141  896 L
+/c22 { 0.000000 0.000000 0.625000 sr} bdef
+c22
+9 -16 177 -56 2964 2781 3 MP
+PP
+0 sg
+2964 2781 mt 3141 2725 L
+3141 2725 mt 3150 2709 L
+c22
+179 -61 7 -11 2964 2781 3 MP
+PP
+0 sg
+2964 2781 mt 2971 2770 L
+2971 2770 mt 3150 2709 L
+c22
+-45 -17 179 -61 2971 2770 3 MP
+PP
+0 sg
+2971 2770 mt 3150 2709 L
+3150 2709 mt 3105 2692 L
+c20
+82 -19 144 -75 3077 2740 3 MP
+PP
+0 sg
+3077 2740 mt 3221 2665 L
+3221 2665 mt 3303 2646 L
+c20
+162 -79 64 -15 3077 2740 3 MP
+PP
+0 sg
+3077 2740 mt 3141 2725 L
+3141 2725 mt 3303 2646 L
+c20
+83 -96 -137 -12 3009 2677 3 MP
+PP
+0 sg
+3009 2677 mt 2872 2665 L
+2872 2665 mt 2955 2569 L
+c20
+-178 -15 124 -93 3009 2677 3 MP
+PP
+0 sg
+3009 2677 mt 3133 2584 L
+3133 2584 mt 2955 2569 L
+c16
+84 -113 231 -12 2945 2599 3 MP
+PP
+0 sg
+2945 2599 mt 3176 2587 L
+3176 2587 mt 3260 2474 L
+c15
+-21 -128 -323 -15 3144 1243 3 MP
+PP
+0 sg
+3144 1243 mt 2821 1228 L
+2821 1228 mt 2800 1100 L
+c15
+-293 -14 -51 -129 3144 1243 3 MP
+PP
+0 sg
+3144 1243 mt 3093 1114 L
+3093 1114 mt 2800 1100 L
+c17
+-84 -133 264 -13 2996 1281 3 MP
+PP
+0 sg
+2996 1281 mt 3260 1268 L
+3260 1268 mt 3176 1135 L
+c15
+264 -13 -42 -146 3038 1427 3 MP
+PP
+0 sg
+3038 1427 mt 2996 1281 L
+2996 1281 mt 3260 1268 L
+c16
+264 -14 51 -111 2945 2599 3 MP
+PP
+0 sg
+2945 2599 mt 2996 2488 L
+2996 2488 mt 3260 2474 L
+c21
+-137 -12 -124 -75 3133 923 3 MP
+PP
+0 sg
+3133  923 mt 3009  848 L
+3009  848 mt 2872  836 L
+c21
+-83 -71 -178 -16 3133 923 3 MP
+PP
+0 sg
+3133  923 mt 2955  907 L
+2955  907 mt 2872  836 L
+c21
+64 -15 -144 -93 3221 1004 3 MP
+PP
+0 sg
+3221 1004 mt 3077  911 L
+3077  911 mt 3141  896 L
+c21
+-144 -93 144 -15 3077 1019 3 MP
+PP
+0 sg
+3077 1019 mt 3221 1004 L
+3221 1004 mt 3077  911 L
+c19
+144 -15 -99 -116 3176 1135 3 MP
+PP
+0 sg
+3176 1135 mt 3077 1019 L
+3077 1019 mt 3221 1004 L
+c22
+165 -67 -31 -11 2971 2770 3 MP
+PP
+0 sg
+2971 2770 mt 2940 2759 L
+2940 2759 mt 3105 2692 L
+c20
+144 -75 111 -12 2966 2752 3 MP
+PP
+0 sg
+2966 2752 mt 3077 2740 L
+3077 2740 mt 3221 2665 L
+c22
+-96 -15 165 -67 2940 2759 3 MP
+PP
+0 sg
+2940 2759 mt 3105 2692 L
+3105 2692 mt 3009 2677 L
+c20
+144 -15 111 -72 2966 2752 3 MP
+PP
+0 sg
+2966 2752 mt 3077 2680 L
+3077 2680 mt 3221 2665 L
+c17
+231 -12 -51 -134 2996 1281 3 MP
+PP
+0 sg
+2996 1281 mt 2945 1147 L
+2945 1147 mt 3176 1135 L
+c17
+-257 -12 -63 -113 3093 1114 3 MP
+PP
+0 sg
+3093 1114 mt 3030 1001 L
+3030 1001 mt 2773  989 L
+c17
+-27 -111 -293 -14 3093 1114 3 MP
+PP
+0 sg
+3093 1114 mt 2800 1100 L
+2800 1100 mt 2773  989 L
+c19
+-99 -116 231 -12 2945 1147 3 MP
+PP
+0 sg
+2945 1147 mt 3176 1135 L
+3176 1135 mt 3077 1019 L
+c22
+-137 -12 134 -72 2875 2749 3 MP
+PP
+0 sg
+2875 2749 mt 3009 2677 L
+3009 2677 mt 2872 2665 L
+c18
+231 -12 60 -91 2885 2690 3 MP
+PP
+0 sg
+2885 2690 mt 2945 2599 L
+2945 2599 mt 3176 2587 L
+c22
+134 -72 -65 -10 2940 2759 3 MP
+PP
+0 sg
+2940 2759 mt 2875 2749 L
+2875 2749 mt 3009 2677 L
+c18
+99 -93 192 -10 2885 2690 3 MP
+PP
+0 sg
+2885 2690 mt 3077 2680 L
+3077 2680 mt 3176 2587 L
+/c23 { 0.687500 0.000000 0.000000 sr} bdef
+c23
+-134 -52 -96 -15 3105 863 3 MP
+PP
+0 sg
+3105  863 mt 3009  848 L
+3009  848 mt 2875  796 L
+c23
+-65 -10 -165 -57 3105 863 3 MP
+PP
+0 sg
+3105  863 mt 2940  806 L
+2940  806 mt 2875  796 L
+c23
+-165 -57 -45 -16 3150 879 3 MP
+PP
+0 sg
+3150  879 mt 3105  863 L
+3105  863 mt 2940  806 L
+c23
+-179 -62 9 -17 3141 896 3 MP
+PP
+0 sg
+3141  896 mt 3150  879 L
+3150  879 mt 2971  817 L
+c23
+-31 -11 -179 -62 3150 879 3 MP
+PP
+0 sg
+3150  879 mt 2971  817 L
+2971  817 mt 2940  806 L
+c23
+7 -12 -177 -67 3141 896 3 MP
+PP
+0 sg
+3141  896 mt 2964  829 L
+2964  829 mt 2971  817 L
+/c24 { 0.000000 0.000000 0.562500 sr} bdef
+c24
+185 -32 22 -5 2757 2818 3 MP
+PP
+0 sg
+2757 2818 mt 2779 2813 L
+2779 2813 mt 2964 2781 L
+c24
+43 -10 164 -27 2757 2818 3 MP
+PP
+0 sg
+2757 2818 mt 2921 2791 L
+2921 2791 mt 2964 2781 L
+c24
+7 -11 185 -32 2779 2813 3 MP
+PP
+0 sg
+2779 2813 mt 2964 2781 L
+2964 2781 mt 2971 2770 L
+c22
+64 -15 156 -51 2921 2791 3 MP
+PP
+0 sg
+2921 2791 mt 3077 2740 L
+3077 2740 mt 3141 2725 L
+c22
+177 -56 43 -10 2921 2791 3 MP
+PP
+0 sg
+2921 2791 mt 2964 2781 L
+2964 2781 mt 3141 2725 L
+c23
+-93 -8 -134 -52 3009 848 3 MP
+PP
+0 sg
+3009  848 mt 2875  796 L
+2875  796 mt 2782  788 L
+c23
+-90 -48 -137 -12 3009 848 3 MP
+PP
+0 sg
+3009  848 mt 2872  836 L
+2872  836 mt 2782  788 L
+c23
+-177 -67 64 -15 3077 911 3 MP
+PP
+0 sg
+3077  911 mt 3141  896 L
+3141  896 mt 2964  829 L
+c10
+-383 -6 9 -161 2837 2005 3 MP
+PP
+0 sg
+2837 2005 mt 2846 1844 L
+2846 1844 mt 2463 1838 L
+c8
+-6 -162 375 -5 2717 1911 3 MP
+PP
+0 sg
+2717 1911 mt 3092 1906 L
+3092 1906 mt 3086 1744 L
+c11
+-370 -6 16 -155 2821 2160 3 MP
+PP
+0 sg
+2821 2160 mt 2837 2005 L
+2837 2005 mt 2467 1999 L
+c9
+6 -159 371 -5 2715 2070 3 MP
+PP
+0 sg
+2715 2070 mt 3086 2065 L
+3086 2065 mt 3092 1906 L
+c10
+-4 -161 -370 -6 2837 2005 3 MP
+PP
+0 sg
+2837 2005 mt 2467 1999 L
+2467 1999 mt 2463 1838 L
+c9
+375 -5 2 -159 2715 2070 3 MP
+PP
+0 sg
+2715 2070 mt 2717 1911 L
+2717 1911 mt 3092 1906 L
+c9
+-388 -6 3 -162 2846 1844 3 MP
+PP
+0 sg
+2846 1844 mt 2849 1682 L
+2849 1682 mt 2461 1676 L
+c12
+-18 -161 371 -5 2715 1749 3 MP
+PP
+0 sg
+2715 1749 mt 3086 1744 L
+3086 1744 mt 3068 1583 L
+c14
+-346 -5 21 -147 2800 2307 3 MP
+PP
+0 sg
+2800 2307 mt 2821 2160 L
+2821 2160 mt 2475 2155 L
+c10
+18 -152 357 -6 2711 2223 3 MP
+PP
+0 sg
+2711 2223 mt 3068 2217 L
+3068 2217 mt 3086 2065 L
+c11
+-8 -156 -346 -5 2821 2160 3 MP
+PP
+0 sg
+2821 2160 mt 2475 2155 L
+2475 2155 mt 2467 1999 L
+c10
+371 -5 4 -153 2711 2223 3 MP
+PP
+0 sg
+2711 2223 mt 2715 2070 L
+2715 2070 mt 3086 2065 L
+c9
+-2 -162 -383 -6 2846 1844 3 MP
+PP
+0 sg
+2846 1844 mt 2463 1838 L
+2463 1838 mt 2461 1676 L
+c8
+371 -5 -2 -162 2717 1911 3 MP
+PP
+0 sg
+2717 1911 mt 2715 1749 L
+2715 1749 mt 3086 1744 L
+c19
+-213 -10 -75 -94 3030 1001 3 MP
+PP
+0 sg
+3030 1001 mt 2955  907 L
+2955  907 mt 2742  897 L
+c21
+111 -11 -111 -97 3077 1019 3 MP
+PP
+0 sg
+3077 1019 mt 2966  922 L
+2966  922 mt 3077  911 L
+c24
+-31 -11 189 -38 2782 2808 3 MP
+PP
+0 sg
+2782 2808 mt 2971 2770 L
+2971 2770 mt 2940 2759 L
+c24
+189 -38 3 -5 2779 2813 3 MP
+PP
+0 sg
+2779 2813 mt 2782 2808 L
+2782 2808 mt 2971 2770 L
+c22
+156 -51 76 -8 2845 2799 3 MP
+PP
+0 sg
+2845 2799 mt 2921 2791 L
+2921 2791 mt 3077 2740 L
+c23
+43 -10 -156 -72 3077 911 3 MP
+PP
+0 sg
+3077  911 mt 2921  839 L
+2921  839 mt 2964  829 L
+c22
+111 -12 121 -47 2845 2799 3 MP
+PP
+0 sg
+2845 2799 mt 2966 2752 L
+2966 2752 mt 3077 2740 L
+c23
+-156 -72 111 -11 2966 922 3 MP
+PP
+0 sg
+2966  922 mt 3077  911 L
+3077  911 mt 2921  839 L
+c19
+192 -10 -60 -118 2945 1147 3 MP
+PP
+0 sg
+2945 1147 mt 2885 1029 L
+2885 1029 mt 3077 1019 L
+c19
+-31 -92 -257 -12 3030 1001 3 MP
+PP
+0 sg
+3030 1001 mt 2773  989 L
+2773  989 mt 2742  897 L
+c21
+-111 -97 192 -10 2885 1029 3 MP
+PP
+0 sg
+2885 1029 mt 3077 1019 L
+3077 1019 mt 2966  922 L
+c22
+90 -76 -93 -8 2875 2749 3 MP
+PP
+0 sg
+2875 2749 mt 2782 2741 L
+2782 2741 mt 2872 2665 L
+c24
+141 -48 -33 -5 2767 2802 3 MP
+PP
+0 sg
+2767 2802 mt 2734 2797 L
+2734 2797 mt 2875 2749 L
+c24
+-93 -8 141 -48 2734 2797 3 MP
+PP
+0 sg
+2734 2797 mt 2875 2749 L
+2875 2749 mt 2782 2741 L
+c24
+-65 -10 173 -43 2767 2802 3 MP
+PP
+0 sg
+2767 2802 mt 2940 2759 L
+2940 2759 mt 2875 2749 L
+c20
+111 -72 148 -7 2818 2759 3 MP
+PP
+0 sg
+2818 2759 mt 2966 2752 L
+2966 2752 mt 3077 2680 L
+c20
+192 -10 67 -69 2818 2759 3 MP
+PP
+0 sg
+2818 2759 mt 2885 2690 L
+2885 2690 mt 3077 2680 L
+c8
+-383 -6 -3 -159 2849 1682 3 MP
+PP
+0 sg
+2849 1682 mt 2846 1523 L
+2846 1523 mt 2463 1517 L
+c8
+2 -159 -388 -6 2849 1682 3 MP
+PP
+0 sg
+2849 1682 mt 2461 1676 L
+2461 1676 mt 2463 1517 L
+c12
+357 -5 -4 -161 2715 1749 3 MP
+PP
+0 sg
+2715 1749 mt 2711 1588 L
+2711 1588 mt 3068 1583 L
+c12
+4 -153 -383 -6 2846 1523 3 MP
+PP
+0 sg
+2846 1523 mt 2463 1517 L
+2463 1517 mt 2467 1364 L
+c12
+-370 -6 -9 -153 2846 1523 3 MP
+PP
+0 sg
+2846 1523 mt 2837 1370 L
+2837 1370 mt 2467 1364 L
+c13
+-30 -156 357 -5 2711 1588 3 MP
+PP
+0 sg
+2711 1588 mt 3068 1583 L
+3068 1583 mt 3038 1427 L
+c14
+-11 -147 -314 -5 2800 2307 3 MP
+PP
+0 sg
+2800 2307 mt 2486 2302 L
+2486 2302 mt 2475 2155 L
+c16
+-314 -5 27 -134 2773 2441 3 MP
+PP
+0 sg
+2773 2441 mt 2800 2307 L
+2800 2307 mt 2486 2302 L
+c11
+357 -6 8 -141 2703 2364 3 MP
+PP
+0 sg
+2703 2364 mt 2711 2223 L
+2711 2223 mt 3068 2217 L
+c11
+30 -142 335 -5 2703 2364 3 MP
+PP
+0 sg
+2703 2364 mt 3038 2359 L
+3038 2359 mt 3068 2217 L
+c13
+335 -5 -8 -156 2711 1588 3 MP
+PP
+0 sg
+2711 1588 mt 2703 1432 L
+2703 1432 mt 3038 1427 L
+c16
+-13 -134 -274 -5 2773 2441 3 MP
+PP
+0 sg
+2773 2441 mt 2499 2436 L
+2499 2436 mt 2486 2302 L
+c18
+-274 -5 31 -118 2742 2559 3 MP
+PP
+0 sg
+2742 2559 mt 2773 2441 L
+2773 2441 mt 2499 2436 L
+c18
+31 -118 -213 -10 2955 2569 3 MP
+PP
+0 sg
+2955 2569 mt 2742 2559 L
+2742 2559 mt 2773 2441 L
+c14
+335 -5 11 -128 2692 2492 3 MP
+PP
+0 sg
+2692 2492 mt 2703 2364 L
+2703 2364 mt 3038 2359 L
+c14
+42 -129 304 -4 2692 2492 3 MP
+PP
+0 sg
+2692 2492 mt 2996 2488 L
+2996 2488 mt 3038 2359 L
+c13
+8 -141 -370 -6 2837 1370 3 MP
+PP
+0 sg
+2837 1370 mt 2467 1364 L
+2467 1364 mt 2475 1223 L
+c13
+-346 -5 -16 -142 2837 1370 3 MP
+PP
+0 sg
+2837 1370 mt 2821 1228 L
+2821 1228 mt 2475 1223 L
+c15
+-42 -146 335 -5 2703 1432 3 MP
+PP
+0 sg
+2703 1432 mt 3038 1427 L
+3038 1427 mt 2996 1281 L
+c20
+-228 -4 35 -99 2707 2658 3 MP
+PP
+0 sg
+2707 2658 mt 2742 2559 L
+2742 2559 mt 2514 2555 L
+c20
+35 -99 -165 -7 2872 2665 3 MP
+PP
+0 sg
+2872 2665 mt 2707 2658 L
+2707 2658 mt 2742 2559 L
+c20
+-213 -10 83 -96 2872 2665 3 MP
+PP
+0 sg
+2872 2665 mt 2955 2569 L
+2955 2569 mt 2742 2559 L
+c16
+51 -111 266 -4 2679 2603 3 MP
+PP
+0 sg
+2679 2603 mt 2945 2599 L
+2945 2599 mt 2996 2488 L
+c15
+-314 -5 -21 -128 2821 1228 3 MP
+PP
+0 sg
+2821 1228 mt 2800 1100 L
+2800 1100 mt 2486 1095 L
+c15
+11 -128 -346 -5 2821 1228 3 MP
+PP
+0 sg
+2821 1228 mt 2475 1223 L
+2475 1223 mt 2486 1095 L
+c17
+-51 -134 304 -4 2692 1285 3 MP
+PP
+0 sg
+2692 1285 mt 2996 1281 L
+2996 1281 mt 2945 1147 L
+c15
+304 -4 -11 -147 2703 1432 3 MP
+PP
+0 sg
+2703 1432 mt 2692 1285 L
+2692 1285 mt 2996 1281 L
+c18
+-15 -119 -228 -4 2742 2559 3 MP
+PP
+0 sg
+2742 2559 mt 2514 2555 L
+2514 2555 mt 2499 2436 L
+c16
+304 -4 13 -111 2679 2603 3 MP
+PP
+0 sg
+2679 2603 mt 2692 2492 L
+2692 2492 mt 2996 2488 L
+/c25 { 0.562500 0.000000 0.000000 sr} bdef
+c25
+-48 -4 -141 -27 2875 796 3 MP
+PP
+0 sg
+2875  796 mt 2734  769 L
+2734  769 mt 2686  765 L
+c25
+-96 -23 -93 -8 2875 796 3 MP
+PP
+0 sg
+2875  796 mt 2782  788 L
+2782  788 mt 2686  765 L
+c25
+-141 -27 -65 -10 2940 806 3 MP
+PP
+0 sg
+2940  806 mt 2875  796 L
+2875  796 mt 2734  769 L
+c25
+-33 -5 -173 -32 2940 806 3 MP
+PP
+0 sg
+2940  806 mt 2767  774 L
+2767  774 mt 2734  769 L
+c25
+-15 -6 -189 -37 2971 817 3 MP
+PP
+0 sg
+2971  817 mt 2782  780 L
+2782  780 mt 2767  774 L
+c25
+-173 -32 -31 -11 2971 817 3 MP
+PP
+0 sg
+2971  817 mt 2940  806 L
+2940  806 mt 2767  774 L
+c25
+-189 -37 7 -12 2964 829 3 MP
+PP
+0 sg
+2964  829 mt 2971  817 L
+2971  817 mt 2782  780 L
+c21
+-165 -8 -83 -71 2955 907 3 MP
+PP
+0 sg
+2955  907 mt 2872  836 L
+2872  836 mt 2707  828 L
+c21
+-35 -69 -213 -10 2955 907 3 MP
+PP
+0 sg
+2955  907 mt 2742  897 L
+2742  897 mt 2707  828 L
+c23
+76 -8 -121 -75 2966 922 3 MP
+PP
+0 sg
+2966  922 mt 2845  847 L
+2845  847 mt 2921  839 L
+c21
+148 -8 -67 -99 2885 1029 3 MP
+PP
+0 sg
+2885 1029 mt 2818  930 L
+2818  930 mt 2966  922 L
+c23
+-121 -75 148 -8 2818 930 3 MP
+PP
+0 sg
+2818  930 mt 2966  922 L
+2966  922 mt 2845  847 L
+c24
+178 -18 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2767 2802 L
+c24
+-33 -5 178 -18 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2767 2802 L
+2767 2802 mt 2734 2797 L
+2734 2797 mt 2589 2820 L
+c24
+-15 -6 193 -12 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2782 2808 L
+2782 2808 mt 2767 2802 L
+2767 2802 mt 2589 2820 L
+c24
+173 -43 -15 -6 2782 2808 3 MP
+PP
+0 sg
+2782 2808 mt 2767 2802 L
+2767 2802 mt 2940 2759 L
+c22
+121 -47 100 -6 2745 2805 3 MP
+PP
+0 sg
+2745 2805 mt 2845 2799 L
+2845 2799 mt 2966 2752 L
+c22
+148 -7 73 -46 2745 2805 3 MP
+PP
+0 sg
+2745 2805 mt 2818 2759 L
+2818 2759 mt 2966 2752 L
+c25
+-185 -44 43 -10 2921 839 3 MP
+PP
+0 sg
+2921  839 mt 2964  829 L
+2964  829 mt 2779  785 L
+c25
+3 -5 -185 -44 2964 829 3 MP
+PP
+0 sg
+2964  829 mt 2779  785 L
+2779  785 mt 2782  780 L
+c17
+13 -111 -314 -5 2800 1100 3 MP
+PP
+0 sg
+2800 1100 mt 2486 1095 L
+2486 1095 mt 2499  984 L
+c17
+-274 -5 -27 -111 2800 1100 3 MP
+PP
+0 sg
+2800 1100 mt 2773  989 L
+2773  989 mt 2499  984 L
+c19
+-60 -118 266 -4 2679 1151 3 MP
+PP
+0 sg
+2679 1151 mt 2945 1147 L
+2945 1147 mt 2885 1029 L
+c20
+-17 -100 -176 -3 2707 2658 3 MP
+PP
+0 sg
+2707 2658 mt 2531 2655 L
+2531 2655 mt 2514 2555 L
+c22
+-176 -3 38 -77 2669 2735 3 MP
+PP
+0 sg
+2669 2735 mt 2707 2658 L
+2707 2658 mt 2531 2655 L
+c22
+38 -77 -113 -6 2782 2741 3 MP
+PP
+0 sg
+2782 2741 mt 2669 2735 L
+2669 2735 mt 2707 2658 L
+c22
+-165 -7 90 -76 2782 2741 3 MP
+PP
+0 sg
+2782 2741 mt 2872 2665 L
+2872 2665 mt 2707 2658 L
+c18
+266 -4 15 -90 2664 2693 3 MP
+PP
+0 sg
+2664 2693 mt 2679 2603 L
+2679 2603 mt 2945 2599 L
+c17
+266 -4 -13 -134 2692 1285 3 MP
+PP
+0 sg
+2692 1285 mt 2679 1151 L
+2679 1151 mt 2945 1147 L
+c18
+60 -91 221 -3 2664 2693 3 MP
+PP
+0 sg
+2664 2693 mt 2885 2690 L
+2885 2690 mt 2945 2599 L
+c24
+168 -2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2757 2818 L
+c24
+38 -4 130 2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2719 2822 L
+2719 2822 mt 2757 2818 L
+2757 2818 mt 2589 2820 L
+c24
+22 -5 168 -2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2757 2818 L
+2757 2818 mt 2779 2813 L
+2779 2813 mt 2589 2820 L
+c24
+190 -7 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2779 2813 L
+c24
+3 -5 190 -7 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2779 2813 L
+2779 2813 mt 2782 2808 L
+2782 2808 mt 2589 2820 L
+c24
+164 -27 38 -4 2719 2822 3 MP
+PP
+0 sg
+2719 2822 mt 2757 2818 L
+2757 2818 mt 2921 2791 L
+c25
+-39 -21 -113 -5 2782 788 3 MP
+PP
+0 sg
+2782  788 mt 2669  783 L
+2669  783 mt 2630  762 L
+c25
+-56 -3 -96 -23 2782 788 3 MP
+PP
+0 sg
+2782  788 mt 2686  765 L
+2686  765 mt 2630  762 L
+c23
+-113 -5 -90 -48 2872 836 3 MP
+PP
+0 sg
+2872  836 mt 2782  788 L
+2782  788 mt 2669  783 L
+c25
+22 -5 -164 -49 2921 839 3 MP
+PP
+0 sg
+2921  839 mt 2757  790 L
+2757  790 mt 2779  785 L
+c24
+76 -8 126 -23 2719 2822 3 MP
+PP
+0 sg
+2719 2822 mt 2845 2799 L
+2845 2799 mt 2921 2791 L
+c23
+-38 -45 -165 -8 2872 836 3 MP
+PP
+0 sg
+2872  836 mt 2707  828 L
+2707  828 mt 2669  783 L
+c25
+-164 -49 76 -8 2845 847 3 MP
+PP
+0 sg
+2845  847 mt 2921  839 L
+2921  839 mt 2757  790 L
+c24
+-119 -1 39 -55 2630 2790 3 MP
+PP
+0 sg
+2630 2790 mt 2669 2735 L
+2669 2735 mt 2550 2734 L
+c22
+-19 -79 -119 -1 2669 2735 3 MP
+PP
+0 sg
+2669 2735 mt 2550 2734 L
+2550 2734 mt 2531 2655 L
+c24
+39 -55 -56 -3 2686 2793 3 MP
+PP
+0 sg
+2686 2793 mt 2630 2790 L
+2630 2790 mt 2669 2735 L
+c24
+-113 -6 96 -52 2686 2793 3 MP
+PP
+0 sg
+2686 2793 mt 2782 2741 L
+2782 2741 mt 2669 2735 L
+c20
+221 -3 17 -69 2647 2762 3 MP
+PP
+0 sg
+2647 2762 mt 2664 2693 L
+2664 2693 mt 2885 2690 L
+c19
+221 -3 -15 -119 2679 1151 3 MP
+PP
+0 sg
+2679 1151 mt 2664 1032 L
+2664 1032 mt 2885 1029 L
+c24
+96 -52 -48 -4 2734 2797 3 MP
+PP
+0 sg
+2734 2797 mt 2686 2793 L
+2686 2793 mt 2782 2741 L
+c20
+67 -69 171 -3 2647 2762 3 MP
+PP
+0 sg
+2647 2762 mt 2818 2759 L
+2818 2759 mt 2885 2690 L
+c19
+15 -90 -274 -5 2773 989 3 MP
+PP
+0 sg
+2773  989 mt 2499  984 L
+2499  984 mt 2514  894 L
+c19
+-228 -3 -31 -92 2773 989 3 MP
+PP
+0 sg
+2773  989 mt 2742  897 L
+2742  897 mt 2514  894 L
+c21
+-67 -99 221 -3 2664 1032 3 MP
+PP
+0 sg
+2664 1032 mt 2885 1029 L
+2885 1029 mt 2818  930 L
+c25
+38 -5 -126 -52 2845 847 3 MP
+PP
+0 sg
+2845  847 mt 2719  795 L
+2719  795 mt 2757  790 L
+c24
+130 2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2719 2822 L
+c24
+51 -3 79 5 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2668 2825 L
+2668 2825 mt 2719 2822 L
+2719 2822 mt 2589 2820 L
+c24
+126 -23 51 -3 2668 2825 3 MP
+PP
+0 sg
+2668 2825 mt 2719 2822 L
+2719 2822 mt 2845 2799 L
+c25
+-126 -52 100 -5 2745 852 3 MP
+PP
+0 sg
+2745  852 mt 2845  847 L
+2845  847 mt 2719  795 L
+c23
+100 -5 -73 -78 2818 930 3 MP
+PP
+0 sg
+2818  930 mt 2745  852 L
+2745  852 mt 2845  847 L
+c24
+193 -12 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2782 2808 L
+c24
+100 -6 77 -20 2668 2825 3 MP
+PP
+0 sg
+2668 2825 mt 2745 2805 L
+2745 2805 mt 2845 2799 L
+c24
+-56 -3 97 -27 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2686 2793 L
+2686 2793 mt 2630 2790 L
+2630 2790 mt 2589 2820 L
+c24
+97 -27 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2686 2793 L
+c24
+145 -23 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2734 2797 L
+c24
+-48 -4 145 -23 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2734 2797 L
+2734 2797 mt 2686 2793 L
+2686 2793 mt 2589 2820 L
+c22
+73 -46 117 -1 2628 2806 3 MP
+PP
+0 sg
+2628 2806 mt 2745 2805 L
+2745 2805 mt 2818 2759 L
+c21
+171 -2 -17 -100 2664 1032 3 MP
+PP
+0 sg
+2664 1032 mt 2647  932 L
+2647  932 mt 2818  930 L
+c21
+17 -69 -228 -3 2742 897 3 MP
+PP
+0 sg
+2742  897 mt 2514  894 L
+2514  894 mt 2531  825 L
+c21
+-176 -3 -35 -69 2742 897 3 MP
+PP
+0 sg
+2742  897 mt 2707  828 L
+2707  828 mt 2531  825 L
+c23
+-73 -78 171 -2 2647 932 3 MP
+PP
+0 sg
+2647  932 mt 2818  930 L
+2818  930 mt 2745  852 L
+c22
+171 -3 19 -44 2628 2806 3 MP
+PP
+0 sg
+2628 2806 mt 2647 2762 L
+2647 2762 mt 2818 2759 L
+c25
+19 -20 -119 -2 2669 783 3 MP
+PP
+0 sg
+2669  783 mt 2550  781 L
+2550  781 mt 2569  761 L
+c25
+-61 -1 -39 -21 2669 783 3 MP
+PP
+0 sg
+2669  783 mt 2630  762 L
+2630  762 mt 2569  761 L
+/c26 { 0.500000 0.000000 0.000000 sr} bdef
+c26
+0 0 -193 -13 2782 780 3 MP
+PP
+0 sg
+2782  780 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-193 -13 3 -5 2779 785 3 MP
+PP
+0 sg
+2779  785 mt 2782  780 L
+2782  780 mt 2589  767 L
+2589  767 mt 2779  785 L
+c26
+-178 -7 -15 -6 2782 780 3 MP
+PP
+0 sg
+2782  780 mt 2767  774 L
+2767  774 mt 2589  767 L
+2589  767 mt 2782  780 L
+c26
+0 0 -190 -18 2779 785 3 MP
+PP
+0 sg
+2779  785 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-190 -18 22 -5 2757 790 3 MP
+PP
+0 sg
+2757  790 mt 2779  785 L
+2779  785 mt 2589  767 L
+2589  767 mt 2757  790 L
+c26
+-145 -2 -33 -5 2767 774 3 MP
+PP
+0 sg
+2767  774 mt 2734  769 L
+2734  769 mt 2589  767 L
+2589  767 mt 2767  774 L
+c26
+0 0 -178 -7 2767 774 3 MP
+PP
+0 sg
+2767  774 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+-119 -2 -38 -45 2707 828 3 MP
+PP
+0 sg
+2707  828 mt 2669  783 L
+2669  783 mt 2550  781 L
+c26
+-168 -23 38 -5 2719 795 3 MP
+PP
+0 sg
+2719  795 mt 2757  790 L
+2757  790 mt 2589  767 L
+2589  767 mt 2719  795 L
+c26
+0 0 -168 -23 2757 790 3 MP
+PP
+0 sg
+2757  790 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+19 -44 -176 -3 2707 828 3 MP
+PP
+0 sg
+2707  828 mt 2531  825 L
+2531  825 mt 2550  781 L
+c25
+-77 -55 117 -1 2628 853 3 MP
+PP
+0 sg
+2628  853 mt 2745  852 L
+2745  852 mt 2668  797 L
+c23
+117 -1 -19 -79 2647 932 3 MP
+PP
+0 sg
+2647  932 mt 2628  853 L
+2628  853 mt 2745  852 L
+c25
+51 -2 -77 -55 2745 852 3 MP
+PP
+0 sg
+2745  852 mt 2668  797 L
+2668  797 mt 2719  795 L
+c24
+59 -1 20 6 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2609 2826 L
+2609 2826 mt 2668 2825 L
+2668 2825 mt 2589 2820 L
+c24
+79 5 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2668 2825 L
+c24
+117 -1 19 -20 2609 2826 3 MP
+PP
+0 sg
+2609 2826 mt 2628 2806 L
+2628 2806 mt 2745 2805 L
+c24
+77 -20 59 -1 2609 2826 3 MP
+PP
+0 sg
+2609 2826 mt 2668 2825 L
+2668 2825 mt 2745 2805 L
+c26
+0 0 -145 -2 2734 769 3 MP
+PP
+0 sg
+2734  769 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-97 2 -48 -4 2734 769 3 MP
+PP
+0 sg
+2734  769 mt 2686  765 L
+2686  765 mt 2589  767 L
+2589  767 mt 2734  769 L
+c26
+0 0 -130 -28 2719 795 3 MP
+PP
+0 sg
+2719  795 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-130 -28 51 -2 2668 797 3 MP
+PP
+0 sg
+2668  797 mt 2719  795 L
+2719  795 mt 2589  767 L
+2589  767 mt 2668  797 L
+c11
+-357 5 -8 -156 2475 2155 3 MP
+PP
+0 sg
+2475 2155 mt 2467 1999 L
+2467 1999 mt 2110 2004 L
+c9
+2 -159 383 6 2332 2064 3 MP
+PP
+0 sg
+2332 2064 mt 2715 2070 L
+2715 2070 mt 2717 1911 L
+c10
+-18 -161 -357 5 2467 1999 3 MP
+PP
+0 sg
+2467 1999 mt 2110 2004 L
+2110 2004 mt 2092 1843 L
+c10
+-371 5 -4 -161 2467 1999 3 MP
+PP
+0 sg
+2467 1999 mt 2463 1838 L
+2463 1838 mt 2092 1843 L
+c9
+388 6 -3 -159 2332 2064 3 MP
+PP
+0 sg
+2332 2064 mt 2329 1905 L
+2329 1905 mt 2717 1911 L
+c8
+-2 -162 388 6 2329 1905 3 MP
+PP
+0 sg
+2329 1905 mt 2717 1911 L
+2717 1911 mt 2715 1749 L
+c11
+-30 -156 -335 5 2475 2155 3 MP
+PP
+0 sg
+2475 2155 mt 2140 2160 L
+2140 2160 mt 2110 2004 L
+c14
+-335 5 -11 -147 2486 2302 3 MP
+PP
+0 sg
+2486 2302 mt 2475 2155 L
+2475 2155 mt 2140 2160 L
+c10
+383 6 -9 -153 2341 2217 3 MP
+PP
+0 sg
+2341 2217 mt 2332 2064 L
+2332 2064 mt 2715 2070 L
+c10
+4 -153 370 6 2341 2217 3 MP
+PP
+0 sg
+2341 2217 mt 2711 2223 L
+2711 2223 mt 2715 2070 L
+c9
+-375 5 -2 -162 2463 1838 3 MP
+PP
+0 sg
+2463 1838 mt 2461 1676 L
+2461 1676 mt 2086 1681 L
+c12
+-4 -161 383 6 2332 1743 3 MP
+PP
+0 sg
+2332 1743 mt 2715 1749 L
+2715 1749 mt 2711 1588 L
+c9
+-6 -162 -371 5 2463 1838 3 MP
+PP
+0 sg
+2463 1838 mt 2092 1843 L
+2092 1843 mt 2086 1681 L
+c8
+383 6 3 -162 2329 1905 3 MP
+PP
+0 sg
+2329 1905 mt 2332 1743 L
+2332 1743 mt 2715 1749 L
+c16
+-304 4 -13 -134 2499 2436 3 MP
+PP
+0 sg
+2499 2436 mt 2486 2302 L
+2486 2302 mt 2182 2306 L
+c11
+8 -141 346 5 2357 2359 3 MP
+PP
+0 sg
+2357 2359 mt 2703 2364 L
+2703 2364 mt 2711 2223 L
+c8
+-371 5 2 -159 2461 1676 3 MP
+PP
+0 sg
+2461 1676 mt 2463 1517 L
+2463 1517 mt 2092 1522 L
+c13
+-8 -156 370 6 2341 1582 3 MP
+PP
+0 sg
+2341 1582 mt 2711 1588 L
+2711 1588 mt 2703 1432 L
+c8
+6 -159 -375 5 2461 1676 3 MP
+PP
+0 sg
+2461 1676 mt 2086 1681 L
+2086 1681 mt 2092 1522 L
+c12
+370 6 9 -161 2332 1743 3 MP
+PP
+0 sg
+2332 1743 mt 2341 1582 L
+2341 1582 mt 2711 1588 L
+c14
+-42 -146 -304 4 2486 2302 3 MP
+PP
+0 sg
+2486 2302 mt 2182 2306 L
+2182 2306 mt 2140 2160 L
+c11
+370 6 -16 -142 2357 2359 3 MP
+PP
+0 sg
+2357 2359 mt 2341 2217 L
+2341 2217 mt 2711 2223 L
+c12
+-357 6 4 -153 2463 1517 3 MP
+PP
+0 sg
+2463 1517 mt 2467 1364 L
+2467 1364 mt 2110 1370 L
+c15
+-11 -147 346 5 2357 1427 3 MP
+PP
+0 sg
+2357 1427 mt 2703 1432 L
+2703 1432 mt 2692 1285 L
+c16
+-51 -134 -266 4 2499 2436 3 MP
+PP
+0 sg
+2499 2436 mt 2233 2440 L
+2233 2440 mt 2182 2306 L
+c18
+-266 4 -15 -119 2514 2555 3 MP
+PP
+0 sg
+2514 2555 mt 2499 2436 L
+2499 2436 mt 2233 2440 L
+c14
+346 5 -21 -128 2378 2487 3 MP
+PP
+0 sg
+2378 2487 mt 2357 2359 L
+2357 2359 mt 2703 2364 L
+c14
+11 -128 314 5 2378 2487 3 MP
+PP
+0 sg
+2378 2487 mt 2692 2492 L
+2692 2492 mt 2703 2364 L
+c12
+18 -152 -371 5 2463 1517 3 MP
+PP
+0 sg
+2463 1517 mt 2092 1522 L
+2092 1522 mt 2110 1370 L
+c13
+346 5 16 -155 2341 1582 3 MP
+PP
+0 sg
+2341 1582 mt 2357 1427 L
+2357 1427 mt 2703 1432 L
+c18
+-60 -118 -221 3 2514 2555 3 MP
+PP
+0 sg
+2514 2555 mt 2293 2558 L
+2293 2558 mt 2233 2440 L
+c20
+-221 3 -17 -100 2531 2655 3 MP
+PP
+0 sg
+2531 2655 mt 2514 2555 L
+2514 2555 mt 2293 2558 L
+c16
+314 5 -27 -111 2405 2598 3 MP
+PP
+0 sg
+2405 2598 mt 2378 2487 L
+2378 2487 mt 2692 2492 L
+c13
+30 -142 -357 6 2467 1364 3 MP
+PP
+0 sg
+2467 1364 mt 2110 1370 L
+2110 1370 mt 2140 1228 L
+c13
+-335 5 8 -141 2467 1364 3 MP
+PP
+0 sg
+2467 1364 mt 2475 1223 L
+2475 1223 mt 2140 1228 L
+c15
+314 5 21 -147 2357 1427 3 MP
+PP
+0 sg
+2357 1427 mt 2378 1280 L
+2378 1280 mt 2692 1285 L
+c17
+-13 -134 314 5 2378 1280 3 MP
+PP
+0 sg
+2378 1280 mt 2692 1285 L
+2692 1285 mt 2679 1151 L
+c16
+13 -111 274 5 2405 2598 3 MP
+PP
+0 sg
+2405 2598 mt 2679 2603 L
+2679 2603 mt 2692 2492 L
+c26
+0 0 -97 2 2686 765 3 MP
+PP
+0 sg
+2686  765 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-41 5 -56 -3 2686 765 3 MP
+PP
+0 sg
+2686  765 mt 2630  762 L
+2630  762 mt 2589  767 L
+2589  767 mt 2686  765 L
+c22
+-73 -78 -117 1 2550 2734 3 MP
+PP
+0 sg
+2550 2734 mt 2433 2735 L
+2433 2735 mt 2360 2657 L
+c22
+-171 2 -19 -79 2550 2734 3 MP
+PP
+0 sg
+2550 2734 mt 2531 2655 L
+2531 2655 mt 2360 2657 L
+c18
+15 -90 228 3 2436 2690 3 MP
+PP
+0 sg
+2436 2690 mt 2664 2693 L
+2664 2693 mt 2679 2603 L
+c20
+-67 -99 -171 2 2531 2655 3 MP
+PP
+0 sg
+2531 2655 mt 2360 2657 L
+2360 2657 mt 2293 2558 L
+c18
+274 5 -31 -92 2436 2690 3 MP
+PP
+0 sg
+2436 2690 mt 2405 2598 L
+2405 2598 mt 2679 2603 L
+c15
+42 -129 -335 5 2475 1223 3 MP
+PP
+0 sg
+2475 1223 mt 2140 1228 L
+2140 1228 mt 2182 1099 L
+c15
+-304 4 11 -128 2475 1223 3 MP
+PP
+0 sg
+2475 1223 mt 2486 1095 L
+2486 1095 mt 2182 1099 L
+c17
+274 5 27 -134 2378 1280 3 MP
+PP
+0 sg
+2378 1280 mt 2405 1146 L
+2405 1146 mt 2679 1151 L
+c19
+-15 -119 274 5 2405 1146 3 MP
+PP
+0 sg
+2405 1146 mt 2679 1151 L
+2679 1151 mt 2664 1032 L
+c26
+0 0 -79 -30 2668 797 3 MP
+PP
+0 sg
+2668  797 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-79 -30 59 -1 2609 798 3 MP
+PP
+0 sg
+2609  798 mt 2668  797 L
+2668  797 mt 2589  767 L
+2589  767 mt 2609  798 L
+c25
+59 -1 -19 -55 2628 853 3 MP
+PP
+0 sg
+2628  853 mt 2609  798 L
+2609  798 mt 2668  797 L
+c17
+-266 4 13 -111 2486 1095 3 MP
+PP
+0 sg
+2486 1095 mt 2499  984 L
+2499  984 mt 2233  988 L
+c21
+-17 -100 228 4 2436 1028 3 MP
+PP
+0 sg
+2436 1028 mt 2664 1032 L
+2664 1032 mt 2647  932 L
+c17
+51 -111 -304 4 2486 1095 3 MP
+PP
+0 sg
+2486 1095 mt 2182 1099 L
+2182 1099 mt 2233  988 L
+c19
+228 4 31 -118 2405 1146 3 MP
+PP
+0 sg
+2405 1146 mt 2436 1028 L
+2436 1028 mt 2664 1032 L
+c24
+-77 -55 -59 1 2569 2789 3 MP
+PP
+0 sg
+2569 2789 mt 2510 2790 L
+2510 2790 mt 2433 2735 L
+c24
+-117 1 -19 -55 2569 2789 3 MP
+PP
+0 sg
+2569 2789 mt 2550 2734 L
+2550 2734 mt 2433 2735 L
+c20
+228 3 -35 -69 2471 2759 3 MP
+PP
+0 sg
+2471 2759 mt 2436 2690 L
+2436 2690 mt 2664 2693 L
+c24
+-19 -55 -61 -1 2630 2790 3 MP
+PP
+0 sg
+2630 2790 mt 2569 2789 L
+2569 2789 mt 2550 2734 L
+c20
+17 -69 176 3 2471 2759 3 MP
+PP
+0 sg
+2471 2759 mt 2647 2762 L
+2647 2762 mt 2664 2693 L
+c24
+-100 5 -77 -55 2510 2790 3 MP
+PP
+0 sg
+2510 2790 mt 2433 2735 L
+2433 2735 mt 2333 2740 L
+c24
+-126 -52 -51 2 2510 2790 3 MP
+PP
+0 sg
+2510 2790 mt 2459 2792 L
+2459 2792 mt 2333 2740 L
+c24
+-38 5 -130 -28 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2459 2792 L
+2459 2792 mt 2421 2797 L
+2421 2797 mt 2589 2820 L
+c24
+-51 2 -79 -30 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2510 2790 L
+2510 2790 mt 2459 2792 L
+2459 2792 mt 2589 2820 L
+c24
+-130 -28 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2459 2792 L
+c24
+-59 1 -20 -31 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2569 2789 L
+2569 2789 mt 2510 2790 L
+2510 2790 mt 2589 2820 L
+c24
+-79 -30 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2510 2790 L
+c22
+176 3 -38 -45 2509 2804 3 MP
+PP
+0 sg
+2509 2804 mt 2471 2759 L
+2471 2759 mt 2647 2762 L
+c19
+60 -91 -266 4 2499 984 3 MP
+PP
+0 sg
+2499  984 mt 2233  988 L
+2233  988 mt 2293  897 L
+c19
+-221 3 15 -90 2499 984 3 MP
+PP
+0 sg
+2499  984 mt 2514  894 L
+2514  894 mt 2293  897 L
+c21
+176 3 35 -99 2436 1028 3 MP
+PP
+0 sg
+2436 1028 mt 2471  929 L
+2471  929 mt 2647  932 L
+c24
+-20 -31 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2569 2789 L
+c24
+-61 -1 41 -30 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2630 2790 L
+2630 2790 mt 2569 2789 L
+2569 2789 mt 2589 2820 L
+c24
+41 -30 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2630 2790 L
+c22
+19 -44 119 2 2509 2804 3 MP
+PP
+0 sg
+2509 2804 mt 2628 2806 L
+2628 2806 mt 2647 2762 L
+c23
+-19 -79 176 3 2471 929 3 MP
+PP
+0 sg
+2471  929 mt 2647  932 L
+2647  932 mt 2628  853 L
+c26
+0 0 -41 5 2630 762 3 MP
+PP
+0 sg
+2630  762 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+20 6 -61 -1 2630 762 3 MP
+PP
+0 sg
+2630  762 mt 2569  761 L
+2569  761 mt 2589  767 L
+2589  767 mt 2630  762 L
+c21
+-171 3 17 -69 2514 894 3 MP
+PP
+0 sg
+2514  894 mt 2531  825 L
+2531  825 mt 2360  828 L
+c25
+-19 -55 119 1 2509 852 3 MP
+PP
+0 sg
+2509  852 mt 2628  853 L
+2628  853 mt 2609  798 L
+c24
+-3 5 -190 -18 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2399 2802 L
+2399 2802 mt 2396 2807 L
+2396 2807 mt 2589 2820 L
+c24
+-22 5 -168 -23 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2421 2797 L
+2421 2797 mt 2399 2802 L
+2399 2802 mt 2589 2820 L
+c24
+-190 -18 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2399 2802 L
+c24
+-168 -23 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2421 2797 L
+c24
+56 3 -97 2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2492 2822 L
+2492 2822 mt 2548 2825 L
+2548 2825 mt 2589 2820 L
+c24
+-41 5 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2548 2825 L
+c24
+-193 -13 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2396 2807 L
+c24
+48 4 -145 -2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2444 2818 L
+2444 2818 mt 2492 2822 L
+2492 2822 mt 2589 2820 L
+c24
+-97 2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2492 2822 L
+c24
+33 5 -178 -7 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2411 2813 L
+2411 2813 mt 2444 2818 L
+2444 2818 mt 2589 2820 L
+c24
+-145 -2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2444 2818 L
+c24
+15 6 -193 -13 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2396 2807 L
+2396 2807 mt 2411 2813 L
+2411 2813 mt 2589 2820 L
+c24
+-178 -7 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2411 2813 L
+c24
+61 1 -41 5 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2548 2825 L
+2548 2825 mt 2609 2826 L
+2609 2826 mt 2589 2820 L
+c24
+20 6 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2609 2826 L
+c24
+19 -20 61 1 2548 2825 3 MP
+PP
+0 sg
+2548 2825 mt 2609 2826 L
+2609 2826 mt 2628 2806 L
+c24
+119 2 -39 -21 2548 2825 3 MP
+PP
+0 sg
+2548 2825 mt 2509 2804 L
+2509 2804 mt 2628 2806 L
+c21
+67 -69 -221 3 2514 894 3 MP
+PP
+0 sg
+2514  894 mt 2293  897 L
+2293  897 mt 2360  828 L
+c23
+119 1 38 -77 2471 929 3 MP
+PP
+0 sg
+2471  929 mt 2509  852 L
+2509  852 mt 2628  853 L
+c26
+-20 -31 61 1 2548 797 3 MP
+PP
+0 sg
+2548  797 mt 2609  798 L
+2609  798 mt 2589  767 L
+2589  767 mt 2548  797 L
+c26
+0 0 -20 -31 2609 798 3 MP
+PP
+0 sg
+2609  798 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+73 -46 -171 3 2531 825 3 MP
+PP
+0 sg
+2531  825 mt 2360  828 L
+2360  828 mt 2433  782 L
+c23
+-117 1 19 -44 2531 825 3 MP
+PP
+0 sg
+2531  825 mt 2550  781 L
+2550  781 mt 2433  782 L
+c25
+61 1 39 -55 2509 852 3 MP
+PP
+0 sg
+2509  852 mt 2548  797 L
+2548  797 mt 2609  798 L
+c25
+-38 4 126 -23 2333 788 3 MP
+PP
+0 sg
+2333  788 mt 2459  765 L
+2459  765 mt 2421  769 L
+c25
+126 -23 -100 6 2433 782 3 MP
+PP
+0 sg
+2433  782 mt 2333  788 L
+2333  788 mt 2459  765 L
+c25
+-51 3 77 -20 2433 782 3 MP
+PP
+0 sg
+2433  782 mt 2510  762 L
+2510  762 mt 2459  765 L
+c25
+77 -20 -117 1 2550 781 3 MP
+PP
+0 sg
+2550  781 mt 2433  782 L
+2433  782 mt 2510  762 L
+c25
+-59 1 19 -20 2550 781 3 MP
+PP
+0 sg
+2550  781 mt 2569  761 L
+2569  761 mt 2510  762 L
+c26
+193 -12 -3 5 2399 774 3 MP
+PP
+0 sg
+2399  774 mt 2396  779 L
+2396  779 mt 2589  767 L
+2589  767 mt 2399  774 L
+c26
+0 0 190 -7 2399 774 3 MP
+PP
+0 sg
+2399  774 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+-100 6 73 -46 2360 828 3 MP
+PP
+0 sg
+2360  828 mt 2433  782 L
+2433  782 mt 2333  788 L
+c26
+178 -18 15 6 2396 779 3 MP
+PP
+0 sg
+2396  779 mt 2411  785 L
+2411  785 mt 2589  767 L
+2589  767 mt 2396  779 L
+c26
+0 0 193 -12 2396 779 3 MP
+PP
+0 sg
+2396  779 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+0 0 178 -18 2411 785 3 MP
+PP
+0 sg
+2411  785 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+97 -27 48 4 2444 790 3 MP
+PP
+0 sg
+2444  790 mt 2492  794 L
+2492  794 mt 2589  767 L
+2589  767 mt 2444  790 L
+c26
+0 0 145 -23 2444 790 3 MP
+PP
+0 sg
+2444  790 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+41 -30 56 3 2492 794 3 MP
+PP
+0 sg
+2492  794 mt 2548  797 L
+2548  797 mt 2589  767 L
+2589  767 mt 2492  794 L
+c26
+0 0 97 -27 2492 794 3 MP
+PP
+0 sg
+2492  794 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+0 0 41 -30 2548 797 3 MP
+PP
+0 sg
+2548  797 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+79 5 -59 1 2569 761 3 MP
+PP
+0 sg
+2569  761 mt 2510  762 L
+2510  762 mt 2589  767 L
+2589  767 mt 2569  761 L
+c26
+0 0 20 6 2569 761 3 MP
+PP
+0 sg
+2569  761 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+130 2 -51 3 2510 762 3 MP
+PP
+0 sg
+2510  762 mt 2459  765 L
+2459  765 mt 2589  767 L
+2589  767 mt 2510  762 L
+c26
+0 0 79 5 2510 762 3 MP
+PP
+0 sg
+2510  762 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+168 -2 -38 4 2459 765 3 MP
+PP
+0 sg
+2459  765 mt 2421  769 L
+2421  769 mt 2589  767 L
+2589  767 mt 2459  765 L
+c26
+0 0 130 2 2459 765 3 MP
+PP
+0 sg
+2459  765 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+190 -7 -22 5 2421 769 3 MP
+PP
+0 sg
+2421  769 mt 2399  774 L
+2399  774 mt 2589  767 L
+2589  767 mt 2421  769 L
+c26
+0 0 168 -2 2421 769 3 MP
+PP
+0 sg
+2421  769 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+145 -23 33 5 2411 785 3 MP
+PP
+0 sg
+2411  785 mt 2444  790 L
+2444  790 mt 2589  767 L
+2589  767 mt 2411  785 L
+c25
+39 -55 113 6 2396 846 3 MP
+PP
+0 sg
+2396  846 mt 2509  852 L
+2509  852 mt 2548  797 L
+c25
+56 3 96 -52 2396 846 3 MP
+PP
+0 sg
+2396  846 mt 2492  794 L
+2492  794 mt 2548  797 L
+c24
+-39 -21 56 3 2492 2822 3 MP
+PP
+0 sg
+2492 2822 mt 2548 2825 L
+2548 2825 mt 2509 2804 L
+gr
+
+24 W
+1 sg
+2537 1175 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2536 1368 PD
+gs 655 283 3870 3023 rc
+c24
+-185 -44 -22 5 2421 2797 3 MP
+PP
+0 sg
+2421 2797 mt 2399 2802 L
+2399 2802 mt 2214 2758 L
+c24
+-43 10 -164 -49 2421 2797 3 MP
+PP
+0 sg
+2421 2797 mt 2257 2748 L
+2257 2748 mt 2214 2758 L
+c24
+-76 8 -126 -52 2459 2792 3 MP
+PP
+0 sg
+2459 2792 mt 2333 2740 L
+2333 2740 mt 2257 2748 L
+c24
+-164 -49 -38 5 2459 2792 3 MP
+PP
+0 sg
+2459 2792 mt 2421 2797 L
+2421 2797 mt 2257 2748 L
+c22
+-38 -45 113 5 2396 2799 3 MP
+PP
+0 sg
+2396 2799 mt 2509 2804 L
+2509 2804 mt 2471 2759 L
+c23
+38 -77 165 7 2306 922 3 MP
+PP
+0 sg
+2306  922 mt 2471  929 L
+2471  929 mt 2509  852 L
+c23
+113 6 90 -76 2306 922 3 MP
+PP
+0 sg
+2306  922 mt 2396  846 L
+2396  846 mt 2509  852 L
+c24
+113 5 -96 -23 2492 2822 3 MP
+PP
+0 sg
+2492 2822 mt 2396 2799 L
+2396 2799 mt 2509 2804 L
+gr
+
+0 sg
+24 W
+1 sg
+2499 1242 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2494 1130 PD
+gs 655 283 3870 3023 rc
+c21
+-148 7 67 -69 2293 897 3 MP
+PP
+0 sg
+2293  897 mt 2360  828 L
+2360  828 mt 2212  835 L
+c23
+121 -47 -148 7 2360 828 3 MP
+PP
+0 sg
+2360  828 mt 2212  835 L
+2212  835 mt 2333  788 L
+c25
+96 -52 93 8 2303 838 3 MP
+PP
+0 sg
+2303  838 mt 2396  846 L
+2396  846 mt 2492  794 L
+c25
+48 4 141 -48 2303 838 3 MP
+PP
+0 sg
+2303  838 mt 2444  790 L
+2444  790 mt 2492  794 L
+c24
+-96 -23 48 4 2444 2818 3 MP
+PP
+0 sg
+2444 2818 mt 2492 2822 L
+2492 2822 mt 2396 2799 L
+gr
+
+0 sg
+24 W
+1 sg
+2486 1310 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2473 1335 PD
+gs 655 283 3870 3023 rc
+c21
+35 -99 213 10 2223 1018 3 MP
+PP
+0 sg
+2223 1018 mt 2436 1028 L
+2436 1028 mt 2471  929 L
+c22
+165 8 -90 -48 2396 2799 3 MP
+PP
+0 sg
+2396 2799 mt 2306 2751 L
+2306 2751 mt 2471 2759 L
+c22
+-111 11 -121 -75 2333 2740 3 MP
+PP
+0 sg
+2333 2740 mt 2212 2665 L
+2212 2665 mt 2101 2676 L
+c22
+-156 -72 -76 8 2333 2740 3 MP
+PP
+0 sg
+2333 2740 mt 2257 2748 L
+2257 2748 mt 2101 2676 L
+c22
+-148 8 -73 -78 2433 2735 3 MP
+PP
+0 sg
+2433 2735 mt 2360 2657 L
+2360 2657 mt 2212 2665 L
+c22
+-121 -75 -100 5 2433 2735 3 MP
+PP
+0 sg
+2433 2735 mt 2333 2740 L
+2333 2740 mt 2212 2665 L
+c20
+-35 -69 165 8 2306 2751 3 MP
+PP
+0 sg
+2306 2751 mt 2471 2759 L
+2471 2759 mt 2436 2690 L
+c21
+165 7 83 -96 2223 1018 3 MP
+PP
+0 sg
+2223 1018 mt 2306  922 L
+2306  922 mt 2471  929 L
+gr
+
+0 sg
+24 W
+1 sg
+2469 1460 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2468 1452 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2455 1166 PD
+gs 655 283 3870 3023 rc
+c25
+141 -48 65 10 2238 828 3 MP
+PP
+0 sg
+2238  828 mt 2303  838 L
+2303  838 mt 2444  790 L
+c25
+33 5 173 -43 2238 828 3 MP
+PP
+0 sg
+2238  828 mt 2411  785 L
+2411  785 mt 2444  790 L
+c24
+31 11 -189 -37 2396 2807 3 MP
+PP
+0 sg
+2396 2807 mt 2207 2770 L
+2207 2770 mt 2238 2781 L
+c24
+-173 -32 15 6 2396 2807 3 MP
+PP
+0 sg
+2396 2807 mt 2411 2813 L
+2411 2813 mt 2238 2781 L
+c24
+-141 -27 33 5 2411 2813 3 MP
+PP
+0 sg
+2411 2813 mt 2444 2818 L
+2444 2818 mt 2303 2791 L
+c24
+-189 -37 -3 5 2399 2802 3 MP
+PP
+0 sg
+2399 2802 mt 2396 2807 L
+2396 2807 mt 2207 2770 L
+c24
+-7 12 -185 -44 2399 2802 3 MP
+PP
+0 sg
+2399 2802 mt 2214 2758 L
+2214 2758 mt 2207 2770 L
+c24
+93 8 -141 -27 2444 2818 3 MP
+PP
+0 sg
+2444 2818 mt 2303 2791 L
+2303 2791 mt 2396 2799 L
+c20
+213 10 -83 -71 2306 2751 3 MP
+PP
+0 sg
+2306 2751 mt 2223 2680 L
+2223 2680 mt 2436 2690 L
+c20
+-192 10 -67 -99 2360 2657 3 MP
+PP
+0 sg
+2360 2657 mt 2293 2558 L
+2293 2558 mt 2101 2568 L
+c20
+-111 -97 -148 8 2360 2657 3 MP
+PP
+0 sg
+2360 2657 mt 2212 2665 L
+2212 2665 mt 2101 2568 L
+c18
+-31 -92 213 10 2223 2680 3 MP
+PP
+0 sg
+2223 2680 mt 2436 2690 L
+2436 2690 mt 2405 2598 L
+c15
+-264 14 42 -129 2140 1228 3 MP
+PP
+0 sg
+2140 1228 mt 2182 1099 L
+2182 1099 mt 1918 1113 L
+c19
+31 -118 257 12 2148 1134 3 MP
+PP
+0 sg
+2148 1134 mt 2405 1146 L
+2405 1146 mt 2436 1028 L
+c17
+84 -113 -264 14 2182 1099 3 MP
+PP
+0 sg
+2182 1099 mt 1918 1113 L
+1918 1113 mt 2002 1000 L
+c17
+-231 12 51 -111 2182 1099 3 MP
+PP
+0 sg
+2182 1099 mt 2233  988 L
+2233  988 mt 2002 1000 L
+c19
+213 10 75 -116 2148 1134 3 MP
+PP
+0 sg
+2148 1134 mt 2223 1018 L
+2223 1018 mt 2436 1028 L
+gr
+
+0 sg
+24 W
+1 sg
+2433 1138 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2423 1068 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2422 1192 PD
+gs 655 283 3870 3023 rc
+c25
+164 -27 -76 8 2333 788 3 MP
+PP
+0 sg
+2333  788 mt 2257  796 L
+2257  796 mt 2421  769 L
+c25
+-22 5 164 -27 2257 796 3 MP
+PP
+0 sg
+2257  796 mt 2421  769 L
+2421  769 mt 2399  774 L
+gr
+
+0 sg
+24 W
+1 sg
+2417 1377 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2416 1137 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2412 1295 PD
+gs 655 283 3870 3023 rc
+c23
+156 -51 -111 12 2212 835 3 MP
+PP
+0 sg
+2212  835 mt 2101  847 L
+2101  847 mt 2257  796 L
+c23
+-76 8 121 -47 2212 835 3 MP
+PP
+0 sg
+2212  835 mt 2333  788 L
+2333  788 mt 2257  796 L
+c25
+173 -43 31 11 2207 817 3 MP
+PP
+0 sg
+2207  817 mt 2238  828 L
+2238  828 mt 2411  785 L
+c25
+15 6 189 -38 2207 817 3 MP
+PP
+0 sg
+2207  817 mt 2396  779 L
+2396  779 mt 2411  785 L
+c24
+65 10 -173 -32 2411 2813 3 MP
+PP
+0 sg
+2411 2813 mt 2238 2781 L
+2238 2781 mt 2303 2791 L
+c18
+-99 -116 -192 10 2293 2558 3 MP
+PP
+0 sg
+2293 2558 mt 2101 2568 L
+2101 2568 mt 2002 2452 L
+c18
+-231 12 -60 -118 2293 2558 3 MP
+PP
+0 sg
+2293 2558 mt 2233 2440 L
+2233 2440 mt 2002 2452 L
+c16
+-27 -111 257 12 2148 2586 3 MP
+PP
+0 sg
+2148 2586 mt 2405 2598 L
+2405 2598 mt 2378 2487 L
+c20
+-144 -93 -111 11 2212 2665 3 MP
+PP
+0 sg
+2212 2665 mt 2101 2676 L
+2101 2676 mt 1957 2583 L
+c20
+-144 15 -111 -97 2212 2665 3 MP
+PP
+0 sg
+2212 2665 mt 2101 2568 L
+2101 2568 mt 1957 2583 L
+c18
+257 12 -75 -94 2223 2680 3 MP
+PP
+0 sg
+2223 2680 mt 2148 2586 L
+2148 2586 mt 2405 2598 L
+c13
+-290 14 30 -142 2110 1370 3 MP
+PP
+0 sg
+2110 1370 mt 2140 1228 L
+2140 1228 mt 1850 1242 L
+c15
+68 -129 -290 14 2140 1228 3 MP
+PP
+0 sg
+2140 1228 mt 1850 1242 L
+1850 1242 mt 1918 1113 L
+c17
+257 12 63 -133 2085 1267 3 MP
+PP
+0 sg
+2085 1267 mt 2148 1134 L
+2148 1134 mt 2405 1146 L
+c17
+27 -134 293 13 2085 1267 3 MP
+PP
+0 sg
+2085 1267 mt 2378 1280 L
+2378 1280 mt 2405 1146 L
+gr
+
+0 sg
+24 W
+1 sg
+2402 1483 PD
+gs 655 283 3870 3023 rc
+c23
+-43 10 156 -51 2101 847 3 MP
+PP
+0 sg
+2101  847 mt 2257  796 L
+2257  796 mt 2214  806 L
+c25
+-3 5 185 -32 2214 806 3 MP
+PP
+0 sg
+2214  806 mt 2399  774 L
+2399  774 mt 2396  779 L
+c25
+185 -32 -43 10 2257 796 3 MP
+PP
+0 sg
+2257  796 mt 2214  806 L
+2214  806 mt 2399  774 L
+c21
+111 -72 -192 10 2293 897 3 MP
+PP
+0 sg
+2293  897 mt 2101  907 L
+2101  907 mt 2212  835 L
+c19
+-192 10 60 -91 2233 988 3 MP
+PP
+0 sg
+2233  988 mt 2293  897 L
+2293  897 mt 2101  907 L
+c23
+93 8 134 -72 2169 910 3 MP
+PP
+0 sg
+2169  910 mt 2303  838 L
+2303  838 mt 2396  846 L
+c23
+90 -76 137 12 2169 910 3 MP
+PP
+0 sg
+2169  910 mt 2306  922 L
+2306  922 mt 2396  846 L
+c22
+-90 -48 93 8 2303 2791 3 MP
+PP
+0 sg
+2303 2791 mt 2396 2799 L
+2396 2799 mt 2306 2751 L
+c25
+189 -38 -7 11 2214 806 3 MP
+PP
+0 sg
+2214  806 mt 2207  817 L
+2207  817 mt 2396  779 L
+gr
+
+0 sg
+24 W
+1 sg
+2395 1533 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2380 1458 PD
+gs 655 283 3870 3023 rc
+c12
+-310 15 18 -152 2092 1522 3 MP
+PP
+0 sg
+2092 1522 mt 2110 1370 L
+2110 1370 mt 1800 1385 L
+c13
+50 -143 -310 15 2110 1370 3 MP
+PP
+0 sg
+2110 1370 mt 1800 1385 L
+1800 1385 mt 1850 1242 L
+c15
+293 13 51 -145 2034 1412 3 MP
+PP
+0 sg
+2034 1412 mt 2085 1267 L
+2085 1267 mt 2378 1280 L
+c15
+21 -147 323 15 2034 1412 3 MP
+PP
+0 sg
+2034 1412 mt 2357 1427 L
+2357 1427 mt 2378 1280 L
+c16
+293 14 -63 -113 2148 2586 3 MP
+PP
+0 sg
+2148 2586 mt 2085 2473 L
+2085 2473 mt 2378 2487 L
+c16
+-84 -133 -231 12 2233 2440 3 MP
+PP
+0 sg
+2233 2440 mt 2002 2452 L
+2002 2452 mt 1918 2319 L
+c16
+-264 13 -51 -134 2233 2440 3 MP
+PP
+0 sg
+2233 2440 mt 2182 2306 L
+2182 2306 mt 1918 2319 L
+c14
+-21 -128 293 14 2085 2473 3 MP
+PP
+0 sg
+2085 2473 mt 2378 2487 L
+2378 2487 mt 2357 2359 L
+gr
+
+0 sg
+24 W
+1 sg
+2377 1363 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2371 1171 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2363 1468 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2362 1090 PD
+gs 655 283 3870 3023 rc
+c14
+323 15 -51 -129 2085 2473 3 MP
+PP
+0 sg
+2085 2473 mt 2034 2344 L
+2034 2344 mt 2357 2359 L
+c14
+-290 14 -42 -146 2182 2306 3 MP
+PP
+0 sg
+2182 2306 mt 2140 2160 L
+2140 2160 mt 1850 2174 L
+c14
+-68 -145 -264 13 2182 2306 3 MP
+PP
+0 sg
+2182 2306 mt 1918 2319 L
+1918 2319 mt 1850 2174 L
+c11
+-16 -142 323 15 2034 2344 3 MP
+PP
+0 sg
+2034 2344 mt 2357 2359 L
+2357 2359 mt 2341 2217 L
+c8
+-323 16 6 -159 2086 1681 3 MP
+PP
+0 sg
+2086 1681 mt 2092 1522 L
+2092 1522 mt 1769 1538 L
+c13
+16 -155 345 16 1996 1566 3 MP
+PP
+0 sg
+1996 1566 mt 2341 1582 L
+2341 1582 mt 2357 1427 L
+c12
+31 -153 -323 16 2092 1522 3 MP
+PP
+0 sg
+2092 1522 mt 1769 1538 L
+1769 1538 mt 1800 1385 L
+c13
+323 15 38 -154 1996 1566 3 MP
+PP
+0 sg
+1996 1566 mt 2034 1412 L
+2034 1412 mt 2357 1427 L
+gr
+
+0 sg
+24 W
+1 sg
+2352 1286 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2349 1525 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2343 1285 PD
+gs 655 283 3870 3023 rc
+c8
+10 -160 -327 17 2086 1681 3 MP
+PP
+0 sg
+2086 1681 mt 1759 1698 L
+1759 1698 mt 1769 1538 L
+c9
+-327 17 -6 -162 2092 1843 3 MP
+PP
+0 sg
+2092 1843 mt 2086 1681 L
+2086 1681 mt 1759 1698 L
+c12
+345 16 22 -160 1974 1726 3 MP
+PP
+0 sg
+1974 1726 mt 1996 1566 L
+1996 1566 mt 2341 1582 L
+c11
+345 16 -38 -143 2034 2344 3 MP
+PP
+0 sg
+2034 2344 mt 1996 2201 L
+1996 2201 mt 2341 2217 L
+c12
+9 -161 358 17 1974 1726 3 MP
+PP
+0 sg
+1974 1726 mt 2332 1743 L
+2332 1743 mt 2341 1582 L
+c11
+-310 16 -30 -156 2140 2160 3 MP
+PP
+0 sg
+2140 2160 mt 2110 2004 L
+2110 2004 mt 1800 2020 L
+c11
+-50 -154 -290 14 2140 2160 3 MP
+PP
+0 sg
+2140 2160 mt 1850 2174 L
+1850 2174 mt 1800 2020 L
+c10
+-9 -153 345 16 1996 2201 3 MP
+PP
+0 sg
+1996 2201 mt 2341 2217 L
+2341 2217 mt 2332 2064 L
+gr
+
+0 sg
+24 W
+1 sg
+2336 1394 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2334 1123 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2334 1344 PD
+gs 655 283 3870 3023 rc
+c10
+-323 17 -18 -161 2110 2004 3 MP
+PP
+0 sg
+2110 2004 mt 2092 1843 L
+2092 1843 mt 1769 1860 L
+c10
+-31 -160 -310 16 2110 2004 3 MP
+PP
+0 sg
+2110 2004 mt 1800 2020 L
+1800 2020 mt 1769 1860 L
+c9
+-3 -159 358 17 1974 2047 3 MP
+PP
+0 sg
+1974 2047 mt 2332 2064 L
+2332 2064 mt 2329 1905 L
+c10
+358 17 -22 -154 1996 2201 3 MP
+PP
+0 sg
+1996 2201 mt 1974 2047 L
+1974 2047 mt 2332 2064 L
+c9
+-10 -162 -323 17 2092 1843 3 MP
+PP
+0 sg
+2092 1843 mt 1769 1860 L
+1769 1860 mt 1759 1698 L
+c8
+3 -162 363 17 1966 1888 3 MP
+PP
+0 sg
+1966 1888 mt 2329 1905 L
+2329 1905 mt 2332 1743 L
+c8
+358 17 8 -162 1966 1888 3 MP
+PP
+0 sg
+1966 1888 mt 1974 1726 L
+1974 1726 mt 2332 1743 L
+c9
+363 17 -8 -159 1974 2047 3 MP
+PP
+0 sg
+1974 2047 mt 1966 1888 L
+1966 1888 mt 2329 1905 L
+gr
+
+0 sg
+24 W
+1 sg
+2319 1083 PD
+gs 655 283 3870 3023 rc
+c19
+99 -93 -231 12 2233 988 3 MP
+PP
+0 sg
+2233  988 mt 2002 1000 L
+2002 1000 mt 2101  907 L
+c21
+83 -96 178 15 2045 1003 3 MP
+PP
+0 sg
+2045 1003 mt 2223 1018 L
+2223 1018 mt 2306  922 L
+c21
+137 12 124 -93 2045 1003 3 MP
+PP
+0 sg
+2045 1003 mt 2169  910 L
+2169  910 mt 2306  922 L
+c22
+-64 15 -156 -72 2257 2748 3 MP
+PP
+0 sg
+2257 2748 mt 2101 2676 L
+2101 2676 mt 2037 2691 L
+c22
+-177 -67 -43 10 2257 2748 3 MP
+PP
+0 sg
+2257 2748 mt 2214 2758 L
+2214 2758 mt 2037 2691 L
+c22
+137 12 -134 -52 2303 2791 3 MP
+PP
+0 sg
+2303 2791 mt 2169 2739 L
+2169 2739 mt 2306 2751 L
+c20
+-83 -71 137 12 2169 2739 3 MP
+PP
+0 sg
+2169 2739 mt 2306 2751 L
+2306 2751 mt 2223 2680 L
+c21
+144 -75 -144 15 2101 907 3 MP
+PP
+0 sg
+2101  907 mt 1957  922 L
+1957  922 mt 2101  847 L
+c21
+-111 12 111 -72 2101 907 3 MP
+PP
+0 sg
+2101  907 mt 2212  835 L
+2212  835 mt 2101  847 L
+c23
+134 -72 96 15 2073 895 3 MP
+PP
+0 sg
+2073  895 mt 2169  910 L
+2169  910 mt 2303  838 L
+c22
+-9 17 -177 -67 2214 2758 3 MP
+PP
+0 sg
+2214 2758 mt 2037 2691 L
+2037 2691 mt 2028 2708 L
+c22
+-179 -62 -7 12 2214 2758 3 MP
+PP
+0 sg
+2214 2758 mt 2207 2770 L
+2207 2770 mt 2028 2708 L
+c22
+-134 -52 65 10 2238 2781 3 MP
+PP
+0 sg
+2238 2781 mt 2303 2791 L
+2303 2791 mt 2169 2739 L
+c23
+65 10 165 -67 2073 895 3 MP
+PP
+0 sg
+2073  895 mt 2238  828 L
+2238  828 mt 2303  838 L
+gr
+
+0 sg
+24 W
+1 sg
+2296 1466 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2296 1226 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2283 1362 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2282 1224 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2278 1568 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2277 1304 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2277 1508 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2276 1112 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2275 1509 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2275 1469 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2266 1343 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2255 1272 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2254 1571 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2246 1094 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2240 1103 PD
+gs 655 283 3870 3023 rc
+c21
+-64 15 144 -75 1957 922 3 MP
+PP
+0 sg
+1957  922 mt 2101  847 L
+2101  847 mt 2037  862 L
+c23
+165 -67 45 17 2028 878 3 MP
+PP
+0 sg
+2028  878 mt 2073  895 L
+2073  895 mt 2238  828 L
+c22
+45 16 -179 -62 2207 2770 3 MP
+PP
+0 sg
+2207 2770 mt 2028 2708 L
+2028 2708 mt 2073 2724 L
+c22
+-165 -57 31 11 2207 2770 3 MP
+PP
+0 sg
+2207 2770 mt 2238 2781 L
+2238 2781 mt 2073 2724 L
+c22
+96 15 -165 -57 2238 2781 3 MP
+PP
+0 sg
+2238 2781 mt 2073 2724 L
+2073 2724 mt 2169 2739 L
+c23
+31 11 179 -61 2028 878 3 MP
+PP
+0 sg
+2028  878 mt 2207  817 L
+2207  817 mt 2238  828 L
+gr
+
+0 sg
+24 W
+1 sg
+2236 1229 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2231 1383 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2230 1121 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2229 1442 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2228 1318 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2223 1194 PD
+gs 655 283 3870 3023 rc
+c20
+-82 19 -144 -93 2101 2676 3 MP
+PP
+0 sg
+2101 2676 mt 1957 2583 L
+1957 2583 mt 1875 2602 L
+c20
+-162 -89 -64 15 2101 2676 3 MP
+PP
+0 sg
+2101 2676 mt 2037 2691 L
+2037 2691 mt 1875 2602 L
+c18
+-75 -94 178 16 2045 2664 3 MP
+PP
+0 sg
+2045 2664 mt 2223 2680 L
+2223 2680 mt 2148 2586 L
+c19
+178 15 110 -113 1935 1116 3 MP
+PP
+0 sg
+1935 1116 mt 2045 1003 L
+2045 1003 mt 2223 1018 L
+c19
+75 -116 213 18 1935 1116 3 MP
+PP
+0 sg
+1935 1116 mt 2148 1134 L
+2148 1134 mt 2223 1018 L
+c20
+178 16 -124 -75 2169 2739 3 MP
+PP
+0 sg
+2169 2739 mt 2045 2664 L
+2045 2664 mt 2223 2680 L
+c23
+177 -56 -64 15 2101 847 3 MP
+PP
+0 sg
+2101  847 mt 2037  862 L
+2037  862 mt 2214  806 L
+c23
+-7 11 177 -56 2037 862 3 MP
+PP
+0 sg
+2037  862 mt 2214  806 L
+2214  806 mt 2207  817 L
+gr
+
+0 sg
+24 W
+1 sg
+2208 1555 PD
+gs 655 283 3870 3023 rc
+c23
+179 -61 -9 16 2037 862 3 MP
+PP
+0 sg
+2037  862 mt 2028  878 L
+2028  878 mt 2207  817 L
+gr
+
+0 sg
+24 W
+1 sg
+2198 1227 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2198 1472 PD
+gs 655 283 3870 3023 rc
+c19
+128 -96 -173 18 2002 1000 3 MP
+PP
+0 sg
+2002 1000 mt 1829 1018 L
+1829 1018 mt 1957  922 L
+c19
+-144 15 99 -93 2002 1000 3 MP
+PP
+0 sg
+2002 1000 mt 2101  907 L
+2101  907 mt 1957  922 L
+c21
+124 -93 124 19 1921 984 3 MP
+PP
+0 sg
+1921  984 mt 2045 1003 L
+2045 1003 mt 2169  910 L
+c21
+96 15 152 -89 1921 984 3 MP
+PP
+0 sg
+1921  984 mt 2073  895 L
+2073  895 mt 2169  910 L
+c20
+-124 -75 96 15 2073 2724 3 MP
+PP
+0 sg
+2073 2724 mt 2169 2739 L
+2169 2739 mt 2045 2664 L
+gr
+
+0 sg
+24 W
+1 sg
+2156 1272 PD
+gs 655 283 3870 3023 rc
+c13
+-219 23 50 -143 1800 1385 3 MP
+PP
+0 sg
+1800 1385 mt 1850 1242 L
+1850 1242 mt 1631 1265 L
+c15
+88 -132 -219 23 1850 1242 3 MP
+PP
+0 sg
+1850 1242 mt 1631 1265 L
+1631 1265 mt 1719 1133 L
+c15
+-199 20 68 -129 1850 1242 3 MP
+PP
+0 sg
+1850 1242 mt 1918 1113 L
+1918 1113 mt 1719 1133 L
+c17
+213 18 94 -129 1841 1245 3 MP
+PP
+0 sg
+1841 1245 mt 1935 1116 L
+1935 1116 mt 2148 1134 L
+c17
+63 -133 244 22 1841 1245 3 MP
+PP
+0 sg
+1841 1245 mt 2085 1267 L
+2085 1267 mt 2148 1134 L
+c18
+-99 23 -128 -113 1957 2583 3 MP
+PP
+0 sg
+1957 2583 mt 1829 2470 L
+1829 2470 mt 1730 2493 L
+c18
+-128 -113 -144 15 2101 2568 3 MP
+PP
+0 sg
+2101 2568 mt 1957 2583 L
+1957 2583 mt 1829 2470 L
+c18
+-173 18 -99 -116 2101 2568 3 MP
+PP
+0 sg
+2101 2568 mt 2002 2452 L
+2002 2452 mt 1829 2470 L
+c16
+-63 -113 213 18 1935 2568 3 MP
+PP
+0 sg
+1935 2568 mt 2148 2586 L
+2148 2586 mt 2085 2473 L
+c18
+-145 -109 -82 19 1957 2583 3 MP
+PP
+0 sg
+1957 2583 mt 1875 2602 L
+1875 2602 mt 1730 2493 L
+c18
+213 18 -110 -96 2045 2664 3 MP
+PP
+0 sg
+2045 2664 mt 1935 2568 L
+1935 2568 mt 2148 2586 L
+gr
+
+0 sg
+24 W
+1 sg
+2147 1174 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2145 1460 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2144 1415 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2139 1245 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2133 1357 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2119 1506 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2104 1104 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2088 1296 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2085 1566 PD
+gs 655 283 3870 3023 rc
+c13
+64 -145 -233 25 1800 1385 3 MP
+PP
+0 sg
+1800 1385 mt 1567 1410 L
+1567 1410 mt 1631 1265 L
+c15
+244 22 76 -143 1765 1388 3 MP
+PP
+0 sg
+1765 1388 mt 1841 1245 L
+1841 1245 mt 2085 1267 L
+c16
+-110 -130 -173 18 2002 2452 3 MP
+PP
+0 sg
+2002 2452 mt 1829 2470 L
+1829 2470 mt 1719 2340 L
+c16
+244 21 -94 -116 1935 2568 3 MP
+PP
+0 sg
+1935 2568 mt 1841 2452 L
+1841 2452 mt 2085 2473 L
+c12
+-233 25 31 -153 1769 1538 3 MP
+PP
+0 sg
+1769 1538 mt 1800 1385 L
+1800 1385 mt 1567 1410 L
+c15
+51 -145 269 24 1765 1388 3 MP
+PP
+0 sg
+1765 1388 mt 2034 1412 L
+2034 1412 mt 2085 1267 L
+c16
+-199 21 -84 -133 2002 2452 3 MP
+PP
+0 sg
+2002 2452 mt 1918 2319 L
+1918 2319 mt 1719 2340 L
+c14
+-51 -129 244 21 1841 2452 3 MP
+PP
+0 sg
+1841 2452 mt 2085 2473 L
+2085 2473 mt 2034 2344 L
+gr
+
+0 sg
+24 W
+1 sg
+2084 1577 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2082 1468 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2081 1270 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2080 1114 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2080 1148 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2078 1200 PD
+gs 655 283 3870 3023 rc
+c19
+-82 19 128 -96 1829 1018 3 MP
+PP
+0 sg
+1829 1018 mt 1957  922 L
+1957  922 mt 1875  941 L
+c21
+152 -89 59 22 1862 962 3 MP
+PP
+0 sg
+1862  962 mt 1921  984 L
+1921  984 mt 2073  895 L
+c20
+-166 -85 -9 17 2037 2691 3 MP
+PP
+0 sg
+2037 2691 mt 2028 2708 L
+2028 2708 mt 1862 2623 L
+c20
+-13 21 -162 -89 2037 2691 3 MP
+PP
+0 sg
+2037 2691 mt 1875 2602 L
+1875 2602 mt 1862 2623 L
+c20
+124 19 -152 -79 2073 2724 3 MP
+PP
+0 sg
+2073 2724 mt 1921 2645 L
+1921 2645 mt 2045 2664 L
+c20
+-152 -79 45 16 2028 2708 3 MP
+PP
+0 sg
+2028 2708 mt 2073 2724 L
+2073 2724 mt 1921 2645 L
+c21
+162 -79 -82 19 1957 922 3 MP
+PP
+0 sg
+1957  922 mt 1875  941 L
+1875  941 mt 2037  862 L
+c21
+45 17 166 -84 1862 962 3 MP
+PP
+0 sg
+1862  962 mt 2028  878 L
+2028  878 mt 2073  895 L
+gr
+
+0 sg
+24 W
+1 sg
+2072 1177 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2066 1251 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2063 1542 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2057 1488 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2047 1486 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2046 1220 PD
+gs 655 283 3870 3023 rc
+c17
+110 -115 -199 20 1918 1113 3 MP
+PP
+0 sg
+1918 1113 mt 1719 1133 L
+1719 1133 mt 1829 1018 L
+c17
+-173 18 84 -113 1918 1113 3 MP
+PP
+0 sg
+1918 1113 mt 2002 1000 L
+2002 1000 mt 1829 1018 L
+c19
+110 -113 149 23 1786 1093 3 MP
+PP
+0 sg
+1786 1093 mt 1935 1116 L
+1935 1116 mt 2045 1003 L
+c19
+124 19 135 -109 1786 1093 3 MP
+PP
+0 sg
+1786 1093 mt 1921  984 L
+1921  984 mt 2045 1003 L
+c18
+-110 -96 124 19 1921 2645 3 MP
+PP
+0 sg
+1921 2645 mt 2045 2664 L
+2045 2664 mt 1935 2568 L
+c21
+-9 16 162 -79 1875 941 3 MP
+PP
+0 sg
+1875  941 mt 2037  862 L
+2037  862 mt 2028  878 L
+gr
+
+0 sg
+24 W
+1 sg
+2037 1353 PD
+gs 655 283 3870 3023 rc
+c12
+40 -154 -242 26 1769 1538 3 MP
+PP
+0 sg
+1769 1538 mt 1527 1564 L
+1527 1564 mt 1567 1410 L
+c13
+269 24 56 -153 1709 1541 3 MP
+PP
+0 sg
+1709 1541 mt 1765 1388 L
+1765 1388 mt 2034 1412 L
+c8
+-242 26 10 -160 1759 1698 3 MP
+PP
+0 sg
+1759 1698 mt 1769 1538 L
+1769 1538 mt 1527 1564 L
+c13
+38 -154 287 25 1709 1541 3 MP
+PP
+0 sg
+1709 1541 mt 1996 1566 L
+1996 1566 mt 2034 1412 L
+c14
+-88 -143 -199 21 1918 2319 3 MP
+PP
+0 sg
+1918 2319 mt 1719 2340 L
+1719 2340 mt 1631 2197 L
+c14
+269 24 -76 -132 1841 2452 3 MP
+PP
+0 sg
+1841 2452 mt 1765 2320 L
+1765 2320 mt 2034 2344 L
+c14
+-219 23 -68 -145 1918 2319 3 MP
+PP
+0 sg
+1918 2319 mt 1850 2174 L
+1850 2174 mt 1631 2197 L
+c11
+-38 -143 269 24 1765 2320 3 MP
+PP
+0 sg
+1765 2320 mt 2034 2344 L
+2034 2344 mt 1996 2201 L
+gr
+
+0 sg
+24 W
+1 sg
+2028 1244 PD
+gs 655 283 3870 3023 rc
+c20
+59 22 -166 -85 2028 2708 3 MP
+PP
+0 sg
+2028 2708 mt 1862 2623 L
+1862 2623 mt 1921 2645 L
+c21
+166 -84 -13 21 1875 941 3 MP
+PP
+0 sg
+1875  941 mt 1862  962 L
+1862  962 mt 2028  878 L
+gr
+
+0 sg
+24 W
+1 sg
+2026 1236 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2022 1406 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2015 1452 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2010 1495 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1997 1384 PD
+gs 655 283 3870 3023 rc
+c8
+13 -160 -245 26 1759 1698 3 MP
+PP
+0 sg
+1759 1698 mt 1514 1724 L
+1514 1724 mt 1527 1564 L
+c12
+287 25 33 -159 1676 1700 3 MP
+PP
+0 sg
+1676 1700 mt 1709 1541 L
+1709 1541 mt 1996 1566 L
+c11
+-64 -153 -219 23 1850 2174 3 MP
+PP
+0 sg
+1850 2174 mt 1631 2197 L
+1631 2197 mt 1567 2044 L
+c11
+-233 24 -50 -154 1850 2174 3 MP
+PP
+0 sg
+1850 2174 mt 1800 2020 L
+1800 2020 mt 1567 2044 L
+c10
+-22 -154 287 25 1709 2176 3 MP
+PP
+0 sg
+1709 2176 mt 1996 2201 L
+1996 2201 mt 1974 2047 L
+c11
+287 25 -56 -144 1765 2320 3 MP
+PP
+0 sg
+1765 2320 mt 1709 2176 L
+1709 2176 mt 1996 2201 L
+c9
+-245 26 -10 -162 1769 1860 3 MP
+PP
+0 sg
+1769 1860 mt 1759 1698 L
+1759 1698 mt 1514 1724 L
+c12
+22 -160 298 26 1676 1700 3 MP
+PP
+0 sg
+1676 1700 mt 1974 1726 L
+1974 1726 mt 1996 1566 L
+gr
+
+0 sg
+24 W
+1 sg
+1994 1140 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1990 1286 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1987 1174 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1984 1190 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1983 1305 PD
+gs 655 283 3870 3023 rc
+c10
+-40 -159 -233 24 1800 2020 3 MP
+PP
+0 sg
+1800 2020 mt 1567 2044 L
+1567 2044 mt 1527 1885 L
+c10
+298 25 -33 -154 1709 2176 3 MP
+PP
+0 sg
+1709 2176 mt 1676 2022 L
+1676 2022 mt 1974 2047 L
+c9
+-13 -161 -242 25 1769 1860 3 MP
+PP
+0 sg
+1769 1860 mt 1527 1885 L
+1527 1885 mt 1514 1724 L
+c10
+-242 25 -31 -160 1800 2020 3 MP
+PP
+0 sg
+1800 2020 mt 1769 1860 L
+1769 1860 mt 1527 1885 L
+c8
+8 -162 302 26 1664 1862 3 MP
+PP
+0 sg
+1664 1862 mt 1966 1888 L
+1966 1888 mt 1974 1726 L
+c9
+-8 -159 298 25 1676 2022 3 MP
+PP
+0 sg
+1676 2022 mt 1974 2047 L
+1974 2047 mt 1966 1888 L
+c8
+298 26 12 -162 1664 1862 3 MP
+PP
+0 sg
+1664 1862 mt 1676 1700 L
+1676 1700 mt 1974 1726 L
+gr
+
+0 sg
+24 W
+1 sg
+1973 1206 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1966 1393 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1966 1276 PD
+gs 655 283 3870 3023 rc
+c9
+302 26 -12 -160 1676 2022 3 MP
+PP
+0 sg
+1676 2022 mt 1664 1862 L
+1664 1862 mt 1966 1888 L
+gr
+
+0 sg
+24 W
+1 sg
+1955 1192 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1948 1369 PD
+gs 655 283 3870 3023 rc
+c18
+-147 -104 -13 21 1875 2602 3 MP
+PP
+0 sg
+1875 2602 mt 1862 2623 L
+1862 2623 mt 1715 2519 L
+c18
+-15 26 -145 -109 1875 2602 3 MP
+PP
+0 sg
+1875 2602 mt 1730 2493 L
+1730 2493 mt 1715 2519 L
+c18
+149 24 -135 -101 1921 2645 3 MP
+PP
+0 sg
+1921 2645 mt 1786 2544 L
+1786 2544 mt 1935 2568 L
+c17
+149 23 116 -126 1670 1219 3 MP
+PP
+0 sg
+1670 1219 mt 1786 1093 L
+1786 1093 mt 1935 1116 L
+c17
+94 -129 171 26 1670 1219 3 MP
+PP
+0 sg
+1670 1219 mt 1841 1245 L
+1841 1245 mt 1935 1116 L
+c16
+-94 -116 149 24 1786 2544 3 MP
+PP
+0 sg
+1786 2544 mt 1935 2568 L
+1935 2568 mt 1841 2452 L
+gr
+
+0 sg
+24 W
+1 sg
+1934 1411 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1930 1469 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1926 1292 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1922 1459 PD
+gs 655 283 3870 3023 rc
+c18
+-135 -101 59 22 1862 2623 3 MP
+PP
+0 sg
+1862 2623 mt 1921 2645 L
+1921 2645 mt 1786 2544 L
+c17
+124 -119 -113 27 1719 1133 3 MP
+PP
+0 sg
+1719 1133 mt 1606 1160 L
+1606 1160 mt 1730 1041 L
+c17
+-99 23 110 -115 1719 1133 3 MP
+PP
+0 sg
+1719 1133 mt 1829 1018 L
+1829 1018 mt 1730 1041 L
+c19
+145 -100 -99 23 1829 1018 3 MP
+PP
+0 sg
+1829 1018 mt 1730 1041 L
+1730 1041 mt 1875  941 L
+c19
+59 22 147 -105 1715 1067 3 MP
+PP
+0 sg
+1715 1067 mt 1862  962 L
+1862  962 mt 1921  984 L
+c19
+135 -109 71 26 1715 1067 3 MP
+PP
+0 sg
+1715 1067 mt 1786 1093 L
+1786 1093 mt 1921  984 L
+gr
+
+0 sg
+24 W
+1 sg
+1914 1488 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1898 1444 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1894 1426 PD
+gs 655 283 3870 3023 rc
+c19
+-13 21 145 -100 1730 1041 3 MP
+PP
+0 sg
+1730 1041 mt 1875  941 L
+1875  941 mt 1862  962 L
+c19
+147 -105 -15 26 1730 1041 3 MP
+PP
+0 sg
+1730 1041 mt 1715 1067 L
+1715 1067 mt 1862  962 L
+c18
+71 25 -147 -104 1862 2623 3 MP
+PP
+0 sg
+1862 2623 mt 1715 2519 L
+1715 2519 mt 1786 2544 L
+gr
+
+0 sg
+24 W
+1 sg
+1862 1389 PD
+gs 655 283 3870 3023 rc
+c13
+-125 29 64 -145 1567 1410 3 MP
+PP
+0 sg
+1567 1410 mt 1631 1265 L
+1631 1265 mt 1506 1294 L
+c15
+76 -143 188 29 1577 1359 3 MP
+PP
+0 sg
+1577 1359 mt 1765 1388 L
+1765 1388 mt 1841 1245 L
+c15
+171 26 93 -140 1577 1359 3 MP
+PP
+0 sg
+1577 1359 mt 1670 1219 L
+1670 1219 mt 1841 1245 L
+c16
+-113 27 -110 -130 1829 2470 3 MP
+PP
+0 sg
+1829 2470 mt 1719 2340 L
+1719 2340 mt 1606 2367 L
+c16
+-124 -126 -99 23 1829 2470 3 MP
+PP
+0 sg
+1829 2470 mt 1730 2493 L
+1730 2493 mt 1606 2367 L
+c16
+171 26 -116 -118 1786 2544 3 MP
+PP
+0 sg
+1786 2544 mt 1670 2426 L
+1670 2426 mt 1841 2452 L
+c14
+-76 -132 171 26 1670 2426 3 MP
+PP
+0 sg
+1670 2426 mt 1841 2452 L
+1841 2452 mt 1765 2320 L
+c16
+-17 29 -124 -126 1730 2493 3 MP
+PP
+0 sg
+1730 2493 mt 1606 2367 L
+1606 2367 mt 1589 2396 L
+c16
+-126 -123 -15 26 1730 2493 3 MP
+PP
+0 sg
+1730 2493 mt 1715 2519 L
+1715 2519 mt 1589 2396 L
+c16
+-116 -118 71 25 1715 2519 3 MP
+PP
+0 sg
+1715 2519 mt 1786 2544 L
+1786 2544 mt 1670 2426 L
+c15
+100 -134 -125 29 1631 1265 3 MP
+PP
+0 sg
+1631 1265 mt 1506 1294 L
+1506 1294 mt 1606 1160 L
+c15
+-113 27 88 -132 1631 1265 3 MP
+PP
+0 sg
+1631 1265 mt 1719 1133 L
+1719 1133 mt 1606 1160 L
+c17
+71 26 126 -122 1589 1189 3 MP
+PP
+0 sg
+1589 1189 mt 1715 1067 L
+1715 1067 mt 1786 1093 L
+c17
+116 -126 81 30 1589 1189 3 MP
+PP
+0 sg
+1589 1189 mt 1670 1219 L
+1670 1219 mt 1786 1093 L
+c12
+-134 31 40 -154 1527 1564 3 MP
+PP
+0 sg
+1527 1564 mt 1567 1410 L
+1567 1410 mt 1433 1441 L
+c13
+56 -153 200 31 1509 1510 3 MP
+PP
+0 sg
+1509 1510 mt 1709 1541 L
+1709 1541 mt 1765 1388 L
+c13
+73 -147 -134 31 1567 1410 3 MP
+PP
+0 sg
+1567 1410 mt 1433 1441 L
+1433 1441 mt 1506 1294 L
+c13
+188 29 68 -151 1509 1510 3 MP
+PP
+0 sg
+1509 1510 mt 1577 1359 L
+1577 1359 mt 1765 1388 L
+c14
+-100 -141 -113 27 1719 2340 3 MP
+PP
+0 sg
+1719 2340 mt 1606 2367 L
+1606 2367 mt 1506 2226 L
+c14
+-125 29 -88 -143 1719 2340 3 MP
+PP
+0 sg
+1719 2340 mt 1631 2197 L
+1631 2197 mt 1506 2226 L
+c14
+188 29 -93 -135 1670 2426 3 MP
+PP
+0 sg
+1670 2426 mt 1577 2291 L
+1577 2291 mt 1765 2320 L
+c11
+-56 -144 188 29 1577 2291 3 MP
+PP
+0 sg
+1577 2291 mt 1765 2320 L
+1765 2320 mt 1709 2176 L
+c17
+-15 26 124 -119 1606 1160 3 MP
+PP
+0 sg
+1606 1160 mt 1730 1041 L
+1730 1041 mt 1715 1067 L
+c16
+81 30 -126 -123 1715 2519 3 MP
+PP
+0 sg
+1715 2519 mt 1589 2396 L
+1589 2396 mt 1670 2426 L
+c17
+126 -122 -17 29 1606 1160 3 MP
+PP
+0 sg
+1606 1160 mt 1589 1189 L
+1589 1189 mt 1715 1067 L
+c12
+44 -155 -138 32 1527 1564 3 MP
+PP
+0 sg
+1527 1564 mt 1389 1596 L
+1389 1596 mt 1433 1441 L
+c8
+-138 32 13 -160 1514 1724 3 MP
+PP
+0 sg
+1514 1724 mt 1527 1564 L
+1527 1564 mt 1389 1596 L
+c12
+200 31 42 -158 1467 1668 3 MP
+PP
+0 sg
+1467 1668 mt 1509 1510 L
+1509 1510 mt 1709 1541 L
+c12
+33 -159 209 32 1467 1668 3 MP
+PP
+0 sg
+1467 1668 mt 1676 1700 L
+1676 1700 mt 1709 1541 L
+c11
+-73 -151 -125 29 1631 2197 3 MP
+PP
+0 sg
+1631 2197 mt 1506 2226 L
+1506 2226 mt 1433 2075 L
+c11
+-134 31 -64 -153 1631 2197 3 MP
+PP
+0 sg
+1631 2197 mt 1567 2044 L
+1567 2044 mt 1433 2075 L
+c10
+-33 -154 200 32 1509 2144 3 MP
+PP
+0 sg
+1509 2144 mt 1709 2176 L
+1709 2176 mt 1676 2022 L
+c11
+200 32 -68 -147 1577 2291 3 MP
+PP
+0 sg
+1577 2291 mt 1509 2144 L
+1509 2144 mt 1709 2176 L
+c10
+-138 32 -40 -159 1567 2044 3 MP
+PP
+0 sg
+1567 2044 mt 1527 1885 L
+1527 1885 mt 1389 1917 L
+c10
+-44 -158 -134 31 1567 2044 3 MP
+PP
+0 sg
+1567 2044 mt 1433 2075 L
+1433 2075 mt 1389 1917 L
+c9
+-12 -160 209 33 1467 1989 3 MP
+PP
+0 sg
+1467 1989 mt 1676 2022 L
+1676 2022 mt 1664 1862 L
+c8
+15 -160 -140 32 1514 1724 3 MP
+PP
+0 sg
+1514 1724 mt 1374 1756 L
+1374 1756 mt 1389 1596 L
+c9
+-15 -161 -138 32 1527 1885 3 MP
+PP
+0 sg
+1527 1885 mt 1389 1917 L
+1389 1917 mt 1374 1756 L
+c9
+-140 32 -13 -161 1527 1885 3 MP
+PP
+0 sg
+1527 1885 mt 1514 1724 L
+1514 1724 mt 1374 1756 L
+c8
+209 32 14 -161 1453 1829 3 MP
+PP
+0 sg
+1453 1829 mt 1467 1668 L
+1467 1668 mt 1676 1700 L
+c8
+12 -162 211 33 1453 1829 3 MP
+PP
+0 sg
+1453 1829 mt 1664 1862 L
+1664 1862 mt 1676 1700 L
+c10
+209 33 -42 -155 1509 2144 3 MP
+PP
+0 sg
+1509 2144 mt 1467 1989 L
+1467 1989 mt 1676 2022 L
+c14
+-101 -137 -17 29 1606 2367 3 MP
+PP
+0 sg
+1606 2367 mt 1589 2396 L
+1589 2396 mt 1488 2259 L
+c14
+-18 33 -100 -141 1606 2367 3 MP
+PP
+0 sg
+1606 2367 mt 1506 2226 L
+1506 2226 mt 1488 2259 L
+c14
+-93 -135 81 30 1589 2396 3 MP
+PP
+0 sg
+1589 2396 mt 1670 2426 L
+1670 2426 mt 1577 2291 L
+c13
+-18 32 73 -147 1433 1441 3 MP
+PP
+0 sg
+1433 1441 mt 1506 1294 L
+1506 1294 mt 1488 1326 L
+c15
+93 -140 89 33 1488 1326 3 MP
+PP
+0 sg
+1488 1326 mt 1577 1359 L
+1577 1359 mt 1670 1219 L
+c15
+81 30 101 -137 1488 1326 3 MP
+PP
+0 sg
+1488 1326 mt 1589 1189 L
+1589 1189 mt 1670 1219 L
+c9
+211 33 -14 -160 1467 1989 3 MP
+PP
+0 sg
+1467 1989 mt 1453 1829 L
+1453 1829 mt 1664 1862 L
+c15
+-17 29 100 -134 1506 1294 3 MP
+PP
+0 sg
+1506 1294 mt 1606 1160 L
+1606 1160 mt 1589 1189 L
+c15
+101 -137 -18 32 1506 1294 3 MP
+PP
+0 sg
+1506 1294 mt 1488 1326 L
+1488 1326 mt 1589 1189 L
+c14
+89 32 -101 -137 1589 2396 3 MP
+PP
+0 sg
+1589 2396 mt 1488 2259 L
+1488 2259 mt 1577 2291 L
+c12
+-20 34 44 -155 1389 1596 3 MP
+PP
+0 sg
+1389 1596 mt 1433 1441 L
+1433 1441 mt 1413 1475 L
+c13
+68 -151 96 35 1413 1475 3 MP
+PP
+0 sg
+1413 1475 mt 1509 1510 L
+1509 1510 mt 1577 1359 L
+c11
+-75 -149 -18 33 1506 2226 3 MP
+PP
+0 sg
+1506 2226 mt 1488 2259 L
+1488 2259 mt 1413 2110 L
+c11
+-20 35 -73 -151 1506 2226 3 MP
+PP
+0 sg
+1506 2226 mt 1433 2075 L
+1433 2075 mt 1413 2110 L
+c11
+-68 -147 89 32 1488 2259 3 MP
+PP
+0 sg
+1488 2259 mt 1577 2291 L
+1577 2291 mt 1509 2144 L
+c13
+75 -149 -20 34 1433 1441 3 MP
+PP
+0 sg
+1433 1441 mt 1413 1475 L
+1413 1475 mt 1488 1326 L
+c13
+89 33 75 -149 1413 1475 3 MP
+PP
+0 sg
+1413 1475 mt 1488 1326 L
+1488 1326 mt 1577 1359 L
+c8
+-21 36 15 -160 1374 1756 3 MP
+PP
+0 sg
+1374 1756 mt 1389 1596 L
+1389 1596 mt 1368 1632 L
+c12
+45 -157 -21 36 1389 1596 3 MP
+PP
+0 sg
+1389 1596 mt 1368 1632 L
+1368 1632 mt 1413 1475 L
+c12
+96 35 45 -157 1368 1632 3 MP
+PP
+0 sg
+1368 1632 mt 1413 1475 L
+1413 1475 mt 1509 1510 L
+c10
+-21 36 -44 -158 1433 2075 3 MP
+PP
+0 sg
+1433 2075 mt 1389 1917 L
+1389 1917 mt 1368 1953 L
+c10
+-45 -157 -20 35 1433 2075 3 MP
+PP
+0 sg
+1433 2075 mt 1413 2110 L
+1413 2110 mt 1368 1953 L
+c10
+-42 -155 96 34 1413 2110 3 MP
+PP
+0 sg
+1413 2110 mt 1509 2144 L
+1509 2144 mt 1467 1989 L
+c12
+42 -158 99 36 1368 1632 3 MP
+PP
+0 sg
+1368 1632 mt 1467 1668 L
+1467 1668 mt 1509 1510 L
+c11
+96 34 -75 -149 1488 2259 3 MP
+PP
+0 sg
+1488 2259 mt 1413 2110 L
+1413 2110 mt 1509 2144 L
+c9
+-21 36 -15 -161 1389 1917 3 MP
+PP
+0 sg
+1389 1917 mt 1374 1756 L
+1374 1756 mt 1353 1792 L
+c8
+14 -161 100 37 1353 1792 3 MP
+PP
+0 sg
+1353 1792 mt 1453 1829 L
+1453 1829 mt 1467 1668 L
+c8
+15 -160 -21 36 1374 1756 3 MP
+PP
+0 sg
+1374 1756 mt 1353 1792 L
+1353 1792 mt 1368 1632 L
+c8
+99 36 15 -160 1353 1792 3 MP
+PP
+0 sg
+1353 1792 mt 1368 1632 L
+1368 1632 mt 1467 1668 L
+c10
+99 36 -45 -157 1413 2110 3 MP
+PP
+0 sg
+1413 2110 mt 1368 1953 L
+1368 1953 mt 1467 1989 L
+c9
+-14 -160 99 36 1368 1953 3 MP
+PP
+0 sg
+1368 1953 mt 1467 1989 L
+1467 1989 mt 1453 1829 L
+c9
+-15 -161 -21 36 1389 1917 3 MP
+PP
+0 sg
+1389 1917 mt 1368 1953 L
+1368 1953 mt 1353 1792 L
+c9
+100 37 -15 -161 1368 1953 3 MP
+PP
+0 sg
+1368 1953 mt 1353 1792 L
+1353 1792 mt 1453 1829 L
+gr
+
+0 sg
+
+end %%Color Dict
+
+eplot
+%%EndObject
+
+epage
+end
+
+showpage
+
+%%Trailer
+%%EOF
diff -Naur ns-3.22/src/spectrum/examples/tv-trans-example.cc ns-3.23/src/spectrum/examples/tv-trans-example.cc
--- ns-3.22/src/spectrum/examples/tv-trans-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/examples/tv-trans-example.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,108 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <iostream>
+#include <stdlib.h>
+#include <ns3/core-module.h>
+#include <ns3/mobility-module.h>
+#include <ns3/spectrum-helper.h>
+#include <ns3/spectrum-analyzer-helper.h>
+#include <ns3/tv-spectrum-transmitter-helper.h>
+
+using namespace ns3;
+
+/**
+ * This example uses the TvSpectrumTransmitterHelper class to set up two 8-VSB
+ * TV transmitters with adjacent channels. Each transmitter's spectrum has a
+ * bandwidth of 6 MHz. The first TV transmitter has a start frequency of
+ * 524 MHz while the second has a start frequency of 530 MHz. These transmitters
+ * model ATSC (North American digital TV standard) channels 23 and 24.
+ *
+ * A spectrum analyzer is used to measure the transmitted spectra from the
+ * TV transmitters. The file "spectrum-analyzer-tv-sim-2-0.tr" contains its
+ * output post simulation (and can be plotted with Gnuplot or MATLAB).
+ */
+int main (int argc, char** argv)
+{
+  /* nodes and positions */
+  NodeContainer tvTransmitterNodes;
+  NodeContainer spectrumAnalyzerNodes;
+  NodeContainer allNodes;
+  tvTransmitterNodes.Create (2);
+  spectrumAnalyzerNodes.Create (1);
+  allNodes.Add (tvTransmitterNodes);
+  allNodes.Add (spectrumAnalyzerNodes);
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> nodePositionList = CreateObject<ListPositionAllocator> ();
+  nodePositionList->Add (Vector (128000.0, 0.0, 0.0)); // TV Transmitter 1; 128 km away from spectrum analyzer 
+  nodePositionList->Add (Vector (0.0, 24000.0, 0.0)); // TV Transmitter 2; 24 km away from spectrum analyzer
+  nodePositionList->Add (Vector (0.0, 0.0, 0.0));  // Spectrum Analyzer
+  mobility.SetPositionAllocator (nodePositionList);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (allNodes);
+
+  /* channel and propagation */
+  SpectrumChannelHelper channelHelper = SpectrumChannelHelper::Default ();
+  channelHelper.SetChannel ("ns3::MultiModelSpectrumChannel");
+  // constant path loss added just to show capability to set different propagation loss models
+  // FriisSpectrumPropagationLossModel already added by default in SpectrumChannelHelper
+  channelHelper.AddSpectrumPropagationLoss ("ns3::ConstantSpectrumPropagationLossModel");
+  Ptr<SpectrumChannel> channel = channelHelper.Create ();
+  
+  /* TV transmitter setup */
+  TvSpectrumTransmitterHelper tvTransHelper;
+  tvTransHelper.SetChannel (channel);
+  tvTransHelper.SetAttribute ("StartFrequency", DoubleValue (524e6));
+  tvTransHelper.SetAttribute ("ChannelBandwidth", DoubleValue (6e6));
+  tvTransHelper.SetAttribute ("StartingTime", TimeValue (Seconds (0)));
+  tvTransHelper.SetAttribute ("TransmitDuration", TimeValue (Seconds (0.2)));
+  // 22.22 dBm/Hz from 1000 kW ERP transmit power, flat 6 MHz PSD spectrum assumed for this approximation 
+  tvTransHelper.SetAttribute ("BasePsd", DoubleValue (22.22)); 
+  tvTransHelper.SetAttribute ("TvType", EnumValue (TvSpectrumTransmitter::TVTYPE_8VSB));
+  tvTransHelper.SetAttribute ("Antenna", StringValue ("ns3::IsotropicAntennaModel"));
+  tvTransHelper.InstallAdjacent (tvTransmitterNodes);
+
+  /* frequency range for spectrum analyzer */
+  std::vector<double> freqs;
+  for (int i = 0; i < 200; ++i)
+    {
+      freqs.push_back ((i + 5200) * 1e5);
+    }
+  Ptr<SpectrumModel> spectrumAnalyzerFreqModel = Create<SpectrumModel> (freqs);
+
+  /* spectrum analyzer setup */
+  SpectrumAnalyzerHelper spectrumAnalyzerHelper;
+  spectrumAnalyzerHelper.SetChannel (channel);
+  spectrumAnalyzerHelper.SetRxSpectrumModel (spectrumAnalyzerFreqModel);
+  spectrumAnalyzerHelper.SetPhyAttribute ("NoisePowerSpectralDensity", DoubleValue (1e-15)); // -120 dBm/Hz
+  spectrumAnalyzerHelper.EnableAsciiAll ("spectrum-analyzer-tv-sim");
+  NetDeviceContainer spectrumAnalyzerDevices = spectrumAnalyzerHelper.Install (spectrumAnalyzerNodes);
+
+  Simulator::Stop (Seconds (0.4));
+
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+
+  std::cout << "simulation done!" << std::endl;
+  std::cout << "see spectrum analyzer output file" << std::endl;
+
+  return 0;
+}
diff -Naur ns-3.22/src/spectrum/examples/tv-trans-regional-example.cc ns-3.23/src/spectrum/examples/tv-trans-regional-example.cc
--- ns-3.22/src/spectrum/examples/tv-trans-regional-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/examples/tv-trans-regional-example.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,111 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <iostream>
+#include <stdlib.h>
+#include <ns3/core-module.h>
+#include <ns3/mobility-module.h>
+#include <ns3/spectrum-helper.h>
+#include <ns3/spectrum-analyzer-helper.h>
+#include <ns3/tv-spectrum-transmitter-helper.h>
+
+using namespace ns3;
+
+/**
+ * This example uses the TvSpectrumTransmitterHelper class to generate a random
+ * number of COFDM TV transmitters within a 250 km radius around latitude
+ * 48.86 degrees and longitude 2.35 degrees (Paris, France). The transmitters' 
+ * frequencies and bandwidths correspond to the European TV channel allocations.
+ * These TV transmitters model the digital DVB-T standard.
+ *
+ * A spectrum analyzer is used to measure the transmitted spectra from the
+ * TV transmitters. The file "spectrum-analyzer-tv-sim-regional-0-0.tr" contains
+ * its output post simulation (and can be plotted with Gnuplot or MATLAB).
+ */
+int main (int argc, char** argv)
+{
+  /* random seed and run number; adjust these to change random draws */
+  RngSeedManager::SetSeed(1);
+  RngSeedManager::SetRun(3);
+
+  /* nodes and positions */
+  NodeContainer spectrumAnalyzerNodes;
+  spectrumAnalyzerNodes.Create (1);
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> nodePositionList = CreateObject<ListPositionAllocator> ();
+  Vector coordinates = GeographicPositions::GeographicToCartesianCoordinates (48.86, 
+                                                                              2.35, 
+                                                                              0,
+                                                                              GeographicPositions::SPHERE);
+  nodePositionList->Add (coordinates); // spectrum analyzer
+  mobility.SetPositionAllocator (nodePositionList);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (spectrumAnalyzerNodes);
+
+  /* channel and propagation */
+  SpectrumChannelHelper channelHelper = SpectrumChannelHelper::Default ();
+  channelHelper.SetChannel ("ns3::MultiModelSpectrumChannel");
+  Ptr<SpectrumChannel> channel = channelHelper.Create ();
+  
+  /* TV transmitter setup */
+  TvSpectrumTransmitterHelper tvTransHelper;
+  tvTransHelper.SetChannel (channel);
+  tvTransHelper.SetAttribute ("StartingTime", TimeValue (Seconds (0.1)));
+  tvTransHelper.SetAttribute ("TransmitDuration", TimeValue (Seconds (0.1)));
+  // 7.96 dBm/Hz from 50 kW ERP transmit power, flat 8 MHz PSD spectrum assumed for this approximation 
+  tvTransHelper.SetAttribute ("BasePsd", DoubleValue (7.96));
+  tvTransHelper.SetAttribute ("TvType", EnumValue (TvSpectrumTransmitter::TVTYPE_COFDM));
+  tvTransHelper.SetAttribute ("Antenna", StringValue ("ns3::IsotropicAntennaModel"));
+
+  tvTransHelper.AssignStreams (300);
+  tvTransHelper.CreateRegionalTvTransmitters(TvSpectrumTransmitterHelper::REGION_EUROPE, 
+                                             TvSpectrumTransmitterHelper::DENSITY_MEDIUM, 
+                                             48.86, 
+                                             2.35, 
+                                             0,
+                                             250000);
+
+  /* frequency range for spectrum analyzer */
+  std::vector<double> freqs;
+  for (int i = 0; i < 6860; i = i + 5)
+    {
+      freqs.push_back ((i + 1740) * 1e5);
+    }
+  Ptr<SpectrumModel> spectrumAnalyzerFreqModel = Create<SpectrumModel> (freqs);
+
+  /* spectrum analyzer setup */
+  SpectrumAnalyzerHelper spectrumAnalyzerHelper;
+  spectrumAnalyzerHelper.SetChannel (channel);
+  spectrumAnalyzerHelper.SetRxSpectrumModel (spectrumAnalyzerFreqModel);
+  spectrumAnalyzerHelper.SetPhyAttribute ("NoisePowerSpectralDensity", DoubleValue (4.14e-21)); // approx -174 dBm/Hz
+  spectrumAnalyzerHelper.EnableAsciiAll ("spectrum-analyzer-tv-sim-regional");
+  NetDeviceContainer spectrumAnalyzerDevices = spectrumAnalyzerHelper.Install (spectrumAnalyzerNodes);
+
+  Simulator::Stop (Seconds (0.4));
+
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+
+  std::cout << "simulation done!" << std::endl;
+  std::cout << "see spectrum analyzer output file" << std::endl;
+
+  return 0;
+}
diff -Naur ns-3.22/src/spectrum/examples/wscript ns-3.23/src/spectrum/examples/wscript
--- ns-3.22/src/spectrum/examples/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/examples/wscript	2015-05-13 11:05:26.000000000 -0700
@@ -13,4 +13,10 @@
                                  ['spectrum', 'mobility', 'internet', 'applications'])
     obj.source = 'adhoc-aloha-ideal-phy-with-microwave-oven.cc'
 
+    obj = bld.create_ns3_program('tv-trans-example',
+                                 ['spectrum', 'mobility', 'core'])
+    obj.source = 'tv-trans-example.cc'
 
+    obj = bld.create_ns3_program('tv-trans-regional-example',
+                                 ['spectrum', 'mobility', 'core'])
+    obj.source = 'tv-trans-regional-example.cc'
diff -Naur ns-3.22/src/spectrum/helper/tv-spectrum-transmitter-helper.cc ns-3.23/src/spectrum/helper/tv-spectrum-transmitter-helper.cc
--- ns-3.22/src/spectrum/helper/tv-spectrum-transmitter-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/helper/tv-spectrum-transmitter-helper.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,480 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/log.h>
+#include <cmath>
+#include <list>
+#include <vector>
+#include <ns3/uinteger.h>
+#include <ns3/double.h>
+#include <ns3/isotropic-antenna-model.h>
+#include <ns3/mobility-helper.h>
+#include <ns3/position-allocator.h>
+#include <ns3/geographic-positions.h>
+#include "tv-spectrum-transmitter-helper.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitterHelper");
+
+// NORTH AMERICA: 84 elements (index 0 - 83); valid channels = 2 - 83
+const int northAmericaArrayLength = 84;
+const double northAmericaStartFrequencies[84] = {0, 0, 54e6, 60e6, 66e6, 76e6, 
+  82e6, 174e6, 180e6, 186e6, 192e6, 198e6, 204e6, 210e6, 470e6, 476e6, 482e6, 
+  488e6, 494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 
+  554e6, 560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 
+  620e6, 626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 
+  686e6, 692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 
+  752e6, 758e6, 764e6, 770e6, 776e6, 782e6, 788e6, 794e6, 800e6, 806e6, 812e6, 
+  818e6, 824e6, 830e6, 836e6, 842e6, 848e6, 854e6, 860e6, 866e6, 872e6, 878e6, 
+  884e6};
+const double northAmericaEndFrequencies[84] = {0, 0, 60e6, 66e6, 72e6, 82e6, 
+  88e6, 180e6, 186e6, 192e6, 198e6, 204e6, 210e6, 216e6, 476e6, 482e6, 488e6, 
+  494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 
+  560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 
+  626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 
+  692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 
+  758e6, 764e6, 770e6, 776e6, 782e6, 788e6, 794e6, 800e6, 806e6, 812e6, 818e6, 
+  824e6, 830e6, 836e6, 842e6, 848e6, 854e6, 860e6, 866e6, 872e6, 878e6, 884e6, 
+  890e6};
+
+// EUROPE: 70 elements (index 0 - 69); valid channels = 5 - 12, 21 - 69
+const int europeArrayLength = 70;
+const double europeStartFrequencies[70] = {0, 0, 0, 0, 0, 174e6, 181e6, 188e6, 
+  195e6, 202e6, 209e6, 216e6, 223e6, 0, 0, 0, 0, 0, 0, 0, 0, 470e6, 478e6, 
+  486e6, 494e6, 502e6, 510e6, 518e6, 526e6, 534e6, 542e6, 550e6, 558e6, 566e6, 
+  574e6, 582e6, 590e6, 598e6, 606e6, 614e6, 622e6, 630e6, 638e6, 646e6, 654e6, 
+  662e6, 670e6, 678e6, 686e6, 694e6, 702e6, 710e6, 718e6, 726e6, 734e6, 742e6, 
+  750e6, 758e6, 766e6, 774e6, 782e6, 790e6, 798e6, 806e6, 814e6, 822e6, 830e6, 
+  838e6, 846e6, 854e6};
+const double europeEndFrequencies[70] = {0, 0, 0, 0, 0, 181e6, 188e6, 195e6, 
+  202e6, 209e6, 216e6, 223e6, 230e6, 0, 0, 0, 0, 0, 0, 0, 0, 478e6, 486e6, 
+  494e6, 502e6, 510e6, 518e6, 526e6, 534e6, 542e6, 550e6, 558e6, 566e6, 574e6, 
+  582e6, 590e6, 598e6, 606e6, 614e6, 622e6, 630e6, 638e6, 646e6, 654e6, 662e6, 
+  670e6, 678e6, 686e6, 694e6, 702e6, 710e6, 718e6, 726e6, 734e6, 742e6, 750e6, 
+  758e6, 766e6, 774e6, 782e6, 790e6, 798e6, 806e6, 814e6, 822e6, 830e6, 838e6, 
+  846e6, 854e6, 862e6};
+
+// JAPAN: 63 elements (index 0 - 62); valid channels = 1 - 62
+const int japanArrayLength = 63;
+const double japanStartFrequencies[63] = {0, 90e6, 96e6, 102e6, 170e6, 176e6, 
+  182e6, 188e6, 192e6, 198e6, 204e6, 210e6, 216e6, 470e6, 476e6, 482e6, 488e6, 
+  494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 
+  560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 
+  626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 
+  692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 
+  758e6, 764e6};
+const double japanEndFrequencies[63] = {0, 96e6, 102e6, 108e6, 176e6, 182e6, 
+  188e6, 194e6, 198e6, 204e6, 210e6, 216e6, 222e6, 476e6, 482e6, 488e6, 494e6, 
+  500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 560e6, 
+  566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 626e6, 
+  632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 692e6, 
+  698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 758e6, 
+  764e6, 770e6};
+
+TvSpectrumTransmitterHelper::TvSpectrumTransmitterHelper ()
+  : m_channel (0),
+    m_uniRand (CreateObject<UniformRandomVariable> ())
+{
+  NS_LOG_FUNCTION (this);
+  m_factory.SetTypeId ("ns3::TvSpectrumTransmitter");
+}
+
+TvSpectrumTransmitterHelper::~TvSpectrumTransmitterHelper ()
+{
+  m_channel = 0;
+  m_uniRand = 0;
+  NS_LOG_FUNCTION (this);
+}
+
+void
+TvSpectrumTransmitterHelper::SetChannel (Ptr<SpectrumChannel> c)
+{
+  NS_LOG_FUNCTION (this << c);
+  m_channel = c;
+}
+
+void
+TvSpectrumTransmitterHelper::SetAttribute (std::string name, const AttributeValue &val)
+{
+  m_factory.Set (name, val);
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::Install (NodeContainer nodeCont)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+    }
+  return devCont;
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::Install (NodeContainer nodeCont,
+                                      Region region,
+                                      uint16_t channelNumber)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  double startFrequency;
+  double channelBandwidth;
+  if (region == REGION_NORTH_AMERICA)
+    {
+      NS_ASSERT_MSG (channelNumber < northAmericaArrayLength,
+                     "channel number " << channelNumber <<
+                     " does not exist for this region");
+      NS_ASSERT_MSG (northAmericaStartFrequencies[channelNumber] != 0,
+                     "channel number " << channelNumber <<
+                     " does not exist for this region");
+      startFrequency = northAmericaStartFrequencies[channelNumber];    
+      channelBandwidth = northAmericaEndFrequencies[channelNumber] - 
+                         northAmericaStartFrequencies[channelNumber];
+    }
+  else if (region == REGION_EUROPE)
+    {
+      NS_ASSERT_MSG (channelNumber < europeArrayLength,
+                     "channel number " << channelNumber <<
+                     " does not exist for this region");
+      NS_ASSERT_MSG (europeStartFrequencies[channelNumber] != 0,
+                     "channel number " << channelNumber <<
+                     " does not exist for this region");
+      startFrequency = europeStartFrequencies[channelNumber];    
+      channelBandwidth = europeEndFrequencies[channelNumber] - 
+                         europeStartFrequencies[channelNumber];
+    }
+  else if (region == REGION_JAPAN)
+    {
+      NS_ASSERT_MSG (channelNumber < japanArrayLength,
+                     "channel number " << channelNumber <<
+                     " does not exist for this region");
+      NS_ASSERT_MSG (japanStartFrequencies[channelNumber] != 0,
+                     "channel number " << channelNumber <<
+                     " does not exist for this region");
+      startFrequency = japanStartFrequencies[channelNumber];    
+      channelBandwidth = japanEndFrequencies[channelNumber] - 
+                         japanStartFrequencies[channelNumber];
+    }
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->SetAttribute ("StartFrequency", DoubleValue (startFrequency));
+      phy->SetAttribute ("ChannelBandwidth", DoubleValue (channelBandwidth));
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+    }
+  return devCont;
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::InstallAdjacent (NodeContainer nodeCont)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  int index = 0;
+  DoubleValue startFrequency;
+  DoubleValue channelBandwidth;
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->GetAttribute ("StartFrequency", startFrequency);
+      phy->GetAttribute ("ChannelBandwidth", channelBandwidth);
+      phy->SetAttribute ("StartFrequency", DoubleValue (startFrequency.Get () + 
+                         (index * channelBandwidth.Get ())));
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+      index++;
+    }
+  return devCont;
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::InstallAdjacent (NodeContainer nodeCont,
+                                              Region region,
+                                              uint16_t channelNumber)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  double startFrequency;
+  double channelBandwidth;
+  uint16_t currChannelNumber;
+  int index = 0;
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      currChannelNumber = channelNumber + index;
+      if (region == REGION_NORTH_AMERICA)
+        {
+          NS_ASSERT_MSG (currChannelNumber < northAmericaArrayLength,
+                         "channel number " << currChannelNumber <<
+                         " does not exist for this region");
+          NS_ASSERT_MSG (northAmericaStartFrequencies[currChannelNumber] != 0,
+                         "channel number " << currChannelNumber <<
+                         " does not exist for this region");
+          startFrequency = northAmericaStartFrequencies[currChannelNumber];    
+          channelBandwidth = northAmericaEndFrequencies[currChannelNumber] 
+                             - northAmericaStartFrequencies[currChannelNumber];
+        }
+      else if (region == REGION_EUROPE)
+        {
+          NS_ASSERT_MSG (currChannelNumber < europeArrayLength,
+                         "channel number " << currChannelNumber <<
+                         " does not exist for this region");
+          NS_ASSERT_MSG (europeStartFrequencies[currChannelNumber] != 0,
+                         "channel number " << currChannelNumber <<
+                         " does not exist for this region");
+          startFrequency = europeStartFrequencies[currChannelNumber];    
+          channelBandwidth = europeEndFrequencies[currChannelNumber] - 
+                             europeStartFrequencies[currChannelNumber];
+        }
+      else if (region == REGION_JAPAN)
+        {
+          NS_ASSERT_MSG (currChannelNumber < japanArrayLength,
+                         "channel number " << currChannelNumber <<
+                         " does not exist for this region");
+          NS_ASSERT_MSG (japanStartFrequencies[currChannelNumber] != 0,
+                         "channel number " << currChannelNumber <<
+                         " does not exist for this region");
+          startFrequency = japanStartFrequencies[currChannelNumber];    
+          channelBandwidth = japanEndFrequencies[currChannelNumber] - 
+                             japanStartFrequencies[currChannelNumber];
+        }
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->SetAttribute ("StartFrequency", DoubleValue (startFrequency));
+      phy->SetAttribute ("ChannelBandwidth", DoubleValue (channelBandwidth));
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+      index++;
+    }
+  return devCont;
+}
+
+
+int64_t
+TvSpectrumTransmitterHelper::AssignStreams (int64_t streamNum)
+{
+  m_uniRand->SetStream (streamNum);
+  return 1;
+}
+
+
+void
+TvSpectrumTransmitterHelper::CreateRegionalTvTransmitters (Region region, 
+                                                           Density density, 
+                                                           double originLatitude, 
+                                                           double originLongitude,
+                                                           double maxAltitude, 
+                                                           double maxRadius)
+{
+  NS_LOG_FUNCTION (this);
+  std::list<int> transmitterIndicesToCreate;
+  if (region == REGION_NORTH_AMERICA)
+    {
+      transmitterIndicesToCreate = GenerateRegionalTransmitterIndices 
+                                   (northAmericaStartFrequencies, 
+                                    northAmericaArrayLength, 
+                                    density);
+    }
+  else if (region == REGION_EUROPE)
+    {
+      transmitterIndicesToCreate = GenerateRegionalTransmitterIndices 
+                                   (europeStartFrequencies, 
+                                    europeArrayLength, 
+                                    density);
+    }
+  else if (region == REGION_JAPAN)
+    {
+      transmitterIndicesToCreate = GenerateRegionalTransmitterIndices 
+                                   (japanStartFrequencies, 
+                                    japanArrayLength, 
+                                    density);
+    }
+  std::list<Vector> tvTransmitterLocations = 
+    GeographicPositions::RandCartesianPointsAroundGeographicPoint (originLatitude, 
+                                                                   originLongitude, 
+                                                                   maxAltitude,
+                                                                   transmitterIndicesToCreate.size(), 
+                                                                   maxRadius,
+                                                                   m_uniRand);
+  InstallRandomRegionalTransmitters (region, 
+                                     transmitterIndicesToCreate, 
+                                     tvTransmitterLocations);
+}
+
+
+std::list<int>
+TvSpectrumTransmitterHelper::GenerateRegionalTransmitterIndices (const double startFrequencies[], 
+                                                                 const int startFrequenciesLength, 
+                                                                 Density density)
+{
+  std::vector<double> startFreqVector; //stores all non-zero start frequencies
+  for (int i = 0; i < startFrequenciesLength; i++)
+    {
+      double element = startFrequencies[i];
+      //add all non-zero frequencies to vector (0 means unused channel)
+      if (element != 0) startFreqVector.push_back(element);
+    }
+
+  //randomly generate number of transmitters to create based on density
+  uint32_t freqVectorSize = startFreqVector.size();
+  int randNumTransmitters = GetRandomNumTransmitters (density, freqVectorSize);
+ 
+  //stores start frequencies that transmitters will be created to transmit
+  std::vector<double> transmitterStartFreqsToCreate; 
+  for (int i = 0; i < randNumTransmitters; i++)
+    {
+      //get random index from start frequency vector
+      uint32_t randIndex = m_uniRand->GetInteger (0, startFreqVector.size () - 1);
+      //add start frequency corresponding to random index to vector 
+      transmitterStartFreqsToCreate.push_back(startFreqVector[randIndex]); 
+      //remove selected start frequency from vector so it is not selected again
+      startFreqVector.erase(startFreqVector.begin() + randIndex); 
+    }
+
+  //find indices on startFrequencies[] containing each start frequency that is 
+  //selected to be transmitted and add to list
+  std::list<int> transmitterIndicesToCreate;
+  for (int i = 0; i < (int)transmitterStartFreqsToCreate.size(); i++)
+    {
+      for (int channelNumberIndex = 0; 
+           channelNumberIndex < startFrequenciesLength; channelNumberIndex++)
+        {
+          if (startFrequencies[channelNumberIndex] == transmitterStartFreqsToCreate[i])
+            {
+              transmitterIndicesToCreate.push_back(channelNumberIndex);
+              break;
+            }
+        }
+    }
+  return transmitterIndicesToCreate;
+}
+
+
+int
+TvSpectrumTransmitterHelper::GetRandomNumTransmitters (Density density,
+                                                       uint32_t numChannels)
+{
+  int numTransmitters;
+  if (density == DENSITY_LOW)
+    {
+      numTransmitters = m_uniRand->GetInteger (1, ceil (0.33 * numChannels));
+    }
+  else if (density == DENSITY_MEDIUM)
+    {
+      numTransmitters = m_uniRand->GetInteger (ceil (0.33 * numChannels) + 1, ceil (0.66 * numChannels));
+    }  
+  else
+    {
+      numTransmitters = m_uniRand->GetInteger (ceil (0.66 * numChannels) + 1, numChannels);
+    }  
+  return numTransmitters;
+}
+
+
+void
+TvSpectrumTransmitterHelper::InstallRandomRegionalTransmitters (Region region, 
+                                                                std::list<int> transmitterIndicesToCreate, 
+                                                                std::list<Vector> transmitterLocations)
+{
+  int numTransmitters = (int)transmitterIndicesToCreate.size();
+  for (int transNum = 0; transNum < numTransmitters; transNum++)
+    {
+      Ptr<ListPositionAllocator> nodePosition = CreateObject<ListPositionAllocator> ();
+      // add generated coordinate point to node position
+      nodePosition->Add (transmitterLocations.front()); 
+      MobilityHelper mobility;
+      mobility.SetPositionAllocator (nodePosition);
+      mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+      NodeContainer tvNode; // contains position of transmitter to be created
+      tvNode.Create (1);
+      mobility.Install (tvNode);
+      // set channel number for this transmitter
+      uint16_t channelNumber = (uint16_t) transmitterIndicesToCreate.front(); 
+      Install (tvNode, region, channelNumber); //install tv transmitter
+      transmitterLocations.pop_front(); // remove created transmitter location
+      transmitterIndicesToCreate.pop_front(); // remove created transmitter index
+    }
+}
+
+} // namespace ns3
+
diff -Naur ns-3.22/src/spectrum/helper/tv-spectrum-transmitter-helper.h ns-3.23/src/spectrum/helper/tv-spectrum-transmitter-helper.h
--- ns-3.22/src/spectrum/helper/tv-spectrum-transmitter-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/helper/tv-spectrum-transmitter-helper.h	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,325 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#ifndef TV_SPECTRUM_TRANSMITTER_HELPER_H
+#define TV_SPECTRUM_TRANSMITTER_HELPER_H
+
+#include <ns3/spectrum-value.h>
+#include <ns3/spectrum-phy.h>
+#include <ns3/spectrum-channel.h>
+#include <ns3/antenna-model.h>
+#include <ns3/spectrum-signal-parameters.h>
+#include <ns3/mobility-model.h>
+#include <ns3/net-device.h>
+#include <ns3/net-device-container.h>
+#include <ns3/node-container.h>
+#include <ns3/non-communicating-net-device.h>
+#include <ns3/random-variable-stream.h>
+#include <ns3/tv-spectrum-transmitter.h>
+#include "ns3/object-factory.h"
+
+namespace ns3
+{
+
+/**
+ * \ingroup spectrum
+ *
+ * Helper class which uses TvSpectrumTransmitter class to create customizable 
+ * TV transmitter(s) that transmit PSD spectrum specified by user-set attributes.
+ * Has functionality to create TV transmitter(s) with actual frequencies of 
+ * specific geographic regions.
+ * Provides method to create a random set of transmitters within a given region 
+ * and location.
+ *
+ * Here is an example of how to use this class:
+ *
+ * TvSpectrumTransmitterHelper tvTransHelper;
+ * tvTransHelper.SetChannel (channel); // provided that user has a Ptr<SpectrumChannel> ready.
+ * tvTransHelper.SetAttribute ("StartFrequency", DoubleValue (524e6));
+ * tvTransHelper.SetAttribute ("ChannelBandwidth", DoubleValue (6e6));
+ * tvTransHelper.SetAttribute ("StartingTime", TimeValue (Seconds (0)));
+ * tvTransHelper.SetAttribute ("TransmitDuration", TimeValue (Seconds (0.2)));
+ * tvTransHelper.SetAttribute ("BasePsd", DoubleValue (22.22)); 
+ * tvTransHelper.SetAttribute ("TvType", EnumValue (TvSpectrumTransmitter::TVTYPE_8VSB));
+ * tvTransHelper.SetAttribute ("Antenna", StringValue ("ns3::IsotropicAntennaModel"));
+ * tvTransHelper.Install (tvTransmitterNode); //provided that user has a NodeContainer ready.
+ */
+class TvSpectrumTransmitterHelper
+{
+
+public:
+  /**
+   * geographical region that TV transmitters are being set up in
+   */
+  enum Region
+  {
+    REGION_NORTH_AMERICA,
+    REGION_JAPAN,
+    REGION_EUROPE
+  };
+
+  /**
+   * density of location that TV transmitters are being set up in
+   */
+  enum Density
+  {
+    DENSITY_LOW,
+    DENSITY_MEDIUM,
+    DENSITY_HIGH
+  };
+  
+  TvSpectrumTransmitterHelper (); //!< Default constructor
+  virtual ~TvSpectrumTransmitterHelper (); //!< Destructor
+
+  /** 
+   * Set the spectrum channel for the device(s) to transmit on
+   * 
+   * @param c a pointer to the spectrum channel
+   */
+  void SetChannel (Ptr<SpectrumChannel> c);
+
+  /** 
+   * Set attribute for each TvSpectrumTransmitter instance to be created 
+   * 
+   * @param name the name of the attribute to set
+   * @param val the value of the attribute to set
+   */
+  void SetAttribute (std::string name, const AttributeValue &val);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * If multiple transmitters created, all will have same settings (frequency, 
+   * PSD, etc.) except for position/location, which depends on the positions 
+   * in the input NodeContainer.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer Install (NodeContainer nodes);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * Transmitter(s) will be created with frequencies corresponding to the 
+   * user-selected channel number of the user-selected region.
+   * If multiple transmitters created, all will have same settings (frequency, 
+   * PSD, etc.) except for position/location, which depends on the positions 
+   * in the input NodeContainer.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   * @param region the region of which the transmitter(s) will be characterized
+   * @param channelNumber the TV channel number in the selected region that the 
+   * transmitter frequencies will be modeled after
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer Install (NodeContainer nodes,
+                              Region region,
+                              uint16_t channelNumber);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Consecutively created transmitters (consecutive in input NodeContainer) 
+   * will have adjacent channels, i.e. a transmitter's frequency spectrum will 
+   * border (but not overlap) the frequency spectrum of the transmitter created 
+   * directly before it and the transmitter created directly after it.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * If multiple transmitters created, they will have same settings except for 
+   * frequency and position/location.
+   * For each node, start frequency will be incremented by the channel bandwidth 
+   * that is set.
+   * For example, if two nodes are given as inputs to InstallAdjacent with 
+   * start frequency set to 500 MHz and channel bandwidth set to 6 MHz, the 
+   * first node will be a transmitter ranging from 500 MHz to 506 MHz and the 
+   * second node will be a transmitter ranging from 506 MHz to 512 MHz.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer InstallAdjacent (NodeContainer nodes);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Consecutively created transmitters (consecutive in input NodeContainer) 
+   * will have adjacent channels, with the frequency spectrum and bandwidth of 
+   * each channel determined by the user-selected region.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * The first created transmitter will have frequencies corresponding to the 
+   * user-selected channel number of the user-selected region.
+   * Each subsequently created transmitter will have its frequencies modeled 
+   * after the channel number (of the user-selected region) following the 
+   * previous one; for example if the first created transmitter is modeled after 
+   * channel 1, the next one created will be modeled after channel 2, and the 
+   * following one will be modeled after channel 3.
+   * If multiple transmitters created, they will have same settings except for 
+   * frequency and position/location.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   * @param region the region of which the transmitter(s) will be characterized
+   * @param channelNumber the TV channel number in the selected region that the 
+   * first created transmitter's frequencies will be modeled after
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer InstallAdjacent (NodeContainer nodes,
+                                      Region region,
+                                      uint16_t channelNumber);
+
+  /**
+   * Assigns the stream number for the uniform random number generator to use
+   *
+   * @param stream first stream index to use
+   * @return the number of stream indices assigned by this helper
+   */
+  int64_t AssignStreams (int64_t streamNum);
+
+  /**
+   * Generates and installs (starts transmission on the spectrum channel) a 
+   * random number of TV transmitters with channel frequencies corresponding 
+   * to the given region at random locations on or above earth. 
+   * The generated transmitters are located at randomly selected points within a 
+   * given altitude above earth's surface centered around a given origin point 
+   * (on earth's surface) within a given distance radius, corresponding to a 
+   * uniform distribution.
+   * Distance radius is measured as if all points are on earth's surface
+   * (with altitude = 0).
+   * Assumes earth is a perfect sphere.
+   * The given region's channel numbers that the generated TV transmitters' 
+   * frequency spectra are modeled after are uniformly selected at random.
+   * These channel numbers are never repeated.
+   * The number of transmitters generated is uniformly random based on given 
+   * density.
+   * Each transmitter has BasePsd and TvType set from SetAttribute(), which 
+   * should be set before calling this method.
+   * 
+   * @param region the region that the transmitters are in
+   * @param density the density (high, medium, or low) of the location being 
+   * simulated, which determines how many transmitters are created and how many 
+   * channels are occupied. Low density will generate between one and one third 
+   * of the number of TV channels in the given region, medium density will 
+   * generate between one third and two thirds, and high density will generate 
+   * between two thirds and all of the channels.
+   * @param originLatitude origin point latitude in degrees
+   * @param originLongitude origin point longitude in degrees
+   * @param maxAltitude maximum altitude in meters above earth's surface with
+   * which random points can be generated
+   * @param maxRadius max distance in meters from origin with which random 
+   * transmitters can be generated (all transmitters are less than or equal to 
+   * this distance from the origin, relative to points being on earth's surface)
+   */
+  void CreateRegionalTvTransmitters (Region region, 
+                                     Density density, 
+                                     double originLatitude, 
+                                     double originLongitude, 
+                                     double maxAltitude,
+                                     double maxRadius);
+
+
+private:
+  Ptr<SpectrumChannel> m_channel; //!< Pointer to spectrum channel object
+
+  /**
+   * Generates random indices of given region frequency array (ignoring indices 
+   * referring to invalid channels).
+   * Number of indices generated (which is number of TV transmitters to be 
+   * created) is random based on given density.
+   * Indices generated refer to frequencies that TV transmitters will be 
+   * created with.
+   * 
+   * @param startFrequencies array containing all channel start frequencies for 
+   * a particular region
+   * @param startFrequenciesLength number of elements in startFrequencies array
+   * @param density the density (high, medium, or low) of the location being 
+   * simulated, which determines how many transmitters are created
+   *
+   * @return a list contaning the indices in startFrequencies that transmitters 
+   * will be created for
+   */
+  std::list<int> GenerateRegionalTransmitterIndices (const double startFrequencies[], 
+                                                     const int startFrequenciesLength, 
+                                                     Density density);
+  
+  /**
+   * Randomly generates the number of TV transmitters to be created based on 
+   * given density and number of possible TV channels. 
+   * Low density will generate a transmitter for between one (a single 
+   * transmitter) and one third of the number of possible channels, medium 
+   * density will generate a transmitter for between one third and two thirds, 
+   * and high density will generate a transmitter for between two thirds and all 
+   * of the possible channels. 
+   * These ratios are approximated in the implementation, but there is no 
+   * overlap possible in the number of transmitters generated between adjacent 
+   * densities. 
+   * For example, given 60 possible channels, for low density between 1 and 20 
+   * transmitters can be created, for medium density between 21 and 40 
+   * transmitters can be created, and for high density between 41 and 60 
+   * transmitters can be created (all inclusive).
+   * 
+   * @param density the density (high, medium, or low) of the location being 
+   * simulated
+   * @param numChannels the number of possible TV channels in the region being 
+   * simulated
+   *
+   * @return the number of TV transmitters that will be created
+   */
+  int GetRandomNumTransmitters (Density density, uint32_t numChannels);
+
+  /**
+   * Installs each randomly generated regional TV transmitter
+   * 
+   * @param region the region that the transmitters are in
+   * @param transmitterIndicesToCreate a list contaning the channel number 
+   * indices (for region's start frequencies array) that transmitters will be 
+   * created for; this is returned from GenerateRegionalTransmitterIndices()
+   * @param transmitterLocations a list containing the vectors 
+   * (x, y, z location) of each TV transmitter to be generated; this is 
+   * returned from RandGeographicCoordsAroundPoint()
+   */
+  void InstallRandomRegionalTransmitters (Region region, 
+                                          std::list<int> transmitterIndicesToCreate, 
+                                          std::list<Vector> transmitterLocations);
+
+  ObjectFactory m_factory; //!< Object factory for attribute setting
+  Ptr<UniformRandomVariable> m_uniRand; //!< Object to generate uniform random numbers
+
+};
+
+} // namespace ns3
+
+#endif /* TV_SPECTRUM_TRANSMITTER_HELPER_H */
diff -Naur ns-3.22/src/spectrum/model/aloha-noack-mac-header.cc ns-3.23/src/spectrum/model/aloha-noack-mac-header.cc
--- ns-3.22/src/spectrum/model/aloha-noack-mac-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/aloha-noack-mac-header.cc	2015-05-13 11:05:26.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::AlohaNoackMacHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<AlohaNoackMacHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/spectrum/model/aloha-noack-net-device.cc ns-3.23/src/spectrum/model/aloha-noack-net-device.cc
--- ns-3.22/src/spectrum/model/aloha-noack-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/aloha-noack-net-device.cc	2015-05-13 11:05:26.000000000 -0700
@@ -60,6 +60,7 @@
 {
   static TypeId tid = TypeId ("ns3::AlohaNoackNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<AlohaNoackNetDevice> ()
     .AddAttribute ("Address",
                    "The MAC address of this device.",
diff -Naur ns-3.22/src/spectrum/model/constant-spectrum-propagation-loss.cc ns-3.23/src/spectrum/model/constant-spectrum-propagation-loss.cc
--- ns-3.22/src/spectrum/model/constant-spectrum-propagation-loss.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/constant-spectrum-propagation-loss.cc	2015-05-13 11:05:26.000000000 -0700
@@ -47,6 +47,7 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantSpectrumPropagationLossModel")
     .SetParent<SpectrumPropagationLossModel> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<ConstantSpectrumPropagationLossModel> ()
     .AddAttribute ("Loss",
                    "Path loss (dB) between transmitter and receiver",
diff -Naur ns-3.22/src/spectrum/model/friis-spectrum-propagation-loss.cc ns-3.23/src/spectrum/model/friis-spectrum-propagation-loss.cc
--- ns-3.22/src/spectrum/model/friis-spectrum-propagation-loss.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/friis-spectrum-propagation-loss.cc	2015-05-13 11:05:26.000000000 -0700
@@ -42,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::FriisSpectrumPropagationLossModel")
     .SetParent<SpectrumPropagationLossModel> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<FriisSpectrumPropagationLossModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/spectrum/model/half-duplex-ideal-phy.cc ns-3.23/src/spectrum/model/half-duplex-ideal-phy.cc
--- ns-3.22/src/spectrum/model/half-duplex-ideal-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/half-duplex-ideal-phy.cc	2015-05-13 11:05:26.000000000 -0700
@@ -288,8 +288,8 @@
         m_txPacket = p;
         ChangeState (TX);
         Ptr<HalfDuplexIdealPhySignalParameters> txParams = Create<HalfDuplexIdealPhySignalParameters> ();
-        double txTimeSeconds = m_rate.CalculateTxTime (p->GetSize ());
-        txParams->duration = Seconds (txTimeSeconds);
+        Time txTimeSeconds = m_rate.CalculateBytesTxTime (p->GetSize ());
+        txParams->duration = txTimeSeconds;
         txParams->txPhy = GetObject<SpectrumPhy> ();
         txParams->txAntenna = m_antenna;
         txParams->psd = m_txPsd;
@@ -297,7 +297,7 @@
 
         NS_LOG_LOGIC (this << " tx power: " << 10 * std::log10 (Integral (*(txParams->psd))) + 30 << " dBm");
         m_channel->StartTx (txParams);
-        Simulator::Schedule (Seconds (txTimeSeconds), &HalfDuplexIdealPhy::EndTx, this);
+        Simulator::Schedule (txTimeSeconds, &HalfDuplexIdealPhy::EndTx, this);
       }
       break;
 
diff -Naur ns-3.22/src/spectrum/model/multi-model-spectrum-channel.cc ns-3.23/src/spectrum/model/multi-model-spectrum-channel.cc
--- ns-3.22/src/spectrum/model/multi-model-spectrum-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/multi-model-spectrum-channel.cc	2015-05-13 11:05:26.000000000 -0700
@@ -97,6 +97,7 @@
 {
   static TypeId tid = TypeId ("ns3::MultiModelSpectrumChannel")
     .SetParent<SpectrumChannel> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<MultiModelSpectrumChannel> ()
     .AddAttribute ("MaxLossDb",
                    "If a single-frequency PropagationLossModel is used, "
@@ -411,6 +412,7 @@
             {
               return (*phyIt)->GetDevice ();
             }
+          j++;
         }
     }
   NS_FATAL_ERROR ("m_numDevice > actual number of devices");
diff -Naur ns-3.22/src/spectrum/model/non-communicating-net-device.cc ns-3.23/src/spectrum/model/non-communicating-net-device.cc
--- ns-3.22/src/spectrum/model/non-communicating-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/non-communicating-net-device.cc	2015-05-13 11:05:26.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::NonCommunicatingNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<NonCommunicatingNetDevice> ()
     .AddAttribute ("Phy", "The PHY layer attached to this device.",
                    PointerValue (),
diff -Naur ns-3.22/src/spectrum/model/single-model-spectrum-channel.cc ns-3.23/src/spectrum/model/single-model-spectrum-channel.cc
--- ns-3.22/src/spectrum/model/single-model-spectrum-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/single-model-spectrum-channel.cc	2015-05-13 11:05:26.000000000 -0700
@@ -67,6 +67,7 @@
   NS_LOG_FUNCTION_NOARGS ();
   static TypeId tid = TypeId ("ns3::SingleModelSpectrumChannel")
     .SetParent<SpectrumChannel> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<SingleModelSpectrumChannel> ()
     .AddAttribute ("MaxLossDb",
                    "If a single-frequency PropagationLossModel is used, "
diff -Naur ns-3.22/src/spectrum/model/spectrum-analyzer.cc ns-3.23/src/spectrum/model/spectrum-analyzer.cc
--- ns-3.22/src/spectrum/model/spectrum-analyzer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/spectrum-analyzer.cc	2015-05-13 11:05:26.000000000 -0700
@@ -71,6 +71,7 @@
 {
   static TypeId tid = TypeId ("ns3::SpectrumAnalyzer")
     .SetParent<SpectrumPhy> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<SpectrumAnalyzer> ()
     .AddAttribute ("Resolution",
                    "The lengh of the time interval over which the "
diff -Naur ns-3.22/src/spectrum/model/spectrum-channel.cc ns-3.23/src/spectrum/model/spectrum-channel.cc
--- ns-3.22/src/spectrum/model/spectrum-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/spectrum-channel.cc	2015-05-13 11:05:26.000000000 -0700
@@ -31,6 +31,7 @@
 {
   static TypeId tid = TypeId ("ns3::SpectrumChannel")
     .SetParent<Channel> ()
+    .SetGroupName ("Spectrum")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/spectrum/model/spectrum-error-model.cc ns-3.23/src/spectrum/model/spectrum-error-model.cc
--- ns-3.22/src/spectrum/model/spectrum-error-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/spectrum-error-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::SpectrumErrorModel")
     .SetParent<Object> ()
+    .SetGroupName ("Spectrum")
     ;
   return tid;
 }
diff -Naur ns-3.22/src/spectrum/model/spectrum-phy.cc ns-3.23/src/spectrum/model/spectrum-phy.cc
--- ns-3.22/src/spectrum/model/spectrum-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/spectrum-phy.cc	2015-05-13 11:05:26.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::SpectrumPhy")
     .SetParent<Object> ()
+    .SetGroupName ("Spectrum")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/spectrum/model/spectrum-propagation-loss-model.cc ns-3.23/src/spectrum/model/spectrum-propagation-loss-model.cc
--- ns-3.22/src/spectrum/model/spectrum-propagation-loss-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/spectrum-propagation-loss-model.cc	2015-05-13 11:05:26.000000000 -0700
@@ -48,6 +48,7 @@
 {
   static TypeId tid = TypeId ("ns3::SpectrumPropagationLossModel")
     .SetParent<Object> ()
+    .SetGroupName ("Spectrum")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/spectrum/model/tv-spectrum-transmitter.cc ns-3.23/src/spectrum/model/tv-spectrum-transmitter.cc
--- ns-3.22/src/spectrum/model/tv-spectrum-transmitter.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/model/tv-spectrum-transmitter.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,581 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/log.h>
+#include <ns3/simulator.h>
+#include <ns3/enum.h>
+#include <ns3/uinteger.h>
+#include <ns3/double.h>
+#include <ns3/integer.h>
+#include <ns3/string.h>
+#include <ns3/pointer.h>
+#include <ns3/isotropic-antenna-model.h>
+#include <ns3/antenna-model.h>
+#include <cmath>
+#include "tv-spectrum-transmitter.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitter");
+
+NS_OBJECT_ENSURE_REGISTERED (TvSpectrumTransmitter);
+
+TvSpectrumTransmitter::TvSpectrumTransmitter ()
+  : m_mobility (0),
+    m_antenna (CreateObject<IsotropicAntennaModel> ()),
+    m_netDevice (0),
+    m_channel (0),
+    m_tvType (TVTYPE_8VSB),
+    m_startFrequency (500e6),
+    m_channelBandwidth (6e6),
+    m_basePsd (20),
+    m_txPsd (0),
+    m_startingTime (Seconds (0)),
+    m_transmitDuration (Seconds (0.2)),
+    m_active (false)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TvSpectrumTransmitter::~TvSpectrumTransmitter ()
+{
+  m_mobility = 0;
+  m_antenna = 0;
+  m_netDevice = 0;
+  m_channel = 0;
+  m_txPsd = 0;
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+TvSpectrumTransmitter::GetTypeId(void)
+{
+  static TypeId tid = TypeId("ns3::TvSpectrumTransmitter")
+    .SetParent<SpectrumPhy> ()
+    .SetGroupName ("Spectrum")
+    .AddConstructor<TvSpectrumTransmitter> ()
+    .AddAttribute ("TvType",
+                   "The type of TV transmitter/modulation to be used.",
+                   EnumValue (TvSpectrumTransmitter::TVTYPE_8VSB),
+                   MakeEnumAccessor (&TvSpectrumTransmitter::m_tvType),
+                   MakeEnumChecker (TvSpectrumTransmitter::TVTYPE_8VSB, "8vsb",
+                                    TvSpectrumTransmitter::TVTYPE_COFDM, "cofdm",
+                                    TvSpectrumTransmitter::TVTYPE_ANALOG, "analog"))
+    .AddAttribute ("StartFrequency",
+                   "The lower end frequency (in Hz) of the TV transmitter's "
+                   "signal. Must be greater than or equal to 0.",
+                   DoubleValue (500e6),
+                   MakeDoubleAccessor (&TvSpectrumTransmitter::m_startFrequency),
+                   MakeDoubleChecker<double> (0, std::numeric_limits<double>::max ()))
+    .AddAttribute ("ChannelBandwidth",
+                   "The bandwidth (in Hz) of the TV transmitter's signal. Must "
+                   "be greater than or equal to 0.",
+                   DoubleValue (6e6),
+                   MakeDoubleAccessor (&TvSpectrumTransmitter::m_channelBandwidth),
+                   MakeDoubleChecker<double> (0, std::numeric_limits<double>::max ()))
+    .AddAttribute ("BasePsd",
+                   "The base power spectral density (in dBm/Hz) of the TV "
+                   "transmitter's transmitted spectrum. Base PSD is the "
+                   "maximum PSD of the spectrum excluding pilots. For analog "
+                   "and COFDM transmitters this is the maximum PSD, but for "
+                   "8-VSB transmitters this is the maximum PSD of the main "
+                   "signal spectrum (flat-top segment) since the pilot "
+                   "actually has the maximum PSD overall.",
+                   DoubleValue (20),
+                   MakeDoubleAccessor (&TvSpectrumTransmitter::m_basePsd),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("Antenna",
+                   "The AntennaModel to be used. Allows classes inherited "
+                   "from ns3::AntennaModel. Defaults to ns3::IsotropicAntennaModel.",
+                   StringValue ("ns3::IsotropicAntennaModel"),
+                   MakePointerAccessor (&TvSpectrumTransmitter::m_antenna),
+                   MakePointerChecker<AntennaModel> ())
+    .AddAttribute ("StartingTime",
+                   "The time point after the simulation begins in which the TV "
+                   "transmitter will begin transmitting.",
+                   TimeValue (Seconds (0)),
+                   MakeTimeAccessor (&TvSpectrumTransmitter::m_startingTime),
+                   MakeTimeChecker ())
+    .AddAttribute ("TransmitDuration",
+                   "The duration of time that the TV transmitter will transmit for.",
+                   TimeValue (Seconds (0.2)),
+                   MakeTimeAccessor (&TvSpectrumTransmitter::m_transmitDuration),
+                   MakeTimeChecker ())
+  ;
+  return tid;
+}
+
+void
+TvSpectrumTransmitter::SetChannel (Ptr<SpectrumChannel> c)
+{
+  NS_LOG_FUNCTION (this << c);
+  m_channel = c;
+}
+
+void
+TvSpectrumTransmitter::SetMobility (Ptr<MobilityModel> m)
+{
+  NS_LOG_FUNCTION (this << m);
+  m_mobility = m;
+}
+
+void
+TvSpectrumTransmitter::SetDevice (Ptr<NetDevice> d)
+{
+  NS_LOG_FUNCTION (this << d);
+  m_netDevice = d;
+}
+
+Ptr<MobilityModel>
+TvSpectrumTransmitter::GetMobility ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_mobility;
+}
+
+Ptr<NetDevice>
+TvSpectrumTransmitter::GetDevice ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_netDevice;
+}
+
+Ptr<const SpectrumModel>
+TvSpectrumTransmitter::GetRxSpectrumModel () const
+{
+  NS_LOG_FUNCTION (this);
+  return 0;
+}
+
+Ptr<AntennaModel>
+TvSpectrumTransmitter::GetRxAntenna ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_antenna;
+}
+
+void
+TvSpectrumTransmitter::StartRx (Ptr<SpectrumSignalParameters> params)
+{
+  NS_LOG_FUNCTION (this << params);
+}
+
+
+Ptr<SpectrumChannel>
+TvSpectrumTransmitter::GetChannel () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_channel;
+}
+
+// Used as key for map containing created spectrum models
+struct TvSpectrumModelId
+{
+  TvSpectrumModelId (double stFreq, double bwidth);
+  double startFrequency;
+  double bandwidth;
+};
+
+TvSpectrumModelId::TvSpectrumModelId (double stFreq, double bwidth)
+  : startFrequency (stFreq), 
+    bandwidth (bwidth)
+{
+}
+
+bool
+operator < (const TvSpectrumModelId& a, const TvSpectrumModelId& b)
+{
+  return ( (a.startFrequency < b.startFrequency) || 
+           ( (a.startFrequency == b.startFrequency) && (a.bandwidth < b.bandwidth) ) );
+}
+
+// Stores created spectrum models
+static std::map<TvSpectrumModelId, Ptr<SpectrumModel> > g_tvSpectrumModelMap;
+
+/** 
+ * 8-VSB PSD approximated from Figure 3 of the following article:
+ * Baron, Stanley. "First-Hand:Digital Television: The Digital Terrestrial 
+ * Television Broadcasting (DTTB) Standard." IEEE Global History Network.
+ * <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_
+ * Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
+ *
+ * COFDM PSD approximated from Figure 12 (8k mode) of the following article:
+ * Kopp, Carlo. "High Definition Television." High Definition Television. Air 
+ * Power Australia. <http://www.ausairpower.net/AC-1100.html>.
+ *
+ * Analog PSD approximated from Figure 4 of the following paper:
+ * Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. "Technical Challenges for 
+ * Cognitive Radio in the TV White Space Spectrum." Qualcomm Incorporated.
+ */
+void
+TvSpectrumTransmitter::CreateTvPsd ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_channelBandwidth != 0);
+  Ptr<SpectrumModel> model;
+  TvSpectrumModelId key (m_startFrequency, m_channelBandwidth);
+  std::map<TvSpectrumModelId, Ptr<SpectrumModel> >::iterator iter = g_tvSpectrumModelMap.find (key);
+  if (iter != g_tvSpectrumModelMap.end ())
+    {
+      model = iter->second; //set SpectrumModel to previously created one
+    }
+  else // no previously created SpectrumModel with same frequency and bandwidth
+    {
+      Bands bands;
+      double halfSubBand = 0.5 * (m_channelBandwidth / 100);
+      for (double fl = m_startFrequency - halfSubBand; fl <= (m_startFrequency - 
+           halfSubBand) + m_channelBandwidth; fl += m_channelBandwidth / 100)
+        {
+          BandInfo bi;
+          bi.fl = fl;
+          bi.fc = fl + halfSubBand;
+          bi.fh = fl + (2 * halfSubBand);
+          bands.push_back (bi);
+        }
+      model = Create<SpectrumModel> (bands);
+      g_tvSpectrumModelMap.insert (std::pair<TvSpectrumModelId, Ptr<SpectrumModel> > (key, model));
+    }
+  Ptr<SpectrumValue> psd = Create<SpectrumValue> (model);
+  double basePsdWattsHz = pow (10.0, (m_basePsd - 30) / 10.0); //convert dBm to W/Hz
+  switch (m_tvType)
+    {
+      case TVTYPE_8VSB:
+        {
+          for (int i = 0; i <= 100; i++)
+            {     
+              switch (i)
+                {  
+                  case 0: 
+                  case 100: 
+                    (*psd) [i] = 0.015 * basePsdWattsHz;
+                    break;
+                  case 1: 
+                  case 99: 
+                    (*psd) [i] = 0.019 * basePsdWattsHz;
+                    break;
+                  case 2: 
+                  case 98: 
+                    (*psd) [i] = 0.034 * basePsdWattsHz;
+                    break;
+                  case 3: 
+                  case 97: 
+                    (*psd) [i] = 0.116 * basePsdWattsHz;
+                    break;
+                  case 4: 
+                  case 96: 
+                    (*psd) [i] = 0.309 * basePsdWattsHz;
+                    break;
+                  case 5: 
+                    (*psd) [i] = (0.502 * basePsdWattsHz) + (21.577 * basePsdWattsHz); //pilot
+                    break;
+                  case 6: 
+                  case 94: 
+                    (*psd) [i] = 0.696 * basePsdWattsHz;
+                    break;
+                  case 7: 
+                  case 93: 
+                    (*psd) [i] = 0.913 * basePsdWattsHz;
+                    break;
+                  case 8: 
+                  case 92: 
+                    (*psd) [i] = 0.978 * basePsdWattsHz;
+                    break;
+                  case 9:
+                  case 91:  
+                    (*psd) [i] = 0.990 * basePsdWattsHz;
+                    break;
+                  case 95: 
+                    (*psd) [i] = 0.502 * basePsdWattsHz;
+                    break;
+                  default: 
+                    (*psd) [i] = basePsdWattsHz;
+                    break;
+                }  
+            }
+          break;
+        }
+      case TVTYPE_COFDM:
+        {
+          for (int i = 0; i <= 100; i++)
+            {
+              switch (i)
+                {
+                  case 0: 
+                  case 100: 
+                    (*psd) [i] = 1.52e-4 * basePsdWattsHz;
+                    break;
+                  case 1: 
+                  case 99: 
+                    (*psd) [i] = 2.93e-4 * basePsdWattsHz;
+                    break;
+                  case 2: 
+                  case 98: 
+                    (*psd) [i] = 8.26e-4 * basePsdWattsHz;
+                    break;
+                  case 3:
+                  case 97:  
+                    (*psd) [i] = 0.0927 * basePsdWattsHz;
+                    break;
+                  default: 
+                    (*psd) [i] = basePsdWattsHz;
+                    break;
+                }
+            }
+          break;
+        }
+      case TVTYPE_ANALOG:
+        {
+          for (int i = 0; i <= 100; i++)
+            {
+              switch (i)
+                {
+                  case 0:
+                  case 1:
+                  case 2:
+                  case 3:
+                    (*psd) [i] = 27.07946e-08 * basePsdWattsHz;
+                    break;
+                  case 4:
+                  case 5:
+                  case 6:
+                    (*psd) [i] = 2.51189e-07 * basePsdWattsHz;
+                    break;
+                  case 7:
+                  case 8:
+                  case 9:
+                    (*psd) [i] = 1e-06 * basePsdWattsHz;
+                    break;
+                  case 10:
+                  case 11:
+                  case 12:
+                    (*psd) [i] = 2.39883e-06 * basePsdWattsHz;
+                    break;
+                  case 13:
+                  case 14:
+                  case 15:
+                    (*psd) [i] = 5.62341e-06 * basePsdWattsHz;
+                    break;
+                  case 16:
+                  case 17:
+                  case 18:
+                    (*psd) [i] = 6.68344e-06 * basePsdWattsHz;
+                    break;
+                  case 19:
+                  case 20:
+                  case 21:
+                    (*psd) [i] = 1.25893e-05 * basePsdWattsHz;
+                    break;
+                  case 22:
+                  case 23:
+                  case 24:
+                    (*psd) [i] = 3.16228e-05 * basePsdWattsHz;
+                    break;
+                  case 25:
+                    (*psd) [i] = 0.000158489 * basePsdWattsHz;
+                    break;
+                  case 26:
+                    (*psd) [i] = basePsdWattsHz;
+                    break;
+                  case 27:
+                    (*psd) [i] = 7.49894e-05 * basePsdWattsHz;
+                    break;
+                  case 28:
+                  case 29:
+                  case 30:
+                    (*psd) [i] = 2.37137e-05 * basePsdWattsHz;
+                    break;
+                  case 31:
+                  case 32:
+                  case 33:
+                    (*psd) [i] = 1.14815e-05 * basePsdWattsHz;
+                    break;
+                  case 34:
+                  case 35:
+                  case 36:
+                    (*psd) [i] = 7.49894e-06 * basePsdWattsHz;
+                    break;
+                  case 37:
+                  case 38:
+                  case 39:
+                    (*psd) [i] = 5.62341e-06 * basePsdWattsHz;
+                    break;
+                  case 40:
+                  case 41:
+                  case 42:
+                    (*psd) [i] = 4.21697e-06 * basePsdWattsHz;
+                    break;
+                  case 43:
+                  case 44:
+                  case 45:
+                    (*psd) [i] = 3.16228e-06 * basePsdWattsHz;
+                    break;
+                  case 46:
+                  case 47:
+                  case 48:
+                    (*psd) [i] = 1.99526e-06 * basePsdWattsHz;
+                    break;
+                  case 49:
+                  case 50:
+                  case 51:
+                    (*psd) [i] = 1.25893e-06 * basePsdWattsHz;
+                    break;
+                  case 52:
+                  case 53:
+                  case 54:
+                    (*psd) [i] = 8.41395e-07 * basePsdWattsHz;
+                    break;
+                  case 55:
+                  case 56:
+                  case 57:
+                    (*psd) [i] = 6.30957e-07 * basePsdWattsHz;
+                    break;
+                  case 58:
+                  case 59:
+                  case 60:
+                    (*psd) [i] = 5.88844e-07 * basePsdWattsHz;
+                    break;
+                  case 61:
+                  case 62:
+                  case 63:
+                    (*psd) [i] = 5.62341e-07 * basePsdWattsHz;
+                    break;
+                  case 64:
+                  case 65:
+                  case 66:
+                    (*psd) [i] = 5.30884e-07 * basePsdWattsHz;
+                    break;
+                  case 67:
+                  case 68:
+                  case 69:
+                    (*psd) [i] = 5.01187e-07 * basePsdWattsHz;
+                    break;
+                  case 70:
+                  case 71:
+                  case 72:
+                    (*psd) [i] = 5.30884e-07 * basePsdWattsHz;
+                    break;
+                  case 73:
+                  case 74:
+                  case 75:
+                    (*psd) [i] = 7.49894e-07 * basePsdWattsHz;
+                    break;
+                  case 76:
+                  case 77:
+                  case 78:
+                    (*psd) [i] = 1.77828e-06 * basePsdWattsHz;
+                    break;
+                  case 79:
+                    (*psd) [i] = 5.62341e-06 * basePsdWattsHz;
+                    break;
+                  case 80:
+                    (*psd) [i] = 0.000177828 * basePsdWattsHz;
+                    break;
+                  case 81:
+                    (*psd) [i] = 4.21697e-06 * basePsdWattsHz;
+                    break;
+                  case 82:
+                  case 83:
+                  case 84:
+                    (*psd) [i] = 3.16228e-06 * basePsdWattsHz;
+                    break;
+                  case 85:
+                  case 86:
+                  case 87:
+                    (*psd) [i] = 3.16228e-06 * basePsdWattsHz;
+                    break;
+                  case 88:
+                  case 89:
+                  case 90:
+                    (*psd) [i] = 4.73151e-06 * basePsdWattsHz;
+                    break;
+                  case 91:
+                  case 92:
+                  case 93:
+                    (*psd) [i] = 7.49894e-06 * basePsdWattsHz;
+                    break;
+                  case 94:
+                    (*psd) [i] = 7.49894e-05 * basePsdWattsHz;
+                    break;
+                  case 95:
+                    (*psd) [i] = 0.1 * basePsdWattsHz;
+                    break;
+                  case 96:
+                    (*psd) [i] = 7.49894e-05 * basePsdWattsHz;
+                    break;
+                  case 97:
+                  case 98:
+                  case 99:
+                  case 100:
+                    (*psd) [i] = 1.77828e-06 * basePsdWattsHz;
+                    break;
+                }
+            }
+          break;
+        }
+      default:
+        {
+          NS_LOG_ERROR ("no valid TvType selected");
+          break;
+        }
+    }
+  m_txPsd = psd;
+}
+
+Ptr<SpectrumValue>
+TvSpectrumTransmitter::GetTxPsd () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_txPsd;
+}
+
+void
+TvSpectrumTransmitter::SetupTx ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_txPsd);
+  Ptr<SpectrumSignalParameters> signal = Create<SpectrumSignalParameters> ();
+  signal->duration = m_transmitDuration;
+  signal->psd = m_txPsd;
+  signal->txPhy = GetObject<SpectrumPhy> ();
+  signal->txAntenna = m_antenna;
+  m_channel->StartTx (signal);
+}
+
+void
+TvSpectrumTransmitter::Start ()
+{
+  NS_LOG_FUNCTION (this);
+  if (!m_active)
+    {
+      NS_LOG_LOGIC ("starting TV transmitter");
+      m_active = true;
+      Simulator::Schedule (m_startingTime, &TvSpectrumTransmitter::SetupTx, this);
+    }
+}
+
+void
+TvSpectrumTransmitter::Stop ()
+{
+  NS_LOG_FUNCTION (this);
+  m_active = false;
+}
+
+} // namespace ns3
+
diff -Naur ns-3.22/src/spectrum/model/tv-spectrum-transmitter.h ns-3.23/src/spectrum/model/tv-spectrum-transmitter.h
--- ns-3.22/src/spectrum/model/tv-spectrum-transmitter.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/model/tv-spectrum-transmitter.h	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,152 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#ifndef TV_SPECTRUM_TRANSMITTER_H
+#define TV_SPECTRUM_TRANSMITTER_H
+
+#include <ns3/spectrum-value.h>
+#include <ns3/spectrum-phy.h>
+#include <ns3/spectrum-channel.h>
+#include <ns3/antenna-model.h>
+#include <ns3/spectrum-signal-parameters.h>
+#include <ns3/mobility-model.h>
+#include <ns3/net-device.h>
+
+namespace ns3
+{
+
+
+/**
+ * \ingroup spectrum
+ *
+ * SpectrumPhy implementation that creates a customizable TV transmitter which
+ * transmits a PSD spectrum specified by user-set attributes.
+ *
+ *
+ * This PHY model supports a single antenna model instance which is
+ * used for transmission (this PHY model never receives).
+ */
+class TvSpectrumTransmitter : public SpectrumPhy
+{
+
+public:
+  /** 
+   * types of TV transmitters: analog, digital 8-VSB, or digital COFDM
+   */
+  enum TvType
+  {
+    TVTYPE_ANALOG,
+    TVTYPE_8VSB,
+    TVTYPE_COFDM
+  };
+  
+  TvSpectrumTransmitter (); //!< Default constructor
+  virtual ~TvSpectrumTransmitter (); //!< Destructor
+  
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
+  static TypeId GetTypeId (void);
+
+  // inherited from SpectrumPhy
+  void SetChannel (Ptr<SpectrumChannel> c);
+  void SetMobility (Ptr<MobilityModel> m);
+  void SetDevice (Ptr<NetDevice> d);
+  Ptr<MobilityModel> GetMobility ();
+  Ptr<NetDevice> GetDevice ();
+  // device does not use Rx but these pure virtual methods must be implemented
+  Ptr<const SpectrumModel> GetRxSpectrumModel () const;
+  Ptr<AntennaModel> GetRxAntenna ();
+  void StartRx (Ptr<SpectrumSignalParameters> params);
+
+  /** 
+   * Get the spectrum channel
+   * 
+   * @return a pointer to the assigned spectrum channel
+   */
+  Ptr<SpectrumChannel> GetChannel () const;
+
+  /** 
+   * Creates power spectral density (PSD) spectrum of the TV transmitter and
+   * sets it for transmission.
+   * Before calling this method, must set attributes and parameters that are 
+   * applicable to your transmitter.
+   * 
+   * 8-VSB PSD approximated from Figure 3 of the following article:
+   * Baron, Stanley. "First-Hand:Digital Television: The Digital Terrestrial 
+   * Television Broadcasting (DTTB) Standard." IEEE Global History Network.
+   * <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_
+   * Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
+   *
+   * COFDM PSD approximated from Figure 12 (8k mode) of the following article:
+   * Kopp, Carlo. "High Definition Television." High Definition Television. Air 
+   * Power Australia. <http://www.ausairpower.net/AC-1100.html>.
+   *
+   * Analog PSD approximated from Figure 4 of the following paper:
+   * Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. "Technical Challenges 
+   * for Cognitive Radio in the TV White Space Spectrum." Qualcomm Incorporated.
+   *
+   *
+   * @return a pointer to the power spectral density of the TV transmitter
+   */
+  virtual void CreateTvPsd ();
+
+  /** 
+   * Get the power spectral density of the TV transmitter's signal
+   * 
+   * @return a pointer to the PSD
+   */  
+  Ptr<SpectrumValue> GetTxPsd () const;
+
+  /** 
+   * Starts the TV Transmitter's transmission on the spectrum channel
+   */
+  virtual void Start ();
+
+  /** 
+   * Stops the TV Transmitter's transmission on the spectrum channel
+   */
+  virtual void Stop ();
+
+
+private:
+  Ptr<MobilityModel> m_mobility; //!< Pointer to mobility model object
+  Ptr<AntennaModel> m_antenna; //!< Pointer to antenna model object
+  Ptr<NetDevice> m_netDevice; //!< Pointer to net device object
+  Ptr<SpectrumChannel> m_channel; //!< Pointer to spectrum channel object
+
+  /** Sets up signal to be transmitted */
+  virtual void SetupTx ();
+
+  enum TvType m_tvType; //!< Type of TV transmitter
+  double m_startFrequency; //!< Start frequency (in Hz) of TV transmitter's signal
+  double m_channelBandwidth; //!< Bandwidth (in Hz) of TV transmitter's signal
+  double m_basePsd; //!< Base power spectral density value (in dBm/Hz) of TV transmitter's signal
+  Ptr<SpectrumValue> m_txPsd; //!< Pointer to power spectral density of TV transmitter's signal
+  Time m_startingTime; //!< Timepoint after simulation begins that TV transmitter will begin transmitting
+  Time m_transmitDuration; //!< Length of time that TV transmitter will transmit for
+  bool m_active; //!< True if TV transmitter is transmitting
+
+};
+
+} // namespace ns3
+
+#endif /* TV_SPECTRUM_TRANSMITTER_H */
diff -Naur ns-3.22/src/spectrum/model/waveform-generator.cc ns-3.23/src/spectrum/model/waveform-generator.cc
--- ns-3.22/src/spectrum/model/waveform-generator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/model/waveform-generator.cc	2015-05-13 11:05:26.000000000 -0700
@@ -69,6 +69,7 @@
 {
   static TypeId tid = TypeId ("ns3::WaveformGenerator")
     .SetParent<SpectrumPhy> ()
+    .SetGroupName ("Spectrum")
     .AddConstructor<WaveformGenerator> ()
     .AddAttribute ("Period",
                    "the period (=1/frequency)",
diff -Naur ns-3.22/src/spectrum/test/tv-helper-distribution-test.cc ns-3.23/src/spectrum/test/tv-helper-distribution-test.cc
--- ns-3.22/src/spectrum/test/tv-helper-distribution-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/test/tv-helper-distribution-test.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,142 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#define private public //to make private method testable
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <ns3/tv-spectrum-transmitter-helper.h>
+
+/**
+ * This test verifies the accuracy of the private GetRandomNumTransmitters()  
+ * method in the TvSpectrumTransmitterHelper class. The method generates a 
+ * random number corresponding to the number of TV transmitters to create based 
+ * on the given location density (low, medium, or high) and maximum possible 
+ * number of TV channels. Low density will generate a transmitter for between 
+ * one (a single transmitter) and one third of the number of possible channels, 
+ * medium density will generate a transmitter for between one third and two 
+ * thirds, and high density will generate a transmitter for between two thirds 
+ * and all of the possible channels. In this test, it is verified that the 
+ * lower (1) and upper (max number of possible channels input) bounds are not 
+ * exceeded and that the number of transmitters to be generated does not overlap 
+ * between adjacent densities. For example, given 60 possible channels, for low 
+ * density between 1 and 20 transmitters can be created, for medium density 
+ * between 21 and 40 transmitters can be created, and for high density between 
+ * 41 and 60 transmitters can be created (all inclusive). This is tested with 
+ * various cases.
+ */
+NS_LOG_COMPONENT_DEFINE ("TvHelperDistributionTest");
+
+using namespace ns3;
+
+
+class TvHelperDistributionTestCase : public TestCase
+{
+public:
+  TvHelperDistributionTestCase (uint32_t maxNumTransmitters);
+  virtual ~TvHelperDistributionTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string Name (uint32_t maxNumTransmitters);
+  uint32_t m_maxNumTransmitters;
+};
+
+std::string 
+TvHelperDistributionTestCase::Name (uint32_t maxNumTransmitters)
+{
+  std::ostringstream oss;
+  oss << "Max Number of Transmitters = " << maxNumTransmitters;
+  return oss.str();
+}
+
+TvHelperDistributionTestCase::TvHelperDistributionTestCase (uint32_t maxNumTransmitters)
+  : TestCase (Name (maxNumTransmitters)),
+    m_maxNumTransmitters (maxNumTransmitters)
+{
+}
+
+TvHelperDistributionTestCase::~TvHelperDistributionTestCase ()
+{
+}
+
+void
+TvHelperDistributionTestCase::DoRun (void)
+{  
+  NS_LOG_FUNCTION (m_maxNumTransmitters);
+  TvSpectrumTransmitterHelper tvTransHelper;
+  uint32_t rand;
+  uint32_t maxLow = 0;
+  uint32_t minMid = m_maxNumTransmitters;
+  uint32_t maxMid = 0;
+  uint32_t minHigh = m_maxNumTransmitters;
+  for (int i = 0; i < 30; i ++) 
+    {
+      rand = tvTransHelper.GetRandomNumTransmitters (TvSpectrumTransmitterHelper::DENSITY_LOW, m_maxNumTransmitters);
+      NS_TEST_ASSERT_MSG_GT (rand, 0, "lower bound exceeded");
+      if (rand > maxLow)
+        {
+          maxLow = rand;
+        }
+    }
+  for (int i = 0; i < 30; i ++) 
+    {
+      rand = tvTransHelper.GetRandomNumTransmitters (TvSpectrumTransmitterHelper::DENSITY_MEDIUM, m_maxNumTransmitters);
+      if (rand < minMid)
+        {
+          minMid = rand;
+        }
+      if (rand > maxMid)
+        {
+          maxMid = rand;
+        }
+    }
+  for (int i = 0; i < 30; i ++) 
+    {
+      rand = tvTransHelper.GetRandomNumTransmitters (TvSpectrumTransmitterHelper::DENSITY_HIGH, m_maxNumTransmitters);
+      NS_TEST_ASSERT_MSG_LT (rand, m_maxNumTransmitters + 1, "upper bound exceeded");
+      if (rand < minHigh)
+        {
+          minHigh = rand;
+        }
+    }
+  NS_TEST_ASSERT_MSG_LT (maxLow, minMid, "low density overlaps with medium density");
+  NS_TEST_ASSERT_MSG_LT (maxMid, minHigh, "medium density overlaps with high density");
+}
+
+
+class TvHelperDistributionTestSuite : public TestSuite
+{
+public:
+  TvHelperDistributionTestSuite ();
+};
+
+TvHelperDistributionTestSuite::TvHelperDistributionTestSuite ()
+  : TestSuite ("tv-helper-distribution", UNIT)
+{
+  NS_LOG_INFO ("creating TvHelperDistributionTestSuite");
+  for (uint32_t maxNumTransmitters = 3; maxNumTransmitters <= 203; maxNumTransmitters+= 10)
+    {
+      AddTestCase (new TvHelperDistributionTestCase (maxNumTransmitters), 
+                   TestCase::QUICK);
+    }
+}
+
+static TvHelperDistributionTestSuite g_TvHelperDistributionTestSuite;
diff -Naur ns-3.22/src/spectrum/test/tv-spectrum-transmitter-test.cc ns-3.23/src/spectrum/test/tv-spectrum-transmitter-test.cc
--- ns-3.22/src/spectrum/test/tv-spectrum-transmitter-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/spectrum/test/tv-spectrum-transmitter-test.cc	2015-05-13 11:05:26.000000000 -0700
@@ -0,0 +1,211 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <ns3/spectrum-value.h>
+#include <ns3/enum.h>
+#include <ns3/double.h>
+#include <ns3/tv-spectrum-transmitter.h>
+
+/**
+ * This test verifies the accuracy of the spectrum/PSD model in the 
+ * TvSpectrumTransmitter class. To do so, it tests if the max power spectral 
+ * density, start frequency, and end frequency comply with expected values. 
+ * Values for TV/modulation type, start frequency, channel bandwidth, and 
+ * base PSD are swept and tested for each case.
+ */
+NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitterTest");
+
+using namespace ns3;
+
+const double TOLERANCE = 1e-15;
+// Bug 2094: Adjust floating point comparison epsilon based on inputs.
+//           Follows http://realtimecollisiondetection.net/blog/?p=89
+double epsilon;
+
+class TvSpectrumTransmitterTestCase : public TestCase
+{
+public:
+  TvSpectrumTransmitterTestCase (double startFrequency, 
+                            double channelBandwidth, 
+                            double basePsd, 
+                            TvSpectrumTransmitter::TvType tvType);
+  virtual ~TvSpectrumTransmitterTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string Name (TvSpectrumTransmitter::TvType tvType, 
+                           double startFrequency, 
+                           double channelBandwidth, 
+                           double basePsd);
+
+  double m_startFrequency;
+  double m_channelBandwidth; 
+  double m_basePsd;
+  TvSpectrumTransmitter::TvType m_tvType;
+};
+
+
+std::string 
+TvSpectrumTransmitterTestCase::Name (TvSpectrumTransmitter::TvType tvType, 
+                                     double startFrequency, 
+                                     double channelBandwidth, 
+                                     double basePsd)
+{
+  std::ostringstream oss;
+  oss << "TV type = " << tvType << ", "
+      << "start frequency = " << startFrequency << " Hz, "
+      << "channel bandwidth = " << channelBandwidth << " Hz, "
+      << "base PSD = " << basePsd << " dBm per Hz";
+  return oss.str();
+}
+
+TvSpectrumTransmitterTestCase::TvSpectrumTransmitterTestCase (double startFrequency,
+						    double channelBandwidth,
+						    double basePsd,
+						    TvSpectrumTransmitter::TvType tvType)
+  : TestCase (Name (tvType, startFrequency, channelBandwidth, basePsd)),
+    m_startFrequency (startFrequency),
+    m_channelBandwidth (channelBandwidth),
+    m_basePsd (basePsd),
+    m_tvType (tvType)
+{
+}
+
+TvSpectrumTransmitterTestCase::~TvSpectrumTransmitterTestCase ()
+{
+}
+
+void
+TvSpectrumTransmitterTestCase::DoRun (void)
+{  
+  NS_LOG_FUNCTION (m_startFrequency << m_basePsd << m_tvType);
+
+  /* TV transmitter setup */
+  Ptr<TvSpectrumTransmitter> phy = CreateObject<TvSpectrumTransmitter>();
+  phy->SetAttribute ("StartFrequency", DoubleValue (m_startFrequency));
+  phy->SetAttribute ("ChannelBandwidth", DoubleValue (m_channelBandwidth));
+  phy->SetAttribute ("BasePsd", DoubleValue (m_basePsd)); 
+  phy->SetAttribute ("TvType", EnumValue (m_tvType));
+  phy->CreateTvPsd ();
+
+  /* Test max PSD value */
+  Ptr<SpectrumValue> psd = phy->GetTxPsd ();
+  Values::const_iterator psdIter = psd->ConstValuesBegin ();
+  double maxValue = 0;
+  while (psdIter != psd->ConstValuesEnd ())
+    {
+      if (*psdIter > maxValue)
+        {
+          maxValue = *psdIter;
+        }
+      ++psdIter;
+    }
+  double basePsdWattsHz = pow (10.0, (m_basePsd - 30) / 10.0); // convert dBm to W/Hz
+  if (m_tvType == TvSpectrumTransmitter::TVTYPE_8VSB) // pilot has highest PSD
+    {
+      double expectedPsd = (0.502 * basePsdWattsHz) + (21.577 * basePsdWattsHz);
+      epsilon = TOLERANCE * std::max (1.0, std::max (maxValue, expectedPsd));
+      NS_TEST_ASSERT_MSG_EQ_TOL (maxValue, 
+                                 expectedPsd, 
+                                 epsilon,
+                                 "peak PSD value (" << maxValue << ") is incorrect");
+    }
+  else // highest PSD is base PSD
+    {
+      epsilon = TOLERANCE * std::max (1.0, std::max (maxValue, basePsdWattsHz));
+      NS_TEST_ASSERT_MSG_EQ_TOL (maxValue, 
+                                 basePsdWattsHz, 
+                                 epsilon, 
+                                 "peak PSD value (" << maxValue << ") is incorrect");
+    }
+
+  /* Test frequency range */
+  Bands::const_iterator bandStart = psd->ConstBandsBegin ();
+  Bands::const_iterator bandEnd = psd->ConstBandsEnd ();
+  epsilon = TOLERANCE * std::max (1.0, std::max ((*bandStart).fc, m_startFrequency));
+  NS_TEST_ASSERT_MSG_EQ_TOL ((*bandStart).fc, 
+                             m_startFrequency, 
+                             epsilon, 
+                             "start frequency value (" << (*bandStart).fc << ") is incorrect");
+  epsilon = TOLERANCE * std::max (1.0, std::max ((*bandStart).fc, (m_startFrequency + m_channelBandwidth)));
+  NS_TEST_ASSERT_MSG_EQ_TOL ((*(bandEnd - 1)).fc, 
+                             m_startFrequency + m_channelBandwidth, 
+                             epsilon, 
+                             "end frequency value (" << (*(bandEnd - 1)).fc << ") is incorrect");
+}
+
+
+class TvSpectrumTransmitterTestSuite : public TestSuite
+{
+public:
+  TvSpectrumTransmitterTestSuite ();
+};
+
+TvSpectrumTransmitterTestSuite::TvSpectrumTransmitterTestSuite ()
+  : TestSuite ("tv-spectrum-transmitter", UNIT)
+{
+  NS_LOG_INFO ("creating TvSpectrumTransmitterTestSuite");
+  for (double startFreq = 100; startFreq < 1e15; startFreq *= 10)
+    {
+      for (double bandwidth = 100; bandwidth < 1e15; bandwidth *= 10)
+        {
+          for (double psd = -100; psd <= 100; psd += 20)
+            {
+              AddTestCase (new TvSpectrumTransmitterTestCase (startFreq, 
+                                                              bandwidth, 
+                                                              psd, 
+                                                              TvSpectrumTransmitter::TVTYPE_8VSB), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+  for (double startFreq = 100; startFreq < 1e15; startFreq *= 10)
+    {
+      for (double bandwidth = 100; bandwidth < 1e15; bandwidth *= 10)
+        {
+          for (double psd = -100; psd <= 100; psd += 20)
+            {
+              AddTestCase (new TvSpectrumTransmitterTestCase (startFreq, 
+                                                              bandwidth, 
+                                                              psd, 
+                                                              TvSpectrumTransmitter::TVTYPE_COFDM), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+  for (double startFreq = 100; startFreq < 1e15; startFreq *= 10)
+    {
+      for (double bandwidth = 100; bandwidth < 1e15; bandwidth *= 10)
+        {
+          for (double psd = -100; psd <= 100; psd += 20)
+            {
+              AddTestCase (new TvSpectrumTransmitterTestCase (startFreq, 
+                                                              bandwidth, 
+                                                              psd, 
+                                                              TvSpectrumTransmitter::TVTYPE_ANALOG), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+}
+
+static TvSpectrumTransmitterTestSuite g_tvSpectrumTransmitterTestSuite;
diff -Naur ns-3.22/src/spectrum/wscript ns-3.23/src/spectrum/wscript
--- ns-3.22/src/spectrum/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/spectrum/wscript	2015-05-13 11:05:26.000000000 -0700
@@ -28,10 +28,12 @@
         'model/half-duplex-ideal-phy-signal-parameters.cc',
         'model/non-communicating-net-device.cc',
         'model/microwave-oven-spectrum-value-helper.cc',
+        'model/tv-spectrum-transmitter.cc',
         'helper/spectrum-helper.cc',
         'helper/adhoc-aloha-noack-ideal-phy-helper.cc',
         'helper/waveform-generator-helper.cc',
         'helper/spectrum-analyzer-helper.cc',
+        'helper/tv-spectrum-transmitter-helper.cc',
         ]
 
     module_test = bld.create_ns3_module_test_library('spectrum')
@@ -40,6 +42,8 @@
         'test/spectrum-value-test.cc',
         'test/spectrum-ideal-phy-test.cc',
         'test/spectrum-waveform-generator-test.cc',
+        'test/tv-helper-distribution-test.cc',
+        'test/tv-spectrum-transmitter-test.cc',
         ]
     
     headers = bld(features='ns3header')
@@ -69,10 +73,12 @@
         'model/half-duplex-ideal-phy-signal-parameters.h',
         'model/non-communicating-net-device.h',
         'model/microwave-oven-spectrum-value-helper.h',
+        'model/tv-spectrum-transmitter.h',
         'helper/spectrum-helper.h',
         'helper/adhoc-aloha-noack-ideal-phy-helper.h',
         'helper/waveform-generator-helper.h',
         'helper/spectrum-analyzer-helper.h',
+        'helper/tv-spectrum-transmitter-helper.h',
         'test/spectrum-test.h',
         ]
 
diff -Naur ns-3.22/src/stats/model/boolean-probe.cc ns-3.23/src/stats/model/boolean-probe.cc
--- ns-3.22/src/stats/model/boolean-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/boolean-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::BooleanProbe")
     .SetParent<Probe> ()
+    .SetGroupName ("Stats")
     .AddConstructor<BooleanProbe> ()
     .AddTraceSource ( "Output",
                       "The bool that serves as output for this probe",
diff -Naur ns-3.22/src/stats/model/data-collection-object.cc ns-3.23/src/stats/model/data-collection-object.cc
--- ns-3.22/src/stats/model/data-collection-object.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/data-collection-object.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::DataCollectionObject")
     .SetParent<Object> ()
+    .SetGroupName ("Stats")
     .AddConstructor<DataCollectionObject> ()
     .AddAttribute ( "Name",
                     "Object's name",
diff -Naur ns-3.22/src/stats/model/double-probe.cc ns-3.23/src/stats/model/double-probe.cc
--- ns-3.22/src/stats/model/double-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/double-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::DoubleProbe")
     .SetParent<Probe> ()
+    .SetGroupName ("Stats")
     .AddConstructor<DoubleProbe> ()
     .AddTraceSource ( "Output",
                       "The double that serves as output for this probe",
diff -Naur ns-3.22/src/stats/model/file-aggregator.cc ns-3.23/src/stats/model/file-aggregator.cc
--- ns-3.22/src/stats/model/file-aggregator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/file-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::FileAggregator")
     .SetParent<DataCollectionObject> ()
+    .SetGroupName ("Stats")
   ;
 
   return tid;
diff -Naur ns-3.22/src/stats/model/gnuplot-aggregator.cc ns-3.23/src/stats/model/gnuplot-aggregator.cc
--- ns-3.22/src/stats/model/gnuplot-aggregator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/gnuplot-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::GnuplotAggregator")
     .SetParent<DataCollectionObject> ()
+    .SetGroupName ("Stats")
   ;
 
   return tid;
diff -Naur ns-3.22/src/stats/model/probe.cc ns-3.23/src/stats/model/probe.cc
--- ns-3.22/src/stats/model/probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::Probe")
     .SetParent<DataCollectionObject> ()
+    .SetGroupName ("Stats")
     .AddAttribute ("Start",
                    "Time data collection starts",
                    TimeValue (Seconds (0)),
diff -Naur ns-3.22/src/stats/model/time-probe.cc ns-3.23/src/stats/model/time-probe.cc
--- ns-3.22/src/stats/model/time-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/time-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::TimeProbe")
     .SetParent<Probe> ()
+    .SetGroupName ("Stats")
     .AddConstructor<TimeProbe> ()
     .AddTraceSource ("Output",
                      "The double valued (units of seconds) probe output",
diff -Naur ns-3.22/src/stats/model/time-series-adaptor.cc ns-3.23/src/stats/model/time-series-adaptor.cc
--- ns-3.22/src/stats/model/time-series-adaptor.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/time-series-adaptor.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::TimeSeriesAdaptor")
     .SetParent<DataCollectionObject> ()
+    .SetGroupName ("Stats")
     .AddConstructor<TimeSeriesAdaptor> ()
     .AddTraceSource ( "Output",
                       "The current simulation time versus "
diff -Naur ns-3.22/src/stats/model/uinteger-16-probe.cc ns-3.23/src/stats/model/uinteger-16-probe.cc
--- ns-3.22/src/stats/model/uinteger-16-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/uinteger-16-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::Uinteger16Probe")
     .SetParent<Probe> ()
+    .SetGroupName ("Stats")
     .AddConstructor<Uinteger16Probe> ()
     .AddTraceSource ( "Output",
                       "The uint16_t that serves as output for this probe",
diff -Naur ns-3.22/src/stats/model/uinteger-32-probe.cc ns-3.23/src/stats/model/uinteger-32-probe.cc
--- ns-3.22/src/stats/model/uinteger-32-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/uinteger-32-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::Uinteger32Probe")
     .SetParent<Probe> ()
+    .SetGroupName ("Stats")
     .AddConstructor<Uinteger32Probe> ()
     .AddTraceSource ( "Output",
                       "The uint32_t that serves as output for this probe",
diff -Naur ns-3.22/src/stats/model/uinteger-8-probe.cc ns-3.23/src/stats/model/uinteger-8-probe.cc
--- ns-3.22/src/stats/model/uinteger-8-probe.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/model/uinteger-8-probe.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::Uinteger8Probe")
     .SetParent<Probe> ()
+    .SetGroupName ("Stats")
     .AddConstructor<Uinteger8Probe> ()
     .AddTraceSource ( "Output",
                       "The uint8_t that serves as output for this probe",
diff -Naur ns-3.22/src/stats/test/double-probe-test-suite.cc ns-3.23/src/stats/test/double-probe-test-suite.cc
--- ns-3.22/src/stats/test/double-probe-test-suite.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/stats/test/double-probe-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
@@ -56,7 +56,6 @@
   double aux;
 };
 
-Ptr<SampleEmitter> s = CreateObject<SampleEmitter> ();
 
 TypeId
 SampleEmitter::GetTypeId (void)
@@ -81,6 +80,7 @@
   void TraceSink (std::string context, double oldValue, double newValue);
   uint32_t m_objectProbed;
   uint32_t m_pathProbed;
+  Ptr<SampleEmitter> m_s;
 };
 
 ProbeTestCase1::ProbeTestCase1 ()
@@ -100,7 +100,7 @@
   NS_TEST_ASSERT_MSG_GT (Simulator::Now (), Seconds (100), "Probed a value outside of the time window");
   NS_TEST_ASSERT_MSG_LT (Simulator::Now (), Seconds (200), "Probed a value outside of the time window");
 
-  NS_TEST_ASSERT_MSG_EQ_TOL (s->GetValue (), newValue, 0.00001, "Value probed different than value in the variable");
+  NS_TEST_ASSERT_MSG_EQ_TOL (m_s->GetValue (), newValue, 0.00001, "Value probed different than value in the variable");
 
   if (context == "testProbe")
     {
@@ -115,23 +115,25 @@
 void
 ProbeTestCase1::DoRun (void)
 {
+  // Defer creation of this until here because it is a random variable
+  m_s = CreateObject<SampleEmitter> ();
   // Test that all instances of probe data are between time window specified
   // Check also that probes can be hooked to sources by Object and by path
 
   Ptr<DoubleProbe> p = CreateObject<DoubleProbe> ();
   p->SetName ("testProbe");
 
-  Simulator::Schedule (Seconds (1), &SampleEmitter::Start, s);
+  Simulator::Schedule (Seconds (1), &SampleEmitter::Start, m_s);
   p->SetAttribute ("Start", TimeValue (Seconds (100.0)));
   p->SetAttribute ("Stop", TimeValue (Seconds (200.0)));
   Simulator::Stop (Seconds (300));
 
   // Register our emitter object so we can fetch it by using the Config
   // namespace
-  Names::Add ("/Names/SampleEmitter", s);
+  Names::Add ("/Names/SampleEmitter", m_s);
 
   // Hook probe to the emitter.
-  p->ConnectByObject ("Emitter", s);
+  p->ConnectByObject ("Emitter", m_s);
 
   // Hook our test function to the probe trace source
   p->TraceConnect ("Output", p->GetName (), MakeCallback (&ProbeTestCase1::TraceSink, this));
diff -Naur ns-3.22/src/tap-bridge/bindings/modulegen__gcc_ILP32.py ns-3.23/src/tap-bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -880,11 +880,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/tap-bridge/bindings/modulegen__gcc_LP64.py ns-3.23/src/tap-bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -880,11 +880,21 @@
     cls.add_constructor([param('uint64_t', 'bps')])
     ## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate) [constructor]
     cls.add_constructor([param('std::string', 'rate')])
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTxTime(uint32_t bits) const [member function]
+    cls.add_method('CalculateBitsTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bits')], 
+                   is_const=True)
+    ## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesTxTime(uint32_t bytes) const [member function]
+    cls.add_method('CalculateBytesTxTime', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'bytes')], 
+                   is_const=True)
     ## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(uint32_t bytes) const [member function]
     cls.add_method('CalculateTxTime', 
                    'double', 
                    [param('uint32_t', 'bytes')], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() const [member function]
     cls.add_method('GetBitRate', 
                    'uint64_t', 
diff -Naur ns-3.22/src/tap-bridge/model/tap-bridge.cc ns-3.23/src/tap-bridge/model/tap-bridge.cc
--- ns-3.22/src/tap-bridge/model/tap-bridge.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/tap-bridge/model/tap-bridge.cc	2015-05-13 11:05:27.000000000 -0700
@@ -80,6 +80,7 @@
 {
   static TypeId tid = TypeId ("ns3::TapBridge")
     .SetParent<NetDevice> ()
+    .SetGroupName ("TapBridge")
     .AddConstructor<TapBridge> ()
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (0),
diff -Naur ns-3.22/src/test/ns3tcp/ns3tcp-state-test-suite.cc ns-3.23/src/test/ns3tcp/ns3tcp-state-test-suite.cc
--- ns-3.22/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 #include "ns3/error-model.h"
 #include "ns3/pointer.h"
 #include "ns3tcp-socket-writer.h"
+#include "ns3/tcp-header.h"
 
 using namespace ns3;
 
@@ -149,6 +150,13 @@
   Ipv4Header ipHeader;
   p->RemoveHeader (ipHeader);
 
+  if (g_log.IsEnabled (ns3::LOG_DEBUG))
+    {
+      TcpHeader th;
+      p->PeekHeader (th);
+      std::clog << Simulator::Now ().GetSeconds () << " TCP header " << th << std::endl;
+    }
+
   //
   // What is left is the TCP header and any data that may be sent.  We aren't
   // sending any TCP data, so we expect what remains is only TCP header, which
diff -Naur ns-3.22/src/topology-read/model/inet-topology-reader.cc ns-3.23/src/topology-read/model/inet-topology-reader.cc
--- ns-3.22/src/topology-read/model/inet-topology-reader.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/topology-read/model/inet-topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::InetTopologyReader")
     .SetParent<Object> ()
+    .SetGroupName ("TopologyReader")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/topology-read/model/orbis-topology-reader.cc ns-3.23/src/topology-read/model/orbis-topology-reader.cc
--- ns-3.22/src/topology-read/model/orbis-topology-reader.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/topology-read/model/orbis-topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::OrbisTopologyReader")
     .SetParent<Object> ()
+    .SetGroupName ("TopologyReader")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/topology-read/model/rocketfuel-topology-reader.cc ns-3.23/src/topology-read/model/rocketfuel-topology-reader.cc
--- ns-3.22/src/topology-read/model/rocketfuel-topology-reader.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/topology-read/model/rocketfuel-topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,6 +38,7 @@
 {
   static TypeId tid = TypeId ("ns3::RocketfuelTopologyReader")
     .SetParent<Object> ()
+    .SetGroupName ("TopologyReader")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/topology-read/model/topology-reader.cc ns-3.23/src/topology-read/model/topology-reader.cc
--- ns-3.22/src/topology-read/model/topology-reader.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/topology-read/model/topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::TopologyReader")
     .SetParent<Object> ()
+    .SetGroupName ("TopologyReader")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/uan/model/uan-channel.cc ns-3.23/src/uan/model/uan-channel.cc
--- ns-3.22/src/uan/model/uan-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanChannel")
     .SetParent<Channel> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanChannel> ()
     .AddAttribute ("PropagationModel",
                    "A pointer to the propagation model.",
diff -Naur ns-3.22/src/uan/model/uan-header-common.cc ns-3.23/src/uan/model/uan-header-common.cc
--- ns-3.22/src/uan/model/uan-header-common.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-header-common.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanHeaderCommon")
     .SetParent<Header> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanHeaderCommon> ()
   ;
   return tid;
diff -Naur ns-3.22/src/uan/model/uan-header-rc.cc ns-3.23/src/uan/model/uan-header-rc.cc
--- ns-3.22/src/uan/model/uan-header-rc.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-header-rc.cc	2015-05-13 11:05:27.000000000 -0700
@@ -55,6 +55,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanHeaderRcData")
     .SetParent<Header> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanHeaderRcData> ()
   ;
   return tid;
@@ -152,6 +153,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanHeaderRcRts")
     .SetParent<Header> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanHeaderRcRts> ()
   ;
   return tid;
@@ -289,6 +291,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanHeaderRcCtsGlobal")
     .SetParent<Header> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanHeaderRcCtsGlobal> ()
   ;
   return tid;
@@ -414,6 +417,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanHeaderRcCts")
     .SetParent<Header> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanHeaderRcCts> ()
   ;
   return tid;
@@ -537,6 +541,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanHeaderRcAck")
     .SetParent<Header> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanHeaderRcAck> ()
   ;
   return tid;
diff -Naur ns-3.22/src/uan/model/uan-mac-aloha.cc ns-3.23/src/uan/model/uan-mac-aloha.cc
--- ns-3.22/src/uan/model/uan-mac-aloha.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-mac-aloha.cc	2015-05-13 11:05:27.000000000 -0700
@@ -71,6 +71,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanMacAloha")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanMacAloha> ()
   ;
   return tid;
diff -Naur ns-3.22/src/uan/model/uan-mac.cc ns-3.23/src/uan/model/uan-mac.cc
--- ns-3.22/src/uan/model/uan-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,7 +27,9 @@
 TypeId UanMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanMac")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Uan")
+  ;
   return tid;
 }
 
diff -Naur ns-3.22/src/uan/model/uan-mac-cw.cc ns-3.23/src/uan/model/uan-mac-cw.cc
--- ns-3.22/src/uan/model/uan-mac-cw.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-mac-cw.cc	2015-05-13 11:05:27.000000000 -0700
@@ -78,6 +78,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanMacCw")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanMacCw> ()
     .AddAttribute ("CW",
                    "The MAC parameter CW.",
diff -Naur ns-3.22/src/uan/model/uan-mac-rc.cc ns-3.23/src/uan/model/uan-mac-rc.cc
--- ns-3.22/src/uan/model/uan-mac-rc.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-mac-rc.cc	2015-05-13 11:05:27.000000000 -0700
@@ -209,6 +209,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanMacRc")
     .SetParent<UanMac> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanMacRc> ()
     .AddAttribute ("RetryRate",
                    "Number of retry attempts per second (of RTS/GWPING).",
diff -Naur ns-3.22/src/uan/model/uan-mac-rc-gw.cc ns-3.23/src/uan/model/uan-mac-rc-gw.cc
--- ns-3.22/src/uan/model/uan-mac-rc-gw.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-mac-rc-gw.cc	2015-05-13 11:05:27.000000000 -0700
@@ -104,6 +104,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanMacRcGw")
     .SetParent<UanMac> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanMacRcGw> ()
     .AddAttribute ("MaxReservations",
                    "Maximum number of reservations to accept per cycle.",
diff -Naur ns-3.22/src/uan/model/uan-net-device.cc ns-3.23/src/uan/model/uan-net-device.cc
--- ns-3.22/src/uan/model/uan-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -88,10 +88,9 @@
 TypeId
 UanNetDevice::GetTypeId ()
 {
-
-
   static TypeId tid = TypeId ("ns3::UanNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Uan")
     .AddAttribute ("Channel", "The channel attached to this device.",
                    PointerValue (),
                    MakePointerAccessor (&UanNetDevice::DoGetChannel, &UanNetDevice::SetChannel),
diff -Naur ns-3.22/src/uan/model/uan-noise-model.cc ns-3.23/src/uan/model/uan-noise-model.cc
--- ns-3.22/src/uan/model/uan-noise-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-noise-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,7 +27,9 @@
 TypeId UanNoiseModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanNoiseModel")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Uan")
+  ;
   return tid;
 }
 
diff -Naur ns-3.22/src/uan/model/uan-noise-model-default.cc ns-3.23/src/uan/model/uan-noise-model-default.cc
--- ns-3.22/src/uan/model/uan-noise-model-default.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-noise-model-default.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanNoiseModelDefault")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanNoiseModelDefault> ()
     .AddAttribute ("Wind", "Wind speed in m/s.",
                    DoubleValue (1),
diff -Naur ns-3.22/src/uan/model/uan-phy.cc ns-3.23/src/uan/model/uan-phy.cc
--- ns-3.22/src/uan/model/uan-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-phy.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,7 +27,9 @@
 TypeId UanPhyCalcSinr::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinr")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Uan")
+  ;
   return tid;
 }
 
@@ -48,7 +50,9 @@
 TypeId UanPhyPer::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyPer")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Uan")
+  ;
   return tid;
 }
 
@@ -70,6 +74,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhy")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddTraceSource ("PhyTxBegin",
                      "Trace source indicating a packet has "
                      "begun transmitting over the channel medium.",
diff -Naur ns-3.22/src/uan/model/uan-phy-dual.cc ns-3.23/src/uan/model/uan-phy-dual.cc
--- ns-3.22/src/uan/model/uan-phy-dual.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-phy-dual.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDual")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyCalcSinrDual> ()
   ;
   return tid;
@@ -159,6 +160,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhyDual")
     .SetParent<UanPhy> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyDual> ()
     .AddAttribute  ("CcaThresholdPhy1",
                     "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1.",
diff -Naur ns-3.22/src/uan/model/uan-phy-gen.cc ns-3.23/src/uan/model/uan-phy-gen.cc
--- ns-3.22/src/uan/model/uan-phy-gen.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-phy-gen.cc	2015-05-13 11:05:27.000000000 -0700
@@ -63,6 +63,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDefault")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyCalcSinrDefault> ()
   ;
   return tid;
@@ -110,6 +111,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinrFhFsk")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyCalcSinrFhFsk> ()
     .AddAttribute ("NumberOfHops",
                    "Number of frequencies in hopping pattern.",
@@ -216,6 +218,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhyPerGenDefault")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyPerGenDefault> ()
     .AddAttribute ("Threshold", "SINR cutoff for good packet reception.",
                    DoubleValue (8),
@@ -254,6 +257,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPhyPerUmodem")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyPerUmodem> ()
   ;
   return tid;
@@ -431,6 +435,7 @@
 
   static TypeId tid = TypeId ("ns3::UanPhyGen")
     .SetParent<UanPhy> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPhyGen> ()
     .AddAttribute ("CcaThreshold",
                    "Aggregate energy of incoming signals to move to CCA Busy state dB.",
diff -Naur ns-3.22/src/uan/model/uan-prop-model.cc ns-3.23/src/uan/model/uan-prop-model.cc
--- ns-3.22/src/uan/model/uan-prop-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-prop-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -341,7 +341,9 @@
 TypeId UanPropModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPropModel")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Uan")
+  ;
   return tid;
 }
 
diff -Naur ns-3.22/src/uan/model/uan-prop-model-ideal.cc ns-3.23/src/uan/model/uan-prop-model-ideal.cc
--- ns-3.22/src/uan/model/uan-prop-model-ideal.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-prop-model-ideal.cc	2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPropModelIdeal")
     .SetParent<UanPropModel> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPropModelIdeal> ()
   ;
   return tid;
diff -Naur ns-3.22/src/uan/model/uan-prop-model-thorp.cc ns-3.23/src/uan/model/uan-prop-model-thorp.cc
--- ns-3.22/src/uan/model/uan-prop-model-thorp.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-prop-model-thorp.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanPropModelThorp")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanPropModelThorp> ()
     .AddAttribute ("SpreadCoef",
                    "Spreading coefficient used in calculation of Thorp's approximation.",
diff -Naur ns-3.22/src/uan/model/uan-transducer.cc ns-3.23/src/uan/model/uan-transducer.cc
--- ns-3.22/src/uan/model/uan-transducer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-transducer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,7 +27,9 @@
 TypeId UanTransducer::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanTransducer")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName ("Uan")
+  ;
   return tid;
 }
 
diff -Naur ns-3.22/src/uan/model/uan-transducer-hd.cc ns-3.23/src/uan/model/uan-transducer-hd.cc
--- ns-3.22/src/uan/model/uan-transducer-hd.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/uan/model/uan-transducer-hd.cc	2015-05-13 11:05:27.000000000 -0700
@@ -89,6 +89,7 @@
 {
   static TypeId tid = TypeId ("ns3::UanTransducerHd")
     .SetParent<Object> ()
+    .SetGroupName ("Uan")
     .AddConstructor<UanTransducerHd> ()
   ;
   return tid;
diff -Naur ns-3.22/src/virtual-net-device/model/virtual-net-device.cc ns-3.23/src/virtual-net-device/model/virtual-net-device.cc
--- ns-3.22/src/virtual-net-device/model/virtual-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/virtual-net-device/model/virtual-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::VirtualNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("VirtualNetDevice")
     .AddConstructor<VirtualNetDevice> ()
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (1500),
diff -Naur ns-3.22/src/visualizer/model/pyviz.cc ns-3.23/src/visualizer/model/pyviz.cc
--- ns-3.22/src/visualizer/model/pyviz.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/visualizer/model/pyviz.cc	2015-05-13 11:05:27.000000000 -0700
@@ -85,6 +85,7 @@
 {
   static TypeId tid = TypeId ("ns3::PyVizPacketTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Visualizer")
     .AddConstructor<PyVizPacketTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/visualizer/model/visual-simulator-impl.cc ns-3.23/src/visualizer/model/visual-simulator-impl.cc
--- ns-3.22/src/visualizer/model/visual-simulator-impl.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/visualizer/model/visual-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::VisualSimulatorImpl")
     .SetParent<SimulatorImpl> ()
+    .SetGroupName ("Visualizer")
     .AddConstructor<VisualSimulatorImpl> ()
     .AddAttribute ("SimulatorImplFactory",
                    "Factory for the underlying simulator implementation used by the visualizer.",
diff -Naur ns-3.22/src/wave/bindings/modulegen__gcc_ILP32.py ns-3.23/src/wave/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/wave/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -128,8 +128,8 @@
     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'])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener [class]
-    module.add_class('MacLowBlockAckEventListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener [class]
+    module.add_class('MacLowAggregationCapableTransmissionListener', allow_subclassing=True, import_from_module='ns.wifi')
     ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener [class]
     module.add_class('MacLowDcfListener', allow_subclassing=True, import_from_module='ns.wifi')
     ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener [class]
@@ -375,17 +375,13 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
-    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
-    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
-    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
-    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
-    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PROTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActionValue [enumeration]
+    module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValue [enumeration]
+    module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFIRMATION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [enumeration]
+    module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION', 'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
     module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
@@ -416,6 +412,8 @@
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader [class]
     module.add_class('AmpduSubframeHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader [class]
+    module.add_class('AmsduSubframeHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## application.h (module 'network'): ns3::Application [class]
     module.add_class('Application', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
@@ -526,6 +524,8 @@
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator [class]
     module.add_class('MpduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
+    module.add_class('MsduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## 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]
@@ -612,6 +612,7 @@
     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')
@@ -743,7 +744,7 @@
     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_Ns3MacLowBlockAckEventListener_methods(root_module, root_module['ns3::MacLowBlockAckEventListener'])
+    register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, root_module['ns3::MacLowAggregationCapableTransmissionListener'])
     register_Ns3MacLowDcfListener_methods(root_module, root_module['ns3::MacLowDcfListener'])
     register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
     register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
@@ -861,6 +862,7 @@
     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'])
+    register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
     register_Ns3Application_methods(root_module, root_module['ns3::Application'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
@@ -914,6 +916,7 @@
     register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3MpduAggregator_methods(root_module, root_module['ns3::MpduAggregator'])
+    register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
     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'])
@@ -2984,67 +2987,82 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowBlockAckEventListener_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener(ns3::MacLowBlockAckEventListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MacLowBlockAckEventListener const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener() [constructor]
+def register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener(ns3::MacLowAggregationCapableTransmissionListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowAggregationCapableTransmissionListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener() [constructor]
     cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('BlockAckInactivityTimeout', 
                    'void', 
                    [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader', 'hdr'), param('ns3::Time', 'tstamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('CompleteTransfer', 
                    'void', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLowBlockAckEventListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowAggregationCapableTransmissionListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('GetBlockAckAgreementExists', 
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetDestAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLowAggregationCapableTransmissionListener::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('GetNOutstandingPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetNRetryNeededPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('GetNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowBlockAckEventListener::GetQueue() [member function]
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowAggregationCapableTransmissionListener::GetQueue() [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::WifiMacQueue >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowBlockAckEventListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetSrcAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
     cls.add_method('PeekNextPacketInBaQueue', 
                    'ns3::Ptr< ns3::Packet const >', 
                    [param('ns3::WifiMacHeader &', 'header'), param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::Time *', 'timestamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('PeekNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
     cls.add_method('RemoveFromBaQueue', 
                    'void', 
                    [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'seqnumber')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::SetAmpdu(bool ampdu) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::SetAmpdu(bool ampdu) [member function]
     cls.add_method('SetAmpdu', 
                    'void', 
                    [param('bool', 'ampdu')], 
@@ -7797,16 +7815,12 @@
     cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
     cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
-    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
-    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
-    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
-    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
-    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshAction [variable]
+    cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multihopAction [variable]
+    cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::MultihopActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfProtectedAction [variable]
+    cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
 def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -8625,6 +8639,10 @@
                    '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', 
@@ -9098,10 +9116,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -9275,10 +9293,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -9963,6 +9981,70 @@
                    [])
     return
 
+def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
+    cls.add_constructor([])
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
+    cls.add_method('GetDestinationAddr', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
+    cls.add_method('GetSourceAddr', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetDestinationAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t arg0) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'arg0')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetSourceAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    return
+
 def register_Ns3Application_methods(root_module, cls):
     ## application.h (module 'network'): ns3::Application::Application(ns3::Application const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Application const &', 'arg0')])
@@ -12852,10 +12934,10 @@
     cls.add_method('CreateBlockAckAgreement', 
                    'void', 
                    [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('DeaggregateAmpduAndReceive', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('DestroyBlockAckAgreement', 
                    'void', 
@@ -12941,14 +13023,14 @@
     cls.add_method('ReceiveError', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'rxSnr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
     cls.add_method('ReceiveOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowBlockAckEventListener * listener) [member function]
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowAggregationCapableTransmissionListener * listener) [member function]
     cls.add_method('RegisterBlockAckListenerForAc', 
                    'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowBlockAckEventListener *', 'listener')])
+                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowAggregationCapableTransmissionListener *', 'listener')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterDcfListener(ns3::MacLowDcfListener * listener) [member function]
     cls.add_method('RegisterDcfListener', 
                    'void', 
@@ -13026,8 +13108,8 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
-    cls.add_method('StopAggregation', 
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopMpduAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
+    cls.add_method('StopMpduAggregation', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'peekedPacket'), param('ns3::WifiMacHeader', 'peekedHdr'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('uint16_t', 'size')], 
                    is_const=True)
@@ -13149,6 +13231,28 @@
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    return
+
+def register_Ns3MsduAggregator_methods(root_module, cls):
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
+    cls.add_constructor([])
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
+    ## msdu-aggregator.h (module 'wifi'): bool ns3::MsduAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket, ns3::Mac48Address src, ns3::Mac48Address dest) [member function]
+    cls.add_method('Aggregate', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('ns3::Mac48Address', 'src'), param('ns3::Mac48Address', 'dest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## msdu-aggregator.h (module 'wifi'): static std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::AmsduSubframeHeader>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::AmsduSubframeHeader> > > ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('Deaggregate', 
+                   'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader > >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
                    is_static=True)
     return
 
diff -Naur ns-3.22/src/wave/bindings/modulegen__gcc_LP64.py ns-3.23/src/wave/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/wave/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -128,8 +128,8 @@
     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'])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener [class]
-    module.add_class('MacLowBlockAckEventListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener [class]
+    module.add_class('MacLowAggregationCapableTransmissionListener', allow_subclassing=True, import_from_module='ns.wifi')
     ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener [class]
     module.add_class('MacLowDcfListener', allow_subclassing=True, import_from_module='ns.wifi')
     ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener [class]
@@ -375,17 +375,13 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
-    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
-    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
-    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
-    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
-    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PROTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActionValue [enumeration]
+    module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValue [enumeration]
+    module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFIRMATION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [enumeration]
+    module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION', 'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
     module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
@@ -416,6 +412,8 @@
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader [class]
     module.add_class('AmpduSubframeHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader [class]
+    module.add_class('AmsduSubframeHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## application.h (module 'network'): ns3::Application [class]
     module.add_class('Application', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
@@ -526,6 +524,8 @@
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator [class]
     module.add_class('MpduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
+    module.add_class('MsduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## 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]
@@ -612,6 +612,7 @@
     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')
@@ -743,7 +744,7 @@
     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_Ns3MacLowBlockAckEventListener_methods(root_module, root_module['ns3::MacLowBlockAckEventListener'])
+    register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, root_module['ns3::MacLowAggregationCapableTransmissionListener'])
     register_Ns3MacLowDcfListener_methods(root_module, root_module['ns3::MacLowDcfListener'])
     register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
     register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
@@ -861,6 +862,7 @@
     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'])
+    register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
     register_Ns3Application_methods(root_module, root_module['ns3::Application'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
@@ -914,6 +916,7 @@
     register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3MpduAggregator_methods(root_module, root_module['ns3::MpduAggregator'])
+    register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
     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'])
@@ -2984,67 +2987,82 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowBlockAckEventListener_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener(ns3::MacLowBlockAckEventListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MacLowBlockAckEventListener const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener() [constructor]
+def register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener(ns3::MacLowAggregationCapableTransmissionListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowAggregationCapableTransmissionListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener() [constructor]
     cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('BlockAckInactivityTimeout', 
                    'void', 
                    [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader', 'hdr'), param('ns3::Time', 'tstamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('CompleteTransfer', 
                    'void', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLowBlockAckEventListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowAggregationCapableTransmissionListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('GetBlockAckAgreementExists', 
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetDestAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLowAggregationCapableTransmissionListener::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('GetNOutstandingPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetNRetryNeededPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('GetNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowBlockAckEventListener::GetQueue() [member function]
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowAggregationCapableTransmissionListener::GetQueue() [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::WifiMacQueue >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowBlockAckEventListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetSrcAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
     cls.add_method('PeekNextPacketInBaQueue', 
                    'ns3::Ptr< ns3::Packet const >', 
                    [param('ns3::WifiMacHeader &', 'header'), param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::Time *', 'timestamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('PeekNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
     cls.add_method('RemoveFromBaQueue', 
                    'void', 
                    [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'seqnumber')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::SetAmpdu(bool ampdu) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::SetAmpdu(bool ampdu) [member function]
     cls.add_method('SetAmpdu', 
                    'void', 
                    [param('bool', 'ampdu')], 
@@ -7797,16 +7815,12 @@
     cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
     cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
-    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
-    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
-    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
-    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
-    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshAction [variable]
+    cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multihopAction [variable]
+    cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::MultihopActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfProtectedAction [variable]
+    cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
 def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -8625,6 +8639,10 @@
                    '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', 
@@ -9098,10 +9116,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -9275,10 +9293,10 @@
                    '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::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -9963,6 +9981,70 @@
                    [])
     return
 
+def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
+    cls.add_constructor([])
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
+    cls.add_method('GetDestinationAddr', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
+    cls.add_method('GetSourceAddr', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetDestinationAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t arg0) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'arg0')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetSourceAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    return
+
 def register_Ns3Application_methods(root_module, cls):
     ## application.h (module 'network'): ns3::Application::Application(ns3::Application const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Application const &', 'arg0')])
@@ -12852,10 +12934,10 @@
     cls.add_method('CreateBlockAckAgreement', 
                    'void', 
                    [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('DeaggregateAmpduAndReceive', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('DestroyBlockAckAgreement', 
                    'void', 
@@ -12941,14 +13023,14 @@
     cls.add_method('ReceiveError', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'rxSnr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
     cls.add_method('ReceiveOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowBlockAckEventListener * listener) [member function]
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowAggregationCapableTransmissionListener * listener) [member function]
     cls.add_method('RegisterBlockAckListenerForAc', 
                    'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowBlockAckEventListener *', 'listener')])
+                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowAggregationCapableTransmissionListener *', 'listener')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterDcfListener(ns3::MacLowDcfListener * listener) [member function]
     cls.add_method('RegisterDcfListener', 
                    'void', 
@@ -13026,8 +13108,8 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
-    cls.add_method('StopAggregation', 
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopMpduAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
+    cls.add_method('StopMpduAggregation', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'peekedPacket'), param('ns3::WifiMacHeader', 'peekedHdr'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('uint16_t', 'size')], 
                    is_const=True)
@@ -13149,6 +13231,28 @@
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    return
+
+def register_Ns3MsduAggregator_methods(root_module, cls):
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
+    cls.add_constructor([])
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
+    ## msdu-aggregator.h (module 'wifi'): bool ns3::MsduAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket, ns3::Mac48Address src, ns3::Mac48Address dest) [member function]
+    cls.add_method('Aggregate', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('ns3::Mac48Address', 'src'), param('ns3::Mac48Address', 'dest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## msdu-aggregator.h (module 'wifi'): static std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::AmsduSubframeHeader>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::AmsduSubframeHeader> > > ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('Deaggregate', 
+                   'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader > >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
                    is_static=True)
     return
 
diff -Naur ns-3.22/src/wave/examples/vanet-routing-compare.cc ns-3.23/src/wave/examples/vanet-routing-compare.cc
--- ns-3.22/src/wave/examples/vanet-routing-compare.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/examples/vanet-routing-compare.cc	2015-05-13 11:05:27.000000000 -0700
@@ -261,7 +261,11 @@
   : m_RxBytes (0),
     m_cumulativeRxBytes (0),
     m_RxPkts (0),
-    m_cumulativeRxPkts (0)
+    m_cumulativeRxPkts (0),
+    m_TxBytes (0),
+    m_cumulativeTxBytes (0),
+    m_TxPkts (0),
+    m_cumulativeTxPkts (0)
 {
 }
 
@@ -562,6 +566,9 @@
 
   switch (m_protocol)
     {
+    case 0:
+      m_protocolName = "NONE";
+      break;
     case 1:
       if (m_routingTables != 0)
         {
@@ -570,21 +577,13 @@
       list.Add (olsr, 100);
       m_protocolName = "OLSR";
       break;
-    case 0:
     case 2:
       if (m_routingTables != 0)
         {
           aodv.PrintRoutingTableAllAt (rtt, rtw);
         }
       list.Add (aodv, 100);
-      if (m_protocol == 0)
-        {
-          m_protocolName = "NONE";
-        }
-      else
-        {
-          m_protocolName = "AODV";
-        }
+      m_protocolName = "AODV";
       break;
     case 3:
       if (m_routingTables != 0)
@@ -595,10 +594,12 @@
       m_protocolName = "DSDV";
       break;
     case 4:
+      // setup is later
       m_protocolName = "DSR";
       break;
     default:
       NS_FATAL_ERROR ("No such protocol:" << m_protocol);
+      break;
     }
 
   if (m_protocol < 4)
diff -Naur ns-3.22/src/wave/helper/wave-helper.cc ns-3.23/src/wave/helper/wave-helper.cc
--- ns-3.22/src/wave/helper/wave-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/helper/wave-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,6 +27,7 @@
 #include "ns3/wave-net-device.h"
 #include "ns3/minstrel-wifi-manager.h"
 #include "ns3/radiotap-header.h"
+#include "ns3/unused.h"
 #include "wave-mac-helper.h"
 #include "wave-helper.h"
 
@@ -484,12 +485,7 @@
   try
     {
       const QosWaveMacHelper& qosMac = dynamic_cast<const QosWaveMacHelper&> (macHelper);
-      // below check will never fail, just used for survive from
-      // gcc warn "-Wunused-but-set-variable"
-      if (&qosMac == 0)
-        {
-          NS_FATAL_ERROR ("it could never get here");
-        }
+      NS_UNUSED (qosMac);
     }
   catch (const std::bad_cast &)
     {
diff -Naur ns-3.22/src/wave/model/bsm-application.cc ns-3.23/src/wave/model/bsm-application.cc
--- ns-3.22/src/wave/model/bsm-application.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/bsm-application.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::BsmApplication")
     .SetParent<Application> ()
+    .SetGroupName ("Wave")
     .AddConstructor<BsmApplication> ()
     ;
   return tid;
diff -Naur ns-3.22/src/wave/model/channel-coordinator.cc ns-3.23/src/wave/model/channel-coordinator.cc
--- ns-3.22/src/wave/model/channel-coordinator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/channel-coordinator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,6 +40,7 @@
 {
   static TypeId tid = TypeId ("ns3::ChannelCoordinator")
     .SetParent<Object> ()
+    .SetGroupName ("Wave")
     .AddConstructor<ChannelCoordinator> ()
     .AddAttribute ("CchInterval", "CCH Interval, default value is 50ms.",
                    TimeValue (GetDefaultCchInterval ()),
diff -Naur ns-3.22/src/wave/model/channel-manager.cc ns-3.23/src/wave/model/channel-manager.cc
--- ns-3.22/src/wave/model/channel-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/channel-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::ChannelManager")
     .SetParent<Object> ()
+    .SetGroupName ("Wave")
     .AddConstructor<ChannelManager> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wave/model/channel-scheduler.cc ns-3.23/src/wave/model/channel-scheduler.cc
--- ns-3.22/src/wave/model/channel-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/channel-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::ChannelScheduler")
     .SetParent<Object> ()
+    .SetGroupName ("Wave")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/wave/model/default-channel-scheduler.cc ns-3.23/src/wave/model/default-channel-scheduler.cc
--- ns-3.22/src/wave/model/default-channel-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/default-channel-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -56,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::DefaultChannelScheduler")
     .SetParent<ChannelScheduler> ()
+    .SetGroupName ("Wave")
     .AddConstructor<DefaultChannelScheduler> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wave/model/higher-tx-tag.cc ns-3.23/src/wave/model/higher-tx-tag.cc
--- ns-3.22/src/wave/model/higher-tx-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/higher-tx-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::HigherLayerTxVectorTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wave")
     .AddConstructor<HigherLayerTxVectorTag> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wave/model/ocb-wifi-mac.cc ns-3.23/src/wave/model/ocb-wifi-mac.cc
--- ns-3.22/src/wave/model/ocb-wifi-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/ocb-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::OcbWifiMac")
     .SetParent<RegularWifiMac> ()
+    .SetGroupName ("Wave")
     .AddConstructor<OcbWifiMac> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wave/model/vendor-specific-action.cc ns-3.23/src/wave/model/vendor-specific-action.cc
--- ns-3.22/src/wave/model/vendor-specific-action.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/vendor-specific-action.cc	2015-05-13 11:05:27.000000000 -0700
@@ -247,6 +247,7 @@
 {
   static TypeId tid = TypeId ("ns3::VendorSpecificActionHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wave")
     .AddConstructor<VendorSpecificActionHeader> ()
   ;
 
diff -Naur ns-3.22/src/wave/model/vsa-manager.cc ns-3.23/src/wave/model/vsa-manager.cc
--- ns-3.22/src/wave/model/vsa-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/vsa-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::VsaManager")
     .SetParent<Object> ()
+    .SetGroupName ("Wave")
     .AddConstructor<VsaManager> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wave/model/wave-mac-low.cc ns-3.23/src/wave/model/wave-mac-low.cc
--- ns-3.22/src/wave/model/wave-mac-low.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/wave-mac-low.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::WaveMacLow")
     .SetParent<MacLow> ()
+    .SetGroupName ("Wave")
     .AddConstructor<WaveMacLow> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wave/model/wave-net-device.cc ns-3.23/src/wave/model/wave-net-device.cc
--- ns-3.22/src/wave/model/wave-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wave/model/wave-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::WaveNetDevice")
     .SetParent<NetDevice> ()
+    .SetGroupName ("Wave")
     .AddConstructor<WaveNetDevice> ()
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (MAX_MSDU_SIZE - LLC_SNAP_HEADER_LENGTH),
diff -Naur ns-3.22/src/wifi/bindings/callbacks_list.py ns-3.23/src/wifi/bindings/callbacks_list.py
--- ns-3.22/src/wifi/bindings/callbacks_list.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/bindings/callbacks_list.py	2015-05-13 11:05:27.000000000 -0700
@@ -1,7 +1,7 @@
 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', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', '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'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::WifiMacHeader const*', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur ns-3.22/src/wifi/bindings/modulegen__gcc_ILP32.py ns-3.23/src/wifi/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/wifi/bindings/modulegen__gcc_ILP32.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
@@ -112,8 +112,8 @@
     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'])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener [class]
-    module.add_class('MacLowBlockAckEventListener', allow_subclassing=True)
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener [class]
+    module.add_class('MacLowAggregationCapableTransmissionListener', allow_subclassing=True)
     ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener [class]
     module.add_class('MacLowDcfListener', allow_subclassing=True)
     ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener [class]
@@ -319,17 +319,13 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
-    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
-    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
-    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
-    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
-    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'])
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PROTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActionValue [enumeration]
+    module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=root_module['ns3::WifiActionHeader'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValue [enumeration]
+    module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFIRMATION'], outer_class=root_module['ns3::WifiActionHeader'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [enumeration]
+    module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION', 'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
     module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
@@ -706,7 +702,7 @@
     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_Ns3MacLowBlockAckEventListener_methods(root_module, root_module['ns3::MacLowBlockAckEventListener'])
+    register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, root_module['ns3::MacLowAggregationCapableTransmissionListener'])
     register_Ns3MacLowDcfListener_methods(root_module, root_module['ns3::MacLowDcfListener'])
     register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
     register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
@@ -2181,12 +2177,16 @@
     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::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower, ns3::WifiTxVector txvector) [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::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower'), param('ns3::WifiTxVector', 'txvector')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
-    cls.add_method('CalculateSnrPer', 
+                   [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]
@@ -2736,67 +2736,82 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowBlockAckEventListener_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener(ns3::MacLowBlockAckEventListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MacLowBlockAckEventListener const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener() [constructor]
+def register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener(ns3::MacLowAggregationCapableTransmissionListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowAggregationCapableTransmissionListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener() [constructor]
     cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('BlockAckInactivityTimeout', 
                    'void', 
                    [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader', 'hdr'), param('ns3::Time', 'tstamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('CompleteTransfer', 
                    'void', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLowBlockAckEventListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowAggregationCapableTransmissionListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('GetBlockAckAgreementExists', 
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetDestAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLowAggregationCapableTransmissionListener::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('GetNOutstandingPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetNRetryNeededPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('GetNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowBlockAckEventListener::GetQueue() [member function]
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowAggregationCapableTransmissionListener::GetQueue() [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::WifiMacQueue >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowBlockAckEventListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetSrcAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
     cls.add_method('PeekNextPacketInBaQueue', 
                    'ns3::Ptr< ns3::Packet const >', 
                    [param('ns3::WifiMacHeader &', 'header'), param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::Time *', 'timestamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('PeekNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
     cls.add_method('RemoveFromBaQueue', 
                    'void', 
                    [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'seqnumber')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::SetAmpdu(bool ampdu) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::SetAmpdu(bool ampdu) [member function]
     cls.add_method('SetAmpdu', 
                    'void', 
                    [param('bool', 'ampdu')], 
@@ -6398,16 +6413,12 @@
     cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
     cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
-    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
-    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
-    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
-    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
-    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshAction [variable]
+    cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multihopAction [variable]
+    cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::MultihopActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfProtectedAction [variable]
+    cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
 def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -7332,6 +7343,10 @@
                    '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', 
@@ -7805,10 +7820,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -7982,10 +7997,10 @@
                    '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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -8072,18 +8087,18 @@
     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')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::Packet const> packet, double snr) [member function]
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::Packet> packet, double snr, ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::Packet> packet, double snr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'snr'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
     cls.add_method('SwitchFromSleep', 
                    'void', 
@@ -8947,10 +8962,10 @@
                    '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_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## 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::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -8982,9 +8997,13 @@
     cls.add_method('SetTxPowerStart', 
                    'void', 
                    [param('double', 'start')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time rxDuration) [member function]
+    ## 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]
     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', 
+                   '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')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
     cls.add_method('UnregisterListener', 
@@ -11677,10 +11696,10 @@
     cls.add_method('CreateBlockAckAgreement', 
                    'void', 
                    [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('DeaggregateAmpduAndReceive', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('DestroyBlockAckAgreement', 
                    'void', 
@@ -11766,14 +11785,14 @@
     cls.add_method('ReceiveError', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'rxSnr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
     cls.add_method('ReceiveOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowBlockAckEventListener * listener) [member function]
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowAggregationCapableTransmissionListener * listener) [member function]
     cls.add_method('RegisterBlockAckListenerForAc', 
                    'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowBlockAckEventListener *', 'listener')])
+                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowAggregationCapableTransmissionListener *', 'listener')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterDcfListener(ns3::MacLowDcfListener * listener) [member function]
     cls.add_method('RegisterDcfListener', 
                    'void', 
@@ -11851,8 +11870,8 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
-    cls.add_method('StopAggregation', 
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopMpduAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
+    cls.add_method('StopMpduAggregation', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'peekedPacket'), param('ns3::WifiMacHeader', 'peekedHdr'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('uint16_t', 'size')], 
                    is_const=True)
diff -Naur ns-3.22/src/wifi/bindings/modulegen__gcc_LP64.py ns-3.23/src/wifi/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/wifi/bindings/modulegen__gcc_LP64.py	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
@@ -112,8 +112,8 @@
     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'])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener [class]
-    module.add_class('MacLowBlockAckEventListener', allow_subclassing=True)
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener [class]
+    module.add_class('MacLowAggregationCapableTransmissionListener', allow_subclassing=True)
     ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener [class]
     module.add_class('MacLowDcfListener', allow_subclassing=True)
     ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener [class]
@@ -319,17 +319,13 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
-    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
-    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
-    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
-    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'])
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
-    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'])
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PROTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActionValue [enumeration]
+    module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=root_module['ns3::WifiActionHeader'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValue [enumeration]
+    module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFIRMATION'], outer_class=root_module['ns3::WifiActionHeader'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [enumeration]
+    module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION', 'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
     module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
@@ -706,7 +702,7 @@
     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_Ns3MacLowBlockAckEventListener_methods(root_module, root_module['ns3::MacLowBlockAckEventListener'])
+    register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, root_module['ns3::MacLowAggregationCapableTransmissionListener'])
     register_Ns3MacLowDcfListener_methods(root_module, root_module['ns3::MacLowDcfListener'])
     register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
     register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
@@ -2181,12 +2177,16 @@
     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::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower, ns3::WifiTxVector txvector) [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::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower'), param('ns3::WifiTxVector', 'txvector')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
-    cls.add_method('CalculateSnrPer', 
+                   [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]
@@ -2736,67 +2736,82 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowBlockAckEventListener_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener(ns3::MacLowBlockAckEventListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::MacLowBlockAckEventListener const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener() [constructor]
+def register_Ns3MacLowAggregationCapableTransmissionListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener(ns3::MacLowAggregationCapableTransmissionListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowAggregationCapableTransmissionListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener() [constructor]
     cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('BlockAckInactivityTimeout', 
                    'void', 
                    [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteMpduTx(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader hdr, ns3::Time tstamp) [member function]
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader', 'hdr'), param('ns3::Time', 'tstamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::CompleteTransfer(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('CompleteTransfer', 
                    'void', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLowBlockAckEventListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowAggregationCapableTransmissionListener::GetBlockAckAgreementExists(ns3::Mac48Address address, uint8_t tid) [member function]
     cls.add_method('GetBlockAckAgreementExists', 
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetDestAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLowAggregationCapableTransmissionListener::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('GetNOutstandingPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowBlockAckEventListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetNRetryNeededPackets', 
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('GetNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowBlockAckEventListener::GetQueue() [member function]
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::MacLowAggregationCapableTransmissionListener::GetQueue() [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::WifiMacQueue >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowBlockAckEventListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLowAggregationCapableTransmissionListener::GetSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('GetSrcAddressForAggregation', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue(ns3::WifiMacHeader & header, ns3::Mac48Address recipient, uint8_t tid, ns3::Time * timestamp) [member function]
     cls.add_method('PeekNextPacketInBaQueue', 
                    'ns3::Ptr< ns3::Packet const >', 
                    [param('ns3::WifiMacHeader &', 'header'), param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::Time *', 'timestamp')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowBlockAckEventListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
+    ## mac-low.h (module 'wifi'): uint16_t ns3::MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor(ns3::WifiMacHeader * hdr) [member function]
     cls.add_method('PeekNextSequenceNumberfor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader *', 'hdr')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue(uint8_t tid, ns3::Mac48Address recipient, uint16_t seqnumber) [member function]
     cls.add_method('RemoveFromBaQueue', 
                    'void', 
                    [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'seqnumber')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::SetAmpdu(bool ampdu) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLowAggregationCapableTransmissionListener::SetAmpdu(bool ampdu) [member function]
     cls.add_method('SetAmpdu', 
                    'void', 
                    [param('bool', 'ampdu')], 
@@ -6398,16 +6413,12 @@
     cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
     cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
-    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
-    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
-    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
-    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
-    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
-    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshAction [variable]
+    cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multihopAction [variable]
+    cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::MultihopActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfProtectedAction [variable]
+    cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
 def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -7332,6 +7343,10 @@
                    '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', 
@@ -7805,10 +7820,10 @@
                    '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::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [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', 
@@ -7982,10 +7997,10 @@
                    '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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## 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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -8072,18 +8087,18 @@
     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')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::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::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::Packet const> packet, double snr) [member function]
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::Packet> packet, double snr, ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::Packet> packet, double snr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'snr'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
     cls.add_method('SwitchFromSleep', 
                    'void', 
@@ -8947,10 +8962,10 @@
                    '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_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## 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::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   [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', 
@@ -8982,9 +8997,13 @@
     cls.add_method('SetTxPowerStart', 
                    'void', 
                    [param('double', 'start')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time rxDuration) [member function]
+    ## 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]
     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', 
+                   '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')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
     cls.add_method('UnregisterListener', 
@@ -11677,10 +11696,10 @@
     cls.add_method('CreateBlockAckAgreement', 
                    'void', 
                    [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::Packet> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('DeaggregateAmpduAndReceive', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
     cls.add_method('DestroyBlockAckAgreement', 
                    'void', 
@@ -11766,14 +11785,14 @@
     cls.add_method('ReceiveError', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'rxSnr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, bool ampduSubframe) [member function]
     cls.add_method('ReceiveOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowBlockAckEventListener * listener) [member function]
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('bool', 'ampduSubframe')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowAggregationCapableTransmissionListener * listener) [member function]
     cls.add_method('RegisterBlockAckListenerForAc', 
                    'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowBlockAckEventListener *', 'listener')])
+                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowAggregationCapableTransmissionListener *', 'listener')])
     ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterDcfListener(ns3::MacLowDcfListener * listener) [member function]
     cls.add_method('RegisterDcfListener', 
                    'void', 
@@ -11851,8 +11870,8 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')], 
                    is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
-    cls.add_method('StopAggregation', 
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::StopMpduAggregation(ns3::Ptr<ns3::Packet const> peekedPacket, ns3::WifiMacHeader peekedHdr, ns3::Ptr<ns3::Packet> aggregatedPacket, uint16_t size) const [member function]
+    cls.add_method('StopMpduAggregation', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'peekedPacket'), param('ns3::WifiMacHeader', 'peekedHdr'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('uint16_t', 'size')], 
                    is_const=True)
diff -Naur ns-3.22/src/wifi/doc/wifi.rst ns-3.23/src/wifi/doc/wifi.rst
--- ns-3.22/src/wifi/doc/wifi.rst	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/doc/wifi.rst	2015-05-13 11:05:27.000000000 -0700
@@ -19,7 +19,7 @@
 
 * 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
+* **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
@@ -733,8 +733,12 @@
 * PHY_RXSTART is not supported
 * 802.11e TXOP is not supported
 * 802.11n MIMO is not supported
-* hybrid aggregation 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
 ************
@@ -771,4 +775,4 @@
 
 .. [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>`__
\ No newline at end of file
+.. [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.22/src/wifi/examples/wifi-phy-test.cc ns-3.23/src/wifi/examples/wifi-phy-test.cc
--- ns-3.22/src/wifi/examples/wifi-phy-test.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/examples/wifi-phy-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,7 +59,7 @@
 
 private:
   void Send (void);
-  void Receive (Ptr<Packet> p, double snr, WifiMode mode, enum WifiPreamble preamble);
+  void Receive (Ptr<Packet> p, double snr, WifiTxVector txVector, enum WifiPreamble preamble);
   Ptr<WifiPhy> m_tx;
   struct Input m_input;
   struct Output m_output;
@@ -77,7 +77,7 @@
 }
 
 void
-PsrExperiment::Receive (Ptr<Packet> p, double snr, WifiMode mode, enum WifiPreamble preamble)
+PsrExperiment::Receive (Ptr<Packet> p, double snr, WifiTxVector txVector, enum WifiPreamble preamble)
 {
   m_output.received++;
 }
@@ -161,7 +161,7 @@
 private:
   void SendA (void) const;
   void SendB (void) const;
-  void Receive (Ptr<Packet> p, double snr, WifiMode mode, enum WifiPreamble preamble);
+  void Receive (Ptr<Packet> p, double snr, WifiTxVector txVector, enum WifiPreamble preamble);
   Ptr<WifiPhy> m_txA;
   Ptr<WifiPhy> m_txB;
   uint32_t m_flowIdA;
@@ -193,7 +193,7 @@
 }
 
 void
-CollisionExperiment::Receive (Ptr<Packet> p, double snr, WifiMode mode, enum WifiPreamble preamble)
+CollisionExperiment::Receive (Ptr<Packet> p, double snr, WifiTxVector txVector, enum WifiPreamble preamble)
 {
   FlowIdTag tag;
   if (p->FindFirstMatchingByteTag (tag))
diff -Naur ns-3.22/src/wifi/helper/athstats-helper.cc ns-3.23/src/wifi/helper/athstats-helper.cc
--- ns-3.22/src/wifi/helper/athstats-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/helper/athstats-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -111,6 +111,7 @@
 {
   static TypeId tid = TypeId ("ns3::AthstatsWifiTraceSink")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AthstatsWifiTraceSink> ()
     .AddAttribute ("Interval",
                    "Time interval between reports",
diff -Naur ns-3.22/src/wifi/model/aarfcd-wifi-manager.cc ns-3.23/src/wifi/model/aarfcd-wifi-manager.cc
--- ns-3.22/src/wifi/model/aarfcd-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/aarfcd-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -66,6 +66,7 @@
 {
   static TypeId tid = TypeId ("ns3::AarfcdWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AarfcdWifiManager> ()
     .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
                    DoubleValue (2.0),
diff -Naur ns-3.22/src/wifi/model/aarf-wifi-manager.cc ns-3.23/src/wifi/model/aarf-wifi-manager.cc
--- ns-3.22/src/wifi/model/aarf-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/aarf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::AarfWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AarfWifiManager> ()
     .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
                    DoubleValue (2.0),
diff -Naur ns-3.22/src/wifi/model/adhoc-wifi-mac.cc ns-3.23/src/wifi/model/adhoc-wifi-mac.cc
--- ns-3.22/src/wifi/model/adhoc-wifi-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/adhoc-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -47,6 +47,7 @@
 {
   static TypeId tid = TypeId ("ns3::AdhocWifiMac")
     .SetParent<RegularWifiMac> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AdhocWifiMac> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/ampdu-subframe-header.cc ns-3.23/src/wifi/model/ampdu-subframe-header.cc
--- ns-3.22/src/wifi/model/ampdu-subframe-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/ampdu-subframe-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -29,6 +29,7 @@
 {
   static TypeId tid = TypeId ("ns3::AmpduSubframeHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AmpduSubframeHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/ampdu-tag.cc ns-3.23/src/wifi/model/ampdu-tag.cc
--- ns-3.22/src/wifi/model/ampdu-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/ampdu-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::AmpduTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AmpduTag> ()
     .AddAttribute ("Ampdu Exists", "The value that indicates that the packet contains an AMPDU",
                    UintegerValue (false),
diff -Naur ns-3.22/src/wifi/model/amrr-wifi-manager.cc ns-3.23/src/wifi/model/amrr-wifi-manager.cc
--- ns-3.22/src/wifi/model/amrr-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/amrr-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -57,6 +57,7 @@
 {
   static TypeId tid = TypeId ("ns3::AmrrWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AmrrWifiManager> ()
     .AddAttribute ("UpdatePeriod",
                    "The interval between decisions about rate control changes",
diff -Naur ns-3.22/src/wifi/model/amsdu-subframe-header.cc ns-3.23/src/wifi/model/amsdu-subframe-header.cc
--- ns-3.22/src/wifi/model/amsdu-subframe-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/amsdu-subframe-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 {
   static TypeId tid = TypeId ("ns3::AmsduSubframeHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AmsduSubframeHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/aparf-wifi-manager.cc ns-3.23/src/wifi/model/aparf-wifi-manager.cc
--- ns-3.22/src/wifi/model/aparf-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/aparf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -61,6 +61,7 @@
 {
   static TypeId tid = TypeId ("ns3::AparfWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<AparfWifiManager> ()
     .AddAttribute ("SuccessThreshold 1",
                    "The minimum number of successful transmissions in \"High\" state to try a new power or rate.",
diff -Naur ns-3.22/src/wifi/model/ap-wifi-mac.cc ns-3.23/src/wifi/model/ap-wifi-mac.cc
--- ns-3.22/src/wifi/model/ap-wifi-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/ap-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,6 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::ApWifiMac")
     .SetParent<RegularWifiMac> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<ApWifiMac> ()
     .AddAttribute ("BeaconInterval", "Delay between two beacons",
                    TimeValue (MicroSeconds (102400)),
@@ -313,6 +314,14 @@
     {
       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);
+      }
     }
   // set the basic rates
   for (uint32_t j = 0; j < m_stationManager->GetNBasicModes (); j++)
diff -Naur ns-3.22/src/wifi/model/arf-wifi-manager.cc ns-3.23/src/wifi/model/arf-wifi-manager.cc
--- ns-3.22/src/wifi/model/arf-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/arf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -56,6 +56,7 @@
 {
   static TypeId tid = TypeId ("ns3::ArfWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<ArfWifiManager> ()
     .AddAttribute ("TimerThreshold", "The 'timer' threshold in the ARF algorithm.",
                    UintegerValue (15),
diff -Naur ns-3.22/src/wifi/model/cara-wifi-manager.cc ns-3.23/src/wifi/model/cara-wifi-manager.cc
--- ns-3.22/src/wifi/model/cara-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/cara-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -52,6 +52,7 @@
 {
   static TypeId tid = TypeId ("ns3::CaraWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<CaraWifiManager> ()
     .AddAttribute ("ProbeThreshold",
                    "The number of consecutive transmissions failure to activate the RTS probe.",
diff -Naur ns-3.22/src/wifi/model/constant-rate-wifi-manager.cc ns-3.23/src/wifi/model/constant-rate-wifi-manager.cc
--- ns-3.22/src/wifi/model/constant-rate-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/constant-rate-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,12 +37,13 @@
 {
   static TypeId tid = TypeId ("ns3::ConstantRateWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<ConstantRateWifiManager> ()
     .AddAttribute ("DataMode", "The transmission mode to use for every data packet transmission",
                    StringValue ("OfdmRate6Mbps"),
                    MakeWifiModeAccessor (&ConstantRateWifiManager::m_dataMode),
                    MakeWifiModeChecker ())
-    .AddAttribute ("ControlMode", "The transmission mode to use for every control packet transmission.",
+    .AddAttribute ("ControlMode", "The transmission mode to use for every RTS packet transmission.",
                    StringValue ("OfdmRate6Mbps"),
                    MakeWifiModeAccessor (&ConstantRateWifiManager::m_ctlMode),
                    MakeWifiModeChecker ())
diff -Naur ns-3.22/src/wifi/model/constant-rate-wifi-manager.h ns-3.23/src/wifi/model/constant-rate-wifi-manager.h
--- ns-3.22/src/wifi/model/constant-rate-wifi-manager.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/constant-rate-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
@@ -28,7 +28,7 @@
 
 /**
  * \ingroup wifi
- * \brief use constant rates for data and control transmissions
+ * \brief use constant rates for data and RTS transmissions
  *
  * This class uses always the same transmission rate for every
  * packet sent.
@@ -58,7 +58,7 @@
   virtual bool IsLowLatency (void) const;
 
   WifiMode m_dataMode; //!< Wifi mode for unicast DATA frames
-  WifiMode m_ctlMode; //!< Wifi mode for request control frames
+  WifiMode m_ctlMode; //!< Wifi mode for RTS frames
 };
 
 } // namespace ns3
diff -Naur ns-3.22/src/wifi/model/ctrl-headers.cc ns-3.23/src/wifi/model/ctrl-headers.cc
--- ns-3.22/src/wifi/model/ctrl-headers.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/ctrl-headers.cc	2015-05-13 11:05:27.000000000 -0700
@@ -51,6 +51,7 @@
   NS_LOG_FUNCTION_NOARGS ();
   static TypeId tid = TypeId ("ns3::CtrlBAckRequestHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<CtrlBAckRequestHeader> ()
   ;
   return tid;
@@ -299,6 +300,7 @@
 {
   static TypeId tid = TypeId ("ns3::CtrlBAckResponseHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<CtrlBAckResponseHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/dca-txop.cc ns-3.23/src/wifi/model/dca-txop.cc
--- ns-3.22/src/wifi/model/dca-txop.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/dca-txop.cc	2015-05-13 11:05:27.000000000 -0700
@@ -135,6 +135,7 @@
 {
   static TypeId tid = TypeId ("ns3::DcaTxop")
     .SetParent (ns3::Dcf::GetTypeId ())
+    .SetGroupName ("Wifi")
     .AddConstructor<DcaTxop> ()
     .AddAttribute ("Queue", "The WifiMacQueue object",
                    PointerValue (),
diff -Naur ns-3.22/src/wifi/model/edca-txop-n.cc ns-3.23/src/wifi/model/edca-txop-n.cc
--- ns-3.22/src/wifi/model/edca-txop-n.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/edca-txop-n.cc	2015-05-13 11:05:27.000000000 -0700
@@ -132,14 +132,14 @@
   EdcaTxopN *m_txop;
 };
 
-class EdcaTxopN::BlockAckEventListener : public MacLowBlockAckEventListener
+class EdcaTxopN::AggregationCapableTransmissionListener : public MacLowAggregationCapableTransmissionListener
 {
 public:
-  BlockAckEventListener (EdcaTxopN * txop)
-    : MacLowBlockAckEventListener (),
+  AggregationCapableTransmissionListener (EdcaTxopN * txop)
+    : MacLowAggregationCapableTransmissionListener (),
       m_txop (txop) {
   }
-  virtual ~BlockAckEventListener () {}
+  virtual ~AggregationCapableTransmissionListener () {}
 
   virtual void BlockAckInactivityTimeout (Mac48Address address, uint8_t tid)
   {
@@ -189,6 +189,18 @@
   {
     return m_txop->GetNRetryNeededPackets (recipient, tid);
   }
+  virtual Ptr<MsduAggregator> GetMsduAggregator (void) const
+  { 
+    return m_txop->GetMsduAggregator ();
+  }
+  virtual Mac48Address GetSrcAddressForAggregation (const WifiMacHeader &hdr)
+  {
+    return m_txop->MapSrcAddressForAggregation (hdr);
+  }
+  virtual Mac48Address GetDestAddressForAggregation (const WifiMacHeader &hdr)
+  {
+    return m_txop->MapDestAddressForAggregation (hdr);
+  }
 
 private:
   EdcaTxopN *m_txop;
@@ -201,6 +213,7 @@
 {
   static TypeId tid = TypeId ("ns3::EdcaTxopN")
     .SetParent (ns3::Dcf::GetTypeId ())
+    .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.",
@@ -227,12 +240,13 @@
   : m_manager (0),
     m_currentPacket (0),
     m_aggregator (0),
+    m_typeOfStation (STA),
     m_blockAckType (COMPRESSED_BLOCK_ACK),
     m_ampduExist (false)
 {
   NS_LOG_FUNCTION (this);
   m_transmissionListener = new EdcaTxopN::TransmissionListener (this);
-  m_blockAckListener = new EdcaTxopN::BlockAckEventListener (this);
+  m_blockAckListener = new EdcaTxopN::AggregationCapableTransmissionListener (this);
   m_dcf = new EdcaTxopN::Dcf (this);
   m_queue = CreateObject<WifiMacQueue> ();
   m_rng = new RealRandomStream ();
@@ -646,9 +660,35 @@
       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;
+        }
+      else
+        {
+          m_currentPacket = 0;
         }
       // to reset the dcf.
-      m_currentPacket = 0;
       m_dcf->ResetCw ();
     }
   else
diff -Naur ns-3.22/src/wifi/model/edca-txop-n.h ns-3.23/src/wifi/model/edca-txop-n.h
--- ns-3.22/src/wifi/model/edca-txop-n.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/edca-txop-n.h	2015-05-13 11:05:27.000000000 -0700
@@ -507,7 +507,7 @@
   AcIndex m_ac;
   class Dcf;
   class TransmissionListener;
-  class BlockAckEventListener;
+  class AggregationCapableTransmissionListener;
   friend class Dcf;
   friend class TransmissionListener;
   Dcf *m_dcf;
@@ -518,7 +518,7 @@
   Ptr<MacLow> m_low;
   MacTxMiddle *m_txMiddle;
   TransmissionListener *m_transmissionListener;
-  BlockAckEventListener *m_blockAckListener;
+  AggregationCapableTransmissionListener *m_blockAckListener;
   RandomStream *m_rng;
   Ptr<WifiRemoteStationManager> m_stationManager;
   uint8_t m_fragmentNumber;
diff -Naur ns-3.22/src/wifi/model/error-rate-model.cc ns-3.23/src/wifi/model/error-rate-model.cc
--- ns-3.22/src/wifi/model/error-rate-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -27,6 +27,7 @@
 {
   static TypeId tid = TypeId ("ns3::ErrorRateModel")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/wifi/model/ideal-wifi-manager.cc ns-3.23/src/wifi/model/ideal-wifi-manager.cc
--- ns-3.22/src/wifi/model/ideal-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/ideal-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::IdealWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<IdealWifiManager> ()
     .AddAttribute ("BerThreshold",
                    "The maximum Bit Error Rate acceptable at any transmission mode",
diff -Naur ns-3.22/src/wifi/model/interference-helper.cc ns-3.23/src/wifi/model/interference-helper.cc
--- ns-3.22/src/wifi/model/interference-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/interference-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,16 +32,15 @@
  *       Phy event class
  ****************************************************************/
 
-InterferenceHelper::Event::Event (uint32_t size, WifiMode payloadMode,
+InterferenceHelper::Event::Event (uint32_t size, WifiTxVector txVector,
                                   enum WifiPreamble preamble,
-                                  Time duration, double rxPower, WifiTxVector txVector)
+                                  Time duration, double rxPower)
   : m_size (size),
-    m_payloadMode (payloadMode),
+    m_txVector (txVector),
     m_preamble (preamble),
     m_startTime (Simulator::Now ()),
     m_endTime (m_startTime + duration),
-    m_rxPowerW (rxPower),
-    m_txVector (txVector)
+    m_rxPowerW (rxPower)
 {
 }
 InterferenceHelper::Event::~Event ()
@@ -73,10 +72,15 @@
 {
   return m_size;
 }
+WifiTxVector
+InterferenceHelper::Event::GetTxVector (void) const
+{
+  return m_txVector;
+}
 WifiMode
 InterferenceHelper::Event::GetPayloadMode (void) const
 {
-  return m_payloadMode;
+  return m_txVector.GetMode();
 }
 enum WifiPreamble
 InterferenceHelper::Event::GetPreambleType (void) const
@@ -84,12 +88,6 @@
   return m_preamble;
 }
 
-WifiTxVector
-InterferenceHelper::Event::GetTxVector (void) const
-{
-  return m_txVector;
-}
-
 
 /****************************************************************
  *       Class which records SNIR change events for a
@@ -134,18 +132,17 @@
 }
 
 Ptr<InterferenceHelper::Event>
-InterferenceHelper::Add (uint32_t size, WifiMode payloadMode,
+InterferenceHelper::Add (uint32_t size, WifiTxVector txVector,
                          enum WifiPreamble preamble,
-                         Time duration, double rxPowerW, WifiTxVector txVector)
+                         Time duration, double rxPowerW)
 {
   Ptr<InterferenceHelper::Event> event;
 
   event = Create<InterferenceHelper::Event> (size,
-                                             payloadMode,
+                                             txVector,
                                              preamble,
                                              duration,
-                                             rxPowerW,
-                                             txVector);
+                                             rxPowerW);
   AppendEvent (event);
   return event;
 }
@@ -267,23 +264,16 @@
 }
 
 double
-InterferenceHelper::CalculatePer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
+InterferenceHelper::CalculatePlcpPayloadPer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
 {
   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 ;
- if (preamble==WIFI_PREAMBLE_HT_MF)
-   {
-    MfHeaderMode = WifiPhy::GetMFPlcpHeaderMode (payloadMode, preamble); //return L-SIG mode
-
-   }
-  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 (payloadMode, preamble);//packet start time+ preamble+L SIG+HT 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
   double noiseInterferenceW = (*j).GetDelta ();
   double powerW = event->GetRxPowerW ();
@@ -309,74 +299,143 @@
             { 
                //Case 2ai and 2aii: All formats
                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                              noiseInterferenceW,
-                                                              payloadMode),
-                                                current - plcpPayloadStart,
-                                                payloadMode);
+                                                               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)
+      else if (previous >= plcpHsigHeaderStart)
         {
           //Case 3a: cuurent after payload start
-          if (current >=plcpPayloadStart)
+          if (current >= plcpPayloadStart)
              {
                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                   noiseInterferenceW,
+                                                                   payloadMode),
+                                                     current - plcpPayloadStart,
+                                                     payloadMode);
+                 
+              }
+
+        }
+      //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 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);
+                                                payloadMode); 
+             
+            }
+        }
+
+      noiseInterferenceW += (*j).GetDelta ();
+      previous = (*j).GetTime ();
+      j++;
+    }
+
+  double per = 1 - psr;
+  return per;
+}
+
+double
+InterferenceHelper::CalculatePlcpHeaderPer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
+{
+  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 ;
+  if (preamble == WIFI_PREAMBLE_HT_MF)
+    {
+      MfHeaderMode = WifiPhy::GetMFPlcpHeaderMode (payloadMode, preamble); //return L-SIG mode
+    }
+  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
+  double noiseInterferenceW = (*j).GetDelta ();
+  double powerW = event->GetRxPowerW ();
+    j++;
+  while (ni->end () != j)
+    {
+      Time current = (*j).GetTime ();
+      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 1a: cuurent after payload start
+          if (current >= plcpPayloadStart)
+             {
+
                  
                     psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                              noiseInterferenceW,
-                                                              headerMode),
-                                               plcpHtTrainingSymbolsStart - previous,
-                                                headerMode);
+                                                                    noiseInterferenceW,
+                                                                    headerMode),
+                                                      plcpHtTrainingSymbolsStart - previous,
+                                                      headerMode);
               }
-          //case 3b: current after HT training symbols start
+          //case 1b: current after HT training symbols start
           else if (current >=plcpHtTrainingSymbolsStart)
              {
                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                                 noiseInterferenceW,
                                                                 headerMode),
-                                                   plcpHtTrainingSymbolsStart - previous,
-                                                   headerMode);  
+                                                  plcpHtTrainingSymbolsStart - previous,
+                                                  headerMode);
                    
              }
-         //Case 3c: current is with previous in HT sig
+         //Case 1c: current is with previous in HT sig
          else
             {
                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                                 noiseInterferenceW,
                                                                 headerMode),
-                                                   current- previous,
-                                                   headerMode);  
+                                                  current - previous,
+                                                  headerMode);
                    
             }
       }
-      //Case 4: previous in L-SIG: GF will not reach here because it will execute the previous if and exit
+      // 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 4a: current after payload start  
-          if (current >=plcpPayloadStart)
+          // Case 2a: current after payload start
+          if (current >= plcpPayloadStart)
              {
-                   psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                              noiseInterferenceW,
-                                                              payloadMode),
-                                                      current - plcpPayloadStart,
-                                                      payloadMode);
-                    //Case 4ai: Non HT format (No HT-SIG or Training Symbols)
+              // 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);
+                                                                    noiseInterferenceW,
+                                                                    headerMode),
+                                                      plcpPayloadStart - previous,
+                                                      headerMode);
                 }
-
-               else{
+              else
+                {
                     psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                               noiseInterferenceW,
                                                               headerMode),
@@ -389,8 +448,8 @@
                                                       MfHeaderMode);
                  }
               }
-           //Case 4b: 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        
-          else if (current >=plcpHtTrainingSymbolsStart)
+          // 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
+          else if (current >= plcpHtTrainingSymbolsStart)
              {
                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                               noiseInterferenceW,
@@ -403,8 +462,8 @@
                                                    plcpHsigHeaderStart - previous,
                                                    MfHeaderMode);
               }
-          //Case 4c: 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)
+          // 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,
@@ -418,47 +477,40 @@
                                                    MfHeaderMode);
 
              }
-         //Case 4d: Current with prev in L SIG
+         // Case 2d: Current with prev in L SIG
          else 
             {
-                //Case 4di: Non HT format (No HT-SIG or Training Symbols)
+              // 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);
+                                                                    noiseInterferenceW,
+                                                                    headerMode),
+                                                      current - previous,
+                                                      headerMode);
                 }
-               else
+              else
                 {
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                                noiseInterferenceW,
                                                                MfHeaderMode),
-                                                 current - previous,
-                                                 MfHeaderMode);
+                                                      current - previous,
+                                                      MfHeaderMode);
                 }
             }
         }
-      //Case 5: previous is in the preamble works for all cases
+      // Case 3: previous is in the preamble works for all cases
       else
         {
           if (current >= plcpPayloadStart)
             {
-              //for all
-              psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                              noiseInterferenceW,
-                                                              payloadMode),
-                                                current - plcpPayloadStart,
-                                                payloadMode); 
-             
-               // Non HT format (No HT-SIG or Training Symbols)
+              // Non HT format (No HT-SIG or Training Symbols)
               if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT)
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                                  noiseInterferenceW,
-                                                                  headerMode),
-                                                    plcpPayloadStart - plcpHeaderStart,
-                                                    headerMode);
+                                                                 headerMode),
+                                                   plcpPayloadStart - plcpHeaderStart,
+                                                   headerMode);
               else
               // Greenfield or Mixed format
                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
@@ -473,24 +525,27 @@
                                                    plcpHsigHeaderStart-plcpHeaderStart,
                                                    MfHeaderMode);             
             }
-          else if (current >=plcpHtTrainingSymbolsStart )
+          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,
-                                                                headerMode),
-                                                  plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
-                                                  headerMode);
+              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);       
+                {
+                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                    noiseInterferenceW,
+                                                                    MfHeaderMode),
+                                                      plcpHsigHeaderStart-plcpHeaderStart,
+                                                      MfHeaderMode);
+                }
            }
-          //non HT will not come here     
-          else if (current >=plcpHsigHeaderStart)
+          // non HT will not come here
+          else if (current >= plcpHsigHeaderStart)
              { 
                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                                 noiseInterferenceW,
@@ -513,17 +568,17 @@
                  {
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                                  noiseInterferenceW,
-                                                                  headerMode),
-                                                    current - plcpHeaderStart,
-                                                    headerMode);
+                                                                 headerMode),
+                                                   current - plcpHeaderStart,
+                                                   headerMode);
                  }
               else
                  {
               psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                               noiseInterferenceW,
-                                                             MfHeaderMode),
-                                               current - plcpHeaderStart,
-                                               MfHeaderMode);
+                                                              MfHeaderMode),
+                                                current - plcpHeaderStart,
+                                                MfHeaderMode);
                        }
             }
         }
@@ -537,9 +592,8 @@
   return per;
 }
 
-
 struct InterferenceHelper::SnrPer
-InterferenceHelper::CalculateSnrPer (Ptr<InterferenceHelper::Event> event)
+InterferenceHelper::CalculatePlcpPayloadSnrPer (Ptr<InterferenceHelper::Event> event)
 {
   NiChanges ni;
   double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
@@ -550,7 +604,27 @@
   /* calculate the SNIR at the start of the packet and accumulate
    * all SNIR changes in the snir vector.
    */
-  double per = CalculatePer (event, &ni);
+  double per = CalculatePlcpPayloadPer (event, &ni);
+
+  struct SnrPer snrPer;
+  snrPer.snr = snr;
+  snrPer.per = per;
+  return snrPer;
+}
+
+struct InterferenceHelper::SnrPer
+InterferenceHelper::CalculatePlcpHeaderSnrPer (Ptr<InterferenceHelper::Event> event)
+{
+  NiChanges ni;
+  double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
+  double snr = CalculateSnr (event->GetRxPowerW (),
+                             noiseInterferenceW,
+                             WifiPhy::GetPlcpHeaderMode (event->GetPayloadMode (), event->GetPreambleType ()));
+
+  /* calculate the SNIR at the start of the plcp header and accumulate
+   * all SNIR changes in the snir vector.
+   */
+  double per = CalculatePlcpHeaderPer (event, &ni);
 
   struct SnrPer snrPer;
   snrPer.snr = snr;
diff -Naur ns-3.22/src/wifi/model/interference-helper.h ns-3.23/src/wifi/model/interference-helper.h
--- ns-3.22/src/wifi/model/interference-helper.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/interference-helper.h	2015-05-13 11:05:27.000000000 -0700
@@ -51,15 +51,15 @@
      * Create an Event with the given parameters.
      *
      * \param size packet size
-     * \param payloadMode Wi-Fi mode used for the payload
+     * \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, WifiMode payloadMode,
+    Event (uint32_t size, WifiTxVector txvector,
            enum WifiPreamble preamble,
-           Time duration, double rxPower, WifiTxVector txvector);
+           Time duration, double rxPower);
     ~Event ();
 
     /**
@@ -93,6 +93,12 @@
      */
     uint32_t GetSize (void) const;
     /**
+     * Return the TXVECTOR of the packet.
+     *
+     * \return the TXVECTOR of the packet
+     */
+    WifiTxVector GetTxVector (void) const;
+    /**
      * Return the Wi-Fi mode used for the payload.
      *
      * \return the Wi-Fi mode used for the payload
@@ -104,20 +110,14 @@
      * \return the preamble type of the packet
      */
     enum WifiPreamble GetPreambleType (void) const;
-    /**
-     * Return the TXVECTOR of the packet.
-     *
-     * \return the TXVECTOR of the packet
-     */
-    WifiTxVector GetTxVector (void) const;
+
 private:
     uint32_t m_size;
-    WifiMode m_payloadMode;
+    WifiTxVector m_txVector;
     enum WifiPreamble m_preamble;
     Time m_startTime;
     Time m_endTime;
     double m_rxPowerW;
-    WifiTxVector m_txVector;
   };
   /**
    * A struct for both SNR and PER
@@ -170,25 +170,32 @@
    * Add the packet-related signal to interference helper.
    *
    * \param size packet size
-   * \param payloadMode Wi-Fi mode for the payload
+   * \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 txvector TXVECTOR of the packet
    * \return InterferenceHelper::Event
    */
-  Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiMode payloadMode,
+  Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiTxVector txvector,
                                       enum WifiPreamble preamble,
-                                      Time duration, double rxPower, WifiTxVector txvector);
+                                      Time duration, double rxPower);
 
   /**
-   * Calculate the SNIR at the start of the packet and accumulate
+   * Calculate the SNIR at the start of the plcp payload and accumulate
+   * 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);
+  /**
+   * Calculate the SNIR at the start of the plcp header and accumulate
    * all SNIR changes in the snir vector.
    *
-   * \param event the event corresponding to the first time the packet arrives
+   * \param event the event corresponding to the first time the corresponding packet arrives
    * \return struct of SNR and PER
    */
-  struct InterferenceHelper::SnrPer CalculateSnrPer (Ptr<InterferenceHelper::Event> event);
+  struct InterferenceHelper::SnrPer CalculatePlcpHeaderSnrPer (Ptr<InterferenceHelper::Event> event);
   /**
    * Notify that RX has started.
    */
@@ -284,14 +291,23 @@
    */
   double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode) const;
   /**
-   * Calculate the error rate of the given packet. The packet can be divided into
+   * 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;
+  /**
+   * Calculate the error rate of the plcp header. The plcp header 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 CalculatePer (Ptr<const Event> event, NiChanges *ni) const;
+  double CalculatePlcpHeaderPer (Ptr<const Event> event, NiChanges *ni) const;
 
   double m_noiseFigure; /**< noise figure (linear) */
   Ptr<ErrorRateModel> m_errorRateModel;
diff -Naur ns-3.22/src/wifi/model/mac-low.cc ns-3.23/src/wifi/model/mac-low.cc
--- ns-3.22/src/wifi/model/mac-low.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/mac-low.cc	2015-05-13 11:05:27.000000000 -0700
@@ -61,6 +61,7 @@
 MacLowTransmissionListener::MissedBlockAck (void)
 {
 }
+
 MacLowDcfListener::MacLowDcfListener ()
 {
 }
@@ -68,49 +69,64 @@
 {
 }
 
-MacLowBlockAckEventListener::MacLowBlockAckEventListener ()
+MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener ()
 {
 }
-MacLowBlockAckEventListener::~MacLowBlockAckEventListener ()
+MacLowAggregationCapableTransmissionListener::~MacLowAggregationCapableTransmissionListener ()
 {
 }
 
-void MacLowBlockAckEventListener::SetAmpdu (bool ampdu)
+void MacLowAggregationCapableTransmissionListener::SetAmpdu (bool ampdu)
 {
 }
-void MacLowBlockAckEventListener::CompleteTransfer(Mac48Address address, uint8_t tid)
+void MacLowAggregationCapableTransmissionListener::CompleteTransfer(Mac48Address address, uint8_t tid)
 {
 }
 void
-MacLowBlockAckEventListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
+MacLowAggregationCapableTransmissionListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
 {
 }
 uint16_t 
-MacLowBlockAckEventListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
+MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
 {
  return 0;
 }
 uint16_t 
-MacLowBlockAckEventListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
+MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
 {
  return 0;
 }
 Ptr<const Packet> 
-MacLowBlockAckEventListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
+MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
 {
  return 0;
 }
 void 
-MacLowBlockAckEventListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
+MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
 {
 }
 uint32_t 
-MacLowBlockAckEventListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
+MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
 {
   return 0;
 }
 uint32_t 
-MacLowBlockAckEventListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
+MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
+{
+  return 0;
+}
+Ptr<MsduAggregator>
+MacLowAggregationCapableTransmissionListener::GetMsduAggregator (void) const
+{
+  return 0;
+}
+Mac48Address
+MacLowAggregationCapableTransmissionListener::GetSrcAddressForAggregation (const WifiMacHeader &hdr)
+{
+  return 0;
+}
+Mac48Address
+MacLowAggregationCapableTransmissionListener::GetDestAddressForAggregation (const WifiMacHeader &hdr)
 {
   return 0;
 }
@@ -503,7 +519,7 @@
 void
 MacLow::ResetPhy (void)
 {
-  m_phy->SetReceiveOkCallback (MakeNullCallback<void,Ptr<Packet>, double, WifiMode, enum WifiPreamble>  ());
+  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;
@@ -759,7 +775,7 @@
                                                 hdr.GetQosTid(),
                                                 hdr.GetAddr2 (),
                                                 hdr.GetDuration (),
-                                                m_currentMode);
+                                                m_currentTxVector);
         }
       else if (hdr.IsBlockAckReq())
         {
@@ -808,9 +824,9 @@
 }
 
 void
-MacLow::ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiMode txMode, WifiPreamble preamble, bool ampduSubframe)
+MacLow::ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiTxVector txVector, WifiPreamble preamble, bool ampduSubframe)
 {
-  NS_LOG_FUNCTION (this << packet << rxSnr << txMode << preamble);
+  NS_LOG_FUNCTION (this << packet << rxSnr << txVector.GetMode () << preamble);
   /* A packet is received from the PHY.
    * When we have handled this packet,
    * we handle any packet present in the
@@ -821,7 +837,7 @@
 
   bool isPrevNavZero = IsNavZero ();
   NS_LOG_DEBUG ("duration/id=" << hdr.GetDuration ());
-  NotifyNav (packet,hdr, txMode, preamble);
+  NotifyNav (packet, hdr, preamble);
   if (hdr.IsRts ())
     {
       /* see section 9.2.5.7 802.11-1999
@@ -842,12 +858,12 @@
               NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
               NS_ASSERT (m_sendCtsEvent.IsExpired ());
               m_stationManager->ReportRxOk (hdr.GetAddr2 (), &hdr,
-                                            rxSnr, txMode);
+                                            rxSnr, txVector.GetMode ());
               m_sendCtsEvent = Simulator::Schedule (GetSifs (),
                                                     &MacLow::SendCtsAfterRts, this,
                                                     hdr.GetAddr2 (),
                                                     hdr.GetDuration (),
-                                                    txMode,
+                                                    txVector,
                                                     rxSnr);
             }
           else
@@ -869,19 +885,18 @@
       SnrTag tag;
       packet->RemovePacketTag (tag);
       m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                    rxSnr, txMode);
+                                    rxSnr, txVector.GetMode ());
       m_stationManager->ReportRtsOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                     rxSnr, txMode, tag.Get ());
+                                     rxSnr, txVector.GetMode (), tag.Get ());
 
       m_ctsTimeoutEvent.Cancel ();
       NotifyCtsTimeoutResetNow ();
-      m_listener->GotCts (rxSnr, txMode);
+      m_listener->GotCts (rxSnr, txVector.GetMode ());
       NS_ASSERT (m_sendDataEvent.IsExpired ());
       m_sendDataEvent = Simulator::Schedule (GetSifs (),
                                              &MacLow::SendDataAfterCts, this,
                                              hdr.GetAddr1 (),
-                                             hdr.GetDuration (),
-                                             txMode);
+                                             hdr.GetDuration ());
     }
   else if (hdr.IsAck ()
            && hdr.GetAddr1 () == m_self
@@ -894,10 +909,11 @@
       SnrTag tag;
       packet->RemovePacketTag (tag);
       m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                    rxSnr, txMode);
+                                    rxSnr, txVector.GetMode ());
       m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                      rxSnr, txMode, tag.Get ());
-        
+                                      rxSnr, txVector.GetMode (), tag.Get ());
+
+      FlushAggregateQueue();
       bool gotAck = false;
       if (m_txParams.MustWaitNormalAck ()
           && m_normalAckTimeoutEvent.IsRunning ())
@@ -915,7 +931,7 @@
         }
       if (gotAck)
         {
-          m_listener->GotAck (rxSnr, txMode);
+          m_listener->GotAck (rxSnr, txVector.GetMode ());
         }
       if (m_txParams.HasNextPacket ())
         {
@@ -932,9 +948,10 @@
       packet->RemoveHeader (blockAck);
       m_blockAckTimeoutEvent.Cancel ();
       NotifyAckTimeoutResetNow ();
-      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (),txMode);
+      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (), txVector.GetMode ());
       m_sentMpdus = 0;
       m_ampdu = false;
+      FlushAggregateQueue();
     }
   else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
     {
@@ -962,7 +979,7 @@
                                                         blockAckReq,
                                                         hdr.GetAddr2 (),
                                                         hdr.GetDuration (),
-                                                        txMode);
+                                                        txVector.GetMode ());
                 }
               else
                 {
@@ -988,7 +1005,7 @@
   else if (hdr.GetAddr1 () == m_self)
     {
       m_stationManager->ReportRxOk (hdr.GetAddr2 (), &hdr,
-                                    rxSnr, txMode);
+                                    rxSnr, txVector.GetMode ());
       if (hdr.IsQosData () && ReceiveMpdu (packet, hdr))
         {
           /* From section 9.10.4 in IEEE 802.11:
@@ -1009,7 +1026,7 @@
                                                     &MacLow::SendAckAfterData, this,
                                                     hdr.GetAddr2 (),
                                                     hdr.GetDuration (),
-                                                    txMode,
+                                                    txVector.GetMode (),
                                                     rxSnr);
               m_receivedAtLeastOneMpdu = false;
             }
@@ -1060,7 +1077,7 @@
                                                     &MacLow::SendAckAfterData, this,
                                                     hdr.GetAddr2 (),
                                                     hdr.GetDuration (),
-                                                    txMode,
+                                                    txVector.GetMode (),
                                                     rxSnr);
             }
         }
@@ -1165,32 +1182,24 @@
 Time
 MacLow::GetAckDuration (Mac48Address to, WifiTxVector dataTxVector) const
 {
-  WifiTxVector ackTxVector = GetAckTxVectorForData (to, dataTxVector.GetMode());
+  WifiTxVector ackTxVector = GetAckTxVectorForData (to, dataTxVector.GetMode ());
   return GetAckDuration (ackTxVector);
 }
 Time
 MacLow::GetAckDuration (WifiTxVector ackTxVector) const
 {
-  WifiPreamble preamble;
-  if (ackTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
-  else
-    preamble=WIFI_PREAMBLE_LONG;
-  return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, preamble, 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
 {
   /*
-   * For immediate BlockAck we should transmit the frame with the same WifiMode
+   * For immediate Basic BlockAck we should transmit the frame with the same WifiMode
    * as the BlockAckReq.
-   *
-   * from section 9.6 in IEEE 802.11e:
-   * The BlockAck control frame shall be sent at the same rate and modulation class as
-   * the BlockAckReq frame if it is sent in response to a BlockAckReq frame.
    */
   WifiPreamble preamble;
-  if (blockAckReqTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
+  if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && type == BASIC_BLOCK_ACK)
     preamble= WIFI_PREAMBLE_HT_MF;
   else
     preamble=WIFI_PREAMBLE_LONG;
@@ -1199,19 +1208,15 @@
 Time
 MacLow::GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const
 {
-  WifiTxVector ctsTxVector = GetCtsTxVectorForRts (to, rtsTxVector.GetMode());
+  WifiTxVector ctsTxVector = GetCtsTxVectorForRts (to, rtsTxVector.GetMode ());
   return GetCtsDuration (ctsTxVector);
 }
 
 Time
 MacLow::GetCtsDuration (WifiTxVector ctsTxVector) const
 {
-  WifiPreamble preamble;
-  if (ctsTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
-  else
-    preamble=WIFI_PREAMBLE_LONG;
-  return m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, 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
@@ -1296,12 +1301,9 @@
         {
           preamble = WIFI_PREAMBLE_HT_GF;
         }
-      else if (rtsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
-        {
-          preamble = WIFI_PREAMBLE_HT_MF;
-        }
       else
         {
+          //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);
@@ -1309,13 +1311,10 @@
       txTime += Time (GetSifs () * 2);
     }
   WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
-  //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;
-  else
-    preamble=WIFI_PREAMBLE_LONG;
+    preamble = WIFI_PREAMBLE_HT_GF;
+  else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
+    preamble = WIFI_PREAMBLE_LONG;
   uint32_t dataSize = GetSize (packet, hdr);
   txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
   if (params.MustWaitAck ())
@@ -1336,7 +1335,7 @@
     {
       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
+      //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)
@@ -1350,7 +1349,7 @@
 }
 
 void
-MacLow::NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble)
+MacLow::NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr, WifiPreamble preamble)
 {
   NS_ASSERT (m_lastNavStart <= Simulator::Now ());
   Time duration = hdr.GetDuration ();
@@ -1468,7 +1467,7 @@
   NS_LOG_DEBUG ("send " << hdr->GetTypeString () <<
                 ", to=" << hdr->GetAddr1 () <<
                 ", size=" << packet->GetSize () <<
-                ", mode=" << txVector.GetMode() <<
+                ", mode=" << txVector.GetMode  () <<
                 ", duration=" << hdr->GetDuration () <<
                 ", seq=0x" << std::hex << m_currentHdr.GetSequenceControl () << std::dec);
   if (!m_ampdu || hdr->IsRts ())
@@ -1560,6 +1559,7 @@
   m_listener = 0;
   m_sentMpdus = 0;
   m_ampdu = false;
+  FlushAggregateQueue();
   listener->MissedAck ();
 }
 void
@@ -1590,6 +1590,7 @@
   m_listener = 0;
   m_sentMpdus = 0;
   m_ampdu = false;
+  FlushAggregateQueue();
   listener->MissedBlockAck ();
 }
 void
@@ -1629,12 +1630,10 @@
 
   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 ()))
+  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
     preamble= WIFI_PREAMBLE_HT_GF;
-  else if (rtsTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
-  else
-    preamble=WIFI_PREAMBLE_LONG;
+  else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
+    preamble = WIFI_PREAMBLE_LONG;
 
   if (m_txParams.HasDurationId ())
     {
@@ -1651,12 +1650,12 @@
       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 ())
@@ -1698,11 +1697,11 @@
  
   //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 (dataTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
+    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;
  
   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
   if (m_txParams.MustWaitNormalAck ())
@@ -1773,11 +1772,11 @@
           
   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_GF;
+  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+    preamble = WIFI_PREAMBLE_HT_MF;
   else
-     preamble=WIFI_PREAMBLE_LONG;
+     preamble = WIFI_PREAMBLE_LONG;
   
   StartDataTxTimers (dataTxVector);
 
@@ -1791,13 +1790,13 @@
       if (m_txParams.MustWaitBasicBlockAck ())
         {
           duration += GetSifs ();
-          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 ())
         {
           duration += GetSifs ();
-          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 ())
@@ -1826,7 +1825,7 @@
       m_currentPacket->AddTrailer (fcs);
     }
 
-  ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector,preamble);
+  ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector, preamble);
   m_currentPacket = 0;
 }
 
@@ -1856,10 +1855,10 @@
   WifiTxVector ctsTxVector = GetCtsToSelfTxVector (m_currentPacket, &m_currentHdr);
 
   WifiPreamble preamble;
-  if (ctsTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
+  if (ctsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+    preamble = WIFI_PREAMBLE_HT_MF;
   else
-    preamble=WIFI_PREAMBLE_LONG;
+    preamble = WIFI_PREAMBLE_LONG;
   
   Time duration = Seconds (0);
 
@@ -1877,13 +1876,13 @@
         {
           
           duration += GetSifs ();
-          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 ())
         {
           duration += GetSifs ();
-          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 ())
@@ -1899,7 +1898,7 @@
           if (m_txParams.MustWaitCompressedBlockAck ())
             {
               duration += GetSifs ();
-              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 ())
@@ -1926,17 +1925,16 @@
   m_sendDataEvent = Simulator::Schedule (txDuration,
                                          &MacLow::SendDataAfterCts, this,
                                          cts.GetAddr1 (),
-                                         duration,
-                                         ctsTxVector.GetMode());
+                                         duration);
 }
 void
-MacLow::SendCtsAfterRts (Mac48Address source, Time duration, WifiMode rtsTxMode, double rtsSnr)
+MacLow::SendCtsAfterRts (Mac48Address source, Time duration, WifiTxVector rtsTxVector, double rtsSnr)
 {
-  NS_LOG_FUNCTION (this << source << duration << rtsTxMode << rtsSnr);
+  NS_LOG_FUNCTION (this << source << duration << rtsTxVector.GetMode () << rtsSnr);
   /* send a CTS when you receive a RTS
    * right after SIFS.
    */
- WifiTxVector ctsTxVector = GetCtsTxVector (source, rtsTxMode);
+  WifiTxVector ctsTxVector = GetCtsTxVector (source, rtsTxVector.GetMode ());
   WifiMacHeader cts;
   cts.SetType (WIFI_MAC_CTL_CTS);
   cts.SetDsNotFrom ();
@@ -1944,7 +1942,7 @@
   cts.SetNoMoreFragments ();
   cts.SetNoRetry ();
   cts.SetAddr1 (source);
-  duration -= GetCtsDuration (source, ctsTxVector);
+  duration -= GetCtsDuration (source, rtsTxVector);
   duration -= GetSifs ();
   NS_ASSERT (duration >= MicroSeconds (0));
   cts.SetDuration (duration);
@@ -1958,16 +1956,12 @@
   tag.Set (rtsSnr);
   packet->AddPacketTag (tag);
 
-  WifiPreamble preamble;
-  if (ctsTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
-  else
-    preamble=WIFI_PREAMBLE_LONG;
-  ForwardDown (packet, &cts, ctsTxVector,preamble);
+  //CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
+  ForwardDown (packet, &cts, ctsTxVector, WIFI_PREAMBLE_LONG);
 }
 
 void
-MacLow::SendDataAfterCts (Mac48Address source, Time duration, WifiMode txMode)
+MacLow::SendDataAfterCts (Mac48Address source, Time duration)
 {
   NS_LOG_FUNCTION (this);
   /* send the third step in a
@@ -1976,27 +1970,40 @@
   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);
+    }
+    m_txPackets.clear ();
+  }
+  
   WifiPreamble preamble;       
-  if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+  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_GF;
+  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+    preamble = WIFI_PREAMBLE_HT_MF;
   else
-     preamble=WIFI_PREAMBLE_LONG;
+     preamble = WIFI_PREAMBLE_LONG;
   
   StartDataTxTimers (dataTxVector);
   Time newDuration = Seconds (0);
   if (m_txParams.MustWaitBasicBlockAck ())
     {
       newDuration += GetSifs ();
-      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode());
+      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
       newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
     }
   else if (m_txParams.MustWaitCompressedBlockAck ())
     {
       newDuration += GetSifs ();
-      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode());
+      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
       newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
     }
   else if (m_txParams.MustWaitAck ())
@@ -2011,7 +2018,7 @@
       if (m_txParams.MustWaitCompressedBlockAck ())
         {
            newDuration += GetSifs ();
-           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode());
+           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
            newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
         }
       else if (m_txParams.MustWaitAck ())
@@ -2093,13 +2100,8 @@
   tag.Set (dataSnr);
   packet->AddPacketTag (tag);
 
-   //since ACK is a control response it can't have format GF
-  WifiPreamble preamble;
-  if (ackTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
-  else
-    preamble=WIFI_PREAMBLE_LONG;
-  ForwardDown (packet, &ack, ackTxVector, preamble);
+  //ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
+  ForwardDown (packet, &ack, ackTxVector, WIFI_PREAMBLE_LONG);
 }
 
 bool
@@ -2215,7 +2217,7 @@
       AcIndex ac = QosUtilsMapTidToAc (agreement.GetTid ());
 
       it->second.first.m_inactivityEvent = Simulator::Schedule (timeout,
-                                                                &MacLowBlockAckEventListener::BlockAckInactivityTimeout,
+                                                                &MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout,
                                                                 m_edcaListeners[ac],
                                                                 originator, tid);
     }
@@ -2389,15 +2391,15 @@
   WifiMacTrailer fcs;
   packet->AddTrailer (fcs);
   WifiPreamble preamble;
-  if (blockAckReqTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble= WIFI_PREAMBLE_HT_MF;
+  if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+    preamble = WIFI_PREAMBLE_HT_MF;
   else
-    preamble=WIFI_PREAMBLE_LONG;
+    preamble = WIFI_PREAMBLE_LONG;
   ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
   m_currentPacket = 0;
 }
 void 
-MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiMode blockAckReqTxMode)
+MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector)
 {
   NS_LOG_FUNCTION (this);
   CtrlBAckResponseHeader blockAck;
@@ -2415,7 +2417,7 @@
   NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
   (*i).second.FillBlockAckBitmap (&blockAck);  
 
-  SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxMode);
+  SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxVector.GetMode  ());
 }
 
 void
@@ -2494,7 +2496,7 @@
       //NS_ASSERT (it != m_edcaListeners.end ());
 
       agreement.m_inactivityEvent = Simulator::Schedule (timeout,
-                                                         &MacLowBlockAckEventListener::BlockAckInactivityTimeout,
+                                                         &MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout,
                                                          m_edcaListeners[ac],
                                                          agreement.GetPeer (),
                                                          agreement.GetTid ());
@@ -2502,7 +2504,7 @@
 }
 
 void
-MacLow::RegisterBlockAckListenerForAc (enum AcIndex ac, MacLowBlockAckEventListener *listener)
+MacLow::RegisterBlockAckListenerForAc (enum AcIndex ac, MacLowAggregationCapableTransmissionListener *listener)
 {
   m_edcaListeners.insert (std::make_pair (ac, listener));
 }
@@ -2514,9 +2516,9 @@
 }
 
 void
-MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiMode txMode, WifiPreamble preamble)
+MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiTxVector txVector, WifiPreamble preamble)
 {
-  m_currentMode = txMode;
+  m_currentTxVector = txVector;
   AmpduTag ampdu;
   bool normalAck = false;
   bool ampduSubframe = false;
@@ -2529,16 +2531,16 @@
       WifiMacHeader firsthdr;
       (*n).first->PeekHeader(firsthdr);
       NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ());
-      NotifyNav ((*n).first,firsthdr, txMode, preamble);
+      NotifyNav ((*n).first, firsthdr, preamble);
       if (firsthdr.GetAddr1 () == m_self)
         {
           m_receivedAtLeastOneMpdu = true;
           if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
-              ReceiveOk ((*n).first, rxSnr, txMode, preamble, ampduSubframe);
+              ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
           else if (firsthdr.IsData () || firsthdr.IsQosData ())
             {
               NS_LOG_DEBUG ("Deaagregate packet with sequence=" << firsthdr.GetSequenceNumber ());
-              ReceiveOk ((*n).first, rxSnr, txMode, preamble, ampduSubframe);
+              ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
               if (firsthdr.IsQosAck ())
                 {
                   NS_LOG_DEBUG ("Normal Ack");
@@ -2569,7 +2571,7 @@
                                                     firsthdr.GetQosTid(),
                                                     firsthdr.GetAddr2 (),
                                                     firsthdr.GetDuration (),
-                                                    txMode);
+                                                    txVector);
             } 
           else
             { 
@@ -2580,25 +2582,25 @@
     }
   else
     {     
-          ReceiveOk (aggregatedPacket,rxSnr, txMode, preamble, ampduSubframe);
+          ReceiveOk (aggregatedPacket,rxSnr, txVector, preamble, ampduSubframe);
     }
 }
 
 bool 
-MacLow::StopAggregation(Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
+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
-        preamble = WIFI_PREAMBLE_HT_MF;
+    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))
+    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))
@@ -2612,7 +2614,7 @@
 {
   NS_ASSERT (m_aggregateQueue->GetSize () == 0);
   bool isAmpdu = false;
-  Ptr<Packet> newPacket;
+  Ptr<Packet> newPacket, tempPacket;
   WifiMacHeader peekedHdr;
   newPacket = packet->Copy();
   //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet
@@ -2623,7 +2625,7 @@
       Ptr<WifiMacQueue> queue;
       AcIndex ac = QosUtilsMapTidToAc (tid);
       //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener
-      std::map<AcIndex, MacLowBlockAckEventListener*>::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();
       
@@ -2660,7 +2662,7 @@
 
                   if (aggregated)
                     {
-                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU");
+                      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);
@@ -2678,12 +2680,20 @@
               bool retry = false;
               //looks for other packets to the same destination with the same Tid need to extend that to include MSDUs
               Ptr<const Packet> peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, peekedHdr.GetAddr1 (), tid, &tstamp);
-              if (peekedPacket == 0) 
+              if (peekedPacket == 0)
                 {
                   peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
                                                              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();
+                    }
                 }
               else
                 {
@@ -2691,7 +2701,7 @@
                   currentSequenceNumber = peekedHdr.GetSequenceNumber(); 
                 }
 
-               while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopAggregation (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)
@@ -2719,13 +2729,27 @@
                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
                       if (i == 1 && hdr.IsQosData ())
                       {
-                          listenerIt->second->CompleteMpduTx (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");
+                      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++;
-                      listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
+                      if (!m_txParams.MustSendRts ())
+                      {
+                        listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
+                      }
+                      else
+                      {
+                        InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
+                      }
                       if (retry)
                           listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
                       else
@@ -2747,6 +2771,13 @@
                             {
                               //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();
+                              }
                             }   
                         }
                       else
@@ -2760,6 +2791,13 @@
                         {
                           //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();
+                          }
                         }   
                     }
                 }
@@ -2811,6 +2849,73 @@
 {
   NS_LOG_DEBUG("Flush aggregate queue");
   m_aggregateQueue->Flush ();
+  m_txPackets.clear ();
+}
+
+void
+MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
+{
+  Item item;
+  
+  item.packet = packet;
+  item.hdr = hdr;
+  item.timestamp = tStamp;
+
+  m_txPackets.push_back (item);
+}
+
+Ptr<Packet>
+MacLow::PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
+{
+  bool msduAggregation = false;
+  bool isAmsdu = false;
+  Ptr<Packet> currentAmsduPacket = Create<Packet> ();
+  Ptr<Packet> tempPacket = Create<Packet> ();
+
+  Ptr<WifiMacQueue> queue;
+  AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr));
+  std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
+  NS_ASSERT (listenerIt != m_edcaListeners.end ());
+  queue = listenerIt->second->GetQueue();
+    
+  listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket,
+                                               listenerIt->second->GetSrcAddressForAggregation (*hdr),
+                                               listenerIt->second->GetDestAddressForAggregation (*hdr));
+
+  Ptr<const Packet> 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;
+    }
+    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;
+  }
+  else
+  {
+    return 0;
+  }
 }
 
 } // namespace ns3
diff -Naur ns-3.22/src/wifi/model/mac-low.h ns-3.23/src/wifi/model/mac-low.h
--- ns-3.22/src/wifi/model/mac-low.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/mac-low.h	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,9 @@
 #include "block-ack-cache.h"
 #include "wifi-tx-vector.h"
 #include "mpdu-aggregator.h"
+#include "msdu-aggregator.h"
+
+class TwoLevelAggregationTest;
 
 namespace ns3 {
 
@@ -133,7 +136,6 @@
    * 
    */
   virtual void EndTxNoAck (void) = 0;
-
 };
 
 
@@ -188,11 +190,11 @@
  * \ingroup wifi
  * \brief listen for block ack events.
  */
-class MacLowBlockAckEventListener
+class MacLowAggregationCapableTransmissionListener
 {
 public:
-  MacLowBlockAckEventListener ();
-  virtual ~MacLowBlockAckEventListener ();
+  MacLowAggregationCapableTransmissionListener ();
+  virtual ~MacLowAggregationCapableTransmissionListener ();
   /**
    * Typically is called in order to notify EdcaTxopN that a block ack inactivity
    * timeout occurs for the block ack agreement identified by the pair <i>originator</i>, <i>tid</i>.
@@ -272,6 +274,15 @@
    * Returns number of packets for a specific agreement that need retransmission.
    */
   virtual uint32_t GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const;
+  /**
+   */
+  virtual Ptr<MsduAggregator> GetMsduAggregator (void) const;
+  /**
+   */
+  virtual Mac48Address GetSrcAddressForAggregation (const WifiMacHeader &hdr);
+  /**
+   */
+  virtual Mac48Address GetDestAddressForAggregation (const WifiMacHeader &hdr);
 };
 
 /**
@@ -475,6 +486,8 @@
 class MacLow : public Object
 {
 public:
+  // Allow test cases to access private members
+  friend class ::TwoLevelAggregationTest;
   /**
    * typedef for a callback for MacLowRx
    */
@@ -698,14 +711,14 @@
   /**
    * \param packet packet received
    * \param rxSnr snr of packet received
-   * \param txMode transmission mode of packet received
+   * \param txVector TXVECTOR of packet received
    * \param preamble type of preamble used for the packet received
    * \param ampduSubframe true if this MPDU is part of an A-MPDU
    *
    * This method is typically invoked by the lower PHY layer to notify
    * the MAC layer that a packet was successfully received.
    */
-  void ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiMode txMode, WifiPreamble preamble, bool ampduSubframe);
+  void ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiTxVector txVector, WifiPreamble preamble, bool ampduSubframe);
   /**
    * \param packet packet received.
    * \param rxSnr snr of packet received.
@@ -762,7 +775,7 @@
    * The lifetime of the registered listener is typically equal to the lifetime of the queue
    * associated to this AC.
    */
-  void RegisterBlockAckListenerForAc (enum AcIndex ac, MacLowBlockAckEventListener *listener);
+  void RegisterBlockAckListenerForAc (enum AcIndex ac, MacLowAggregationCapableTransmissionListener *listener);
   /**
    * \param packet the packet to be aggregated. If the aggregation is succesfull, it corresponds either to the first data packet that will be aggregated or to the BAR that will be piggybacked at the end of the A-MPDU.
    * \param hdr the WifiMacHeader for the packet.
@@ -775,13 +788,13 @@
   /**
    * \param aggregatedPacket which is the current A-MPDU
    * \param rxSnr snr of packet received
-   * \param txMode transmission mode of packet received
-   * \param preamble type of preamble used for the packet received        
+   * \param txVector TXVECTOR of packet received
+   * \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, WifiMode txMode, WifiPreamble preamble);
+  void DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiTxVector txVector, WifiPreamble preamble);
   /**
    * \param peekedPacket the packet to be aggregated
    * \param peekedHdr the WifiMacHeader for the packet.
@@ -792,7 +805,7 @@
    * This function decides if a given packet can be added to an A-MPDU or not
    * 
    */
-  bool StopAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const;
+  bool StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const;
   /**
    *
    * This function is called to flush the aggregate queue, which is used for A-MPDU
@@ -998,7 +1011,7 @@
   Time CalculateOverallTxTime (Ptr<const Packet> packet,
                                const WifiMacHeader* hdr,
                                const MacLowTransmissionParameters &params) const;
-  void NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble);
+  void NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr, WifiPreamble preamble);
   /**
    * Reset NAV with the given duration.
    *
@@ -1086,10 +1099,10 @@
    *
    * \param source
    * \param duration
-   * \param txMode
+   * \param rtsTxVector
    * \param rtsSnr
    */
-  void SendCtsAfterRts (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
+  void SendCtsAfterRts (Mac48Address source, Time duration, WifiTxVector rtsTxVector, double rtsSnr);
   /**
    * Send ACK after receiving DATA.
    *
@@ -1104,9 +1117,8 @@
    *
    * \param source
    * \param duration
-   * \param txMode
    */
-  void SendDataAfterCts (Mac48Address source, Time duration, WifiMode txMode);
+  void SendDataAfterCts (Mac48Address source, Time duration);
   /**
    * Event handler that is usually scheduled to fired at the appropriate time
    * after completing transmissions.
@@ -1200,7 +1212,7 @@
    * block ack agreement and creates block ack bitmap on a received packets basis.
    */
   void SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator,
-                                          Time duration, WifiMode blockAckReqTxMode);
+                                          Time duration, WifiTxVector blockAckReqTxVector);
   /**
    * This method creates block ack frame with header equals to <i>blockAck</i> and start its transmission.
    *
@@ -1242,10 +1254,39 @@
    *
    */
   bool IsAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr);
+  /**
+   * Insert in a temporary queue.
+   * It is only used with a RTS/CTS exchange for an A-MPDU transmission.
+   */
+  void InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp);
+  /**
+   * Perform MSDU aggregation for a given MPDU in an A-MPDU
+   *
+   * \param packet packet picked for aggregation
+   * \param hdr 802.11 header for packet picked for aggregation
+   * \param tstamp timestamp
+   * \param currentAmpduPacket current A-MPDU packet
+   * \param blockAckSize size of the piggybacked block ack request
+   *
+   * \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<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.
+   */
+  typedef struct
+  {
+    Ptr<const Packet> packet;
+    WifiMacHeader hdr;
+    Time timestamp;
+  } Item;
+
   /**
    * typedef for an iterator for a list of MacLowDcfListener.
    */
@@ -1313,13 +1354,14 @@
   Agreements m_bAckAgreements;
   BlockAckCaches m_bAckCaches;
 
-  typedef std::map<AcIndex, MacLowBlockAckEventListener*> QueueListeners;
+  typedef std::map<AcIndex, MacLowAggregationCapableTransmissionListener*> QueueListeners;
   QueueListeners m_edcaListeners;
   bool m_ctsToSelfSupported;          //!< Flag whether CTS-to-self is supported
   uint8_t m_sentMpdus;                //!< Number of transmitted MPDUs in an A-MPDU that have not been acknowledged yet
   Ptr<WifiMacQueue> m_aggregateQueue; //!< Queue used for MPDU aggregation
-  WifiMode m_currentMode;             //!< mode used for the current packet transmission
+  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.
 };
 
 } // namespace ns3
diff -Naur ns-3.22/src/wifi/model/mgt-headers.cc ns-3.23/src/wifi/model/mgt-headers.cc
--- ns-3.22/src/wifi/model/mgt-headers.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/mgt-headers.cc	2015-05-13 11:05:27.000000000 -0700
@@ -81,6 +81,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtProbeRequestHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtProbeRequestHeader> ()
   ;
   return tid;
@@ -181,6 +182,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtProbeResponseHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtProbeResponseHeader> ()
   ;
   return tid;
@@ -311,6 +313,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtAssocRequestHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtAssocRequestHeader> ()
   ;
   return tid;
@@ -413,6 +416,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtAssocResponseHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtAssocResponseHeader> ()
   ;
   return tid;
@@ -431,7 +435,7 @@
   size += 2; // aid
   size += m_rates.GetSerializedSize ();
   size += m_rates.extended.GetSerializedSize ();
-size += m_htCapability.GetSerializedSize();
+  size += m_htCapability.GetSerializedSize();
   return size;
 }
 
@@ -462,7 +466,7 @@
   m_aid = i.ReadLsbtohU16 ();
   i = m_rates.Deserialize (i);
   i = m_rates.extended.DeserializeIfPresent (i);
- i = m_htCapability.DeserializeIfPresent (i);
+  i = m_htCapability.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
 /**********************************************************
@@ -479,7 +483,6 @@
                              WifiActionHeader::ActionValue action)
 {
   m_category = type;
-
   switch (type)
     {
     case BLOCK_ACK:
@@ -487,22 +490,25 @@
         m_actionValue = action.blockAck;
         break;
       }
-    case MESH_PEERING_MGT:
+    case MESH:  
       {
-        m_actionValue = action.peerLink;
+        m_actionValue = action.meshAction;
         break;
       }
-    case MESH_PATH_SELECTION:
+    case MULTIHOP: 
       {
-        m_actionValue = action.pathSelection;
+        m_actionValue = action.multihopAction;
         break;
       }
-    case MESH_LINK_METRIC:
-    case MESH_INTERWORKING:
-    case MESH_RESOURCE_COORDINATION:
-    case MESH_PROXY_FORWARDING:
+    case SELF_PROTECTED:
+      {
+        m_actionValue = action.selfProtectedAction;
+        break;
+      } 
     case VENDOR_SPECIFIC_ACTION:
-      break;
+      {
+        break;
+      } 
     }
 }
 WifiActionHeader::CategoryValue
@@ -512,30 +518,25 @@
     {
     case BLOCK_ACK:
       return BLOCK_ACK;
-    case MESH_PEERING_MGT:
-      return MESH_PEERING_MGT;
-    case MESH_LINK_METRIC:
-      return MESH_LINK_METRIC;
-    case MESH_PATH_SELECTION:
-      return MESH_PATH_SELECTION;
-    case MESH_INTERWORKING:
-      return MESH_INTERWORKING;
-    case MESH_RESOURCE_COORDINATION:
-      return MESH_RESOURCE_COORDINATION;
-    case MESH_PROXY_FORWARDING:
-      return MESH_PROXY_FORWARDING;
+    case MESH:
+      return MESH;
+    case MULTIHOP:
+      return MULTIHOP;
+    case SELF_PROTECTED:
+      return SELF_PROTECTED;
     case VENDOR_SPECIFIC_ACTION:
       return VENDOR_SPECIFIC_ACTION;
     default:
       NS_FATAL_ERROR ("Unknown action value");
-      return MESH_PEERING_MGT;
+      return SELF_PROTECTED;
     }
 }
 WifiActionHeader::ActionValue
 WifiActionHeader::GetAction ()
 {
   ActionValue retval;
-  retval.peerLink = 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:
@@ -550,50 +551,92 @@
         case BLOCK_ACK_DELBA:
           retval.blockAck = BLOCK_ACK_DELBA;
           break ;
-        }
+       }
       break ;
-      
-    case MESH_PEERING_MGT:
+    case SELF_PROTECTED:
       switch (m_actionValue)
         {
         case PEER_LINK_OPEN:
-          retval.peerLink = PEER_LINK_OPEN;
-          break ;
+          retval.selfProtectedAction = PEER_LINK_OPEN;
+          break;
         case PEER_LINK_CONFIRM:
-          retval.peerLink = PEER_LINK_CONFIRM;
-          break ;
+          retval.selfProtectedAction = PEER_LINK_CONFIRM;
+          break;
         case PEER_LINK_CLOSE:
-          retval.peerLink = PEER_LINK_CLOSE;
-          break ;
+          retval.selfProtectedAction = PEER_LINK_CLOSE;
+          break;
+        case GROUP_KEY_INFORM:
+          retval.selfProtectedAction = GROUP_KEY_INFORM;
+          break;
+        case GROUP_KEY_ACK:
+          retval.selfProtectedAction = GROUP_KEY_ACK;
+          break;
         default:
           NS_FATAL_ERROR ("Unknown mesh peering management action code");
-          retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
+          retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
         }
-      break ;
+       break ;
       
-    case MESH_PATH_SELECTION:
+    case MESH:
       switch (m_actionValue)
         {
+        case LINK_METRIC_REPORT:
+          retval.meshAction = LINK_METRIC_REPORT;
+          break;
         case PATH_SELECTION:
-          retval.pathSelection = PATH_SELECTION;
-          break ;
+          retval.meshAction = PATH_SELECTION;
+          break;
+        case PORTAL_ANNOUNCEMENT:
+          retval.meshAction = PORTAL_ANNOUNCEMENT;
+          break;
+        case CONGESTION_CONTROL_NOTIFICATION:
+          retval.meshAction = CONGESTION_CONTROL_NOTIFICATION;
+         break;
+        case MDA_SETUP_REQUEST:
+          retval.meshAction = MDA_SETUP_REQUEST;
+         break;
+        case MDA_SETUP_REPLY:
+          retval.meshAction = MDA_SETUP_REPLY;
+          break;
+        case MDAOP_ADVERTISMENT_REQUEST:
+          retval.meshAction = MDAOP_ADVERTISMENT_REQUEST;
+          break;
+        case MDAOP_ADVERTISMENTS:
+          retval.meshAction = MDAOP_ADVERTISMENTS;
+          break;
+        case MDAOP_SET_TEARDOWN:
+          retval.meshAction = MDAOP_SET_TEARDOWN;
+          break;
+        case TBTT_ADJUSTMENT_REQUEST:
+          retval.meshAction = TBTT_ADJUSTMENT_REQUEST;
+          break;
+        case TBTT_ADJUSTMENT_RESPONSE:
+          retval.meshAction = TBTT_ADJUSTMENT_RESPONSE;
+          break;
         default:
-          NS_FATAL_ERROR ("Unknown mesh path selection action code");
-          retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
+          NS_FATAL_ERROR ("Unknown mesh peering management action code");
+          retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
         }
-      break ;
-    case VENDOR_SPECIFIC_ACTION:
-      break ;
-    case MESH_LINK_METRIC:
-    // not yet supported
-    case MESH_INTERWORKING:
-    // not yet supported
-    case MESH_RESOURCE_COORDINATION:
-    // not yet supported
-    default:
+      break;
+  
+    case MULTIHOP: //not yet supported
+      switch (m_actionValue)
+        {
+        case PROXY_UPDATE:                    //(not used so far)
+          retval.multihopAction = PROXY_UPDATE;
+          break;
+        case PROXY_UPDATE_CONFIRMATION:       //(not used so far)
+          retval.multihopAction = PROXY_UPDATE;
+          break;
+        default:
+          NS_FATAL_ERROR ("Unknown mesh peering management action code");
+          retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
+        }
+      break;
+      default:
       NS_FATAL_ERROR ("Unsupported mesh action");
-      retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
-    }
+      retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
+      }
   return retval;
 }
 TypeId
@@ -601,6 +644,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiActionHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<WifiActionHeader> ();
   return tid;
 }
@@ -651,6 +695,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtAddBaRequestHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtAddBaRequestHeader> ();
   return tid;
 }
@@ -827,6 +872,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtAddBaResponseHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtAddBaResponseHeader> ()
   ;
   return tid;
@@ -991,6 +1037,7 @@
 {
   static TypeId tid = TypeId ("ns3::MgtDelBaHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MgtDelBaHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/mgt-headers.h ns-3.23/src/wifi/model/mgt-headers.h
--- ns-3.22/src/wifi/model/mgt-headers.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/mgt-headers.h	2015-05-13 11:05:27.000000000 -0700
@@ -339,61 +339,51 @@
   WifiActionHeader ();
   ~WifiActionHeader ();
 
-  /**
-   * Compatible with open80211s implementation
-   * Category values - see 802.11-2012 Table 8-38
-   */
-  enum CategoryValue
+  /*
+   * Compatible with table 8-38 IEEE 802.11, Part11, (Year 2012)
+   * 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_PEERING_MGT = 30,
-    MESH_LINK_METRIC = 31,
-    MESH_PATH_SELECTION = 32,
-    MESH_INTERWORKING = 33,
-    MESH_RESOURCE_COORDINATION = 34,
-    MESH_PROXY_FORWARDING = 35,
+    MESH = 13,                  //Category: Mesh
+    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.
     VENDOR_SPECIFIC_ACTION = 127,
   };
-  /**
-   * Compatible with open80211s implementation
-   */
-  enum PeerLinkMgtActionValue
-  {
-    PEER_LINK_OPEN = 0,
-    PEER_LINK_CONFIRM = 1,
-    PEER_LINK_CLOSE = 2,
-  };
-  enum LinkMetricActionValue
+ 
+  enum SelfProtectedActionValue //Category: 15 (Self Protected)
   {
-    LINK_METRIC_REQUEST = 0,
-    LINK_METRIC_REPORT,
+    PEER_LINK_OPEN = 1,         //Mesh Peering Open
+    PEER_LINK_CONFIRM = 2,      //Mesh Peering Confirm
+    PEER_LINK_CLOSE = 3,        //Mesh Peering Close
+    GROUP_KEY_INFORM = 4,       //Mesh Group Key Inform
+    GROUP_KEY_ACK = 5,          //Mesh Group Key Acknowledge
   };
-  /**
-   * Compatible with open80211s implementation
-   */
-  enum PathSelectionActionValue
-  {
-    PATH_SELECTION = 0,
-  };
-  enum InterworkActionValue
+
+  enum MultihopActionValue
   {
-    PORTAL_ANNOUNCEMENT = 0,
+    PROXY_UPDATE = 0,                   //(not used so far)
+    PROXY_UPDATE_CONFIRMATION = 1,      //(not used so far)
   };
-  enum ResourceCoordinationActionValue
+
+  enum MeshActionValue
   {
-    CONGESTION_CONTROL_NOTIFICATION = 0,
-    MDA_SETUP_REQUEST,
-    MDA_SETUP_REPLY,
-    MDAOP_ADVERTISMENT_REQUEST,
-    MDAOP_ADVERTISMENTS,
-    MDAOP_SET_TEARDOWN,
-    BEACON_TIMING_REQUEST,
-    BEACON_TIMING_RESPONSE,
-    TBTT_ADJUSTMENT_REQUEST,
-    MESH_CHANNEL_SWITCH_ANNOUNCEMENT,
+    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)
   };
+
   /**
    * Block ACK action field values
    * See 802.11 Table 8-202
@@ -404,16 +394,16 @@
     BLOCK_ACK_ADDBA_RESPONSE = 1,
     BLOCK_ACK_DELBA = 2
   };
+
+
   /**
    * typedef for union of different ActionValues
    */
   typedef union
   {
-    enum PeerLinkMgtActionValue peerLink;
-    enum LinkMetricActionValue linkMetrtic;
-    enum PathSelectionActionValue pathSelection;
-    enum InterworkActionValue interwork;
-    enum ResourceCoordinationActionValue resourceCoordination;
+    enum MeshActionValue meshAction;
+    enum MultihopActionValue multihopAction;
+    enum SelfProtectedActionValue selfProtectedAction;    
     enum BlockAckActionValue blockAck;
   } ActionValue;
   /**
diff -Naur ns-3.22/src/wifi/model/minstrel-wifi-manager.cc ns-3.23/src/wifi/model/minstrel-wifi-manager.cc
--- ns-3.22/src/wifi/model/minstrel-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/minstrel-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -91,6 +91,7 @@
 {
   static TypeId tid = TypeId ("ns3::MinstrelWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MinstrelWifiManager> ()
     .AddAttribute ("UpdateStatistics",
                    "The interval between updating statistics table ",
diff -Naur ns-3.22/src/wifi/model/mpdu-aggregator.cc ns-3.23/src/wifi/model/mpdu-aggregator.cc
--- ns-3.22/src/wifi/model/mpdu-aggregator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/mpdu-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
 MpduAggregator::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::MpduAggregator")
+    .SetGroupName ("Wifi")
     .SetParent<Object> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/mpdu-standard-aggregator.cc ns-3.23/src/wifi/model/mpdu-standard-aggregator.cc
--- ns-3.22/src/wifi/model/mpdu-standard-aggregator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/mpdu-standard-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::MpduStandardAggregator")
     .SetParent<MpduAggregator> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MpduStandardAggregator> ()
     .AddAttribute ("MaxAmpduSize", "Max length in bytes of an A-MPDU",
                    UintegerValue (65535),
diff -Naur ns-3.22/src/wifi/model/msdu-aggregator.cc ns-3.23/src/wifi/model/msdu-aggregator.cc
--- ns-3.22/src/wifi/model/msdu-aggregator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/msdu-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -33,6 +33,7 @@
 {
   static TypeId tid = TypeId ("ns3::MsduAggregator")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/wifi/model/msdu-standard-aggregator.cc ns-3.23/src/wifi/model/msdu-standard-aggregator.cc
--- ns-3.22/src/wifi/model/msdu-standard-aggregator.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/msdu-standard-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::MsduStandardAggregator")
     .SetParent<MsduAggregator> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<MsduStandardAggregator> ()
     .AddAttribute ("MaxAmsduSize", "Max length in byte of an A-MSDU",
                    UintegerValue (7935),
diff -Naur ns-3.22/src/wifi/model/nist-error-rate-model.cc ns-3.23/src/wifi/model/nist-error-rate-model.cc
--- ns-3.22/src/wifi/model/nist-error-rate-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/nist-error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::NistErrorRateModel")
     .SetParent<ErrorRateModel> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<NistErrorRateModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/onoe-wifi-manager.cc ns-3.23/src/wifi/model/onoe-wifi-manager.cc
--- ns-3.22/src/wifi/model/onoe-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/onoe-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -55,6 +55,7 @@
 {
   static TypeId tid = TypeId ("ns3::OnoeWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<OnoeWifiManager> ()
     .AddAttribute ("UpdatePeriod",
                    "The interval between decisions about rate control changes",
diff -Naur ns-3.22/src/wifi/model/parf-wifi-manager.cc ns-3.23/src/wifi/model/parf-wifi-manager.cc
--- ns-3.22/src/wifi/model/parf-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/parf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -62,6 +62,7 @@
 {
   static TypeId tid = TypeId ("ns3::ParfWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<ParfWifiManager> ()
     .AddAttribute ("AttemptThreshold",
                    "The minimum number of transmission attempts to try a new power or rate.",
diff -Naur ns-3.22/src/wifi/model/qos-tag.cc ns-3.23/src/wifi/model/qos-tag.cc
--- ns-3.22/src/wifi/model/qos-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/qos-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,7 @@
 {
   static TypeId tid = TypeId ("ns3::QosTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<QosTag> ()
     .AddAttribute ("tid", "The tid that indicates AC which packet belongs",
                    UintegerValue (0),
diff -Naur ns-3.22/src/wifi/model/regular-wifi-mac.cc ns-3.23/src/wifi/model/regular-wifi-mac.cc
--- ns-3.22/src/wifi/model/regular-wifi-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/regular-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -651,6 +651,7 @@
 {
   static TypeId tid = TypeId ("ns3::RegularWifiMac")
     .SetParent<WifiMac> ()
+    .SetGroupName ("Wifi")
     .AddAttribute ("QosSupported",
                    "This Boolean attribute is set to enable 802.11e/WMM-style QoS support at this STA",
                    BooleanValue (false),
diff -Naur ns-3.22/src/wifi/model/rraa-wifi-manager.cc ns-3.23/src/wifi/model/rraa-wifi-manager.cc
--- ns-3.22/src/wifi/model/rraa-wifi-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/rraa-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
 {
   static TypeId tid = TypeId ("ns3::RraaWifiManager")
     .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<RraaWifiManager> ()
     .AddAttribute ("Basic",
                    "If true the RRAA-BASIC algorithm will be used, otherwise the RRAA wil be used",
diff -Naur ns-3.22/src/wifi/model/snr-tag.cc ns-3.23/src/wifi/model/snr-tag.cc
--- ns-3.22/src/wifi/model/snr-tag.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/snr-tag.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
 {
   static TypeId tid = TypeId ("ns3::SnrTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<SnrTag> ()
     .AddAttribute ("Snr", "The snr of the last packet received",
                    DoubleValue (0.0),
diff -Naur ns-3.22/src/wifi/model/sta-wifi-mac.cc ns-3.23/src/wifi/model/sta-wifi-mac.cc
--- ns-3.22/src/wifi/model/sta-wifi-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/sta-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -66,6 +66,7 @@
 {
   static TypeId tid = TypeId ("ns3::StaWifiMac")
     .SetParent<RegularWifiMac> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<StaWifiMac> ()
     .AddAttribute ("ProbeRequestTimeout", "The interval between two consecutive probe request attempts.",
                    TimeValue (Seconds (0.05)),
diff -Naur ns-3.22/src/wifi/model/wifi-channel.cc ns-3.23/src/wifi/model/wifi-channel.cc
--- ns-3.22/src/wifi/model/wifi-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,6 +42,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiChannel")
     .SetParent<Channel> ()
+    .SetGroupName ("Wifi")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/wifi/model/wifi-information-element-vector.cc ns-3.23/src/wifi/model/wifi-information-element-vector.cc
--- ns-3.22/src/wifi/model/wifi-information-element-vector.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-information-element-vector.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,6 +43,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiInformationElementVector")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<WifiInformationElementVector> ();
   return tid;
 }
diff -Naur ns-3.22/src/wifi/model/wifi-mac.cc ns-3.23/src/wifi/model/wifi-mac.cc
--- ns-3.22/src/wifi/model/wifi-mac.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
@@ -139,6 +139,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiMac")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
     .AddAttribute ("CtsTimeout", "When this timeout expires, the RTS/CTS handshake has failed.",
                    TimeValue (GetDefaultCtsAckTimeout ()),
                    MakeTimeAccessor (&WifiMac::SetCtsTimeout,
@@ -373,8 +374,6 @@
 {
   Configure80211g ();
   SetRifs(MicroSeconds (2));
-  SetCtsTimeout (MicroSeconds (10 + 52 + 20 + GetDefaultMaxPropagationDelay ().GetMicroSeconds () * 2));
-  SetAckTimeout (MicroSeconds (10 + 52 + 20 + GetDefaultMaxPropagationDelay ().GetMicroSeconds () * 2));
   SetBasicBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultBasicBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
   SetCompressedBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultCompressedBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
 }
@@ -383,8 +382,6 @@
 {
   Configure80211a ();
   SetRifs(MicroSeconds (2));
-  SetCtsTimeout (MicroSeconds (10 + 52 + 20 + GetDefaultMaxPropagationDelay ().GetMicroSeconds () * 2));
-  SetAckTimeout (MicroSeconds (10 + 52 + 20 + GetDefaultMaxPropagationDelay ().GetMicroSeconds () * 2));
   SetBasicBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultBasicBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
   SetCompressedBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultCompressedBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
 }
diff -Naur ns-3.22/src/wifi/model/wifi-mac-header.cc ns-3.23/src/wifi/model/wifi-mac-header.cc
--- ns-3.22/src/wifi/model/wifi-mac-header.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -956,6 +956,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiMacHeader")
     .SetParent<Header> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<WifiMacHeader> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/wifi-mac-queue.cc ns-3.23/src/wifi/model/wifi-mac-queue.cc
--- ns-3.22/src/wifi/model/wifi-mac-queue.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-mac-queue.cc	2015-05-13 11:05:27.000000000 -0700
@@ -45,6 +45,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiMacQueue")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<WifiMacQueue> ()
     .AddAttribute ("MaxPacketNumber", "If a packet arrives when there are already this number of packets, it is dropped.",
                    UintegerValue (400),
diff -Naur ns-3.22/src/wifi/model/wifi-mac-trailer.cc ns-3.23/src/wifi/model/wifi-mac-trailer.cc
--- ns-3.22/src/wifi/model/wifi-mac-trailer.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-mac-trailer.cc	2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiMacTrailer")
     .SetParent<Trailer> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<WifiMacTrailer> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/wifi-net-device.cc ns-3.23/src/wifi/model/wifi-net-device.cc
--- ns-3.22/src/wifi/model/wifi-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,6 +42,7 @@
   static TypeId tid = TypeId ("ns3::WifiNetDevice")
     .SetParent<NetDevice> ()
     .AddConstructor<WifiNetDevice> ()
+    .SetGroupName ("Wifi")
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (MAX_MSDU_SIZE - LLC_SNAP_HEADER_LENGTH),
                    MakeUintegerAccessor (&WifiNetDevice::SetMtu,
diff -Naur ns-3.22/src/wifi/model/wifi-phy.cc ns-3.23/src/wifi/model/wifi-phy.cc
--- ns-3.22/src/wifi/model/wifi-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-phy.cc	2015-05-13 11:05:27.000000000 -0700
@@ -55,6 +55,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiPhy")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
     .AddTraceSource ("PhyTxBegin",
                      "Trace source indicating a packet "
                      "has begun transmitting over the channel medium",
@@ -169,7 +170,7 @@
 
 //return L-SIG
 Time
-WifiPhy::GetPlcpHtSigHeaderDuration (WifiMode payloadMode, WifiPreamble preamble)
+WifiPhy::GetPlcpHtSigHeaderDuration (WifiPreamble preamble)
 {
          switch (preamble)
             {
@@ -578,11 +579,21 @@
   WifiMode payloadMode=txvector.GetMode();
   Time duration = GetPlcpPreambleDuration (payloadMode, preamble)
     + GetPlcpHeaderDuration (payloadMode, preamble)
-    + GetPlcpHtSigHeaderDuration (payloadMode, preamble)
+    + GetPlcpHtSigHeaderDuration (preamble)
     + GetPlcpHtTrainingSymbolDuration (preamble, txvector)
     + GetPayloadDuration (size, txvector, preamble, frequency, packetType, incFlag);
   return duration;
 }
+Time
+WifiPhy::CalculatePlcpDuration (WifiTxVector txvector, WifiPreamble preamble)
+{
+  WifiMode payloadMode=txvector.GetMode();
+  Time duration = GetPlcpPreambleDuration (payloadMode, preamble)
+    + GetPlcpHeaderDuration (payloadMode, preamble)
+    + GetPlcpHtSigHeaderDuration (preamble)
+    + GetPlcpHtTrainingSymbolDuration (preamble, txvector);
+  return duration;
+}
 
 void
 WifiPhy::NotifyTxBegin (Ptr<const Packet> packet)
diff -Naur ns-3.22/src/wifi/model/wifi-phy.h ns-3.23/src/wifi/model/wifi-phy.h
--- ns-3.22/src/wifi/model/wifi-phy.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-phy.h	2015-05-13 11:05:27.000000000 -0700
@@ -160,10 +160,10 @@
   /**
    * arg1: packet received successfully
    * arg2: snr of packet
-   * arg3: mode of packet
+   * arg3: TXVECTOR of packet
    * arg4: type of preamble used for packet.
    */
-  typedef Callback<void,Ptr<Packet>, double, WifiMode, enum WifiPreamble> RxOkCallback;
+  typedef Callback<void,Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> RxOkCallback;
   /**
    * arg1: packet received unsuccessfully
    * arg2: snr of packet
@@ -295,6 +295,13 @@
    *          the transmission of these bytes.
    */
   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 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.
+   */
+  Time CalculatePlcpDuration (WifiTxVector txvector, enum WifiPreamble preamble);
 
   /**
    * \param preamble the type of preamble
@@ -311,12 +318,11 @@
    */
   static WifiMode GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble);
   /** 
-   * \param payloadMode the WifiMode use for the transmission of the payload
    * \param preamble the type of preamble
    * 
    * \return the duration of the HT-SIG in Mixed Format and greenfield format PLCP header 
    */
-  static Time GetPlcpHtSigHeaderDuration (WifiMode payloadMode, WifiPreamble preamble);
+  static Time GetPlcpHtSigHeaderDuration (WifiPreamble preamble);
 
 
   /** 
diff -Naur ns-3.22/src/wifi/model/wifi-phy-state-helper.cc ns-3.23/src/wifi/model/wifi-phy-state-helper.cc
--- ns-3.22/src/wifi/model/wifi-phy-state-helper.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-phy-state-helper.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,6 +34,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiPhyStateHelper")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<WifiPhyStateHelper> ()
     .AddTraceSource ("State",
                      "The state of the PHY layer",
@@ -414,14 +415,14 @@
 }
 
 void
-WifiPhyStateHelper::SwitchFromRxEndOk (Ptr<Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble)
+WifiPhyStateHelper::SwitchFromRxEndOk (Ptr<Packet> packet, double snr, WifiTxVector txVector, enum WifiPreamble preamble)
 {
-  m_rxOkTrace (packet, snr, mode, preamble);
+  m_rxOkTrace (packet, snr, txVector.GetMode(), preamble);
   NotifyRxEndOk ();
   DoSwitchFromRx ();
   if (!m_rxOkCallback.IsNull ())
     {
-      m_rxOkCallback (packet, snr, mode, preamble);
+      m_rxOkCallback (packet, snr, txVector, preamble);
     }
 
 }
diff -Naur ns-3.22/src/wifi/model/wifi-phy-state-helper.h ns-3.23/src/wifi/model/wifi-phy-state-helper.h
--- ns-3.22/src/wifi/model/wifi-phy-state-helper.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-phy-state-helper.h	2015-05-13 11:05:27.000000000 -0700
@@ -157,10 +157,10 @@
    *
    * \param packet the successfully received packet
    * \param snr the SNR of the received packet
-   * \param mode the transmission mode of the packet
+   * \param txVector TXVECTOR of the packet
    * \param preamble the preamble of the received packet
    */
-  void SwitchFromRxEndOk (Ptr<Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble);
+  void SwitchFromRxEndOk (Ptr<Packet> packet, double snr, WifiTxVector txVector, enum WifiPreamble preamble);
   /**
    * Switch from RX after the reception failed.
    *
diff -Naur ns-3.22/src/wifi/model/wifi-remote-station-manager.cc ns-3.23/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.22/src/wifi/model/wifi-remote-station-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/wifi-remote-station-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -79,6 +79,7 @@
 {
   static TypeId tid = TypeId ("ns3::HighLatencyDataTxVectorTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<HighLatencyDataTxVectorTag> ()  
     ;
   return tid;
@@ -148,6 +149,7 @@
 {
   static TypeId tid = TypeId ("ns3::HighLatencyRtsTxVectorTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<HighLatencyRtsTxVectorTag> ()  
     ;
   return tid;
@@ -216,6 +218,7 @@
 {
   static TypeId tid = TypeId ("ns3::HighLatencyCtsToSelfTxVectorTag")
     .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<HighLatencyCtsToSelfTxVectorTag> ()  
     ;
   return tid;
@@ -257,6 +260,7 @@
 {
   static TypeId tid = TypeId ("ns3::WifiRemoteStationManager")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
     .AddAttribute ("IsLowLatency", "If true, we attempt to modelize a so-called low-latency device: a device"
                    " where decisions about tx parameters can be made on a per-packet basis and feedback about the"
                    " transmission of each packet is obtained before sending the next. Otherwise, we modelize a "
@@ -320,6 +324,7 @@
 }
 
 WifiRemoteStationManager::WifiRemoteStationManager ()
+ : m_htSupported (false)
 {
 }
 
@@ -931,8 +936,9 @@
        i != m_bssBasicRateSet.end (); i++)
     {
       if ((!found || i->GetPhyRate () > mode.GetPhyRate ())
-          && i->GetPhyRate () <= reqMode.GetPhyRate ()
-          && i->GetModulationClass () == reqMode.GetModulationClass ())
+          && (i->GetPhyRate () <= reqMode.GetPhyRate ())
+          && ((i->GetModulationClass () == reqMode.GetModulationClass ())
+              || (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)))
         {
           mode = *i;
           // We've found a potentially-suitable transmit rate, but we
@@ -942,13 +948,13 @@
         }
     }
   if(HasHtSupported())
-      {
-        if (!found)
-          {
-            uint8_t mcs = GetDefaultMcs (); 
-            mode=  m_wifiPhy->McsToWifiMode (mcs); 
-          }
-        for (WifiMcsListIterator i = m_bssBasicMcsSet.begin ();
+    {
+      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); 
@@ -963,11 +969,13 @@
                 found = true;
               }
           }
+        }
       }
   // 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);
       return mode;
     }
 
@@ -1003,8 +1011,9 @@
        */
       if (thismode.IsMandatory ()
           && (!found || thismode.GetPhyRate () > mode.GetPhyRate ())
-          && thismode.GetPhyRate () <= reqMode.GetPhyRate ()
-          && thismode.GetModulationClass () == reqMode.GetModulationClass ())
+          && (thismode.GetPhyRate () <= reqMode.GetPhyRate ())
+          && ((thismode.GetModulationClass () == reqMode.GetModulationClass ()) ||
+             (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)))
         {
           mode = thismode;
           // As above; we've found a potentially-suitable transmit
diff -Naur ns-3.22/src/wifi/model/yans-error-rate-model.cc ns-3.23/src/wifi/model/yans-error-rate-model.cc
--- ns-3.22/src/wifi/model/yans-error-rate-model.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/yans-error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,7 @@
 {
   static TypeId tid = TypeId ("ns3::YansErrorRateModel")
     .SetParent<ErrorRateModel> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<YansErrorRateModel> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wifi/model/yans-wifi-channel.cc ns-3.23/src/wifi/model/yans-wifi-channel.cc
--- ns-3.22/src/wifi/model/yans-wifi-channel.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/yans-wifi-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::YansWifiChannel")
     .SetParent<WifiChannel> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<YansWifiChannel> ()
     .AddAttribute ("PropagationLossModel", "A pointer to the propagation loss model attached to this channel.",
                    PointerValue (),
@@ -124,7 +125,7 @@
 YansWifiChannel::Receive (uint32_t i, Ptr<Packet> packet, double *atts,
                           WifiTxVector txVector, WifiPreamble preamble) const
 {
-  m_phyList[i]->StartReceivePacket (packet, *atts, txVector, preamble,*(atts+1), NanoSeconds(*(atts+2)));
+  m_phyList[i]->StartReceivePlcp (packet, *atts, txVector, preamble,*(atts+1), NanoSeconds(*(atts+2)));
   delete[] atts;
 }
 
diff -Naur ns-3.22/src/wifi/model/yans-wifi-phy.cc ns-3.23/src/wifi/model/yans-wifi-phy.cc
--- ns-3.22/src/wifi/model/yans-wifi-phy.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/yans-wifi-phy.cc	2015-05-13 11:05:27.000000000 -0700
@@ -50,6 +50,7 @@
 {
   static TypeId tid = TypeId ("ns3::YansWifiPhy")
     .SetParent<WifiPhy> ()
+    .SetGroupName ("Wifi")
     .AddConstructor<YansWifiPhy> ()
     .AddAttribute ("EnergyDetectionThreshold",
                    "The energy of a received signal should be higher than "
@@ -172,8 +173,10 @@
   :  m_initialized (false),
     m_channelNumber (1),
     m_endRxEvent (),
+    m_endPlcpRxEvent(),
     m_channelStartingFrequency (0),
-    m_mpdusNum(0)
+    m_mpdusNum(0),
+    m_plcpSuccess (false)
 {
   NS_LOG_FUNCTION (this);
   m_random = CreateObject<UniformRandomVariable> ();
@@ -396,6 +399,7 @@
     {
     case YansWifiPhy::RX:
       NS_LOG_DEBUG ("drop packet because of channel switching while reception");
+      m_endPlcpRxEvent.Cancel();
       m_endRxEvent.Cancel ();
       goto switchChannel;
       break;
@@ -513,33 +517,37 @@
 {
   m_state->SetReceiveErrorCallback (callback);
 }
+
 void
-YansWifiPhy::StartReceivePacket (Ptr<Packet> packet,
-                                 double rxPowerDbm,
-                                 WifiTxVector txVector,
-                                 enum WifiPreamble preamble, 
-                                 uint8_t packetType, Time rxDuration)
+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);
   AmpduTag ampduTag;
+  
   rxPowerDbm += m_rxGainDb;
   double rxPowerW = DbmToW (rxPowerDbm);
-  WifiMode txMode = txVector.GetMode();
   Time endRx = Simulator::Now () + rxDuration;
+  Time plcpDuration = CalculatePlcpDuration (txVector, preamble);
 
   Ptr<InterferenceHelper::Event> event;
   event = m_interference.Add (packet->GetSize (),
-                              txMode,
+                              txVector,
                               preamble,
                               rxDuration,
-                              rxPowerW,
-		          txVector);  // we need it to calculate duration of HT training symbols
-
+                              rxPowerW);
+    
   switch (m_state->GetState ())
     {
     case YansWifiPhy::SWITCHING:
       NS_LOG_DEBUG ("drop packet because of channel switching");
       NotifyRxDrop (packet);
+      m_plcpSuccess = false;
       /*
        * Packets received on the upcoming channel are added to the event list
        * during the switching state. This way the medium can be correctly sensed
@@ -579,71 +587,79 @@
       break;
     case YansWifiPhy::CCA_BUSY:
     case YansWifiPhy::IDLE:
-      if (rxPowerW > m_edThresholdW)
+      if (rxPowerW > m_edThresholdW) //checked here, no need to check in the payload reception (current implementation assumes constant rx power over the packet duration)
         {
-          if (IsModeSupported (txMode) || IsMcsSupported(txMode))
+          if (preamble == WIFI_PREAMBLE_NONE && m_mpdusNum == 0)
             {
-              if (preamble != WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum == 0)
-                {
-                  //received the first MPDU in an MPDU
-                  m_mpdusNum = ampduTag.GetNoOfMpdus()-1;
-                }
-              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)
-                    {
-                      NS_LOG_DEBUG ("Missing MPDU from the A-MPDU " << m_mpdusNum - ampduTag.GetNoOfMpdus());
-                      m_mpdusNum = ampduTag.GetNoOfMpdus();
-                    }
-                  else
-                      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;
-                }
-              else if (preamble == WIFI_PREAMBLE_NONE && m_mpdusNum == 0)
-                {
-                  NS_LOG_DEBUG ("drop packet because no preamble has been received");
-                  NotifyRxDrop (packet);
-                  goto maybeCcaBusy;
-                }
-              NS_LOG_DEBUG ("sync to signal (power=" << rxPowerW << "W)");
-              // sync to signal
-              m_state->SwitchToRx (rxDuration);
-              NS_ASSERT (m_endRxEvent.IsExpired ());
-              NotifyRxBegin (packet);
-              m_interference.NotifyRxStart ();
-              m_endRxEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndReceive, this,
-                                                  packet,
-                                                  event);
+              NS_LOG_DEBUG ("drop packet because no preamble has been received");
+              NotifyRxDrop (packet);
+              goto maybeCcaBusy;
             }
-          else
+          else if (preamble == WIFI_PREAMBLE_NONE && m_plcpSuccess == false) // A-MPDU reception fails
             {
-              NS_LOG_DEBUG ("drop packet because it was sent using an unsupported mode (" << txMode << ")");
+              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)
+            {
+              //received the first MPDU in an MPDU
+              m_mpdusNum = ampduTag.GetNoOfMpdus()-1;
+            }
+           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)
+                {
+                    NS_LOG_DEBUG ("Missing MPDU from the A-MPDU " << m_mpdusNum - ampduTag.GetNoOfMpdus());
+                    m_mpdusNum = ampduTag.GetNoOfMpdus();
+                }
+              else
+                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
+          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_endRxEvent.IsExpired ());
+          m_endRxEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndReceive, this,
+                                              packet, preamble, packetType, event);
         }
       else
         {
           NS_LOG_DEBUG ("drop packet because signal power too Small (" <<
                         rxPowerW << "<" << m_edThresholdW << ")");
           NotifyRxDrop (packet);
+          m_plcpSuccess = false;
           goto maybeCcaBusy;
         }
       break;
     case YansWifiPhy::SLEEP:
       NS_LOG_DEBUG ("drop packet because in sleep mode");
       NotifyRxDrop (packet);
+      m_plcpSuccess = false;
       break;
     }
 
   return;
-
-maybeCcaBusy:
+  
+  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
@@ -655,6 +671,45 @@
       m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd);
     }
 }
+void
+YansWifiPhy::StartReceivePacket (Ptr<Packet> packet,
+                                 WifiTxVector txVector,
+                                 enum WifiPreamble preamble, 
+                                 uint8_t packetType,
+                                 Ptr<InterferenceHelper::Event> event)
+{
+  NS_LOG_FUNCTION (this << packet << txVector.GetMode()<< preamble << (uint32_t)packetType);
+  NS_ASSERT (IsStateRx ());
+  NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
+  AmpduTag ampduTag;
+  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;
+      }
+}
 
 void
 YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
@@ -667,7 +722,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");
@@ -678,6 +733,7 @@
   Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble, GetFrequency(), packetType, 1);
   if (m_state->IsStateRx ())
     {
+      m_endPlcpRxEvent.Cancel ();
       m_endRxEvent.Cancel ();
       m_interference.NotifyRxEnd ();
     }
@@ -947,19 +1003,22 @@
 }
 
 void
-YansWifiPhy::EndReceive (Ptr<Packet> packet, Ptr<InterferenceHelper::Event> event)
+YansWifiPhy::EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, uint8_t packetType, Ptr<InterferenceHelper::Event> event)
 {
   NS_LOG_FUNCTION (this << packet << event);
   NS_ASSERT (IsStateRx ());
   NS_ASSERT (event->GetEndTime () == Simulator::Now ());
 
   struct InterferenceHelper::SnrPer snrPer;
-  snrPer = m_interference.CalculateSnrPer (event);
+  snrPer = m_interference.CalculatePlcpPayloadSnrPer (event);
   m_interference.NotifyRxEnd ();
-
-  NS_LOG_DEBUG ("mode=" << (event->GetPayloadMode ().GetDataRate ()) <<
-                ", snr=" << snrPer.snr << ", per=" << snrPer.per << ", size=" << packet->GetSize ());
-  if (m_random->GetValue () > snrPer.per)
+  
+  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;
@@ -975,14 +1034,25 @@
       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->GetPayloadMode (), event->GetPreambleType ());
+      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)
+    {
+      m_plcpSuccess = false;
+    }
+    
 }
 
 int64_t
diff -Naur ns-3.22/src/wifi/model/yans-wifi-phy.h ns-3.23/src/wifi/model/yans-wifi-phy.h
--- ns-3.22/src/wifi/model/yans-wifi-phy.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/model/yans-wifi-phy.h	2015-05-13 11:05:27.000000000 -0700
@@ -100,21 +100,35 @@
   double GetChannelFrequencyMhz () const;
 
   /**
-   * Starting receiving the packet (i.e. the first bit of the preamble has arrived).
+   * Starting receiving the plcp of a packet (i.e. the first bit of the preamble has arrived).
    *
    * \param packet the arriving packet
    * \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 rxDuration the duration needed for the reception of the arriving packet
+   * \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);
+  /**
+   * 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 event the corresponding event of the first time the packet arrives
    */
   void StartReceivePacket (Ptr<Packet> packet,
-                           double rxPowerDbm,
                            WifiTxVector txVector,
                            WifiPreamble preamble,
                            uint8_t packetType,
-                           Time rxDuration);
+                           Ptr<InterferenceHelper::Event> event);
 
   /**
    * Sets the RX loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver.
@@ -462,13 +476,15 @@
    * The last bit of the packet has arrived.
    *
    * \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 event the corresponding event of the first time the packet arrives
    */
-  void EndReceive (Ptr<Packet> packet, Ptr<InterferenceHelper::Event> event);
+  void EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, uint8_t packetType, 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
@@ -533,6 +549,7 @@
   std::vector<uint32_t> m_bssMembershipSelectorSet;
   std::vector<uint8_t> m_deviceMcsSet;
   EventId m_endRxEvent;
+  EventId m_endPlcpRxEvent;
 
   Ptr<UniformRandomVariable> m_random;  //!< Provides uniform random variables.
   double m_channelStartingFrequency;    //!< Standard-dependent center frequency of 0-th channel in MHz
@@ -540,6 +557,7 @@
   InterferenceHelper m_interference;    //!< Pointer to InterferenceHelper
   Time m_channelSwitchDelay;            //!< Time required to switch between channel
   uint16_t m_mpdusNum;                  //!< carries the number of expected mpdus that are part of an A-MPDU
+  bool m_plcpSuccess;                   //!< Flag if the PLCP of the packet or the first MPDU in an A-MPDU has been received
 };
 
 } // namespace ns3
diff -Naur ns-3.22/src/wifi/test/wifi-aggregation-test.cc ns-3.23/src/wifi/test/wifi-aggregation-test.cc
--- ns-3.22/src/wifi/test/wifi-aggregation-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/src/wifi/test/wifi-aggregation-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,191 @@
+/* -*- 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>
+ */
+
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/object-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/mac-low.h"
+#include "ns3/edca-txop-n.h"
+#include "ns3/yans-wifi-phy.h"
+
+using namespace ns3;
+
+class TwoLevelAggregationTest : public TestCase
+{
+public:
+  TwoLevelAggregationTest ();
+
+private:
+  virtual void DoRun (void);
+  Ptr<MacLow> m_low;
+  Ptr<YansWifiPhy> m_phy;
+  Ptr<EdcaTxopN> m_edca;
+  Ptr<WifiRemoteStationManager> m_manager;
+  ObjectFactory m_factory;
+  Ptr<MpduAggregator> m_mpduAggregator;
+  Ptr<MsduAggregator> m_msduAggregator;
+};
+
+TwoLevelAggregationTest::TwoLevelAggregationTest ()
+  : TestCase ("Check the correctness of two-level aggregation operations")
+{
+}
+
+void
+TwoLevelAggregationTest::DoRun (void)
+{
+  /*
+   * Create and configure phy layer.
+   */
+  m_phy = CreateObject<YansWifiPhy> ();
+  m_phy->ConfigureStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
+
+  /*
+   * Create and configure manager.
+   */
+  m_factory = ObjectFactory ();
+  m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
+  m_factory.Set ("DataMode", StringValue ("OfdmRate65MbpsBW20MHz"));
+  m_manager = m_factory.Create<WifiRemoteStationManager> ();
+  m_manager->SetupPhy(m_phy);
+
+  /*
+   * Create and configure maclayer.
+   */
+  m_low = CreateObject<MacLow> ();
+  m_low->SetPhy(m_phy);
+  m_low->SetWifiRemoteStationManager (m_manager);
+
+  m_edca = CreateObject<EdcaTxopN> ();
+  m_edca->SetLow (m_low);
+  m_edca->SetAccessCategory (AC_BE);
+  m_edca->SetWifiRemoteStationManager (m_manager);
+  m_edca->CompleteConfig ();
+
+  /*
+   * Configure aggregation.
+   */
+  m_factory = ObjectFactory ();
+  m_factory.SetTypeId ("ns3::MsduStandardAggregator");
+  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_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.
+   */
+  Ptr<const Packet> pkt = Create<Packet> (1500);
+  Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
+  WifiMacHeader hdr, peekedHdr;
+  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:01"));
+  hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:02"));
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  Time tstamp;
+
+  //-----------------------------------------------------------------------------------------------------
+  
+  /*
+   * Test MSDU aggregation of two packets using MacLow::PerformMsduAggregation.
+   * 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_low->m_currentPacket = peekedPacket->Copy ();
+  m_low->m_currentHdr = peekedHdr;
+  
+  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");
+
+  //-----------------------------------------------------------------------------------------------------
+    
+  /*
+   * 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).
+   * This test is needed to ensure that no packets are removed from the queue in MacLow::PerformMsduAggregation, since aggregation will no occur in MacLow::AggregateToAmpdu.
+   */
+  m_factory = ObjectFactory ();
+  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
+  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);
+  
+  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).
+   * This test is needed to ensure that there is no issue when the queue is empty.
+   */
+  m_factory = ObjectFactory ();
+  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
+  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);
+  
+  result = (packet != 0);
+  NS_TEST_EXPECT_MSG_EQ (result, false, "aggregation failed to stop as queue is empty");
+  Simulator::Destroy ();
+}
+
+//-----------------------------------------------------------------------------
+class WifiAggregationTestSuite : public TestSuite
+{
+public:
+  WifiAggregationTestSuite ();
+};
+
+WifiAggregationTestSuite::WifiAggregationTestSuite ()
+  : TestSuite ("aggregation-wifi", UNIT)
+{
+  AddTestCase (new TwoLevelAggregationTest, TestCase::QUICK);
+}
+
+static WifiAggregationTestSuite g_wifiAggregationTestSuite;
diff -Naur ns-3.22/src/wifi/wscript ns-3.23/src/wifi/wscript
--- ns-3.22/src/wifi/wscript	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wifi/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -84,6 +84,7 @@
         'test/tx-duration-test.cc',
         'test/power-rate-adaptation-test.cc',
         'test/wifi-test.cc',
+        'test/wifi-aggregation-test.cc',
         ]
 
     headers = bld(features='ns3header')
diff -Naur ns-3.22/src/wimax/model/bandwidth-manager.cc ns-3.23/src/wimax/model/bandwidth-manager.cc
--- ns-3.22/src/wimax/model/bandwidth-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bandwidth-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -42,7 +42,8 @@
 TypeId BandwidthManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::BandwidthManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/bs-link-manager.cc ns-3.23/src/wimax/model/bs-link-manager.cc
--- ns-3.22/src/wimax/model/bs-link-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-link-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -41,7 +41,8 @@
 TypeId BSLinkManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::BSLinkManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/bs-net-device.cc ns-3.23/src/wimax/model/bs-net-device.cc
--- ns-3.22/src/wimax/model/bs-net-device.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-net-device.cc	2015-05-13 11:05:27.000000000 -0700
@@ -58,6 +58,8 @@
 
     .SetParent<WimaxNetDevice> ()
 
+    .SetGroupName("Wimax")
+
     .AddConstructor<BaseStationNetDevice> ()
 
     .AddAttribute ("BSScheduler",
diff -Naur ns-3.22/src/wimax/model/bs-scheduler.cc ns-3.23/src/wimax/model/bs-scheduler.cc
--- ns-3.22/src/wimax/model/bs-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -44,7 +44,7 @@
 TypeId
 BSScheduler::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BSScheduler").SetParent<Object> ();
+  static TypeId tid = TypeId ("ns3::BSScheduler").SetParent<Object> ().SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/bs-scheduler-rtps.cc ns-3.23/src/wimax/model/bs-scheduler-rtps.cc
--- ns-3.22/src/wimax/model/bs-scheduler-rtps.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-scheduler-rtps.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,7 +46,7 @@
 TypeId
 BSSchedulerRtps::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BSSchedulerRtps").SetParent<Object> ().AddConstructor<BSSchedulerRtps> ();
+  static TypeId tid = TypeId ("ns3::BSSchedulerRtps").SetParent<Object> ().SetGroupName("Wimax").AddConstructor<BSSchedulerRtps> ();
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/bs-scheduler-simple.cc ns-3.23/src/wimax/model/bs-scheduler-simple.cc
--- ns-3.22/src/wimax/model/bs-scheduler-simple.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-scheduler-simple.cc	2015-05-13 11:05:27.000000000 -0700
@@ -43,7 +43,7 @@
 
 TypeId BSSchedulerSimple::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BSSchedulerSimple").SetParent<Object> ().AddConstructor<BSSchedulerSimple> ();
+  static TypeId tid = TypeId ("ns3::BSSchedulerSimple").SetParent<Object> ().SetGroupName("Wimax").AddConstructor<BSSchedulerSimple> ();
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/bs-uplink-scheduler.cc ns-3.23/src/wimax/model/bs-uplink-scheduler.cc
--- ns-3.22/src/wimax/model/bs-uplink-scheduler.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-uplink-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -76,6 +76,7 @@
 {
   static TypeId tid = TypeId ("ns3::UplinkScheduler")
     .SetParent<Object> ()
+    .SetGroupName("Wimax")
   ;
   return tid;
 }
diff -Naur ns-3.22/src/wimax/model/bs-uplink-scheduler-mbqos.cc ns-3.23/src/wimax/model/bs-uplink-scheduler-mbqos.cc
--- ns-3.22/src/wimax/model/bs-uplink-scheduler-mbqos.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-uplink-scheduler-mbqos.cc	2015-05-13 11:05:27.000000000 -0700
@@ -58,6 +58,8 @@
 
     .SetParent<UplinkScheduler> ()
 
+    .SetGroupName("Wimax")
+
     .AddAttribute ("WindowInterval",
                    "The time to wait to reset window",
                    TimeValue (Seconds (1.0)),
diff -Naur ns-3.22/src/wimax/model/bs-uplink-scheduler-rtps.cc ns-3.23/src/wimax/model/bs-uplink-scheduler-rtps.cc
--- ns-3.22/src/wimax/model/bs-uplink-scheduler-rtps.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-uplink-scheduler-rtps.cc	2015-05-13 11:05:27.000000000 -0700
@@ -71,7 +71,7 @@
 TypeId
 UplinkSchedulerRtps::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::UplinkSchedulerRtps").SetParent<UplinkScheduler> ();
+  static TypeId tid = TypeId ("ns3::UplinkSchedulerRtps").SetParent<UplinkScheduler> ().SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/bs-uplink-scheduler-simple.cc ns-3.23/src/wimax/model/bs-uplink-scheduler-simple.cc
--- ns-3.22/src/wimax/model/bs-uplink-scheduler-simple.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/bs-uplink-scheduler-simple.cc	2015-05-13 11:05:27.000000000 -0700
@@ -75,7 +75,7 @@
 TypeId
 UplinkSchedulerSimple::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::UplinkSchedulerSimple").SetParent<Object> ();
+  static TypeId tid = TypeId ("ns3::UplinkSchedulerSimple").SetParent<Object> ().SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/burst-profile-manager.cc ns-3.23/src/wimax/model/burst-profile-manager.cc
--- ns-3.22/src/wimax/model/burst-profile-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/burst-profile-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -36,7 +36,8 @@
 TypeId BurstProfileManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::BurstProfileManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/connection-manager.cc ns-3.23/src/wimax/model/connection-manager.cc
--- ns-3.22/src/wimax/model/connection-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/connection-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,7 +40,8 @@
 TypeId ConnectionManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ConnectionManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/default-traces.h ns-3.23/src/wimax/model/default-traces.h
--- ns-3.22/src/wimax/model/default-traces.h	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/default-traces.h	2015-05-13 11:05:27.000000000 -0700
@@ -54,6 +54,22 @@
  * The multipath channel is simulated using the TDL_channel class of
  * the IT++ library.
  *
+ *
+ * The file format should be as follows
+ *
+ * SNR_value1   BER  Blc_ER  STANDARD_DEVIATION  CONFIDENCE_INTERVAL1  CONFIDENCE_INTERVAL2
+ * SNR_value2   BER  Blc_ER  STANDARD_DEVIATION  CONFIDENCE_INTERVAL1  CONFIDENCE_INTERVAL2
+ *  ...          ...  ...     ...                 ...                   ...
+ *
+ *
+ *  Aditional notes: from Esteban Municio   <esteban.municio@urjc.es>
+ *
+ *  This trace file has been edited for the 16 QAM 3/4 modulation (modulation4) since the original SNR traces for
+ *  this modulation were not long enough, giving inflated BER and BLER figures for typical SNR values. Due to the impossibility
+ *  to get the original IT++ environment used for the original traces by the previous authors, the traces of modulation4 have
+ *  been generated using a simple IT++ program simulating the theoretical model of a AWGN channel
+ *  given BER=3/2*erfc(sqrt(k*0.1*(Eb_N0_dB)));
+ *
  * \relates ns3::SNRToBlockErrorRateManager
  * \hideinitializer
  * @{
@@ -254,66 +270,187 @@
     0.00000, 0.00030, 0.00048, 0.00079, 0.00048, 0.00030, 0.00030, 0.00079, 0.00000 }
 };
 
-static const double modulation4[6][115] = {
+static const double modulation4[6][331] = {
 
-  { 20.00, 20.10, 20.20, 20.30, 20.40, 20.50, 20.60, 20.70, 20.80, 20.90, 21.00, 21.10, 21.20, 21.30, 21.40, 21.50,
-    21.60, 21.70, 21.80, 21.90, 22.00, 22.10, 22.20, 22.30, 22.40, 22.50, 22.60, 22.70, 22.80, 22.90, 23.00, 23.10,
-    23.20, 23.30, 23.40, 23.50, 23.60, 23.70, 23.80, 23.90, 24.00, 24.10, 24.20, 24.30, 24.40, 24.50, 24.60, 24.70,
-    24.80, 24.90, 25.00, 25.10, 25.20, 25.30, 25.40, 25.50, 25.60, 25.70, 25.80, 25.90, 26.00, 26.10, 26.20, 26.30,
-    26.40, 26.50, 26.60, 26.70, 26.80, 26.90, 27.10, 27.20, 27.30, 27.40, 27.50, 27.60, 27.70, 27.80, 27.90, 28.00,
-    28.10, 28.20, 28.30, 28.40, 28.50, 28.60, 28.70, 28.80, 28.90, 29.00, 29.10, 29.20, 29.30, 29.40, 29.50, 29.60,
-    29.70, 29.80, 29.90, 30.00, 30.10, 30.20, 30.30, 30.40, 30.50, 30.60, 30.70, 30.80, 30.90, 31.00, 31.10, 31.20,
-    31.30, 31.40, 31.50 },
-
-  { 0.33107, 0.32310, 0.31789, 0.31805, 0.31352, 0.30854, 0.30697, 0.29615, 0.29218, 0.28319, 0.27982, 0.27112, 0.27369,
-    0.26701, 0.26180, 0.25450, 0.25144, 0.24541, 0.23739, 0.23148, 0.23259, 0.23020, 0.22530, 0.21333, 0.20806, 0.20799,
-    0.19834, 0.19916, 0.19431, 0.18956, 0.18273, 0.18543, 0.17783, 0.17627, 0.17182, 0.16563, 0.15979, 0.15714, 0.15541,
-    0.15025, 0.14868, 0.14430, 0.13602, 0.13636, 0.13467, 0.12758, 0.12542, 0.12828, 0.12015, 0.11889, 0.11511, 0.10993,
-    0.10791, 0.10339, 0.10542, 0.10187, 0.09945, 0.09516, 0.08852, 0.09033, 0.09222, 0.08730, 0.08405, 0.08084, 0.08054,
-    0.07719, 0.07267, 0.06947, 0.07170, 0.06786, 0.06610, 0.06346, 0.05817, 0.06174, 0.06139, 0.05859, 0.05682, 0.05319,
-    0.05322, 0.05096, 0.05004, 0.04921, 0.04771, 0.04506, 0.04220, 0.04323, 0.04337, 0.04082, 0.04035, 0.03932, 0.03570,
-    0.03526, 0.03798, 0.03680, 0.03391, 0.03413, 0.03184, 0.02968, 0.02886, 0.02931, 0.02955, 0.02795, 0.02603, 0.02478,
-    0.02541, 0.02669, 0.02407, 0.02403, 0.02353, 0.02260, 0.02004, 0.02105, 0.02135, 0.01855, 0.02085 },
-
-  { 0.68910, 0.67470, 0.66370, 0.66340, 0.65400, 0.64460, 0.64120, 0.61740, 0.61020, 0.59290, 0.58240, 0.56690, 0.57110,
-    0.55810, 0.54650, 0.53130, 0.52610, 0.51200, 0.49810, 0.48530, 0.48690, 0.48150, 0.47100, 0.44610, 0.43360, 0.43630,
-    0.41640, 0.41670, 0.40760, 0.39680, 0.38090, 0.38680, 0.37150, 0.36880, 0.36050, 0.34570, 0.33380, 0.32750, 0.32550,
-    0.31570, 0.31170, 0.30200, 0.28510, 0.28540, 0.28240, 0.26730, 0.26210, 0.26730, 0.25150, 0.24950, 0.24100, 0.23150,
-    0.22630, 0.21650, 0.22150, 0.21430, 0.20760, 0.19990, 0.18610, 0.18940, 0.19290, 0.18350, 0.17690, 0.16830, 0.17030,
-    0.16210, 0.15310, 0.14570, 0.14960, 0.14150, 0.13860, 0.13350, 0.12300, 0.12880, 0.12900, 0.12350, 0.11900, 0.11280,
-    0.11120, 0.10710, 0.10500, 0.10350, 0.10030, 0.09460, 0.08850, 0.09070, 0.09010, 0.08600, 0.08490, 0.08210, 0.07550,
-    0.07440, 0.07960, 0.07740, 0.07190, 0.07100, 0.06770, 0.06190, 0.06050, 0.06170, 0.06200, 0.05870, 0.05490, 0.05240,
-    0.05300, 0.05540, 0.05070, 0.05070, 0.04940, 0.04670, 0.04440, 0.04240, 0.04300, 0.04100, 0.04200 },
-
-  { 0.21424, 0.21948, 0.22320, 0.22330, 0.22628, 0.22909, 0.23006, 0.23622, 0.23786, 0.24137, 0.24321, 0.24552, 0.24494,
-    0.24662, 0.24784, 0.24902, 0.24932, 0.24986, 0.25000, 0.24978, 0.24983, 0.24966, 0.24916, 0.24710, 0.24559, 0.24594,
-    0.24301, 0.24306, 0.24146, 0.23935, 0.23581, 0.23719, 0.23349, 0.23279, 0.23054, 0.22619, 0.22238, 0.22024, 0.21955,
-    0.21603, 0.21454, 0.21080, 0.20382, 0.20395, 0.20265, 0.19585, 0.19340, 0.19585, 0.18825, 0.18725, 0.18292, 0.17791,
-    0.17509, 0.16963, 0.17244, 0.16838, 0.16450, 0.15994, 0.15147, 0.15353, 0.15569, 0.14983, 0.14561, 0.13997, 0.14130,
-    0.13582, 0.12966, 0.12447, 0.12722, 0.12148, 0.11939, 0.11568, 0.10787, 0.11221, 0.11236, 0.10825, 0.10484, 0.10008,
-    0.09884, 0.09563, 0.09398, 0.09279, 0.09024, 0.08565, 0.08067, 0.08247, 0.08198, 0.07860, 0.07769, 0.07536, 0.06980,
-    0.06886, 0.07326, 0.07141, 0.06673, 0.06596, 0.06312, 0.05807, 0.05684, 0.05789, 0.05816, 0.05525, 0.05189, 0.04965,
-    0.05019, 0.05233, 0.04813, 0.04813, 0.04696, 0.04452, 0.04060, 0.04243, 0.04115, 0.03932, 0.04024 },
-
-  { 0.68003, 0.66552, 0.65444, 0.65414, 0.64468, 0.63522, 0.63180, 0.60787, 0.60064, 0.58327, 0.57273, 0.55719, 0.56140,
-    0.54837, 0.53674, 0.52152, 0.51631, 0.50220, 0.48830, 0.47550, 0.47710, 0.47171, 0.46122, 0.43636, 0.42389, 0.42658,
-    0.40674, 0.40704, 0.39797, 0.38721, 0.37138, 0.37725, 0.36203, 0.35934, 0.35109, 0.33638, 0.32456, 0.31830, 0.31632,
-    0.30659, 0.30262, 0.29300, 0.27625, 0.27655, 0.27358, 0.25863, 0.25348, 0.25863, 0.24300, 0.24102, 0.23262, 0.22323,
-    0.21810, 0.20843, 0.21336, 0.20626, 0.19965, 0.19206, 0.17847, 0.18172, 0.18517, 0.17591, 0.16942, 0.16097, 0.16293,
-    0.15488, 0.14604, 0.13878, 0.14261, 0.13467, 0.13183, 0.12683, 0.11656, 0.12223, 0.12243, 0.11705, 0.11265, 0.10660,
-    0.10504, 0.10104, 0.09899, 0.09753, 0.09441, 0.08886, 0.08293, 0.08507, 0.08449, 0.08050, 0.07944, 0.07672, 0.07032,
-    0.06926, 0.07429, 0.07216, 0.06684, 0.06597, 0.06278, 0.05718, 0.05583, 0.05698, 0.05727, 0.05409, 0.05044, 0.04803,
-    0.04861, 0.05092, 0.04640, 0.04640, 0.04515, 0.04256, 0.03845, 0.04036, 0.03043, 0.02871, 0.02957 },
-
-  { 0.69817, 0.68388, 0.67296, 0.67266, 0.66332, 0.65398, 0.65060, 0.62693, 0.61976, 0.60253, 0.59207, 0.57661, 0.58080,
-    0.56783, 0.55626, 0.54108, 0.53589, 0.52180, 0.50790, 0.49510, 0.49670, 0.49129, 0.48078, 0.45584, 0.44331, 0.44602,
-    0.42606, 0.42636, 0.41723, 0.40639, 0.39042, 0.39635, 0.38097, 0.37826, 0.36991, 0.35502, 0.34304, 0.33670, 0.33468,
-    0.32481, 0.32078, 0.31100, 0.29395, 0.29425, 0.29122, 0.27597, 0.27072, 0.27597, 0.26000, 0.25798, 0.24938, 0.23977,
-    0.23450, 0.22457, 0.22964, 0.22234, 0.21555, 0.20774, 0.19373, 0.19708, 0.20063, 0.19109, 0.18438, 0.17563, 0.17767,
-    0.16932, 0.16016, 0.15262, 0.15659, 0.14833, 0.14537, 0.14017, 0.12944, 0.13537, 0.13557, 0.12995, 0.12535, 0.11900,
-    0.11736, 0.11316, 0.11101, 0.10947, 0.10619, 0.10034, 0.09407, 0.09633, 0.09571, 0.09150, 0.09036, 0.08748, 0.08068,
-    0.07954, 0.08490, 0.08264, 0.07696, 0.07603, 0.07262, 0.06662, 0.06517, 0.06642, 0.06673, 0.06331, 0.05937, 0.05677,
-    0.05739, 0.05988, 0.05500, 0.05500, 0.05365, 0.05084, 0.04635, 0.04844, 0.05557, 0.05329, 0.05443 },
+  {20,20.1,20.2,20.3,20.4,20.5,20.6,20.7,20.8,20.9,21,21.1,21.2,21.3,21.4,21.5,21.6,21.7,
+   21.8,21.9,22,22.1,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,
+   23.6,23.7,23.8,23.9,24,24.1,24.2,24.3,24.4,24.5,24.6,24.7,24.8,24.9,25,25.1,25.2,25.3,
+   25.4,25.5,25.6,25.7,25.8,25.9,26,26.1,26.2,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27,27.1,
+   27.2,27.3,27.4,27.5,27.6,27.7,27.8,27.9,28,28.1,28.2,28.3,28.4,28.5,28.6,28.7,28.8,28.9,
+   29,29.1,29.2,29.3,29.4,29.5,29.6,29.7,29.8,29.9,30,30.1,30.2,30.3,30.4,30.5,30.6,30.7,
+   30.8,30.9,31,31.1,31.2,31.3,31.4,31.5,31.6,31.7,31.8,31.9,32,32.1,32.2,32.3,32.4,32.5,
+   32.6,32.7,32.8,32.9,33,33.1,33.2,33.3,33.4,33.5,33.6,33.7,33.8,33.9,34,34.1,34.2,34.3,
+   34.4,34.5,34.6,34.7,34.8,34.9,35,35.1,35.2,35.3,35.4,35.5,35.6,35.7,35.8,35.9,36,36.1,
+   36.2,36.3,36.4,36.5,36.6,36.7,36.8,36.9,37,37.1,37.2,37.3,37.4,37.5,37.6,37.7,37.8,37.9,
+   38,38.1,38.2,38.3,38.4,38.5,38.6,38.7,38.8,38.9,39,39.1,39.2,39.3,39.4,39.5,39.6,39.7,
+   39.8,39.9,40,40.1,40.2,40.3,40.4,40.5,40.6,40.7,40.8,40.9,41,41.1,41.2,41.3,41.4,41.5,
+   41.6,41.7,41.8,41.9,42,42.1,42.2,42.3,42.4,42.5,42.6,42.7,42.8,42.9,43,43.1,43.2,43.3,
+   43.4,43.5,43.6,43.7,43.8,43.9,44,44.1,44.2,44.3,44.4,44.5,44.6,44.7,44.8,44.9,45,45.1,
+   45.2,45.3,45.4,45.5,45.6,45.7,45.8,45.9,46,46.1,46.2,46.3,46.4,46.5,46.6,46.7,46.8,46.9,
+   47,47.1,47.2,47.3,47.4,47.5,47.6,47.7,47.8,47.9,48,48.1,48.2,48.3,48.4,48.5,48.6,48.7,
+   48.8,48.9,49,49.1,49.2,49.3,49.4,49.5,49.6,49.7,49.8,49.9,50,50.1,50.2,50.3,50.4,50.5,
+   50.6,50.7,50.8,50.9,51,51.1,51.2,51.3,51.4,51.5,51.6,51.7,51.8,51.9,52,52.1,52.2,52.3,
+   52.4,52.5,52.6,52.7,52.8,52.9,53},
+
+  {0.473383,0.465027,0.456673,0.448325,0.439984,0.431653,0.423335,0.415032,0.406746,0.398480,0.390237,
+  0.382020,0.373830,0.365672,0.357547,0.349458,0.341409,0.333402,0.325439,0.317525,0.309662,0.301852,
+  0.294099,0.286406,0.278776,0.271211,0.263714,0.256290,0.248939,0.241667,0.234474,0.227364,0.220341,
+  0.213406,0.206562,0.199813,0.193161,0.186608,0.180156,0.173809,0.167569,0.161438,0.155418,0.149511,
+  0.143719,0.138045,0.132489,0.127053,0.121740,0.116550,0.111485,0.106546,0.101733,0.097049,0.092492,
+  0.088064,0.083766,0.079597,0.075558,0.071648,0.067867,0.064215,0.060691,0.057295,0.054025,0.050880,
+  0.047860,0.044962,0.042185,0.039528,0.036989,0.034565,0.032255,0.030056,0.027965,0.025981,0.024101,
+  0.022322,0.020641,0.019055,0.017561,0.016157,0.014839,0.013604,0.012449,0.011371,0.010366,0.009431,
+  0.008563,0.007760,0.007017,0.006331,0.005700,0.005120,0.004589,0.004103,0.003660,0.003256,0.002890,
+  0.002558,0.002259,0.001989,0.001747,0.001529,0.001335,0.001162,0.001009,0.000873,0.000753,0.000647,
+  0.000555,0.000474,0.000403,0.000342,0.000289,0.000243,0.000204,0.000170,0.000142,0.000117,0.000097,
+  0.000080,0.000065,0.000053,0.000043,0.000035,0.000028,0.000022,0.000018,0.000014,0.000011,0.000009,
+  0.000007,0.000005,0.000004,0.000003,0.000002,0.000002,0.000001,0.000001,0.000001,0.000001,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000},
+
+  {0.899428,0.883551,0.867679,0.851817,0.835970,0.820141,0.804337,0.788561,0.772818,0.757113,0.741451,
+  0.725838,0.710278,0.694776,0.679339,0.663970,0.648677,0.633463,0.618335,0.603298,0.588357,0.573519,
+  0.558789,0.544172,0.529674,0.515300,0.501058,0.486950,0.472985,0.459166,0.445500,0.431992,0.418647,
+  0.405471,0.392468,0.379645,0.367005,0.354554,0.342297,0.330238,0.318382,0.306732,0.295294,0.284071,
+  0.273066,0.262285,0.251729,0.241402,0.231306,0.221446,0.211822,0.202437,0.193293,0.184392,0.175735,
+  0.167322,0.159155,0.151234,0.143559,0.136131,0.128947,0.122008,0.115313,0.108860,0.102647,0.096672,
+  0.090933,0.085428,0.080152,0.075104,0.070279,0.065674,0.061284,0.057106,0.053134,0.049364,0.045792,
+  0.042411,0.039217,0.036204,0.033367,0.030699,0.028194,0.025848,0.023653,0.021604,0.019695,0.017919,
+  0.016271,0.014743,0.013332,0.012029,0.010830,0.009728,0.008719,0.007796,0.006953,0.006187,0.005491,
+  0.004861,0.004292,0.003779,0.003318,0.002906,0.002537,0.002209,0.001917,0.001659,0.001430,0.001230,
+  0.001054,0.000900,0.000766,0.000649,0.000549,0.000462,0.000387,0.000324,0.000269,0.000223,0.000184,
+  0.000151,0.000124,0.000101,0.000082,0.000066,0.000053,0.000042,0.000034,0.000027,0.000021,0.000016,
+  0.000013,0.000010,0.000008,0.000006,0.000004,0.000003,0.000003,0.000002,0.000001,0.000001,0.000001,
+  0.000001,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000},
+
+  {0.163210,0.176020,0.187600,0.194680,0.203900,0.213060,0.224650,0.229210,0.234400,0.242200,0.245430,
+  0.248200,0.249480,0.249980,0.249410,0.247290,0.245040,0.242130,0.237250,0.230790,0.224780,0.217600,
+  0.209440,0.198020,0.192010,0.188000,0.177640,0.167520,0.158250,0.152220,0.143330,0.129380,0.125460,
+  0.114500,0.113030,0.100460,0.097670,0.091910,0.085250,0.079510,0.073260,0.063030,0.063890,0.054640,
+  0.053480,0.046690,0.046600,0.041060,0.035260,0.029190,0.029290,0.026180,0.023140,0.022570,0.022380,
+  0.018160,0.018540,0.013030,0.014970,0.012340,0.012250,0.009800,0.009900,0.007340,0.009020,0.009610,
+  0.004680,0.005960,0.005170,0.005370,0.003690,0.003880,0.003690,0.002490,0.003190,0.003090,0.003090,
+  0.001900,0.001900,0.001300,0.001300,0.001200,0.001400,0.000700,0.000700,0.001100,0.000800,0.000200,
+  0.000500,0.001000,0.000600,0.000700,0.000300,0.000700,0.000600,0.000700,0.000100,0.000400,0.000400,
+  0.000300,0.000200,0.000200,0.000200,0.000200,0.000200,0.000400,0.000000,0.000100,0.000000,0.000100,
+  0.000200,0.000400,0.000200,0.000100,0.000100,0.000400,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000},
+
+  {0.890434,0.874715,0.859002,0.843299,0.827610,0.811940,0.796293,0.780675,0.765089,0.749542,0.734037,
+  0.718579,0.703175,0.687828,0.672545,0.657331,0.642190,0.627128,0.612151,0.597265,0.582474,0.567784,
+  0.553201,0.538730,0.524377,0.510147,0.496047,0.482081,0.468255,0.454575,0.441045,0.427672,0.414461,
+  0.401416,0.388544,0.375848,0.363335,0.351009,0.338874,0.326936,0.315198,0.303665,0.292341,0.281230,
+  0.270336,0.259662,0.249211,0.238988,0.228993,0.219231,0.209704,0.200413,0.191361,0.182548,0.173977,
+  0.165649,0.157564,0.149722,0.142124,0.134769,0.127658,0.120788,0.114160,0.107771,0.101620,0.095705,
+  0.090024,0.084573,0.079351,0.074353,0.069576,0.065017,0.060671,0.056535,0.052603,0.048871,0.045334,
+  0.041987,0.038825,0.035842,0.033033,0.030392,0.027912,0.025589,0.023417,0.021388,0.019498,0.017740,
+  0.016108,0.014596,0.013198,0.011909,0.010722,0.009631,0.008632,0.007718,0.006884,0.006125,0.005436,
+  0.004812,0.004249,0.003741,0.003285,0.002877,0.002512,0.002187,0.001898,0.001642,0.001416,0.001218,
+  0.001043,0.000891,0.000758,0.000643,0.000543,0.000457,0.000384,0.000320,0.000267,0.000221,0.000182,
+  0.000150,0.000123,0.000100,0.000081,0.000065,0.000052,0.000042,0.000033,0.000026,0.000021,0.000016,
+  0.000013,0.000010,0.000008,0.000006,0.000004,0.000003,0.000003,0.000002,0.000001,0.000001,0.000001,
+  0.000001,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000},
+
+  {0.908423,0.892386,0.876356,0.860335,0.844330,0.828343,0.812380,0.796446,0.780546,0.764684,0.748866,
+  0.733096,0.717380,0.701724,0.686132,0.670610,0.655163,0.639798,0.624518,0.609331,0.594241,0.579254,
+  0.564377,0.549613,0.534970,0.520453,0.506068,0.491820,0.477715,0.463758,0.449955,0.436312,0.422834,
+  0.409526,0.396393,0.383441,0.370675,0.358100,0.345720,0.333540,0.321565,0.309799,0.298247,0.286911,
+  0.275797,0.264907,0.254246,0.243816,0.233619,0.223660,0.213940,0.204462,0.195226,0.186236,0.177492,
+  0.168995,0.160747,0.152747,0.144995,0.137492,0.130237,0.123228,0.116466,0.109948,0.103673,0.097639,
+  0.091843,0.086282,0.080954,0.075855,0.070982,0.066330,0.061897,0.057677,0.053665,0.049858,0.046250,
+  0.042835,0.039609,0.036566,0.033700,0.031006,0.028476,0.026106,0.023890,0.021820,0.019892,0.018098,
+  0.016433,0.014891,0.013465,0.012149,0.010938,0.009826,0.008806,0.007873,0.007023,0.006249,0.005546,
+  0.004910,0.004335,0.003817,0.003352,0.002935,0.002562,0.002231,0.001936,0.001675,0.001445,0.001242,
+  0.001064,0.000909,0.000774,0.000656,0.000554,0.000467,0.000391,0.000327,0.000272,0.000225,0.000186,
+  0.000153,0.000125,0.000102,0.000083,0.000067,0.000054,0.000043,0.000034,0.000027,0.000021,0.000017,
+  0.000013,0.000010,0.000008,0.000006,0.000004,0.000003,0.000003,0.000002,0.000001,0.000001,0.000001,
+  0.000001,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
+  0.000000}
 };
 
 static const double modulation5[6][547] = {
diff -Naur ns-3.22/src/wimax/model/dl-mac-messages.cc ns-3.23/src/wimax/model/dl-mac-messages.cc
--- ns-3.22/src/wimax/model/dl-mac-messages.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/dl-mac-messages.cc	2015-05-13 11:05:27.000000000 -0700
@@ -384,6 +384,7 @@
 {
   static TypeId tid = TypeId ("ns3::Dcd")
     .SetParent<Header> ()
+    .SetGroupName("Wimax")
     .AddConstructor<Dcd> ()
   ;
   return tid;
@@ -603,6 +604,7 @@
 {
   static TypeId tid = TypeId ("ns3::DlMap")
     .SetParent<Header> ()
+    .SetGroupName("Wimax")
     .AddConstructor<DlMap> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wimax/model/ipcs-classifier.cc ns-3.23/src/wimax/model/ipcs-classifier.cc
--- ns-3.22/src/wimax/model/ipcs-classifier.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/ipcs-classifier.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,7 +40,8 @@
 TypeId IpcsClassifier::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::IpcsClassifier")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/mac-messages.cc ns-3.23/src/wimax/model/mac-messages.cc
--- ns-3.22/src/wimax/model/mac-messages.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/mac-messages.cc	2015-05-13 11:05:27.000000000 -0700
@@ -68,7 +68,7 @@
 ManagementMessageType::GetTypeId (void)
 {
   static TypeId tid =
-    TypeId ("ns3::ManagementMessageType").SetParent<Header> ().AddConstructor<ManagementMessageType> ();
+    TypeId ("ns3::ManagementMessageType").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<ManagementMessageType> ();
   return tid;
 }
 
@@ -166,7 +166,7 @@
 TypeId
 RngReq::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RngReq").SetParent<Header> ().AddConstructor<RngReq> ();
+  static TypeId tid = TypeId ("ns3::RngReq").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<RngReq> ();
   return tid;
 }
 
@@ -423,7 +423,7 @@
 TypeId
 RngRsp::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RngRsp").SetParent<Header> ().AddConstructor<RngRsp> ();
+  static TypeId tid = TypeId ("ns3::RngRsp").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<RngRsp> ();
   return tid;
 }
 
@@ -564,7 +564,7 @@
 TypeId
 DsaReq::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::DsaReq").SetParent<Header> ().AddConstructor<DsaReq> ();
+  static TypeId tid = TypeId ("ns3::DsaReq").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<DsaReq> ();
   return tid;
 }
 
@@ -705,7 +705,7 @@
 TypeId
 DsaRsp::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::DsaRsp").SetParent<Header> ().AddConstructor<DsaRsp> ();
+  static TypeId tid = TypeId ("ns3::DsaRsp").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<DsaRsp> ();
   return tid;
 }
 
@@ -799,7 +799,7 @@
 TypeId
 DsaAck::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::DsaAck").SetParent<Header> ().AddConstructor<DsaAck> ();
+  static TypeId tid = TypeId ("ns3::DsaAck").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<DsaAck> ();
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/service-flow-manager.cc ns-3.23/src/wimax/model/service-flow-manager.cc
--- ns-3.22/src/wimax/model/service-flow-manager.cc	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/wimax/model/service-flow-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -49,7 +49,8 @@
 TypeId ServiceFlowManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ServiceFlowManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/ss-link-manager.cc ns-3.23/src/wimax/model/ss-link-manager.cc
--- ns-3.22/src/wimax/model/ss-link-manager.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/ss-link-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,7 +40,8 @@
 TypeId SSLinkManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::SSLinkManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/ss-manager.cc ns-3.23/src/wimax/model/ss-manager.cc
--- ns-3.22/src/wimax/model/ss-manager.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/ss-manager.cc	2015-05-13 11:05:27.000000000 -0700
@@ -34,7 +34,8 @@
 TypeId SSManager::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::SSManager")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/ss-scheduler.cc ns-3.23/src/wimax/model/ss-scheduler.cc
--- ns-3.22/src/wimax/model/ss-scheduler.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/ss-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
@@ -40,7 +40,8 @@
 TypeId SSScheduler::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::SSScheduler")
-    .SetParent<Object> ();
+    .SetParent<Object> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/ul-mac-messages.cc ns-3.23/src/wimax/model/ul-mac-messages.cc
--- ns-3.22/src/wimax/model/ul-mac-messages.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/ul-mac-messages.cc	2015-05-13 11:05:27.000000000 -0700
@@ -376,6 +376,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ucd")
     .SetParent<Header> ()
+    .SetGroupName("Wimax")
     .AddConstructor<Ucd> ()
   ;
   return tid;
@@ -637,6 +638,7 @@
 {
   static TypeId tid = TypeId ("ns3::UlMap")
     .SetParent<Header> ()
+    .SetGroupName("Wimax")
     .AddConstructor<UlMap> ()
   ;
   return tid;
diff -Naur ns-3.22/src/wimax/model/wimax-channel.cc ns-3.23/src/wimax/model/wimax-channel.cc
--- ns-3.22/src/wimax/model/wimax-channel.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/wimax-channel.cc	2015-05-13 11:05:27.000000000 -0700
@@ -32,7 +32,8 @@
 TypeId WimaxChannel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::WimaxChannel")
-    .SetParent<Channel> ();
+    .SetParent<Channel> ()
+    .SetGroupName("Wimax");
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/wimax-connection.cc ns-3.23/src/wimax/model/wimax-connection.cc
--- ns-3.22/src/wimax/model/wimax-connection.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/wimax-connection.cc	2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,8 @@
 
     .SetParent<Object> ()
 
+    .SetGroupName("Wimax")
+
     .AddAttribute ("Type",
                    "Connection type",
                    EnumValue (Cid::INITIAL_RANGING),
diff -Naur ns-3.22/src/wimax/model/wimax-mac-header.cc ns-3.23/src/wimax/model/wimax-mac-header.cc
--- ns-3.22/src/wimax/model/wimax-mac-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/wimax-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -62,7 +62,7 @@
 TypeId
 MacHeaderType::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::MacHeaderType").SetParent<Header> ().AddConstructor<MacHeaderType> ();
+  static TypeId tid = TypeId ("ns3::MacHeaderType").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<MacHeaderType> ();
   return tid;
 }
 
@@ -200,7 +200,7 @@
 
 TypeId GenericMacHeader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::GenericMacHeader").SetParent<Header> ().AddConstructor<GenericMacHeader> ();
+  static TypeId tid = TypeId ("ns3::GenericMacHeader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<GenericMacHeader> ();
   return tid;
 }
 
@@ -379,7 +379,7 @@
 
 TypeId BandwidthRequestHeader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BandwidthRequestHeader").SetParent<Header> ().AddConstructor<
+  static TypeId tid = TypeId ("ns3::BandwidthRequestHeader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<
       BandwidthRequestHeader> ();
   return tid;
 }
@@ -528,7 +528,7 @@
 
 TypeId GrantManagementSubheader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::GrantManagementSubheader").SetParent<Header> ().AddConstructor<
+  static TypeId tid = TypeId ("ns3::GrantManagementSubheader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<
       GrantManagementSubheader> ();
   return tid;
 }
@@ -616,7 +616,7 @@
 FragmentationSubheader::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::FragmentationSubheader").SetParent<
-      Header> ().AddConstructor<FragmentationSubheader> ();
+      Header> ().SetGroupName("Wimax").AddConstructor<FragmentationSubheader> ();
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/wimax-mac-queue.cc ns-3.23/src/wimax/model/wimax-mac-queue.cc
--- ns-3.22/src/wimax/model/wimax-mac-queue.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/wimax-mac-queue.cc	2015-05-13 11:05:27.000000000 -0700
@@ -79,6 +79,7 @@
 {
   static TypeId tid = TypeId ("ns3::WimaxMacQueue")
     .SetParent<Object> ()
+    .SetGroupName("Wimax")
     .AddAttribute (
       "MaxSize",
       "Maximum size",
diff -Naur ns-3.22/src/wimax/model/wimax-mac-to-mac-header.cc ns-3.23/src/wimax/model/wimax-mac-to-mac-header.cc
--- ns-3.22/src/wimax/model/wimax-mac-to-mac-header.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/wimax-mac-to-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
@@ -46,7 +46,7 @@
 WimaxMacToMacHeader::GetTypeId (void)
 {
   static TypeId tid =
-    TypeId ("ns3::WimaxMacToMacHeader").SetParent<Header> ().AddConstructor<WimaxMacToMacHeader> ();
+    TypeId ("ns3::WimaxMacToMacHeader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<WimaxMacToMacHeader> ();
   return tid;
 }
 
diff -Naur ns-3.22/src/wimax/model/wimax-phy.cc ns-3.23/src/wimax/model/wimax-phy.cc
--- ns-3.22/src/wimax/model/wimax-phy.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/model/wimax-phy.cc	2015-05-13 11:05:27.000000000 -0700
@@ -38,7 +38,7 @@
 
 TypeId WimaxPhy::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::WimaxPhy").SetParent<Object> ()
+  static TypeId tid = TypeId ("ns3::WimaxPhy").SetParent<Object> ().SetGroupName("Wimax")
 
     .AddAttribute ("Channel",
                    "Wimax channel",
diff -Naur ns-3.22/src/wimax/test/mac-messages-test.cc ns-3.23/src/wimax/test/mac-messages-test.cc
--- ns-3.22/src/wimax/test/mac-messages-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/mac-messages-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -18,26 +18,9 @@
  *         Mohamed Amine Ismail <amine.ismail@sophia.inria.fr>
  *
  */
-#include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/udp-client-server-helper.h"
-#include "ns3/udp-header.h"
-#include "ns3/simulator.h"
-#include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/global-route-manager.h"
-#include "ns3/wimax-tlv.h"
-#include "ns3/ipcs-classifier-record.h"
 #include "ns3/service-flow.h"
-#include <iostream>
+#include "ns3/mac-messages.h"
 
 using namespace ns3;
 /*
diff -Naur ns-3.22/src/wimax/test/phy-test.cc ns-3.23/src/wimax/test/phy-test.cc
--- ns-3.22/src/wimax/test/phy-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/phy-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -19,23 +19,12 @@
  *                              <amine.ismail@udcast.com>
  */
 #include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
 #include "ns3/simulator.h"
+#include "ns3/node-container.h"
+#include "ns3/net-device-container.h"
 #include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/global-route-manager.h"
 #include "ns3/snr-to-block-error-rate-manager.h"
-#include <iostream>
 
 using namespace ns3;
 
diff -Naur ns-3.22/src/wimax/test/qos-test.cc ns-3.23/src/wimax/test/qos-test.cc
--- ns-3.22/src/wimax/test/qos-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/qos-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -19,22 +19,17 @@
  *                              <amine.ismail@udcast.com>
  */
 #include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
 #include "ns3/simulator.h"
+#include "ns3/node-container.h"
 #include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include <iostream>
-#include "ns3/global-route-manager.h"
+#include "ns3/net-device-container.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/service-flow.h"
+#include "ns3/ipcs-classifier-record.h"
 
 using namespace ns3;
 
diff -Naur ns-3.22/src/wimax/test/ss-mac-test.cc ns-3.23/src/wimax/test/ss-mac-test.cc
--- ns-3.22/src/wimax/test/ss-mac-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/ss-mac-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -19,24 +19,11 @@
  *                              <amine.ismail@udcast.com>
  */
 #include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/udp-client-server-helper.h"
-#include "ns3/udp-header.h"
 #include "ns3/simulator.h"
 #include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include <iostream>
-#include "ns3/global-route-manager.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
 
 using namespace ns3;
 
diff -Naur ns-3.22/src/wimax/test/wimax-fragmentation-test.cc ns-3.23/src/wimax/test/wimax-fragmentation-test.cc
--- ns-3.22/src/wimax/test/wimax-fragmentation-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/wimax-fragmentation-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -19,26 +19,14 @@
  *                       <peppe.piro@gmail.com>
  */
 #include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/udp-client-server-helper.h"
-#include "ns3/udp-header.h"
+#include "ns3/ptr.h"
+#include "ns3/packet.h"
 #include "ns3/simulator.h"
-#include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/global-route-manager.h"
-#include "ns3/wimax-tlv.h"
-#include "ns3/ipcs-classifier-record.h"
-#include "ns3/service-flow.h"
+#include "ns3/wimax-mac-header.h"
+#include "ns3/mac-messages.h"
+#include "ns3/cid.h"
 #include "ns3/wimax-connection.h"
-#include <iostream>
 
 using namespace ns3;
 
diff -Naur ns-3.22/src/wimax/test/wimax-service-flow-test.cc ns-3.23/src/wimax/test/wimax-service-flow-test.cc
--- ns-3.22/src/wimax/test/wimax-service-flow-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/wimax-service-flow-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -19,26 +19,16 @@
  *                              <amine.ismail@udcast.com>
  *
  */
-#include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/udp-client-server-helper.h"
-#include "ns3/udp-header.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-address.h"
 #include "ns3/simulator.h"
 #include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/global-route-manager.h"
-#include "ns3/wimax-tlv.h"
+#include "ns3/cs-parameters.h"
 #include "ns3/ipcs-classifier-record.h"
 #include "ns3/service-flow.h"
-#include <iostream>
 
 using namespace ns3;
 
diff -Naur ns-3.22/src/wimax/test/wimax-tlv-test.cc ns-3.23/src/wimax/test/wimax-tlv-test.cc
--- ns-3.22/src/wimax/test/wimax-tlv-test.cc	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/test/wimax-tlv-test.cc	2015-05-13 11:05:27.000000000 -0700
@@ -20,25 +20,14 @@
  *
  */
 #include "ns3/log.h"
-#include "ns3/abort.h"
 #include "ns3/test.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/udp-client-server-helper.h"
-#include "ns3/udp-header.h"
-#include "ns3/simulator.h"
+#include "ns3/ipcs-classifier-record.h"
+#include "ns3/ptr.h"
+#include "ns3/packet.h"
 #include "ns3/wimax-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/global-route-manager.h"
 #include "ns3/wimax-tlv.h"
-#include "ns3/ipcs-classifier-record.h"
 #include "ns3/service-flow.h"
-#include <iostream>
+#include "ns3/cs-parameters.h"
 
 using namespace ns3;
 
diff -Naur ns-3.22/src/wimax/wscript ns-3.23/src/wimax/wscript
--- ns-3.22/src/wimax/wscript	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wimax/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -1,6 +1,6 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 def build(bld):
-    obj = bld.create_ns3_module('wimax', ['network', 'point-to-point', 'internet', 'propagation', 'mobility'])
+    obj = bld.create_ns3_module('wimax', ['network', 'internet', 'propagation', 'mobility'])
     obj.source = [
             'model/cid.cc',
             'model/cid-factory.cc',
diff -Naur ns-3.22/src/wscript ns-3.23/src/wscript
--- ns-3.22/src/wscript	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -1,3 +1,4 @@
+
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 import os, os.path
@@ -206,7 +207,11 @@
         return
 
     env.append_value('PYTHON_MODULES_BUILT', module)
-    apidefs = env['PYTHON_BINDINGS_APIDEFS'].replace("-", "_")
+    try:
+        apidefs = env['PYTHON_BINDINGS_APIDEFS'].replace("-", "_")
+    except AttributeError:
+        # we likely got an empty list for env['PYTHON_BINDINGS_APIDEFS']
+        return
 
     #debug = ('PYBINDGEN_DEBUG' in os.environ)
     debug = True # XXX
@@ -487,7 +492,7 @@
             up = m.update
             up(self.__class__.__name__.encode())
             for x in self.inputs + self.outputs:
-                up(x.abspath().encode())
+                up(x.abspath())
             up(self.mode)
             if self.mode == 'remove':
                 up(self.header_to_remove.abspath().encode())
@@ -579,7 +584,7 @@
             up = m.update
             up(self.__class__.__name__.encode())
             for x in self.inputs + self.outputs:
-                up(x.abspath().encode())
+                up(x.abspath())
             up(self.mode)
             if self.mode == 'remove':
                 up(self.header_to_remove.abspath().encode())
diff -Naur ns-3.22/VERSION ns-3.23/VERSION
--- ns-3.22/VERSION	2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/VERSION	2015-05-13 11:05:26.000000000 -0700
@@ -1 +1 @@
-3.22
+3.23
diff -Naur ns-3.22/waf-tools/boost.py ns-3.23/waf-tools/boost.py
--- ns-3.22/waf-tools/boost.py	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/waf-tools/boost.py	2015-05-13 11:05:27.000000000 -0700
@@ -1,375 +1,380 @@
-#!/usr/bin/env python
-# encoding: utf-8
-#
-# partially based on boost.py written by Gernot Vormayr
-# written by Ruediger Sonderfeld <ruediger@c-plusplus.de>, 2008
-# modified by Bjoern Michaelsen, 2008
-# modified by Luca Fossati, 2008
-# rewritten for waf 1.5.1, Thomas Nagy, 2008
-# rewritten for waf 1.6.2, Sylvain Rouquette, 2011
-
-'''
-
-This is an extra tool, not bundled with the default waf binary.
-To add the boost tool to the waf file:
-$ ./waf-light --tools=compat15,boost
-	or, if you have waf >= 1.6.2
-$ ./waf update --files=boost
-
-When using this tool, the wscript will look like:
-
-	def options(opt):
-		opt.load('compiler_cxx boost')
-
-	def configure(conf):
-		conf.load('compiler_cxx boost')
-		conf.check_boost(lib='system filesystem')
-
-	def build(bld):
-		bld(source='main.cpp', target='app', use='BOOST')
-
-Options are generated, in order to specify the location of boost includes/libraries.
-The `check_boost` configuration function allows to specify the used boost libraries.
-It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
-Everything will be packaged together in a BOOST component that you can use.
-
-When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
- - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
-   Errors: C4530
- - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
-   So before calling `conf.check_boost` you might want to disabling by adding:
-   	conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
-   Errors: 
- - boost might also be compiled with /MT, which links the runtime statically.
-   If you have problems with redefined symbols, 
-		self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
-		self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc']
-Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases.
-
-'''
-
-import sys
-import re
-from waflib import Utils, Logs, Errors
-from waflib.Configure import conf
-from waflib.Errors import WafError
-
-BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
-              '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
-BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
-BOOST_VERSION_FILE = 'boost/version.hpp'
-BOOST_VERSION_CODE = '''
-#include <iostream>
-#include <boost/version.hpp>
-int main() { std::cout << BOOST_LIB_VERSION << std::endl; }
-'''
-
-# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
-PLATFORM = Utils.unversioned_sys_platform()
-detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
-detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang'
-detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc'
-BOOST_TOOLSETS = {
-	'borland':  'bcb',
-	'clang':	detect_clang,
-	'como':	 'como',
-	'cw':	   'cw',
-	'darwin':   'xgcc',
-	'edg':	  'edg',
-	'g++':	  detect_mingw,
-	'gcc':	  detect_mingw,
-	'icpc':	 detect_intel,
-	'intel':	detect_intel,
-	'kcc':	  'kcc',
-	'kylix':	'bck',
-	'mipspro':  'mp',
-	'mingw':	'mgw',
-	'msvc':	 'vc',
-	'qcc':	  'qcc',
-	'sun':	  'sw',
-	'sunc++':   'sw',
-	'tru64cxx': 'tru',
-	'vacpp':	'xlc'
-}
-
-
-def options(opt):
-	opt.add_option('--boost-includes', type='string',
-				   default='', dest='boost_includes',
-				   help='''path to the boost includes root (~boost root)
-				   e.g. /path/to/boost_1_47_0''')
-	opt.add_option('--boost-libs', type='string',
-				   default='', dest='boost_libs',
-				   help='''path to the directory where the boost libs are
-				   e.g. /path/to/boost_1_47_0/stage/lib''')
-	opt.add_option('--boost-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),
-				   see doc Boost, Getting Started, chapter 6.1''')
-	opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
-				   help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
-	opt.add_option('--boost-toolset', type='string',
-				   default='', dest='boost_toolset',
-				   help='force a toolset e.g. msvc, vc90, \
-						gcc, mingw, mgw45 (default: auto)')
-	py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
-	opt.add_option('--boost-python', type='string',
-				   default=py_version, dest='boost_python',
-				   help='select the lib python with this version \
-						(default: %s)' % py_version)
-
-
-@conf
-def __boost_get_version_file(self, dir):
-	try:
-		return self.root.find_dir(dir).find_node(BOOST_VERSION_FILE)
-	except:
-		return None
-
-
-@conf
-def boost_get_version(self, dir):
-	"""silently retrieve the boost version number"""
-	re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"$', re.M)
-	try:
-		val = re_but.search(self.__boost_get_version_file(dir).read()).group(1)
-	except:
-		val = self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[dir], execute=False, define_ret=True)
-	return val
-
-
-@conf
-def boost_get_includes(self, *k, **kw):
-	includes = k and k[0] or kw.get('includes', None)
-	if includes and self.__boost_get_version_file(includes):
-		return includes
-	for dir in BOOST_INCLUDES:
-		if self.__boost_get_version_file(dir):
-			return dir
-	if kw.get('boost_mandatory', True):
-		if includes:
-			self.fatal('headers not found in %s' % includes)
-		else:
-			self.fatal('headers not found, please provide a --boost-includes argument (see help)')
-
-
-@conf
-def boost_get_toolset(self, cc):
-	toolset = cc
-	if not cc:
-		build_platform = Utils.unversioned_sys_platform()
-		if build_platform in BOOST_TOOLSETS:
-			cc = build_platform
-		else:
-			cc = self.env.CXX_NAME
-	if cc in BOOST_TOOLSETS:
-		toolset = BOOST_TOOLSETS[cc]
-	return isinstance(toolset, str) and toolset or toolset(self.env)
-
-
-@conf
-def __boost_get_libs_path(self, *k, **kw):
-	''' return the lib path and all the files in it '''
-	if 'files' in kw:
-		return self.root.find_dir('.'), Utils.to_list(kw['files'])
-	libs = k and k[0] or kw.get('libs', None)
-	if libs:
-		path = self.root.find_dir(libs)
-		files = path.ant_glob('*boost_*')
-	if not libs or not files:
-		for dir in BOOST_LIBS:
-			try:
-				path = self.root.find_dir(dir)
-				files = path.ant_glob('*boost_*')
-				if files:
-					break
-				path = self.root.find_dir(dir + '64')
-				files = path.ant_glob('*boost_*')
-				if files:
-					break
-			except:
-				path = None
-	if not path:
-		if libs:
-			self.fatal('libs not found in %s' % libs)
-		else:
-			self.fatal('libs not found, please provide a --boost-libs argument (see help)')
-
-	self.to_log('Found the boost path in %r with the libraries:' % path)
-	for x in files:
-		self.to_log('    %r' % x)
-	return path, files
-
-@conf
-def boost_get_libs(self, *k, **kw):
-	'''
-	return the lib path and the required libs
-	according to the parameters
-	'''
-	path, files = self.__boost_get_libs_path(**kw)
-	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 ''
-	toolset = self.boost_get_toolset(kw.get('toolset', ''))
-	toolset_pat = '(-%s[0-9]{0,3})+' % toolset
-	version = '(-%s)+' % self.env.BOOST_VERSION
-
-	def find_lib(re_lib, files):
-		for file in files:
-			if re_lib.search(file.name):
-				self.to_log('Found boost lib %s' % file)
-				return file
-		return None
-
-	def format_lib_name(name):
-		if name.startswith('lib') and self.env.CC_NAME != 'msvc':
-			name = name[3:]
-		return name[:name.rfind('.')]
-
-	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.fatal('lib %s not found in %s' % (lib, path.abspath()))
-
-	return path.abspath(), libs
-
-
-@conf
-def check_boost(self, *k, **kw):
-	"""
-	Initialize boost libraries to be used.
-
-	Keywords: you can pass the same parameters as with the command line (without "--boost-").
-	Note that the command line has the priority, and should preferably be used.
-	"""
-	if not self.env['CXX']:
-		self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
-
-	params = {'lib': k and k[0] or kw.get('lib', None)}
-	for key, value in self.options.__dict__.items():
-		if not key.startswith('boost_'):
-			continue
-		key = key[len('boost_'):]
-		params[key] = value and value or kw.get(key, '')
-
-	var = kw.get('uselib_store', 'BOOST')
-
-	self.start_msg('Checking boost includes')
-	try:
-		self.env['INCLUDES_%s' % var] = self.boost_get_includes(**params)
-		self.env.BOOST_VERSION = self.boost_get_version(self.env['INCLUDES_%s' % var])
-	except 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.end_msg(self.env.BOOST_VERSION)
-	if Logs.verbose:
-		Logs.pprint('CYAN', '	path : %s' % self.env['INCLUDES_%s' % var])
-
-	if not params['lib']:
-		return
-	self.start_msg('Checking boost libs')
-	try:
-		suffix = params.get('static', 'ST') or ''
-		path, libs = self.boost_get_libs(**params)
-	except 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
-	self.end_msg('ok')
-	if Logs.verbose:
-		Logs.pprint('CYAN', '	path : %s' % path)
-		Logs.pprint('CYAN', '	libs : %s' % libs)
-
-
-	def try_link():
-		if 'system' in params['lib']:
-			self.check_cxx(
-			 fragment="\n".join([
-			  '#include <boost/system/error_code.hpp>',
-			  'int main() { boost::system::error_code c; }',
-			 ]),
-			 use=var,
-			 execute=False,
-			)
-		if 'thread' in params['lib']:
-			self.check_cxx(
-			 fragment="\n".join([
-			  '#include <boost/thread.hpp>',
-			  'int main() { boost::thread t; }',
-			 ]),
-			 use=var,
-			 execute=False,
-			)
-
-	if params.get('linkage_autodetect', False):
-		self.start_msg("Attempting to detect boost linkage flags")
-		toolset = self.boost_get_toolset(kw.get('toolset', ''))
-		if toolset in ['vc']:
-			# disable auto-linking feature, causing error LNK1181
-			# because the code wants to be linked against
-			self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
-
-			# if no dlls are present, we guess the .lib files are not stubs
-			has_dlls = False
-			for x in Utils.listdir(path):
-				if x.endswith(self.env.cxxshlib_PATTERN % ''):
-					has_dlls = True
-					break
-			if not has_dlls:
-				self.env['STLIBPATH_%s' % var] = [path]
-				self.env['STLIB_%s' % var] = libs
-				del self.env['LIB_%s' % var]
-				del self.env['LIBPATH_%s' % var]
-
-			# we attempt to play with some known-to-work CXXFLAGS combinations
-			for cxxflags in (['/MD', '/EHsc'], []):
-				self.env.stash()
-				self.env["CXXFLAGS_%s" % var] += cxxflags
-				try:
-					try_link()
-					self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
-					e = None
-					break
-				except Errors.ConfigurationError, exc:
-					self.env.revert()
-					e = exc
-
-			if e is not None:
-				self.fatal("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e)
-		else:
-			self.fatal("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
-	else:
-		self.start_msg('Checking for boost linkage')
-		try:
-			try_link()
-		except Errors.ConfigurationError, e:
-			self.fatal("Could not link against boost libraries using supplied options")
-		self.end_msg('ok')
-
+#!/usr/bin/env python
+# encoding: utf-8
+#
+# partially based on boost.py written by Gernot Vormayr
+# written by Ruediger Sonderfeld <ruediger@c-plusplus.de>, 2008
+# modified by Bjoern Michaelsen, 2008
+# modified by Luca Fossati, 2008
+# rewritten for waf 1.5.1, Thomas Nagy, 2008
+# rewritten for waf 1.6.2, Sylvain Rouquette, 2011
+
+'''
+
+This is an extra tool, not bundled with the default waf binary.
+To add the boost tool to the waf file:
+$ ./waf-light --tools=compat15,boost
+	or, if you have waf >= 1.6.2
+$ ./waf update --files=boost
+
+When using this tool, the wscript will look like:
+
+	def options(opt):
+		opt.load('compiler_cxx boost')
+
+	def configure(conf):
+		conf.load('compiler_cxx boost')
+		conf.check_boost(lib='system filesystem')
+
+	def build(bld):
+		bld(source='main.cpp', target='app', use='BOOST')
+
+Options are generated, in order to specify the location of boost includes/libraries.
+The `check_boost` configuration function allows to specify the used boost libraries.
+It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
+Everything will be packaged together in a BOOST component that you can use.
+
+When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
+ - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
+   Errors: C4530
+ - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
+   So before calling `conf.check_boost` you might want to disabling by adding:
+   	conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
+   Errors: 
+ - boost might also be compiled with /MT, which links the runtime statically.
+   If you have problems with redefined symbols, 
+		self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+		self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc']
+Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases.
+
+'''
+
+import sys
+import re
+from waflib import Utils, Logs, Errors
+from waflib.Configure import conf
+
+BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
+	      '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
+BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
+BOOST_VERSION_FILE = 'boost/version.hpp'
+BOOST_VERSION_CODE = '''
+#include <iostream>
+#include <boost/version.hpp>
+int main() { std::cout << BOOST_LIB_VERSION << std::endl; }
+'''
+
+BOOST_ERROR_CODE = '''
+#include <boost/system/error_code.hpp>
+int main() { boost::system::error_code c; }
+'''
+
+BOOST_THREAD_CODE = '''
+#include <boost/thread.hpp>
+int main() { boost::thread t; }
+'''
+
+# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
+PLATFORM = Utils.unversioned_sys_platform()
+detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
+detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang'
+detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc'
+BOOST_TOOLSETS = {
+	'borland':  'bcb',
+	'clang':	detect_clang,
+	'como':	 'como',
+	'cw':	   'cw',
+	'darwin':   'xgcc',
+	'edg':	  'edg',
+	'g++':	  detect_mingw,
+	'gcc':	  detect_mingw,
+	'icpc':	 detect_intel,
+	'intel':	detect_intel,
+	'kcc':	  'kcc',
+	'kylix':	'bck',
+	'mipspro':  'mp',
+	'mingw':	'mgw',
+	'msvc':	 'vc',
+	'qcc':	  'qcc',
+	'sun':	  'sw',
+	'sunc++':   'sw',
+	'tru64cxx': 'tru',
+	'vacpp':	'xlc'
+}
+
+
+def options(opt):
+	opt.add_option('--boost-includes', type='string',
+				   default='', dest='boost_includes',
+				   help='''path to the boost includes root (~boost root)
+				   e.g. /path/to/boost_1_47_0''')
+	opt.add_option('--boost-libs', type='string',
+				   default='', dest='boost_libs',
+				   help='''path to the directory where the boost libs are
+				   e.g. /path/to/boost_1_47_0/stage/lib''')
+	opt.add_option('--boost-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),
+				   see doc Boost, Getting Started, chapter 6.1''')
+	opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
+				   help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
+	opt.add_option('--boost-toolset', type='string',
+				   default='', dest='boost_toolset',
+				   help='force a toolset e.g. msvc, vc90, \
+						gcc, mingw, mgw45 (default: auto)')
+	py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
+	opt.add_option('--boost-python', type='string',
+				   default=py_version, dest='boost_python',
+				   help='select the lib python with this version \
+						(default: %s)' % py_version)
+
+
+@conf
+def __boost_get_version_file(self, d):
+	dnode = self.root.find_dir(d)
+	if dnode:
+		return dnode.find_node(BOOST_VERSION_FILE)
+	return None
+
+@conf
+def boost_get_version(self, d):
+	"""silently retrieve the boost version number"""
+	node = self.__boost_get_version_file(d)
+	if node:
+		try:
+			txt = node.read()
+		except (OSError, IOError):
+			Logs.error("Could not read the file %r" % node.abspath())
+		else:
+			re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M)
+			m = re_but.search(txt)
+			if m:
+				return m.group(1)
+	return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True)
+
+@conf
+def boost_get_includes(self, *k, **kw):
+	includes = k and k[0] or kw.get('includes', None)
+	if includes and self.__boost_get_version_file(includes):
+		return includes
+	for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES:
+		if self.__boost_get_version_file(d):
+			return d
+	if includes:
+		self.end_msg('headers not found in %s' % includes)
+		self.fatal('The configuration failed')
+	else:
+		self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
+		self.fatal('The configuration failed')
+
+
+@conf
+def boost_get_toolset(self, cc):
+	toolset = cc
+	if not cc:
+		build_platform = Utils.unversioned_sys_platform()
+		if build_platform in BOOST_TOOLSETS:
+			cc = build_platform
+		else:
+			cc = self.env.CXX_NAME
+	if cc in BOOST_TOOLSETS:
+		toolset = BOOST_TOOLSETS[cc]
+	return isinstance(toolset, str) and toolset or toolset(self.env)
+
+
+@conf
+def __boost_get_libs_path(self, *k, **kw):
+	''' return the lib path and all the files in it '''
+	if 'files' in kw:
+		return self.root.find_dir('.'), Utils.to_list(kw['files'])
+	libs = k and k[0] or kw.get('libs', None)
+	if libs:
+		path = self.root.find_dir(libs)
+		files = path.ant_glob('*boost_*')
+	if not libs or not files:
+		for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS:
+			path = self.root.find_dir(d)
+			if path:
+				files = path.ant_glob('*boost_*')
+				if files:
+					break
+			path = self.root.find_dir(d + '64')
+			if path:
+				files = path.ant_glob('*boost_*')
+				if files:
+					break
+	if not path:
+		if libs:
+			self.end_msg('libs not found in %s' % libs)
+			self.fatal('The configuration failed')
+		else:
+			self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
+			self.fatal('The configuration failed')
+
+	self.to_log('Found the boost path in %r with the libraries:' % path)
+	for x in files:
+		self.to_log('    %r' % x)
+	return path, files
+
+@conf
+def boost_get_libs(self, *k, **kw):
+	'''
+	return the lib path and the required libs
+	according to the parameters
+	'''
+	path, files = self.__boost_get_libs_path(**kw)
+	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 ''
+	toolset = self.boost_get_toolset(kw.get('toolset', ''))
+	toolset_pat = '(-%s[0-9]{0,3})+' % toolset
+	version = '(-%s)+' % self.env.BOOST_VERSION
+
+	def find_lib(re_lib, files):
+		for file in files:
+			if re_lib.search(file.name):
+				self.to_log('Found boost lib %s' % file)
+				return file
+		return None
+
+	def format_lib_name(name):
+		if name.startswith('lib') and self.env.CC_NAME != 'msvc':
+			name = name[3:]
+		return name[:name.rfind('.')]
+
+	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')
+
+	return path.abspath(), libs
+
+
+@conf
+def check_boost(self, *k, **kw):
+	"""
+	Initialize boost libraries to be used.
+
+	Keywords: you can pass the same parameters as with the command line (without "--boost-").
+	Note that the command line has the priority, and should preferably be used.
+	"""
+	if not self.env['CXX']:
+		self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
+
+	params = {'lib': k and k[0] or kw.get('lib', None)}
+	for key, value in self.options.__dict__.items():
+		if not key.startswith('boost_'):
+			continue
+		key = key[len('boost_'):]
+		params[key] = value and value or kw.get(key, '')
+
+	var = kw.get('uselib_store', 'BOOST')
+
+	self.start_msg('Checking boost includes')
+        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.end_msg(self.env.BOOST_VERSION)
+	if Logs.verbose:
+		Logs.pprint('CYAN', '	path : %s' % self.env['INCLUDES_%s' % var])
+
+	if not params['lib']:
+		return
+	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
+	self.end_msg('ok')
+	if Logs.verbose:
+		Logs.pprint('CYAN', '	path : %s' % path)
+		Logs.pprint('CYAN', '	libs : %s' % libs)
+
+
+	def try_link():
+		if 'system' in params['lib']:
+			self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
+		if 'thread' in params['lib']:
+			self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
+
+	if params.get('linkage_autodetect', False):
+		self.start_msg("Attempting to detect boost linkage flags")
+		toolset = self.boost_get_toolset(kw.get('toolset', ''))
+		if toolset in ['vc']:
+			# disable auto-linking feature, causing error LNK1181
+			# because the code wants to be linked against
+			self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+
+			# if no dlls are present, we guess the .lib files are not stubs
+			has_dlls = False
+			for x in Utils.listdir(path):
+				if x.endswith(self.env.cxxshlib_PATTERN % ''):
+					has_dlls = True
+					break
+			if not has_dlls:
+				self.env['STLIBPATH_%s' % var] = [path]
+				self.env['STLIB_%s' % var] = libs
+				del self.env['LIB_%s' % var]
+				del self.env['LIBPATH_%s' % var]
+
+			# we attempt to play with some known-to-work CXXFLAGS combinations
+			for cxxflags in (['/MD', '/EHsc'], []):
+				self.env.stash()
+				self.env["CXXFLAGS_%s" % var] += cxxflags
+				try:
+					try_link()
+					self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
+					exc = None
+					break
+				except Errors.ConfigurationError as e:
+					self.env.revert()
+					exc = e
+
+			if exc is not None:
+				self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=exc)
+				self.fatal('The configuration failed')
+		else:
+			self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
+			self.fatal('The configuration failed')
+	else:
+		self.start_msg('Checking for boost linkage')
+		try:
+			try_link()
+		except Errors.ConfigurationError as e:
+			self.end_msg("Could not link against boost libraries using supplied options")
+			self.fatal('The configuration failed')
+		self.end_msg('ok')
+
diff -Naur ns-3.22/wscript ns-3.23/wscript
--- ns-3.22/wscript	2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/wscript	2015-05-13 11:05:27.000000000 -0700
@@ -536,7 +536,7 @@
                              Options.options.build_profile, Logs.colors('NORMAL'))
     bld = wutils.bld
     print "%-30s: %s%s%s" % ("Build directory", Logs.colors('GREEN'),
-                             Context.out_dir, Logs.colors('NORMAL'))
+                             Options.options.out, Logs.colors('NORMAL'))
     
     
     for (name, caption, was_enabled, reason_not_enabled) in conf.env['NS3_OPTIONAL_FEATURES']:
