Add 'NFD/' from commit 'a22a2172611b1cb93b2e2f53d9d5da122b384f3e'

git-subtree-dir: NFD
git-subtree-mainline: ded1aa693720f9e2998b95c4850b59cbdfcabaa7
git-subtree-split: a22a2172611b1cb93b2e2f53d9d5da122b384f3e
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..e5011d2
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,33 @@
+# This style requires customized clang-format from https://github.com/cawka/clang
+#
+BasedOnStyle: GNU
+---
+Language: Cpp
+AlwaysBreakAfterDefinitionReturnType: true
+AlwaysBreakAfterDeclarationReturnType: true
+ColumnLimit: 100
+SpaceBeforeParens: ControlStatements
+Cpp11BracedListStyle: true
+BreakBeforeBraces: Stroustrup
+PointerAlignment: Left
+PenaltyReturnTypeOnItsOwnLine: 0
+AllowShortBlocksOnASingleLine: false
+# AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: false
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+
+BreakConstructorInitializersBeforeComma: true
+NamespaceIndentation: None
+Standard: Cpp11
+
+AlwaysBreakTemplateDeclarations: true
+IndentWidth: 2
+PenaltyBreakBeforeFirstCallParameter: 500
+SpacesBeforeTrailingComments: 1
+UseTab: Never
+ConstructorInitializerIndentWidth: 2
+
+SpaceBetweenTemplateAndOpeningAngle: false
+BreakBeforeBinaryOperators: NonAssignment
+ContinuationIndentWidth: 2
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 4629c34..0f1f3e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,6 @@
-.DS*
-.waf-1*
-.waf3-*
-.lock*
-**/*.pyc
-build/
-VERSION
-unit-tests.conf
+*.pyc
+.waf*
+*~
+.DS_Store
+docs/doxygen.warnings.log
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..7d92399
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,14 @@
+The PRIMARY AUTHORS are (and/or have been):
+
+  Alex Afanasyev <alexander.afanasyev@ucla.edu>
+  Ilya Moiseenko <iliamo@ucla.edu>
+
+The following is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS,
+people who have reported bugs, submitted patches,and  implemented new features of ndnSIM:
+
+  Jiangzhe Wang (Lucas) <lucas@cs.ucla.edu>
+  Cheng Yi <yic@email.arizona.edu>
+  Saeid Montazeri <saeid.montazeri@gmail.com>
+  Xiaoke Jiang <shock.jiang@gmail.com>
+  Saran Tarnoi <sarantarnoi@gmail.com>
+  Hovaidi Ardestani Mohammad <mohammad.hovaidi.ardestani@aalto.fi>
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/NFD/.gitignore b/NFD/.gitignore
new file mode 100644
index 0000000..4629c34
--- /dev/null
+++ b/NFD/.gitignore
@@ -0,0 +1,8 @@
+.DS*
+.waf-1*
+.waf3-*
+.lock*
+**/*.pyc
+build/
+VERSION
+unit-tests.conf
diff --git a/.gitmodules b/NFD/.gitmodules
similarity index 100%
rename from .gitmodules
rename to NFD/.gitmodules
diff --git a/.jenkins b/NFD/.jenkins
similarity index 100%
rename from .jenkins
rename to NFD/.jenkins
diff --git a/.jenkins.d/00-deps-ndn-cxx.sh b/NFD/.jenkins.d/00-deps-ndn-cxx.sh
similarity index 100%
rename from .jenkins.d/00-deps-ndn-cxx.sh
rename to NFD/.jenkins.d/00-deps-ndn-cxx.sh
diff --git a/.jenkins.d/10-build.sh b/NFD/.jenkins.d/10-build.sh
similarity index 100%
rename from .jenkins.d/10-build.sh
rename to NFD/.jenkins.d/10-build.sh
diff --git a/.jenkins.d/20-tests.sh b/NFD/.jenkins.d/20-tests.sh
similarity index 100%
rename from .jenkins.d/20-tests.sh
rename to NFD/.jenkins.d/20-tests.sh
diff --git a/.jenkins.d/30-coverage.sh b/NFD/.jenkins.d/30-coverage.sh
similarity index 100%
rename from .jenkins.d/30-coverage.sh
rename to NFD/.jenkins.d/30-coverage.sh
diff --git a/.travis.yml b/NFD/.travis.yml
similarity index 100%
rename from .travis.yml
rename to NFD/.travis.yml
diff --git a/.waf-tools/boost-kqueue.py b/NFD/.waf-tools/boost-kqueue.py
similarity index 100%
rename from .waf-tools/boost-kqueue.py
rename to NFD/.waf-tools/boost-kqueue.py
diff --git a/.waf-tools/boost.py b/NFD/.waf-tools/boost.py
similarity index 100%
rename from .waf-tools/boost.py
rename to NFD/.waf-tools/boost.py
diff --git a/.waf-tools/compiler-features.py b/NFD/.waf-tools/compiler-features.py
similarity index 100%
rename from .waf-tools/compiler-features.py
rename to NFD/.waf-tools/compiler-features.py
diff --git a/.waf-tools/coverage.py b/NFD/.waf-tools/coverage.py
similarity index 100%
rename from .waf-tools/coverage.py
rename to NFD/.waf-tools/coverage.py
diff --git a/.waf-tools/default-compiler-flags.py b/NFD/.waf-tools/default-compiler-flags.py
similarity index 100%
rename from .waf-tools/default-compiler-flags.py
rename to NFD/.waf-tools/default-compiler-flags.py
diff --git a/.waf-tools/dependency-checker.py b/NFD/.waf-tools/dependency-checker.py
similarity index 100%
rename from .waf-tools/dependency-checker.py
rename to NFD/.waf-tools/dependency-checker.py
diff --git a/.waf-tools/doxygen.py b/NFD/.waf-tools/doxygen.py
similarity index 100%
rename from .waf-tools/doxygen.py
rename to NFD/.waf-tools/doxygen.py
diff --git a/.waf-tools/pch.py b/NFD/.waf-tools/pch.py
similarity index 100%
rename from .waf-tools/pch.py
rename to NFD/.waf-tools/pch.py
diff --git a/.waf-tools/sphinx_build.py b/NFD/.waf-tools/sphinx_build.py
similarity index 100%
rename from .waf-tools/sphinx_build.py
rename to NFD/.waf-tools/sphinx_build.py
diff --git a/.waf-tools/type_traits.py b/NFD/.waf-tools/type_traits.py
similarity index 100%
rename from .waf-tools/type_traits.py
rename to NFD/.waf-tools/type_traits.py
diff --git a/.waf-tools/unix-socket.py b/NFD/.waf-tools/unix-socket.py
similarity index 100%
rename from .waf-tools/unix-socket.py
rename to NFD/.waf-tools/unix-socket.py
diff --git a/.waf-tools/websocket.py b/NFD/.waf-tools/websocket.py
similarity index 100%
rename from .waf-tools/websocket.py
rename to NFD/.waf-tools/websocket.py
diff --git a/AUTHORS.md b/NFD/AUTHORS.md
similarity index 100%
rename from AUTHORS.md
rename to NFD/AUTHORS.md
diff --git a/COPYING.md b/NFD/COPYING.md
similarity index 100%
rename from COPYING.md
rename to NFD/COPYING.md
diff --git a/INSTALL.md b/NFD/INSTALL.md
similarity index 100%
rename from INSTALL.md
rename to NFD/INSTALL.md
diff --git a/README-dev.md b/NFD/README-dev.md
similarity index 100%
rename from README-dev.md
rename to NFD/README-dev.md
diff --git a/NFD/README.md b/NFD/README.md
new file mode 100644
index 0000000..455be28
--- /dev/null
+++ b/NFD/README.md
@@ -0,0 +1,42 @@
+NFD - Named Data Networking Forwarding Daemon
+=============================================
+
+For complete documentation, including step-by-step installation instructions and
+tutorials, please visit the [NFD homepage](http://named-data.net/doc/NFD/).
+
+## Overview
+
+NFD is a network forwarder that implements and evolves together with the Named Data
+Networking (NDN) [protocol](http://named-data.net/doc/ndn-tlv/).  After the initial
+release, NFD will become a core component of the
+[NDN Platform](http://named-data.net/codebase/platform/) and will follow the same release
+cycle.
+
+NFD is an open and free software package licensed under GPL 3.0 license and is the
+centerpiece of our committement to making NDN's core technology open and free to all
+Internet users and developers.  For more information about the licensing details and
+limitation, refer to
+[`COPYING.md`](https://github.com/named-data/NFD/blob/master/COPYING.md).
+
+NFD is developed by a community effort.  Although the first release was mostly done by the
+members of [NSF-sponsored NDN project team](http://named-data.net/project/participants/),
+it already contains significant contributions from people outside the project team (for
+more details, refer to
+[`AUTHORS.md`](https://github.com/named-data/NFD/blob/master/AUTHORS.md)).  We strongly
+encourage participation from all interested parties, since broader community support is
+key for NDN to succeed as a new Internet architecture.  Bug reports and feedback are
+highly appreciated and can be made through
+[Redmine site](http://redmine.named-data.net/projects/nfd) and the
+[ndn-interest mailing list](http://www.lists.cs.ucla.edu/mailman/listinfo/ndn-interest).
+
+The main design goal of NFD is to support diverse experimentation of NDN technology.  The
+design emphasizes *modularity* and *extensibility* to allow easy experiments with new
+protocol features, algorithms, new applications.  We have not fully optimized the code for
+performance.  The intention is that performance optimizations are one type of experiments
+that developers can conduct by trying out different data structures and different
+algorithms; over time, better implementations may emerge within the same design framework.
+
+NFD will keep evolving in three aspects: improvement of the modularity framework, keeping
+up with the NDN protocol spec, and addition of other new features. We hope to keep the
+modular framework stable and lean, allowing researchers to implement and experiment with
+various features, some of which may eventually work into the protocol spec.
diff --git a/common.hpp b/NFD/common.hpp
similarity index 100%
rename from common.hpp
rename to NFD/common.hpp
diff --git a/contrib/osx-launchd/README.md b/NFD/contrib/osx-launchd/README.md
similarity index 100%
rename from contrib/osx-launchd/README.md
rename to NFD/contrib/osx-launchd/README.md
diff --git a/contrib/osx-launchd/net.named-data.nfd.plist b/NFD/contrib/osx-launchd/net.named-data.nfd.plist
similarity index 100%
rename from contrib/osx-launchd/net.named-data.nfd.plist
rename to NFD/contrib/osx-launchd/net.named-data.nfd.plist
diff --git a/contrib/osx-launchd/net.named-data.nrd.plist b/NFD/contrib/osx-launchd/net.named-data.nrd.plist
similarity index 100%
rename from contrib/osx-launchd/net.named-data.nrd.plist
rename to NFD/contrib/osx-launchd/net.named-data.nrd.plist
diff --git a/contrib/upstart/README.md b/NFD/contrib/upstart/README.md
similarity index 100%
rename from contrib/upstart/README.md
rename to NFD/contrib/upstart/README.md
diff --git a/contrib/upstart/nfd-watcher.conf b/NFD/contrib/upstart/nfd-watcher.conf
similarity index 100%
rename from contrib/upstart/nfd-watcher.conf
rename to NFD/contrib/upstart/nfd-watcher.conf
diff --git a/contrib/upstart/nfd.conf b/NFD/contrib/upstart/nfd.conf
similarity index 100%
rename from contrib/upstart/nfd.conf
rename to NFD/contrib/upstart/nfd.conf
diff --git a/contrib/upstart/nrd.conf b/NFD/contrib/upstart/nrd.conf
similarity index 100%
rename from contrib/upstart/nrd.conf
rename to NFD/contrib/upstart/nrd.conf
diff --git a/core/city-hash.cpp b/NFD/core/city-hash.cpp
similarity index 100%
rename from core/city-hash.cpp
rename to NFD/core/city-hash.cpp
diff --git a/core/city-hash.hpp b/NFD/core/city-hash.hpp
similarity index 100%
rename from core/city-hash.hpp
rename to NFD/core/city-hash.hpp
diff --git a/core/config-file.cpp b/NFD/core/config-file.cpp
similarity index 100%
rename from core/config-file.cpp
rename to NFD/core/config-file.cpp
diff --git a/core/config-file.hpp b/NFD/core/config-file.hpp
similarity index 100%
rename from core/config-file.hpp
rename to NFD/core/config-file.hpp
diff --git a/core/global-io.cpp b/NFD/core/global-io.cpp
similarity index 100%
rename from core/global-io.cpp
rename to NFD/core/global-io.cpp
diff --git a/core/global-io.hpp b/NFD/core/global-io.hpp
similarity index 100%
rename from core/global-io.hpp
rename to NFD/core/global-io.hpp
diff --git a/core/logger-factory.cpp b/NFD/core/logger-factory.cpp
similarity index 100%
rename from core/logger-factory.cpp
rename to NFD/core/logger-factory.cpp
diff --git a/core/logger-factory.hpp b/NFD/core/logger-factory.hpp
similarity index 100%
rename from core/logger-factory.hpp
rename to NFD/core/logger-factory.hpp
diff --git a/core/logger.cpp b/NFD/core/logger.cpp
similarity index 100%
rename from core/logger.cpp
rename to NFD/core/logger.cpp
diff --git a/core/logger.hpp b/NFD/core/logger.hpp
similarity index 100%
rename from core/logger.hpp
rename to NFD/core/logger.hpp
diff --git a/core/network-interface.cpp b/NFD/core/network-interface.cpp
similarity index 100%
rename from core/network-interface.cpp
rename to NFD/core/network-interface.cpp
diff --git a/core/network-interface.hpp b/NFD/core/network-interface.hpp
similarity index 100%
rename from core/network-interface.hpp
rename to NFD/core/network-interface.hpp
diff --git a/core/network.cpp b/NFD/core/network.cpp
similarity index 100%
rename from core/network.cpp
rename to NFD/core/network.cpp
diff --git a/core/network.hpp b/NFD/core/network.hpp
similarity index 100%
rename from core/network.hpp
rename to NFD/core/network.hpp
diff --git a/core/notification-stream.hpp b/NFD/core/notification-stream.hpp
similarity index 100%
rename from core/notification-stream.hpp
rename to NFD/core/notification-stream.hpp
diff --git a/core/privilege-helper.cpp b/NFD/core/privilege-helper.cpp
similarity index 100%
rename from core/privilege-helper.cpp
rename to NFD/core/privilege-helper.cpp
diff --git a/core/privilege-helper.hpp b/NFD/core/privilege-helper.hpp
similarity index 100%
rename from core/privilege-helper.hpp
rename to NFD/core/privilege-helper.hpp
diff --git a/core/random.cpp b/NFD/core/random.cpp
similarity index 100%
rename from core/random.cpp
rename to NFD/core/random.cpp
diff --git a/core/random.hpp b/NFD/core/random.hpp
similarity index 100%
rename from core/random.hpp
rename to NFD/core/random.hpp
diff --git a/core/resolver.hpp b/NFD/core/resolver.hpp
similarity index 100%
rename from core/resolver.hpp
rename to NFD/core/resolver.hpp
diff --git a/core/scheduler.cpp b/NFD/core/scheduler.cpp
similarity index 100%
rename from core/scheduler.cpp
rename to NFD/core/scheduler.cpp
diff --git a/core/scheduler.hpp b/NFD/core/scheduler.hpp
similarity index 100%
rename from core/scheduler.hpp
rename to NFD/core/scheduler.hpp
diff --git a/core/segment-publisher.hpp b/NFD/core/segment-publisher.hpp
similarity index 100%
rename from core/segment-publisher.hpp
rename to NFD/core/segment-publisher.hpp
diff --git a/daemon/face/channel.cpp b/NFD/daemon/face/channel.cpp
similarity index 100%
rename from daemon/face/channel.cpp
rename to NFD/daemon/face/channel.cpp
diff --git a/daemon/face/channel.hpp b/NFD/daemon/face/channel.hpp
similarity index 100%
rename from daemon/face/channel.hpp
rename to NFD/daemon/face/channel.hpp
diff --git a/daemon/face/datagram-face.hpp b/NFD/daemon/face/datagram-face.hpp
similarity index 100%
rename from daemon/face/datagram-face.hpp
rename to NFD/daemon/face/datagram-face.hpp
diff --git a/daemon/face/ethernet-face.cpp b/NFD/daemon/face/ethernet-face.cpp
similarity index 100%
rename from daemon/face/ethernet-face.cpp
rename to NFD/daemon/face/ethernet-face.cpp
diff --git a/daemon/face/ethernet-face.hpp b/NFD/daemon/face/ethernet-face.hpp
similarity index 100%
rename from daemon/face/ethernet-face.hpp
rename to NFD/daemon/face/ethernet-face.hpp
diff --git a/daemon/face/ethernet-factory.cpp b/NFD/daemon/face/ethernet-factory.cpp
similarity index 100%
rename from daemon/face/ethernet-factory.cpp
rename to NFD/daemon/face/ethernet-factory.cpp
diff --git a/daemon/face/ethernet-factory.hpp b/NFD/daemon/face/ethernet-factory.hpp
similarity index 100%
rename from daemon/face/ethernet-factory.hpp
rename to NFD/daemon/face/ethernet-factory.hpp
diff --git a/daemon/face/face-counters.hpp b/NFD/daemon/face/face-counters.hpp
similarity index 100%
rename from daemon/face/face-counters.hpp
rename to NFD/daemon/face/face-counters.hpp
diff --git a/daemon/face/face.cpp b/NFD/daemon/face/face.cpp
similarity index 100%
rename from daemon/face/face.cpp
rename to NFD/daemon/face/face.cpp
diff --git a/daemon/face/face.hpp b/NFD/daemon/face/face.hpp
similarity index 100%
rename from daemon/face/face.hpp
rename to NFD/daemon/face/face.hpp
diff --git a/daemon/face/local-face.hpp b/NFD/daemon/face/local-face.hpp
similarity index 100%
rename from daemon/face/local-face.hpp
rename to NFD/daemon/face/local-face.hpp
diff --git a/daemon/face/multicast-udp-face.cpp b/NFD/daemon/face/multicast-udp-face.cpp
similarity index 100%
rename from daemon/face/multicast-udp-face.cpp
rename to NFD/daemon/face/multicast-udp-face.cpp
diff --git a/daemon/face/multicast-udp-face.hpp b/NFD/daemon/face/multicast-udp-face.hpp
similarity index 100%
rename from daemon/face/multicast-udp-face.hpp
rename to NFD/daemon/face/multicast-udp-face.hpp
diff --git a/daemon/face/ndnlp-parse.cpp b/NFD/daemon/face/ndnlp-parse.cpp
similarity index 100%
rename from daemon/face/ndnlp-parse.cpp
rename to NFD/daemon/face/ndnlp-parse.cpp
diff --git a/daemon/face/ndnlp-parse.hpp b/NFD/daemon/face/ndnlp-parse.hpp
similarity index 100%
rename from daemon/face/ndnlp-parse.hpp
rename to NFD/daemon/face/ndnlp-parse.hpp
diff --git a/daemon/face/ndnlp-partial-message-store.cpp b/NFD/daemon/face/ndnlp-partial-message-store.cpp
similarity index 100%
rename from daemon/face/ndnlp-partial-message-store.cpp
rename to NFD/daemon/face/ndnlp-partial-message-store.cpp
diff --git a/daemon/face/ndnlp-partial-message-store.hpp b/NFD/daemon/face/ndnlp-partial-message-store.hpp
similarity index 100%
rename from daemon/face/ndnlp-partial-message-store.hpp
rename to NFD/daemon/face/ndnlp-partial-message-store.hpp
diff --git a/daemon/face/ndnlp-sequence-generator.cpp b/NFD/daemon/face/ndnlp-sequence-generator.cpp
similarity index 100%
rename from daemon/face/ndnlp-sequence-generator.cpp
rename to NFD/daemon/face/ndnlp-sequence-generator.cpp
diff --git a/daemon/face/ndnlp-sequence-generator.hpp b/NFD/daemon/face/ndnlp-sequence-generator.hpp
similarity index 100%
rename from daemon/face/ndnlp-sequence-generator.hpp
rename to NFD/daemon/face/ndnlp-sequence-generator.hpp
diff --git a/daemon/face/ndnlp-slicer.cpp b/NFD/daemon/face/ndnlp-slicer.cpp
similarity index 100%
rename from daemon/face/ndnlp-slicer.cpp
rename to NFD/daemon/face/ndnlp-slicer.cpp
diff --git a/daemon/face/ndnlp-slicer.hpp b/NFD/daemon/face/ndnlp-slicer.hpp
similarity index 100%
rename from daemon/face/ndnlp-slicer.hpp
rename to NFD/daemon/face/ndnlp-slicer.hpp
diff --git a/daemon/face/ndnlp-tlv.hpp b/NFD/daemon/face/ndnlp-tlv.hpp
similarity index 100%
rename from daemon/face/ndnlp-tlv.hpp
rename to NFD/daemon/face/ndnlp-tlv.hpp
diff --git a/daemon/face/null-face.cpp b/NFD/daemon/face/null-face.cpp
similarity index 100%
rename from daemon/face/null-face.cpp
rename to NFD/daemon/face/null-face.cpp
diff --git a/daemon/face/null-face.hpp b/NFD/daemon/face/null-face.hpp
similarity index 100%
rename from daemon/face/null-face.hpp
rename to NFD/daemon/face/null-face.hpp
diff --git a/daemon/face/protocol-factory.hpp b/NFD/daemon/face/protocol-factory.hpp
similarity index 100%
rename from daemon/face/protocol-factory.hpp
rename to NFD/daemon/face/protocol-factory.hpp
diff --git a/daemon/face/stream-face.hpp b/NFD/daemon/face/stream-face.hpp
similarity index 100%
rename from daemon/face/stream-face.hpp
rename to NFD/daemon/face/stream-face.hpp
diff --git a/daemon/face/tcp-channel.cpp b/NFD/daemon/face/tcp-channel.cpp
similarity index 100%
rename from daemon/face/tcp-channel.cpp
rename to NFD/daemon/face/tcp-channel.cpp
diff --git a/daemon/face/tcp-channel.hpp b/NFD/daemon/face/tcp-channel.hpp
similarity index 100%
rename from daemon/face/tcp-channel.hpp
rename to NFD/daemon/face/tcp-channel.hpp
diff --git a/daemon/face/tcp-face.cpp b/NFD/daemon/face/tcp-face.cpp
similarity index 100%
rename from daemon/face/tcp-face.cpp
rename to NFD/daemon/face/tcp-face.cpp
diff --git a/daemon/face/tcp-face.hpp b/NFD/daemon/face/tcp-face.hpp
similarity index 100%
rename from daemon/face/tcp-face.hpp
rename to NFD/daemon/face/tcp-face.hpp
diff --git a/daemon/face/tcp-factory.cpp b/NFD/daemon/face/tcp-factory.cpp
similarity index 100%
rename from daemon/face/tcp-factory.cpp
rename to NFD/daemon/face/tcp-factory.cpp
diff --git a/daemon/face/tcp-factory.hpp b/NFD/daemon/face/tcp-factory.hpp
similarity index 100%
rename from daemon/face/tcp-factory.hpp
rename to NFD/daemon/face/tcp-factory.hpp
diff --git a/daemon/face/udp-channel.cpp b/NFD/daemon/face/udp-channel.cpp
similarity index 100%
rename from daemon/face/udp-channel.cpp
rename to NFD/daemon/face/udp-channel.cpp
diff --git a/daemon/face/udp-channel.hpp b/NFD/daemon/face/udp-channel.hpp
similarity index 100%
rename from daemon/face/udp-channel.hpp
rename to NFD/daemon/face/udp-channel.hpp
diff --git a/daemon/face/udp-face.cpp b/NFD/daemon/face/udp-face.cpp
similarity index 100%
rename from daemon/face/udp-face.cpp
rename to NFD/daemon/face/udp-face.cpp
diff --git a/daemon/face/udp-face.hpp b/NFD/daemon/face/udp-face.hpp
similarity index 100%
rename from daemon/face/udp-face.hpp
rename to NFD/daemon/face/udp-face.hpp
diff --git a/daemon/face/udp-factory.cpp b/NFD/daemon/face/udp-factory.cpp
similarity index 100%
rename from daemon/face/udp-factory.cpp
rename to NFD/daemon/face/udp-factory.cpp
diff --git a/daemon/face/udp-factory.hpp b/NFD/daemon/face/udp-factory.hpp
similarity index 100%
rename from daemon/face/udp-factory.hpp
rename to NFD/daemon/face/udp-factory.hpp
diff --git a/daemon/face/unix-stream-channel.cpp b/NFD/daemon/face/unix-stream-channel.cpp
similarity index 100%
rename from daemon/face/unix-stream-channel.cpp
rename to NFD/daemon/face/unix-stream-channel.cpp
diff --git a/daemon/face/unix-stream-channel.hpp b/NFD/daemon/face/unix-stream-channel.hpp
similarity index 100%
rename from daemon/face/unix-stream-channel.hpp
rename to NFD/daemon/face/unix-stream-channel.hpp
diff --git a/daemon/face/unix-stream-face.cpp b/NFD/daemon/face/unix-stream-face.cpp
similarity index 100%
rename from daemon/face/unix-stream-face.cpp
rename to NFD/daemon/face/unix-stream-face.cpp
diff --git a/daemon/face/unix-stream-face.hpp b/NFD/daemon/face/unix-stream-face.hpp
similarity index 100%
rename from daemon/face/unix-stream-face.hpp
rename to NFD/daemon/face/unix-stream-face.hpp
diff --git a/daemon/face/unix-stream-factory.cpp b/NFD/daemon/face/unix-stream-factory.cpp
similarity index 100%
rename from daemon/face/unix-stream-factory.cpp
rename to NFD/daemon/face/unix-stream-factory.cpp
diff --git a/daemon/face/unix-stream-factory.hpp b/NFD/daemon/face/unix-stream-factory.hpp
similarity index 100%
rename from daemon/face/unix-stream-factory.hpp
rename to NFD/daemon/face/unix-stream-factory.hpp
diff --git a/daemon/face/websocket-channel.cpp b/NFD/daemon/face/websocket-channel.cpp
similarity index 100%
rename from daemon/face/websocket-channel.cpp
rename to NFD/daemon/face/websocket-channel.cpp
diff --git a/daemon/face/websocket-channel.hpp b/NFD/daemon/face/websocket-channel.hpp
similarity index 100%
rename from daemon/face/websocket-channel.hpp
rename to NFD/daemon/face/websocket-channel.hpp
diff --git a/daemon/face/websocket-face.cpp b/NFD/daemon/face/websocket-face.cpp
similarity index 100%
rename from daemon/face/websocket-face.cpp
rename to NFD/daemon/face/websocket-face.cpp
diff --git a/daemon/face/websocket-face.hpp b/NFD/daemon/face/websocket-face.hpp
similarity index 100%
rename from daemon/face/websocket-face.hpp
rename to NFD/daemon/face/websocket-face.hpp
diff --git a/daemon/face/websocket-factory.cpp b/NFD/daemon/face/websocket-factory.cpp
similarity index 100%
rename from daemon/face/websocket-factory.cpp
rename to NFD/daemon/face/websocket-factory.cpp
diff --git a/daemon/face/websocket-factory.hpp b/NFD/daemon/face/websocket-factory.hpp
similarity index 100%
rename from daemon/face/websocket-factory.hpp
rename to NFD/daemon/face/websocket-factory.hpp
diff --git a/daemon/face/websocketpp.hpp b/NFD/daemon/face/websocketpp.hpp
similarity index 100%
rename from daemon/face/websocketpp.hpp
rename to NFD/daemon/face/websocketpp.hpp
diff --git a/daemon/fw/available-strategies.cpp b/NFD/daemon/fw/available-strategies.cpp
similarity index 100%
rename from daemon/fw/available-strategies.cpp
rename to NFD/daemon/fw/available-strategies.cpp
diff --git a/daemon/fw/available-strategies.hpp b/NFD/daemon/fw/available-strategies.hpp
similarity index 100%
rename from daemon/fw/available-strategies.hpp
rename to NFD/daemon/fw/available-strategies.hpp
diff --git a/daemon/fw/best-route-strategy.cpp b/NFD/daemon/fw/best-route-strategy.cpp
similarity index 100%
rename from daemon/fw/best-route-strategy.cpp
rename to NFD/daemon/fw/best-route-strategy.cpp
diff --git a/daemon/fw/best-route-strategy.hpp b/NFD/daemon/fw/best-route-strategy.hpp
similarity index 100%
rename from daemon/fw/best-route-strategy.hpp
rename to NFD/daemon/fw/best-route-strategy.hpp
diff --git a/daemon/fw/best-route-strategy2.cpp b/NFD/daemon/fw/best-route-strategy2.cpp
similarity index 100%
rename from daemon/fw/best-route-strategy2.cpp
rename to NFD/daemon/fw/best-route-strategy2.cpp
diff --git a/daemon/fw/best-route-strategy2.hpp b/NFD/daemon/fw/best-route-strategy2.hpp
similarity index 100%
rename from daemon/fw/best-route-strategy2.hpp
rename to NFD/daemon/fw/best-route-strategy2.hpp
diff --git a/daemon/fw/broadcast-strategy.cpp b/NFD/daemon/fw/broadcast-strategy.cpp
similarity index 100%
rename from daemon/fw/broadcast-strategy.cpp
rename to NFD/daemon/fw/broadcast-strategy.cpp
diff --git a/daemon/fw/broadcast-strategy.hpp b/NFD/daemon/fw/broadcast-strategy.hpp
similarity index 100%
rename from daemon/fw/broadcast-strategy.hpp
rename to NFD/daemon/fw/broadcast-strategy.hpp
diff --git a/daemon/fw/client-control-strategy.cpp b/NFD/daemon/fw/client-control-strategy.cpp
similarity index 100%
rename from daemon/fw/client-control-strategy.cpp
rename to NFD/daemon/fw/client-control-strategy.cpp
diff --git a/daemon/fw/client-control-strategy.hpp b/NFD/daemon/fw/client-control-strategy.hpp
similarity index 100%
rename from daemon/fw/client-control-strategy.hpp
rename to NFD/daemon/fw/client-control-strategy.hpp
diff --git a/daemon/fw/face-table.cpp b/NFD/daemon/fw/face-table.cpp
similarity index 100%
rename from daemon/fw/face-table.cpp
rename to NFD/daemon/fw/face-table.cpp
diff --git a/daemon/fw/face-table.hpp b/NFD/daemon/fw/face-table.hpp
similarity index 100%
rename from daemon/fw/face-table.hpp
rename to NFD/daemon/fw/face-table.hpp
diff --git a/daemon/fw/forwarder-counters.hpp b/NFD/daemon/fw/forwarder-counters.hpp
similarity index 100%
rename from daemon/fw/forwarder-counters.hpp
rename to NFD/daemon/fw/forwarder-counters.hpp
diff --git a/daemon/fw/forwarder.cpp b/NFD/daemon/fw/forwarder.cpp
similarity index 100%
rename from daemon/fw/forwarder.cpp
rename to NFD/daemon/fw/forwarder.cpp
diff --git a/daemon/fw/forwarder.hpp b/NFD/daemon/fw/forwarder.hpp
similarity index 100%
rename from daemon/fw/forwarder.hpp
rename to NFD/daemon/fw/forwarder.hpp
diff --git a/daemon/fw/ncc-strategy.cpp b/NFD/daemon/fw/ncc-strategy.cpp
similarity index 100%
rename from daemon/fw/ncc-strategy.cpp
rename to NFD/daemon/fw/ncc-strategy.cpp
diff --git a/daemon/fw/ncc-strategy.hpp b/NFD/daemon/fw/ncc-strategy.hpp
similarity index 100%
rename from daemon/fw/ncc-strategy.hpp
rename to NFD/daemon/fw/ncc-strategy.hpp
diff --git a/daemon/fw/rtt-estimator.cpp b/NFD/daemon/fw/rtt-estimator.cpp
similarity index 100%
rename from daemon/fw/rtt-estimator.cpp
rename to NFD/daemon/fw/rtt-estimator.cpp
diff --git a/daemon/fw/rtt-estimator.hpp b/NFD/daemon/fw/rtt-estimator.hpp
similarity index 100%
rename from daemon/fw/rtt-estimator.hpp
rename to NFD/daemon/fw/rtt-estimator.hpp
diff --git a/daemon/fw/strategy-info.hpp b/NFD/daemon/fw/strategy-info.hpp
similarity index 100%
rename from daemon/fw/strategy-info.hpp
rename to NFD/daemon/fw/strategy-info.hpp
diff --git a/daemon/fw/strategy.cpp b/NFD/daemon/fw/strategy.cpp
similarity index 100%
rename from daemon/fw/strategy.cpp
rename to NFD/daemon/fw/strategy.cpp
diff --git a/daemon/fw/strategy.hpp b/NFD/daemon/fw/strategy.hpp
similarity index 100%
rename from daemon/fw/strategy.hpp
rename to NFD/daemon/fw/strategy.hpp
diff --git a/daemon/main.cpp b/NFD/daemon/main.cpp
similarity index 100%
rename from daemon/main.cpp
rename to NFD/daemon/main.cpp
diff --git a/daemon/mgmt/app-face.hpp b/NFD/daemon/mgmt/app-face.hpp
similarity index 100%
rename from daemon/mgmt/app-face.hpp
rename to NFD/daemon/mgmt/app-face.hpp
diff --git a/daemon/mgmt/channel-status-publisher.cpp b/NFD/daemon/mgmt/channel-status-publisher.cpp
similarity index 100%
rename from daemon/mgmt/channel-status-publisher.cpp
rename to NFD/daemon/mgmt/channel-status-publisher.cpp
diff --git a/daemon/mgmt/channel-status-publisher.hpp b/NFD/daemon/mgmt/channel-status-publisher.hpp
similarity index 100%
rename from daemon/mgmt/channel-status-publisher.hpp
rename to NFD/daemon/mgmt/channel-status-publisher.hpp
diff --git a/daemon/mgmt/command-validator.cpp b/NFD/daemon/mgmt/command-validator.cpp
similarity index 100%
rename from daemon/mgmt/command-validator.cpp
rename to NFD/daemon/mgmt/command-validator.cpp
diff --git a/daemon/mgmt/command-validator.hpp b/NFD/daemon/mgmt/command-validator.hpp
similarity index 100%
rename from daemon/mgmt/command-validator.hpp
rename to NFD/daemon/mgmt/command-validator.hpp
diff --git a/daemon/mgmt/face-manager.cpp b/NFD/daemon/mgmt/face-manager.cpp
similarity index 100%
rename from daemon/mgmt/face-manager.cpp
rename to NFD/daemon/mgmt/face-manager.cpp
diff --git a/daemon/mgmt/face-manager.hpp b/NFD/daemon/mgmt/face-manager.hpp
similarity index 100%
rename from daemon/mgmt/face-manager.hpp
rename to NFD/daemon/mgmt/face-manager.hpp
diff --git a/daemon/mgmt/face-query-status-publisher.cpp b/NFD/daemon/mgmt/face-query-status-publisher.cpp
similarity index 100%
rename from daemon/mgmt/face-query-status-publisher.cpp
rename to NFD/daemon/mgmt/face-query-status-publisher.cpp
diff --git a/daemon/mgmt/face-query-status-publisher.hpp b/NFD/daemon/mgmt/face-query-status-publisher.hpp
similarity index 100%
rename from daemon/mgmt/face-query-status-publisher.hpp
rename to NFD/daemon/mgmt/face-query-status-publisher.hpp
diff --git a/daemon/mgmt/face-status-publisher.cpp b/NFD/daemon/mgmt/face-status-publisher.cpp
similarity index 100%
rename from daemon/mgmt/face-status-publisher.cpp
rename to NFD/daemon/mgmt/face-status-publisher.cpp
diff --git a/daemon/mgmt/face-status-publisher.hpp b/NFD/daemon/mgmt/face-status-publisher.hpp
similarity index 100%
rename from daemon/mgmt/face-status-publisher.hpp
rename to NFD/daemon/mgmt/face-status-publisher.hpp
diff --git a/daemon/mgmt/fib-enumeration-publisher.cpp b/NFD/daemon/mgmt/fib-enumeration-publisher.cpp
similarity index 100%
rename from daemon/mgmt/fib-enumeration-publisher.cpp
rename to NFD/daemon/mgmt/fib-enumeration-publisher.cpp
diff --git a/daemon/mgmt/fib-enumeration-publisher.hpp b/NFD/daemon/mgmt/fib-enumeration-publisher.hpp
similarity index 100%
rename from daemon/mgmt/fib-enumeration-publisher.hpp
rename to NFD/daemon/mgmt/fib-enumeration-publisher.hpp
diff --git a/daemon/mgmt/fib-manager.cpp b/NFD/daemon/mgmt/fib-manager.cpp
similarity index 100%
rename from daemon/mgmt/fib-manager.cpp
rename to NFD/daemon/mgmt/fib-manager.cpp
diff --git a/daemon/mgmt/fib-manager.hpp b/NFD/daemon/mgmt/fib-manager.hpp
similarity index 100%
rename from daemon/mgmt/fib-manager.hpp
rename to NFD/daemon/mgmt/fib-manager.hpp
diff --git a/daemon/mgmt/general-config-section.cpp b/NFD/daemon/mgmt/general-config-section.cpp
similarity index 100%
rename from daemon/mgmt/general-config-section.cpp
rename to NFD/daemon/mgmt/general-config-section.cpp
diff --git a/daemon/mgmt/general-config-section.hpp b/NFD/daemon/mgmt/general-config-section.hpp
similarity index 100%
rename from daemon/mgmt/general-config-section.hpp
rename to NFD/daemon/mgmt/general-config-section.hpp
diff --git a/daemon/mgmt/internal-face.cpp b/NFD/daemon/mgmt/internal-face.cpp
similarity index 100%
rename from daemon/mgmt/internal-face.cpp
rename to NFD/daemon/mgmt/internal-face.cpp
diff --git a/daemon/mgmt/internal-face.hpp b/NFD/daemon/mgmt/internal-face.hpp
similarity index 100%
rename from daemon/mgmt/internal-face.hpp
rename to NFD/daemon/mgmt/internal-face.hpp
diff --git a/daemon/mgmt/manager-base.cpp b/NFD/daemon/mgmt/manager-base.cpp
similarity index 100%
rename from daemon/mgmt/manager-base.cpp
rename to NFD/daemon/mgmt/manager-base.cpp
diff --git a/daemon/mgmt/manager-base.hpp b/NFD/daemon/mgmt/manager-base.hpp
similarity index 100%
rename from daemon/mgmt/manager-base.hpp
rename to NFD/daemon/mgmt/manager-base.hpp
diff --git a/daemon/mgmt/status-server.cpp b/NFD/daemon/mgmt/status-server.cpp
similarity index 100%
rename from daemon/mgmt/status-server.cpp
rename to NFD/daemon/mgmt/status-server.cpp
diff --git a/daemon/mgmt/status-server.hpp b/NFD/daemon/mgmt/status-server.hpp
similarity index 100%
rename from daemon/mgmt/status-server.hpp
rename to NFD/daemon/mgmt/status-server.hpp
diff --git a/daemon/mgmt/strategy-choice-manager.cpp b/NFD/daemon/mgmt/strategy-choice-manager.cpp
similarity index 100%
rename from daemon/mgmt/strategy-choice-manager.cpp
rename to NFD/daemon/mgmt/strategy-choice-manager.cpp
diff --git a/daemon/mgmt/strategy-choice-manager.hpp b/NFD/daemon/mgmt/strategy-choice-manager.hpp
similarity index 100%
rename from daemon/mgmt/strategy-choice-manager.hpp
rename to NFD/daemon/mgmt/strategy-choice-manager.hpp
diff --git a/daemon/mgmt/strategy-choice-publisher.cpp b/NFD/daemon/mgmt/strategy-choice-publisher.cpp
similarity index 100%
rename from daemon/mgmt/strategy-choice-publisher.cpp
rename to NFD/daemon/mgmt/strategy-choice-publisher.cpp
diff --git a/daemon/mgmt/strategy-choice-publisher.hpp b/NFD/daemon/mgmt/strategy-choice-publisher.hpp
similarity index 100%
rename from daemon/mgmt/strategy-choice-publisher.hpp
rename to NFD/daemon/mgmt/strategy-choice-publisher.hpp
diff --git a/daemon/mgmt/tables-config-section.cpp b/NFD/daemon/mgmt/tables-config-section.cpp
similarity index 100%
rename from daemon/mgmt/tables-config-section.cpp
rename to NFD/daemon/mgmt/tables-config-section.cpp
diff --git a/daemon/mgmt/tables-config-section.hpp b/NFD/daemon/mgmt/tables-config-section.hpp
similarity index 100%
rename from daemon/mgmt/tables-config-section.hpp
rename to NFD/daemon/mgmt/tables-config-section.hpp
diff --git a/daemon/table/cs-entry.cpp b/NFD/daemon/table/cs-entry.cpp
similarity index 100%
rename from daemon/table/cs-entry.cpp
rename to NFD/daemon/table/cs-entry.cpp
diff --git a/daemon/table/cs-entry.hpp b/NFD/daemon/table/cs-entry.hpp
similarity index 100%
rename from daemon/table/cs-entry.hpp
rename to NFD/daemon/table/cs-entry.hpp
diff --git a/daemon/table/cs-skip-list-entry.cpp b/NFD/daemon/table/cs-skip-list-entry.cpp
similarity index 100%
rename from daemon/table/cs-skip-list-entry.cpp
rename to NFD/daemon/table/cs-skip-list-entry.cpp
diff --git a/daemon/table/cs-skip-list-entry.hpp b/NFD/daemon/table/cs-skip-list-entry.hpp
similarity index 100%
rename from daemon/table/cs-skip-list-entry.hpp
rename to NFD/daemon/table/cs-skip-list-entry.hpp
diff --git a/daemon/table/cs.cpp b/NFD/daemon/table/cs.cpp
similarity index 100%
rename from daemon/table/cs.cpp
rename to NFD/daemon/table/cs.cpp
diff --git a/daemon/table/cs.hpp b/NFD/daemon/table/cs.hpp
similarity index 100%
rename from daemon/table/cs.hpp
rename to NFD/daemon/table/cs.hpp
diff --git a/daemon/table/dead-nonce-list.cpp b/NFD/daemon/table/dead-nonce-list.cpp
similarity index 100%
rename from daemon/table/dead-nonce-list.cpp
rename to NFD/daemon/table/dead-nonce-list.cpp
diff --git a/daemon/table/dead-nonce-list.hpp b/NFD/daemon/table/dead-nonce-list.hpp
similarity index 100%
rename from daemon/table/dead-nonce-list.hpp
rename to NFD/daemon/table/dead-nonce-list.hpp
diff --git a/daemon/table/fib-entry.cpp b/NFD/daemon/table/fib-entry.cpp
similarity index 100%
rename from daemon/table/fib-entry.cpp
rename to NFD/daemon/table/fib-entry.cpp
diff --git a/daemon/table/fib-entry.hpp b/NFD/daemon/table/fib-entry.hpp
similarity index 100%
rename from daemon/table/fib-entry.hpp
rename to NFD/daemon/table/fib-entry.hpp
diff --git a/daemon/table/fib-nexthop.cpp b/NFD/daemon/table/fib-nexthop.cpp
similarity index 100%
rename from daemon/table/fib-nexthop.cpp
rename to NFD/daemon/table/fib-nexthop.cpp
diff --git a/daemon/table/fib-nexthop.hpp b/NFD/daemon/table/fib-nexthop.hpp
similarity index 100%
rename from daemon/table/fib-nexthop.hpp
rename to NFD/daemon/table/fib-nexthop.hpp
diff --git a/daemon/table/fib.cpp b/NFD/daemon/table/fib.cpp
similarity index 100%
rename from daemon/table/fib.cpp
rename to NFD/daemon/table/fib.cpp
diff --git a/daemon/table/fib.hpp b/NFD/daemon/table/fib.hpp
similarity index 100%
rename from daemon/table/fib.hpp
rename to NFD/daemon/table/fib.hpp
diff --git a/daemon/table/measurements-accessor.cpp b/NFD/daemon/table/measurements-accessor.cpp
similarity index 100%
rename from daemon/table/measurements-accessor.cpp
rename to NFD/daemon/table/measurements-accessor.cpp
diff --git a/daemon/table/measurements-accessor.hpp b/NFD/daemon/table/measurements-accessor.hpp
similarity index 100%
rename from daemon/table/measurements-accessor.hpp
rename to NFD/daemon/table/measurements-accessor.hpp
diff --git a/daemon/table/measurements-entry.cpp b/NFD/daemon/table/measurements-entry.cpp
similarity index 100%
rename from daemon/table/measurements-entry.cpp
rename to NFD/daemon/table/measurements-entry.cpp
diff --git a/daemon/table/measurements-entry.hpp b/NFD/daemon/table/measurements-entry.hpp
similarity index 100%
rename from daemon/table/measurements-entry.hpp
rename to NFD/daemon/table/measurements-entry.hpp
diff --git a/daemon/table/measurements.cpp b/NFD/daemon/table/measurements.cpp
similarity index 100%
rename from daemon/table/measurements.cpp
rename to NFD/daemon/table/measurements.cpp
diff --git a/daemon/table/measurements.hpp b/NFD/daemon/table/measurements.hpp
similarity index 100%
rename from daemon/table/measurements.hpp
rename to NFD/daemon/table/measurements.hpp
diff --git a/daemon/table/name-tree-entry.cpp b/NFD/daemon/table/name-tree-entry.cpp
similarity index 100%
rename from daemon/table/name-tree-entry.cpp
rename to NFD/daemon/table/name-tree-entry.cpp
diff --git a/daemon/table/name-tree-entry.hpp b/NFD/daemon/table/name-tree-entry.hpp
similarity index 100%
rename from daemon/table/name-tree-entry.hpp
rename to NFD/daemon/table/name-tree-entry.hpp
diff --git a/daemon/table/name-tree.cpp b/NFD/daemon/table/name-tree.cpp
similarity index 100%
rename from daemon/table/name-tree.cpp
rename to NFD/daemon/table/name-tree.cpp
diff --git a/daemon/table/name-tree.hpp b/NFD/daemon/table/name-tree.hpp
similarity index 100%
rename from daemon/table/name-tree.hpp
rename to NFD/daemon/table/name-tree.hpp
diff --git a/daemon/table/pit-entry.cpp b/NFD/daemon/table/pit-entry.cpp
similarity index 100%
rename from daemon/table/pit-entry.cpp
rename to NFD/daemon/table/pit-entry.cpp
diff --git a/daemon/table/pit-entry.hpp b/NFD/daemon/table/pit-entry.hpp
similarity index 100%
rename from daemon/table/pit-entry.hpp
rename to NFD/daemon/table/pit-entry.hpp
diff --git a/daemon/table/pit-face-record.cpp b/NFD/daemon/table/pit-face-record.cpp
similarity index 100%
rename from daemon/table/pit-face-record.cpp
rename to NFD/daemon/table/pit-face-record.cpp
diff --git a/daemon/table/pit-face-record.hpp b/NFD/daemon/table/pit-face-record.hpp
similarity index 100%
rename from daemon/table/pit-face-record.hpp
rename to NFD/daemon/table/pit-face-record.hpp
diff --git a/daemon/table/pit-in-record.cpp b/NFD/daemon/table/pit-in-record.cpp
similarity index 100%
rename from daemon/table/pit-in-record.cpp
rename to NFD/daemon/table/pit-in-record.cpp
diff --git a/daemon/table/pit-in-record.hpp b/NFD/daemon/table/pit-in-record.hpp
similarity index 100%
rename from daemon/table/pit-in-record.hpp
rename to NFD/daemon/table/pit-in-record.hpp
diff --git a/daemon/table/pit-out-record.cpp b/NFD/daemon/table/pit-out-record.cpp
similarity index 100%
rename from daemon/table/pit-out-record.cpp
rename to NFD/daemon/table/pit-out-record.cpp
diff --git a/daemon/table/pit-out-record.hpp b/NFD/daemon/table/pit-out-record.hpp
similarity index 100%
rename from daemon/table/pit-out-record.hpp
rename to NFD/daemon/table/pit-out-record.hpp
diff --git a/daemon/table/pit.cpp b/NFD/daemon/table/pit.cpp
similarity index 100%
rename from daemon/table/pit.cpp
rename to NFD/daemon/table/pit.cpp
diff --git a/daemon/table/pit.hpp b/NFD/daemon/table/pit.hpp
similarity index 100%
rename from daemon/table/pit.hpp
rename to NFD/daemon/table/pit.hpp
diff --git a/daemon/table/strategy-choice-entry.cpp b/NFD/daemon/table/strategy-choice-entry.cpp
similarity index 100%
rename from daemon/table/strategy-choice-entry.cpp
rename to NFD/daemon/table/strategy-choice-entry.cpp
diff --git a/daemon/table/strategy-choice-entry.hpp b/NFD/daemon/table/strategy-choice-entry.hpp
similarity index 100%
rename from daemon/table/strategy-choice-entry.hpp
rename to NFD/daemon/table/strategy-choice-entry.hpp
diff --git a/daemon/table/strategy-choice.cpp b/NFD/daemon/table/strategy-choice.cpp
similarity index 100%
rename from daemon/table/strategy-choice.cpp
rename to NFD/daemon/table/strategy-choice.cpp
diff --git a/daemon/table/strategy-choice.hpp b/NFD/daemon/table/strategy-choice.hpp
similarity index 100%
rename from daemon/table/strategy-choice.hpp
rename to NFD/daemon/table/strategy-choice.hpp
diff --git a/daemon/table/strategy-info-host.cpp b/NFD/daemon/table/strategy-info-host.cpp
similarity index 100%
rename from daemon/table/strategy-info-host.cpp
rename to NFD/daemon/table/strategy-info-host.cpp
diff --git a/daemon/table/strategy-info-host.hpp b/NFD/daemon/table/strategy-info-host.hpp
similarity index 100%
rename from daemon/table/strategy-info-host.hpp
rename to NFD/daemon/table/strategy-info-host.hpp
diff --git a/docs/FAQ.rst b/NFD/docs/FAQ.rst
similarity index 100%
rename from docs/FAQ.rst
rename to NFD/docs/FAQ.rst
diff --git a/docs/INSTALL.rst b/NFD/docs/INSTALL.rst
similarity index 100%
rename from docs/INSTALL.rst
rename to NFD/docs/INSTALL.rst
diff --git a/docs/RELEASE_NOTES.rst b/NFD/docs/RELEASE_NOTES.rst
similarity index 100%
rename from docs/RELEASE_NOTES.rst
rename to NFD/docs/RELEASE_NOTES.rst
diff --git a/docs/_static/.gitignore b/NFD/docs/_static/.gitignore
similarity index 100%
rename from docs/_static/.gitignore
rename to NFD/docs/_static/.gitignore
diff --git a/docs/_static/nfd-status.xsd b/NFD/docs/_static/nfd-status.xsd
similarity index 100%
rename from docs/_static/nfd-status.xsd
rename to NFD/docs/_static/nfd-status.xsd
diff --git a/docs/conf.py b/NFD/docs/conf.py
similarity index 100%
rename from docs/conf.py
rename to NFD/docs/conf.py
diff --git a/docs/doxygen.conf.in b/NFD/docs/doxygen.conf.in
similarity index 100%
rename from docs/doxygen.conf.in
rename to NFD/docs/doxygen.conf.in
diff --git a/docs/index.rst b/NFD/docs/index.rst
similarity index 100%
rename from docs/index.rst
rename to NFD/docs/index.rst
diff --git a/docs/manpages.rst b/NFD/docs/manpages.rst
similarity index 100%
rename from docs/manpages.rst
rename to NFD/docs/manpages.rst
diff --git a/docs/manpages/ndn-autoconfig-server.rst b/NFD/docs/manpages/ndn-autoconfig-server.rst
similarity index 100%
rename from docs/manpages/ndn-autoconfig-server.rst
rename to NFD/docs/manpages/ndn-autoconfig-server.rst
diff --git a/docs/manpages/ndn-autoconfig.rst b/NFD/docs/manpages/ndn-autoconfig.rst
similarity index 100%
rename from docs/manpages/ndn-autoconfig.rst
rename to NFD/docs/manpages/ndn-autoconfig.rst
diff --git a/docs/manpages/ndn-tlv-peek.rst b/NFD/docs/manpages/ndn-tlv-peek.rst
similarity index 100%
rename from docs/manpages/ndn-tlv-peek.rst
rename to NFD/docs/manpages/ndn-tlv-peek.rst
diff --git a/docs/manpages/ndn-tlv-poke.rst b/NFD/docs/manpages/ndn-tlv-poke.rst
similarity index 100%
rename from docs/manpages/ndn-tlv-poke.rst
rename to NFD/docs/manpages/ndn-tlv-poke.rst
diff --git a/docs/manpages/nfd-autoreg.rst b/NFD/docs/manpages/nfd-autoreg.rst
similarity index 100%
rename from docs/manpages/nfd-autoreg.rst
rename to NFD/docs/manpages/nfd-autoreg.rst
diff --git a/docs/manpages/nfd-status-http-server.rst b/NFD/docs/manpages/nfd-status-http-server.rst
similarity index 100%
rename from docs/manpages/nfd-status-http-server.rst
rename to NFD/docs/manpages/nfd-status-http-server.rst
diff --git a/docs/manpages/nfd-status.rst b/NFD/docs/manpages/nfd-status.rst
similarity index 100%
rename from docs/manpages/nfd-status.rst
rename to NFD/docs/manpages/nfd-status.rst
diff --git a/docs/manpages/nfd.rst b/NFD/docs/manpages/nfd.rst
similarity index 100%
rename from docs/manpages/nfd.rst
rename to NFD/docs/manpages/nfd.rst
diff --git a/docs/manpages/nfdc.rst b/NFD/docs/manpages/nfdc.rst
similarity index 100%
rename from docs/manpages/nfdc.rst
rename to NFD/docs/manpages/nfdc.rst
diff --git a/docs/manpages/nrd.rst b/NFD/docs/manpages/nrd.rst
similarity index 100%
rename from docs/manpages/nrd.rst
rename to NFD/docs/manpages/nrd.rst
diff --git a/docs/misc/local-prefix-discovery.rst b/NFD/docs/misc/local-prefix-discovery.rst
similarity index 100%
rename from docs/misc/local-prefix-discovery.rst
rename to NFD/docs/misc/local-prefix-discovery.rst
diff --git a/docs/named_data_theme/layout.html b/NFD/docs/named_data_theme/layout.html
similarity index 100%
rename from docs/named_data_theme/layout.html
rename to NFD/docs/named_data_theme/layout.html
diff --git a/docs/named_data_theme/named_data_footer-with-analytics.html.in b/NFD/docs/named_data_theme/named_data_footer-with-analytics.html.in
similarity index 100%
rename from docs/named_data_theme/named_data_footer-with-analytics.html.in
rename to NFD/docs/named_data_theme/named_data_footer-with-analytics.html.in
diff --git a/docs/named_data_theme/named_data_footer.html b/NFD/docs/named_data_theme/named_data_footer.html
similarity index 100%
rename from docs/named_data_theme/named_data_footer.html
rename to NFD/docs/named_data_theme/named_data_footer.html
diff --git a/docs/named_data_theme/named_data_header.html b/NFD/docs/named_data_theme/named_data_header.html
similarity index 100%
rename from docs/named_data_theme/named_data_header.html
rename to NFD/docs/named_data_theme/named_data_header.html
diff --git a/docs/named_data_theme/static/bar-top.png b/NFD/docs/named_data_theme/static/bar-top.png
similarity index 100%
rename from docs/named_data_theme/static/bar-top.png
rename to NFD/docs/named_data_theme/static/bar-top.png
Binary files differ
diff --git a/docs/named_data_theme/static/base.css b/NFD/docs/named_data_theme/static/base.css
similarity index 100%
rename from docs/named_data_theme/static/base.css
rename to NFD/docs/named_data_theme/static/base.css
diff --git a/docs/named_data_theme/static/base.css_t b/NFD/docs/named_data_theme/static/base.css_t
similarity index 100%
rename from docs/named_data_theme/static/base.css_t
rename to NFD/docs/named_data_theme/static/base.css_t
diff --git a/docs/named_data_theme/static/bc_s.png b/NFD/docs/named_data_theme/static/bc_s.png
similarity index 100%
rename from docs/named_data_theme/static/bc_s.png
rename to NFD/docs/named_data_theme/static/bc_s.png
Binary files differ
diff --git a/docs/named_data_theme/static/default.css_t b/NFD/docs/named_data_theme/static/default.css_t
similarity index 100%
rename from docs/named_data_theme/static/default.css_t
rename to NFD/docs/named_data_theme/static/default.css_t
diff --git a/docs/named_data_theme/static/doxygen.css b/NFD/docs/named_data_theme/static/doxygen.css
similarity index 100%
rename from docs/named_data_theme/static/doxygen.css
rename to NFD/docs/named_data_theme/static/doxygen.css
diff --git a/docs/named_data_theme/static/foundation.css b/NFD/docs/named_data_theme/static/foundation.css
similarity index 100%
rename from docs/named_data_theme/static/foundation.css
rename to NFD/docs/named_data_theme/static/foundation.css
diff --git a/docs/named_data_theme/static/named_data_doxygen.css b/NFD/docs/named_data_theme/static/named_data_doxygen.css
similarity index 100%
rename from docs/named_data_theme/static/named_data_doxygen.css
rename to NFD/docs/named_data_theme/static/named_data_doxygen.css
diff --git a/docs/named_data_theme/static/named_data_style.css_t b/NFD/docs/named_data_theme/static/named_data_style.css_t
similarity index 100%
rename from docs/named_data_theme/static/named_data_style.css_t
rename to NFD/docs/named_data_theme/static/named_data_style.css_t
diff --git a/docs/named_data_theme/static/nav_f.png b/NFD/docs/named_data_theme/static/nav_f.png
similarity index 100%
rename from docs/named_data_theme/static/nav_f.png
rename to NFD/docs/named_data_theme/static/nav_f.png
Binary files differ
diff --git a/docs/named_data_theme/static/tab_b.png b/NFD/docs/named_data_theme/static/tab_b.png
similarity index 100%
rename from docs/named_data_theme/static/tab_b.png
rename to NFD/docs/named_data_theme/static/tab_b.png
Binary files differ
diff --git a/docs/named_data_theme/theme.conf b/NFD/docs/named_data_theme/theme.conf
similarity index 100%
rename from docs/named_data_theme/theme.conf
rename to NFD/docs/named_data_theme/theme.conf
diff --git a/docs/overview.rst b/NFD/docs/overview.rst
similarity index 100%
rename from docs/overview.rst
rename to NFD/docs/overview.rst
diff --git a/docs/schema.rst b/NFD/docs/schema.rst
similarity index 100%
rename from docs/schema.rst
rename to NFD/docs/schema.rst
diff --git a/nfd.conf.sample.in b/NFD/nfd.conf.sample.in
similarity index 100%
rename from nfd.conf.sample.in
rename to NFD/nfd.conf.sample.in
diff --git a/rib/face-entry.hpp b/NFD/rib/face-entry.hpp
similarity index 100%
rename from rib/face-entry.hpp
rename to NFD/rib/face-entry.hpp
diff --git a/rib/fib-update.cpp b/NFD/rib/fib-update.cpp
similarity index 100%
rename from rib/fib-update.cpp
rename to NFD/rib/fib-update.cpp
diff --git a/rib/fib-update.hpp b/NFD/rib/fib-update.hpp
similarity index 100%
rename from rib/fib-update.hpp
rename to NFD/rib/fib-update.hpp
diff --git a/rib/main.cpp b/NFD/rib/main.cpp
similarity index 100%
rename from rib/main.cpp
rename to NFD/rib/main.cpp
diff --git a/rib/remote-registrator.cpp b/NFD/rib/remote-registrator.cpp
similarity index 100%
rename from rib/remote-registrator.cpp
rename to NFD/rib/remote-registrator.cpp
diff --git a/rib/remote-registrator.hpp b/NFD/rib/remote-registrator.hpp
similarity index 100%
rename from rib/remote-registrator.hpp
rename to NFD/rib/remote-registrator.hpp
diff --git a/rib/rib-entry.cpp b/NFD/rib/rib-entry.cpp
similarity index 100%
rename from rib/rib-entry.cpp
rename to NFD/rib/rib-entry.cpp
diff --git a/rib/rib-entry.hpp b/NFD/rib/rib-entry.hpp
similarity index 100%
rename from rib/rib-entry.hpp
rename to NFD/rib/rib-entry.hpp
diff --git a/rib/rib-manager.cpp b/NFD/rib/rib-manager.cpp
similarity index 100%
rename from rib/rib-manager.cpp
rename to NFD/rib/rib-manager.cpp
diff --git a/rib/rib-manager.hpp b/NFD/rib/rib-manager.hpp
similarity index 100%
rename from rib/rib-manager.hpp
rename to NFD/rib/rib-manager.hpp
diff --git a/rib/rib-status-publisher.cpp b/NFD/rib/rib-status-publisher.cpp
similarity index 100%
rename from rib/rib-status-publisher.cpp
rename to NFD/rib/rib-status-publisher.cpp
diff --git a/rib/rib-status-publisher.hpp b/NFD/rib/rib-status-publisher.hpp
similarity index 100%
rename from rib/rib-status-publisher.hpp
rename to NFD/rib/rib-status-publisher.hpp
diff --git a/rib/rib.cpp b/NFD/rib/rib.cpp
similarity index 100%
rename from rib/rib.cpp
rename to NFD/rib/rib.cpp
diff --git a/rib/rib.hpp b/NFD/rib/rib.hpp
similarity index 100%
rename from rib/rib.hpp
rename to NFD/rib/rib.hpp
diff --git a/tests/boost-test.hpp b/NFD/tests/boost-test.hpp
similarity index 100%
rename from tests/boost-test.hpp
rename to NFD/tests/boost-test.hpp
diff --git a/tests/core/config-file.cpp b/NFD/tests/core/config-file.cpp
similarity index 100%
rename from tests/core/config-file.cpp
rename to NFD/tests/core/config-file.cpp
diff --git a/tests/core/config_example.info b/NFD/tests/core/config_example.info
similarity index 100%
rename from tests/core/config_example.info
rename to NFD/tests/core/config_example.info
diff --git a/tests/core/config_malformed.info b/NFD/tests/core/config_malformed.info
similarity index 100%
rename from tests/core/config_malformed.info
rename to NFD/tests/core/config_malformed.info
diff --git a/tests/core/logger.cpp b/NFD/tests/core/logger.cpp
similarity index 100%
rename from tests/core/logger.cpp
rename to NFD/tests/core/logger.cpp
diff --git a/tests/core/ndebug.cpp b/NFD/tests/core/ndebug.cpp
similarity index 100%
rename from tests/core/ndebug.cpp
rename to NFD/tests/core/ndebug.cpp
diff --git a/tests/core/network-interface.cpp b/NFD/tests/core/network-interface.cpp
similarity index 100%
rename from tests/core/network-interface.cpp
rename to NFD/tests/core/network-interface.cpp
diff --git a/tests/core/network.cpp b/NFD/tests/core/network.cpp
similarity index 100%
rename from tests/core/network.cpp
rename to NFD/tests/core/network.cpp
diff --git a/tests/core/notification-stream.cpp b/NFD/tests/core/notification-stream.cpp
similarity index 100%
rename from tests/core/notification-stream.cpp
rename to NFD/tests/core/notification-stream.cpp
diff --git a/tests/core/resolver.cpp b/NFD/tests/core/resolver.cpp
similarity index 100%
rename from tests/core/resolver.cpp
rename to NFD/tests/core/resolver.cpp
diff --git a/tests/core/scheduler.cpp b/NFD/tests/core/scheduler.cpp
similarity index 100%
rename from tests/core/scheduler.cpp
rename to NFD/tests/core/scheduler.cpp
diff --git a/tests/core/segment-publisher.cpp b/NFD/tests/core/segment-publisher.cpp
similarity index 100%
rename from tests/core/segment-publisher.cpp
rename to NFD/tests/core/segment-publisher.cpp
diff --git a/tests/core/simple-notification.hpp b/NFD/tests/core/simple-notification.hpp
similarity index 100%
rename from tests/core/simple-notification.hpp
rename to NFD/tests/core/simple-notification.hpp
diff --git a/tests/core/version.cpp b/NFD/tests/core/version.cpp
similarity index 100%
rename from tests/core/version.cpp
rename to NFD/tests/core/version.cpp
diff --git a/tests/daemon/face/dummy-face.hpp b/NFD/tests/daemon/face/dummy-face.hpp
similarity index 100%
rename from tests/daemon/face/dummy-face.hpp
rename to NFD/tests/daemon/face/dummy-face.hpp
diff --git a/tests/daemon/face/dummy-stream-sender.hpp b/NFD/tests/daemon/face/dummy-stream-sender.hpp
similarity index 100%
rename from tests/daemon/face/dummy-stream-sender.hpp
rename to NFD/tests/daemon/face/dummy-stream-sender.hpp
diff --git a/tests/daemon/face/ethernet.cpp b/NFD/tests/daemon/face/ethernet.cpp
similarity index 100%
rename from tests/daemon/face/ethernet.cpp
rename to NFD/tests/daemon/face/ethernet.cpp
diff --git a/tests/daemon/face/face-counters.cpp b/NFD/tests/daemon/face/face-counters.cpp
similarity index 100%
rename from tests/daemon/face/face-counters.cpp
rename to NFD/tests/daemon/face/face-counters.cpp
diff --git a/tests/daemon/face/face.cpp b/NFD/tests/daemon/face/face.cpp
similarity index 100%
rename from tests/daemon/face/face.cpp
rename to NFD/tests/daemon/face/face.cpp
diff --git a/tests/daemon/face/ndnlp.cpp b/NFD/tests/daemon/face/ndnlp.cpp
similarity index 100%
rename from tests/daemon/face/ndnlp.cpp
rename to NFD/tests/daemon/face/ndnlp.cpp
diff --git a/tests/daemon/face/null.cpp b/NFD/tests/daemon/face/null.cpp
similarity index 100%
rename from tests/daemon/face/null.cpp
rename to NFD/tests/daemon/face/null.cpp
diff --git a/tests/daemon/face/packet-datasets.cpp b/NFD/tests/daemon/face/packet-datasets.cpp
similarity index 100%
rename from tests/daemon/face/packet-datasets.cpp
rename to NFD/tests/daemon/face/packet-datasets.cpp
diff --git a/tests/daemon/face/packet-datasets.hpp b/NFD/tests/daemon/face/packet-datasets.hpp
similarity index 100%
rename from tests/daemon/face/packet-datasets.hpp
rename to NFD/tests/daemon/face/packet-datasets.hpp
diff --git a/tests/daemon/face/tcp.cpp b/NFD/tests/daemon/face/tcp.cpp
similarity index 100%
rename from tests/daemon/face/tcp.cpp
rename to NFD/tests/daemon/face/tcp.cpp
diff --git a/tests/daemon/face/udp.cpp b/NFD/tests/daemon/face/udp.cpp
similarity index 100%
rename from tests/daemon/face/udp.cpp
rename to NFD/tests/daemon/face/udp.cpp
diff --git a/tests/daemon/face/unix-stream.cpp b/NFD/tests/daemon/face/unix-stream.cpp
similarity index 100%
rename from tests/daemon/face/unix-stream.cpp
rename to NFD/tests/daemon/face/unix-stream.cpp
diff --git a/tests/daemon/face/websocket.cpp b/NFD/tests/daemon/face/websocket.cpp
similarity index 100%
rename from tests/daemon/face/websocket.cpp
rename to NFD/tests/daemon/face/websocket.cpp
diff --git a/tests/daemon/fw/best-route-strategy2.cpp b/NFD/tests/daemon/fw/best-route-strategy2.cpp
similarity index 100%
rename from tests/daemon/fw/best-route-strategy2.cpp
rename to NFD/tests/daemon/fw/best-route-strategy2.cpp
diff --git a/tests/daemon/fw/broadcast-strategy.cpp b/NFD/tests/daemon/fw/broadcast-strategy.cpp
similarity index 100%
rename from tests/daemon/fw/broadcast-strategy.cpp
rename to NFD/tests/daemon/fw/broadcast-strategy.cpp
diff --git a/tests/daemon/fw/client-control-strategy.cpp b/NFD/tests/daemon/fw/client-control-strategy.cpp
similarity index 100%
rename from tests/daemon/fw/client-control-strategy.cpp
rename to NFD/tests/daemon/fw/client-control-strategy.cpp
diff --git a/tests/daemon/fw/dummy-strategy.hpp b/NFD/tests/daemon/fw/dummy-strategy.hpp
similarity index 100%
rename from tests/daemon/fw/dummy-strategy.hpp
rename to NFD/tests/daemon/fw/dummy-strategy.hpp
diff --git a/tests/daemon/fw/face-table.cpp b/NFD/tests/daemon/fw/face-table.cpp
similarity index 100%
rename from tests/daemon/fw/face-table.cpp
rename to NFD/tests/daemon/fw/face-table.cpp
diff --git a/tests/daemon/fw/forwarder.cpp b/NFD/tests/daemon/fw/forwarder.cpp
similarity index 100%
rename from tests/daemon/fw/forwarder.cpp
rename to NFD/tests/daemon/fw/forwarder.cpp
diff --git a/tests/daemon/fw/ncc-strategy.cpp b/NFD/tests/daemon/fw/ncc-strategy.cpp
similarity index 100%
rename from tests/daemon/fw/ncc-strategy.cpp
rename to NFD/tests/daemon/fw/ncc-strategy.cpp
diff --git a/tests/daemon/fw/rtt-estimator.cpp b/NFD/tests/daemon/fw/rtt-estimator.cpp
similarity index 100%
rename from tests/daemon/fw/rtt-estimator.cpp
rename to NFD/tests/daemon/fw/rtt-estimator.cpp
diff --git a/tests/daemon/fw/strategy-tester.hpp b/NFD/tests/daemon/fw/strategy-tester.hpp
similarity index 100%
rename from tests/daemon/fw/strategy-tester.hpp
rename to NFD/tests/daemon/fw/strategy-tester.hpp
diff --git a/tests/daemon/fw/strategy.cpp b/NFD/tests/daemon/fw/strategy.cpp
similarity index 100%
rename from tests/daemon/fw/strategy.cpp
rename to NFD/tests/daemon/fw/strategy.cpp
diff --git a/tests/daemon/mgmt/channel-status-common.hpp b/NFD/tests/daemon/mgmt/channel-status-common.hpp
similarity index 100%
rename from tests/daemon/mgmt/channel-status-common.hpp
rename to NFD/tests/daemon/mgmt/channel-status-common.hpp
diff --git a/tests/daemon/mgmt/channel-status-publisher.cpp b/NFD/tests/daemon/mgmt/channel-status-publisher.cpp
similarity index 100%
rename from tests/daemon/mgmt/channel-status-publisher.cpp
rename to NFD/tests/daemon/mgmt/channel-status-publisher.cpp
diff --git a/tests/daemon/mgmt/command-validator.cpp b/NFD/tests/daemon/mgmt/command-validator.cpp
similarity index 100%
rename from tests/daemon/mgmt/command-validator.cpp
rename to NFD/tests/daemon/mgmt/command-validator.cpp
diff --git a/tests/daemon/mgmt/face-manager.cpp b/NFD/tests/daemon/mgmt/face-manager.cpp
similarity index 100%
rename from tests/daemon/mgmt/face-manager.cpp
rename to NFD/tests/daemon/mgmt/face-manager.cpp
diff --git a/tests/daemon/mgmt/face-query-status-publisher-common.hpp b/NFD/tests/daemon/mgmt/face-query-status-publisher-common.hpp
similarity index 100%
rename from tests/daemon/mgmt/face-query-status-publisher-common.hpp
rename to NFD/tests/daemon/mgmt/face-query-status-publisher-common.hpp
diff --git a/tests/daemon/mgmt/face-query-status-publisher.cpp b/NFD/tests/daemon/mgmt/face-query-status-publisher.cpp
similarity index 100%
rename from tests/daemon/mgmt/face-query-status-publisher.cpp
rename to NFD/tests/daemon/mgmt/face-query-status-publisher.cpp
diff --git a/tests/daemon/mgmt/face-status-publisher-common.hpp b/NFD/tests/daemon/mgmt/face-status-publisher-common.hpp
similarity index 100%
rename from tests/daemon/mgmt/face-status-publisher-common.hpp
rename to NFD/tests/daemon/mgmt/face-status-publisher-common.hpp
diff --git a/tests/daemon/mgmt/face-status-publisher.cpp b/NFD/tests/daemon/mgmt/face-status-publisher.cpp
similarity index 100%
rename from tests/daemon/mgmt/face-status-publisher.cpp
rename to NFD/tests/daemon/mgmt/face-status-publisher.cpp
diff --git a/tests/daemon/mgmt/fib-enumeration-publisher-common.hpp b/NFD/tests/daemon/mgmt/fib-enumeration-publisher-common.hpp
similarity index 100%
rename from tests/daemon/mgmt/fib-enumeration-publisher-common.hpp
rename to NFD/tests/daemon/mgmt/fib-enumeration-publisher-common.hpp
diff --git a/tests/daemon/mgmt/fib-enumeration-publisher.cpp b/NFD/tests/daemon/mgmt/fib-enumeration-publisher.cpp
similarity index 100%
rename from tests/daemon/mgmt/fib-enumeration-publisher.cpp
rename to NFD/tests/daemon/mgmt/fib-enumeration-publisher.cpp
diff --git a/tests/daemon/mgmt/fib-manager.cpp b/NFD/tests/daemon/mgmt/fib-manager.cpp
similarity index 100%
rename from tests/daemon/mgmt/fib-manager.cpp
rename to NFD/tests/daemon/mgmt/fib-manager.cpp
diff --git a/tests/daemon/mgmt/general-config-section.cpp b/NFD/tests/daemon/mgmt/general-config-section.cpp
similarity index 100%
rename from tests/daemon/mgmt/general-config-section.cpp
rename to NFD/tests/daemon/mgmt/general-config-section.cpp
diff --git a/tests/daemon/mgmt/internal-face.cpp b/NFD/tests/daemon/mgmt/internal-face.cpp
similarity index 100%
rename from tests/daemon/mgmt/internal-face.cpp
rename to NFD/tests/daemon/mgmt/internal-face.cpp
diff --git a/tests/daemon/mgmt/malformed.ndncert b/NFD/tests/daemon/mgmt/malformed.ndncert
similarity index 100%
rename from tests/daemon/mgmt/malformed.ndncert
rename to NFD/tests/daemon/mgmt/malformed.ndncert
diff --git a/tests/daemon/mgmt/manager-base.cpp b/NFD/tests/daemon/mgmt/manager-base.cpp
similarity index 100%
rename from tests/daemon/mgmt/manager-base.cpp
rename to NFD/tests/daemon/mgmt/manager-base.cpp
diff --git a/tests/daemon/mgmt/status-server.cpp b/NFD/tests/daemon/mgmt/status-server.cpp
similarity index 100%
rename from tests/daemon/mgmt/status-server.cpp
rename to NFD/tests/daemon/mgmt/status-server.cpp
diff --git a/tests/daemon/mgmt/strategy-choice-manager.cpp b/NFD/tests/daemon/mgmt/strategy-choice-manager.cpp
similarity index 100%
rename from tests/daemon/mgmt/strategy-choice-manager.cpp
rename to NFD/tests/daemon/mgmt/strategy-choice-manager.cpp
diff --git a/tests/daemon/mgmt/strategy-choice-publisher.cpp b/NFD/tests/daemon/mgmt/strategy-choice-publisher.cpp
similarity index 100%
rename from tests/daemon/mgmt/strategy-choice-publisher.cpp
rename to NFD/tests/daemon/mgmt/strategy-choice-publisher.cpp
diff --git a/tests/daemon/mgmt/tables-config-section.cpp b/NFD/tests/daemon/mgmt/tables-config-section.cpp
similarity index 100%
rename from tests/daemon/mgmt/tables-config-section.cpp
rename to NFD/tests/daemon/mgmt/tables-config-section.cpp
diff --git a/tests/daemon/mgmt/validation-common.cpp b/NFD/tests/daemon/mgmt/validation-common.cpp
similarity index 100%
rename from tests/daemon/mgmt/validation-common.cpp
rename to NFD/tests/daemon/mgmt/validation-common.cpp
diff --git a/tests/daemon/mgmt/validation-common.hpp b/NFD/tests/daemon/mgmt/validation-common.hpp
similarity index 100%
rename from tests/daemon/mgmt/validation-common.hpp
rename to NFD/tests/daemon/mgmt/validation-common.hpp
diff --git a/tests/daemon/table/cs.cpp b/NFD/tests/daemon/table/cs.cpp
similarity index 100%
rename from tests/daemon/table/cs.cpp
rename to NFD/tests/daemon/table/cs.cpp
diff --git a/tests/daemon/table/dead-nonce-list.cpp b/NFD/tests/daemon/table/dead-nonce-list.cpp
similarity index 100%
rename from tests/daemon/table/dead-nonce-list.cpp
rename to NFD/tests/daemon/table/dead-nonce-list.cpp
diff --git a/tests/daemon/table/fib.cpp b/NFD/tests/daemon/table/fib.cpp
similarity index 100%
rename from tests/daemon/table/fib.cpp
rename to NFD/tests/daemon/table/fib.cpp
diff --git a/tests/daemon/table/measurements-accessor.cpp b/NFD/tests/daemon/table/measurements-accessor.cpp
similarity index 100%
rename from tests/daemon/table/measurements-accessor.cpp
rename to NFD/tests/daemon/table/measurements-accessor.cpp
diff --git a/tests/daemon/table/measurements.cpp b/NFD/tests/daemon/table/measurements.cpp
similarity index 100%
rename from tests/daemon/table/measurements.cpp
rename to NFD/tests/daemon/table/measurements.cpp
diff --git a/tests/daemon/table/name-tree.cpp b/NFD/tests/daemon/table/name-tree.cpp
similarity index 100%
rename from tests/daemon/table/name-tree.cpp
rename to NFD/tests/daemon/table/name-tree.cpp
diff --git a/tests/daemon/table/pit.cpp b/NFD/tests/daemon/table/pit.cpp
similarity index 100%
rename from tests/daemon/table/pit.cpp
rename to NFD/tests/daemon/table/pit.cpp
diff --git a/tests/daemon/table/strategy-choice.cpp b/NFD/tests/daemon/table/strategy-choice.cpp
similarity index 100%
rename from tests/daemon/table/strategy-choice.cpp
rename to NFD/tests/daemon/table/strategy-choice.cpp
diff --git a/tests/daemon/table/strategy-info-host.cpp b/NFD/tests/daemon/table/strategy-info-host.cpp
similarity index 100%
rename from tests/daemon/table/strategy-info-host.cpp
rename to NFD/tests/daemon/table/strategy-info-host.cpp
diff --git a/tests/global-configuration.cpp b/NFD/tests/global-configuration.cpp
similarity index 100%
rename from tests/global-configuration.cpp
rename to NFD/tests/global-configuration.cpp
diff --git a/tests/identity-management-fixture.cpp b/NFD/tests/identity-management-fixture.cpp
similarity index 100%
rename from tests/identity-management-fixture.cpp
rename to NFD/tests/identity-management-fixture.cpp
diff --git a/tests/identity-management-fixture.hpp b/NFD/tests/identity-management-fixture.hpp
similarity index 100%
rename from tests/identity-management-fixture.hpp
rename to NFD/tests/identity-management-fixture.hpp
diff --git a/tests/limited-io.cpp b/NFD/tests/limited-io.cpp
similarity index 100%
rename from tests/limited-io.cpp
rename to NFD/tests/limited-io.cpp
diff --git a/tests/limited-io.hpp b/NFD/tests/limited-io.hpp
similarity index 100%
rename from tests/limited-io.hpp
rename to NFD/tests/limited-io.hpp
diff --git a/tests/main.cpp b/NFD/tests/main.cpp
similarity index 100%
rename from tests/main.cpp
rename to NFD/tests/main.cpp
diff --git a/tests/other/cs-smoketest.cpp b/NFD/tests/other/cs-smoketest.cpp
similarity index 100%
rename from tests/other/cs-smoketest.cpp
rename to NFD/tests/other/cs-smoketest.cpp
diff --git a/tests/other/wscript b/NFD/tests/other/wscript
similarity index 100%
rename from tests/other/wscript
rename to NFD/tests/other/wscript
diff --git a/tests/rib/fib-updates-common.hpp b/NFD/tests/rib/fib-updates-common.hpp
similarity index 100%
rename from tests/rib/fib-updates-common.hpp
rename to NFD/tests/rib/fib-updates-common.hpp
diff --git a/tests/rib/fib-updates-erase-face.cpp b/NFD/tests/rib/fib-updates-erase-face.cpp
similarity index 100%
rename from tests/rib/fib-updates-erase-face.cpp
rename to NFD/tests/rib/fib-updates-erase-face.cpp
diff --git a/tests/rib/fib-updates-new-face.cpp b/NFD/tests/rib/fib-updates-new-face.cpp
similarity index 100%
rename from tests/rib/fib-updates-new-face.cpp
rename to NFD/tests/rib/fib-updates-new-face.cpp
diff --git a/tests/rib/fib-updates-new-namespace.cpp b/NFD/tests/rib/fib-updates-new-namespace.cpp
similarity index 100%
rename from tests/rib/fib-updates-new-namespace.cpp
rename to NFD/tests/rib/fib-updates-new-namespace.cpp
diff --git a/tests/rib/fib-updates-update-face.cpp b/NFD/tests/rib/fib-updates-update-face.cpp
similarity index 100%
rename from tests/rib/fib-updates-update-face.cpp
rename to NFD/tests/rib/fib-updates-update-face.cpp
diff --git a/tests/rib/remote-registrator.cpp b/NFD/tests/rib/remote-registrator.cpp
similarity index 100%
rename from tests/rib/remote-registrator.cpp
rename to NFD/tests/rib/remote-registrator.cpp
diff --git a/tests/rib/rib-manager.cpp b/NFD/tests/rib/rib-manager.cpp
similarity index 100%
rename from tests/rib/rib-manager.cpp
rename to NFD/tests/rib/rib-manager.cpp
diff --git a/tests/rib/rib-status-publisher-common.hpp b/NFD/tests/rib/rib-status-publisher-common.hpp
similarity index 100%
rename from tests/rib/rib-status-publisher-common.hpp
rename to NFD/tests/rib/rib-status-publisher-common.hpp
diff --git a/tests/rib/rib-status-publisher.cpp b/NFD/tests/rib/rib-status-publisher.cpp
similarity index 100%
rename from tests/rib/rib-status-publisher.cpp
rename to NFD/tests/rib/rib-status-publisher.cpp
diff --git a/tests/rib/rib.cpp b/NFD/tests/rib/rib.cpp
similarity index 100%
rename from tests/rib/rib.cpp
rename to NFD/tests/rib/rib.cpp
diff --git a/tests/test-case.cpp.sample b/NFD/tests/test-case.cpp.sample
similarity index 100%
rename from tests/test-case.cpp.sample
rename to NFD/tests/test-case.cpp.sample
diff --git a/tests/test-common.hpp b/NFD/tests/test-common.hpp
similarity index 100%
rename from tests/test-common.hpp
rename to NFD/tests/test-common.hpp
diff --git a/tests/wscript b/NFD/tests/wscript
similarity index 100%
rename from tests/wscript
rename to NFD/tests/wscript
diff --git a/tools/ndn-autoconfig-server.cpp b/NFD/tools/ndn-autoconfig-server.cpp
similarity index 100%
rename from tools/ndn-autoconfig-server.cpp
rename to NFD/tools/ndn-autoconfig-server.cpp
diff --git a/tools/ndn-autoconfig.cpp b/NFD/tools/ndn-autoconfig.cpp
similarity index 100%
rename from tools/ndn-autoconfig.cpp
rename to NFD/tools/ndn-autoconfig.cpp
diff --git a/tools/ndn-tlv-peek.cpp b/NFD/tools/ndn-tlv-peek.cpp
similarity index 100%
rename from tools/ndn-tlv-peek.cpp
rename to NFD/tools/ndn-tlv-peek.cpp
diff --git a/tools/ndn-tlv-poke.cpp b/NFD/tools/ndn-tlv-poke.cpp
similarity index 100%
rename from tools/ndn-tlv-poke.cpp
rename to NFD/tools/ndn-tlv-poke.cpp
diff --git a/tools/nfd-autoreg.cpp b/NFD/tools/nfd-autoreg.cpp
similarity index 100%
rename from tools/nfd-autoreg.cpp
rename to NFD/tools/nfd-autoreg.cpp
diff --git a/tools/nfd-start.sh b/NFD/tools/nfd-start.sh
similarity index 100%
rename from tools/nfd-start.sh
rename to NFD/tools/nfd-start.sh
diff --git a/tools/nfd-status-http-server-files/nfd-status.xsl b/NFD/tools/nfd-status-http-server-files/nfd-status.xsl
similarity index 100%
rename from tools/nfd-status-http-server-files/nfd-status.xsl
rename to NFD/tools/nfd-status-http-server-files/nfd-status.xsl
diff --git a/tools/nfd-status-http-server-files/reset.css b/NFD/tools/nfd-status-http-server-files/reset.css
similarity index 100%
rename from tools/nfd-status-http-server-files/reset.css
rename to NFD/tools/nfd-status-http-server-files/reset.css
diff --git a/tools/nfd-status-http-server-files/robots.txt b/NFD/tools/nfd-status-http-server-files/robots.txt
similarity index 100%
rename from tools/nfd-status-http-server-files/robots.txt
rename to NFD/tools/nfd-status-http-server-files/robots.txt
diff --git a/tools/nfd-status-http-server-files/style.css b/NFD/tools/nfd-status-http-server-files/style.css
similarity index 100%
rename from tools/nfd-status-http-server-files/style.css
rename to NFD/tools/nfd-status-http-server-files/style.css
diff --git a/tools/nfd-status-http-server-files/text.css b/NFD/tools/nfd-status-http-server-files/text.css
similarity index 100%
rename from tools/nfd-status-http-server-files/text.css
rename to NFD/tools/nfd-status-http-server-files/text.css
diff --git a/tools/nfd-status-http-server.py b/NFD/tools/nfd-status-http-server.py
similarity index 100%
rename from tools/nfd-status-http-server.py
rename to NFD/tools/nfd-status-http-server.py
diff --git a/tools/nfd-status.cpp b/NFD/tools/nfd-status.cpp
similarity index 100%
rename from tools/nfd-status.cpp
rename to NFD/tools/nfd-status.cpp
diff --git a/tools/nfd-stop.sh b/NFD/tools/nfd-stop.sh
similarity index 100%
rename from tools/nfd-stop.sh
rename to NFD/tools/nfd-stop.sh
diff --git a/tools/nfdc.cpp b/NFD/tools/nfdc.cpp
similarity index 100%
rename from tools/nfdc.cpp
rename to NFD/tools/nfdc.cpp
diff --git a/tools/nfdc.hpp b/NFD/tools/nfdc.hpp
similarity index 100%
rename from tools/nfdc.hpp
rename to NFD/tools/nfdc.hpp
diff --git a/unit-tests.conf.sample b/NFD/unit-tests.conf.sample
similarity index 100%
rename from unit-tests.conf.sample
rename to NFD/unit-tests.conf.sample
diff --git a/version.hpp.in b/NFD/version.hpp.in
similarity index 100%
rename from version.hpp.in
rename to NFD/version.hpp.in
diff --git a/waf b/NFD/waf
similarity index 100%
rename from waf
rename to NFD/waf
diff --git a/websocketpp b/NFD/websocketpp
similarity index 100%
rename from websocketpp
rename to NFD/websocketpp
diff --git a/NFD/wscript b/NFD/wscript
new file mode 100644
index 0000000..65c249a
--- /dev/null
+++ b/NFD/wscript
@@ -0,0 +1,321 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+"""
+Copyright (c) 2014  Regents of the University of California,
+                    Arizona Board of Regents,
+                    Colorado State University,
+                    University Pierre & Marie Curie, Sorbonne University,
+                    Washington University in St. Louis,
+                    Beijing Institute of Technology
+
+This file is part of NFD (Named Data Networking Forwarding Daemon).
+See AUTHORS.md for complete list of NFD authors and contributors.
+
+NFD is free software: you can redistribute it and/or modify it under the terms
+of the GNU General Public License as published by the Free Software Foundation,
+either version 3 of the License, or (at your option) any later version.
+
+NFD 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
+NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+VERSION = "0.2.0"
+APPNAME = "nfd"
+BUGREPORT = "http://redmine.named-data.net/projects/nfd"
+URL = "http://named-data.net/doc/NFD/"
+GIT_TAG_PREFIX = "NFD-"
+
+from waflib import Logs, Utils, Context
+import os
+
+def options(opt):
+    opt.load(['compiler_cxx', 'gnu_dirs'])
+    opt.load(['boost', 'unix-socket', 'dependency-checker', 'websocket',
+              'default-compiler-flags', 'coverage', 'pch', 'boost-kqueue',
+              'doxygen', 'sphinx_build', 'type_traits', 'compiler-features'],
+             tooldir=['.waf-tools'])
+
+    nfdopt = opt.add_option_group('NFD Options')
+    opt.addUnixOptions(nfdopt)
+    opt.addWebsocketOptions(nfdopt)
+    opt.addDependencyOptions(nfdopt, 'libpcap')
+    nfdopt.add_option('--without-libpcap', action='store_true', default=False,
+                      dest='without_libpcap',
+                      help='''Disable libpcap (Ethernet face support will be disabled)''')
+
+    opt.addDependencyOptions(nfdopt, 'librt',     '(optional)')
+    opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
+
+    nfdopt.add_option('--with-tests', action='store_true', default=False,
+                      dest='with_tests', help='''Build unit tests''')
+    nfdopt.add_option('--with-other-tests', action='store_true', default=False,
+                      dest='with_other_tests', help='''Build other tests''')
+
+def configure(conf):
+    conf.load(['compiler_cxx', 'gnu_dirs',
+               'default-compiler-flags', 'pch', 'boost-kqueue',
+               'boost', 'dependency-checker', 'websocket',
+               'doxygen', 'sphinx_build', 'type_traits', 'compiler-features'])
+
+    conf.find_program('bash', var='BASH')
+
+    if not os.environ.has_key('PKG_CONFIG_PATH'):
+        os.environ['PKG_CONFIG_PATH'] = ':'.join([
+            '/usr/local/lib/pkgconfig',
+            '/opt/local/lib/pkgconfig'])
+    conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
+                   uselib_store='NDN_CXX', mandatory=True)
+
+    conf.checkDependency(name='librt', lib='rt', mandatory=False)
+    conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
+
+    boost_libs = 'system chrono program_options random'
+    if conf.options.with_tests:
+        conf.env['WITH_TESTS'] = 1
+        conf.define('WITH_TESTS', 1);
+        boost_libs += ' unit_test_framework'
+
+    if conf.options.with_other_tests:
+        conf.env['WITH_OTHER_TESTS'] = 1
+
+    conf.check_boost(lib=boost_libs)
+    if conf.env.BOOST_VERSION_NUMBER < 104800:
+        Logs.error("Minimum required boost version is 1.48.0")
+        Logs.error("Please upgrade your distribution or install custom boost libraries" +
+                   " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
+        return
+
+    conf.load('unix-socket')
+    conf.checkWebsocket(mandatory=True)
+
+    if not conf.options.without_libpcap:
+        conf.check_asio_pcap_support()
+        if conf.env['HAVE_ASIO_PCAP_SUPPORT']:
+            conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
+                                 errmsg='not found, but required for Ethernet face support. '
+                                        'Specify --without-libpcap to disable Ethernet face support.')
+        else:
+            Logs.warn('Warning: Ethernet face support is not supported on this platform with Boost libraries version 1.56. '
+                      'See http://redmine.named-data.net/issues/1877 for more details')
+    if conf.env['HAVE_LIBPCAP']:
+        conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
+                       cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
+
+    conf.load('coverage')
+
+    conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
+
+    # disable assertions in release builds
+    if not conf.options.debug:
+        conf.define('NDEBUG', 1)
+
+    conf.write_config_header('config.hpp')
+
+def build(bld):
+    version(bld)
+
+    bld(features="subst",
+        name='version',
+        source='version.hpp.in',
+        target='version.hpp',
+        install_path=None,
+        VERSION_STRING=VERSION_BASE,
+        VERSION_BUILD=VERSION,
+        VERSION=int(VERSION_SPLIT[0]) * 1000000 +
+                int(VERSION_SPLIT[1]) * 1000 +
+                int(VERSION_SPLIT[2]),
+        VERSION_MAJOR=VERSION_SPLIT[0],
+        VERSION_MINOR=VERSION_SPLIT[1],
+        VERSION_PATCH=VERSION_SPLIT[2],
+        )
+
+    core = bld(
+        target='core-objects',
+        name='core-objects',
+        features='cxx pch',
+        source=bld.path.ant_glob(['core/**/*.cpp']),
+        use='version BOOST NDN_CXX LIBRT',
+        includes='. core',
+        export_includes='. core',
+        headers='common.hpp',
+        )
+
+    nfd_objects = bld(
+        target='daemon-objects',
+        name='daemon-objects',
+        features='cxx',
+        source=bld.path.ant_glob(['daemon/**/*.cpp'],
+                                 excl=['daemon/face/ethernet-*.cpp',
+                                       'daemon/face/unix-*.cpp',
+                                       'daemon/face/websocket-*.cpp',
+                                       'daemon/main.cpp']),
+        use='core-objects WEBSOCKET',
+        includes='daemon',
+        export_includes='daemon',
+        )
+
+    if bld.env['HAVE_LIBPCAP']:
+        nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
+        nfd_objects.use += ' LIBPCAP'
+
+    if bld.env['HAVE_UNIX_SOCKETS']:
+        nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
+
+    if bld.env['HAVE_WEBSOCKET']:
+        nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
+
+    bld(target='bin/nfd',
+        features='cxx cxxprogram',
+        source='daemon/main.cpp',
+        use='daemon-objects',
+        )
+
+    rib_objects = bld(
+        target='rib-objects',
+        name='rib-objects',
+        features='cxx',
+        source=bld.path.ant_glob(['rib/**/*.cpp'],
+                                 excl=['rib/main.cpp']),
+        use='core-objects',
+        )
+
+    bld(target='bin/nrd',
+        features='cxx cxxprogram',
+        source='rib/main.cpp',
+        use='rib-objects',
+        )
+
+    for app in bld.path.ant_glob('tools/*.cpp'):
+        bld(features=['cxx', 'cxxprogram'],
+            target='bin/%s' % (str(app.change_ext(''))),
+            source=['tools/%s' % (str(app))],
+            use='core-objects LIBRESOLV',
+            )
+
+    bld.recurse("tests")
+
+    bld(features="subst",
+        source='nfd.conf.sample.in',
+        target='nfd.conf.sample',
+        install_path="${SYSCONFDIR}/ndn",
+        IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
+        IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
+
+    if bld.env['SPHINX_BUILD']:
+        bld(features="sphinx",
+            builder="man",
+            outdir="docs/manpages",
+            config="docs/conf.py",
+            source=bld.path.ant_glob('docs/manpages/**/*.rst'),
+            install_path="${MANDIR}/",
+            VERSION=VERSION)
+
+    for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
+        bld(features='subst',
+            source='tools/%s' % (str(script)),
+            target='bin/%s' % (str(script.change_ext(''))),
+            install_path="${BINDIR}",
+            chmod=Utils.O755,
+            VERSION=VERSION)
+
+    bld.install_files("${DATAROOTDIR}/ndn",
+                      bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
+
+def docs(bld):
+    from waflib import Options
+    Options.commands = ['doxygen', 'sphinx'] + Options.commands
+
+def doxygen(bld):
+    version(bld)
+
+    if not bld.env.DOXYGEN:
+        Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
+    else:
+        bld(features="subst",
+            name="doxygen-conf",
+            source=["docs/doxygen.conf.in",
+                    "docs/named_data_theme/named_data_footer-with-analytics.html.in"],
+            target=["docs/doxygen.conf",
+                    "docs/named_data_theme/named_data_footer-with-analytics.html"],
+            VERSION=VERSION_BASE,
+            HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
+                          if os.getenv('GOOGLE_ANALYTICS', None) \
+                          else "../docs/named_data_theme/named_data_footer.html",
+            GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""),
+            )
+
+        bld(features="doxygen",
+            doxyfile='docs/doxygen.conf',
+            use="doxygen-conf")
+
+def sphinx(bld):
+    version(bld)
+
+    if not bld.env.SPHINX_BUILD:
+        bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
+    else:
+        bld(features="sphinx",
+            outdir="docs",
+            source=bld.path.ant_glob('docs/**/*.rst'),
+            config="docs/conf.py",
+            VERSION=VERSION_BASE)
+
+def version(ctx):
+    if getattr(Context.g_module, 'VERSION_BASE', None):
+        return
+
+    Context.g_module.VERSION_BASE = Context.g_module.VERSION
+    Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
+
+    didGetVersion = False
+    try:
+        cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
+        p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
+                                   stderr=None, stdin=None)
+        out = str(p.communicate()[0].strip())
+        didGetVersion = (p.returncode == 0 and out != "")
+        if didGetVersion:
+            if out.startswith(GIT_TAG_PREFIX):
+                Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
+            else:
+                Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
+    except OSError:
+        pass
+
+    versionFile = ctx.path.find_node('VERSION')
+
+    if not didGetVersion and versionFile is not None:
+        try:
+            Context.g_module.VERSION = versionFile.read()
+            return
+        except (OSError, IOError):
+            pass
+
+    # version was obtained from git, update VERSION file if necessary
+    if versionFile is not None:
+        try:
+            version = versionFile.read()
+            if version == Context.g_module.VERSION:
+                return # no need to update
+        except (OSError, IOError):
+            Logs.warn("VERSION file exists, but not readable")
+    else:
+        versionFile = ctx.path.make_node('VERSION')
+
+    if versionFile is None:
+        return
+
+    try:
+        versionFile.write(Context.g_module.VERSION)
+    except (OSError, IOError):
+        Logs.warn("VERSION file is not writeable")
+
+def dist(ctx):
+    version(ctx)
+
+def distcheck(ctx):
+    version(ctx)
diff --git a/README.md b/README.md
index 455be28..7a5f5e9 100644
--- a/README.md
+++ b/README.md
@@ -1,42 +1,177 @@
-NFD - Named Data Networking Forwarding Daemon
-=============================================
+[ndnSIM documentation](http://ndnsim.net)
+=========================================
 
-For complete documentation, including step-by-step installation instructions and
-tutorials, please visit the [NFD homepage](http://named-data.net/doc/NFD/).
+For more information, including downloading and compilation instruction, please refer to documentation in ``doc/`` or on http://ndnsim.net
 
-## Overview
+Getting Started
+---------------
 
-NFD is a network forwarder that implements and evolves together with the Named Data
-Networking (NDN) [protocol](http://named-data.net/doc/ndn-tlv/).  After the initial
-release, NFD will become a core component of the
-[NDN Platform](http://named-data.net/codebase/platform/) and will follow the same release
-cycle.
+### Portability
 
-NFD is an open and free software package licensed under GPL 3.0 license and is the
-centerpiece of our committement to making NDN's core technology open and free to all
-Internet users and developers.  For more information about the licensing details and
-limitation, refer to
-[`COPYING.md`](https://github.com/named-data/NFD/blob/master/COPYING.md).
+ndnSIM has been successfully compiled and used under Ubuntu Linux 12.04 (boost libraries **1.48**, with default version 1.46 compilation will probably fail), 12.10 (default version of boost 1.49), 13.04 (default version of boost 1.49), Fedora 18, Mac OS 10.7 and 10.8 (gcc-4.2 apple/llvm, macports gcc 4.7, boost 1.49-1.54).
 
-NFD is developed by a community effort.  Although the first release was mostly done by the
-members of [NSF-sponsored NDN project team](http://named-data.net/project/participants/),
-it already contains significant contributions from people outside the project team (for
-more details, refer to
-[`AUTHORS.md`](https://github.com/named-data/NFD/blob/master/AUTHORS.md)).  We strongly
-encourage participation from all interested parties, since broader community support is
-key for NDN to succeed as a new Internet architecture.  Bug reports and feedback are
-highly appreciated and can be made through
-[Redmine site](http://redmine.named-data.net/projects/nfd) and the
-[ndn-interest mailing list](http://www.lists.cs.ucla.edu/mailman/listinfo/ndn-interest).
+### Requirements
 
-The main design goal of NFD is to support diverse experimentation of NDN technology.  The
-design emphasizes *modularity* and *extensibility* to allow easy experiments with new
-protocol features, algorithms, new applications.  We have not fully optimized the code for
-performance.  The intention is that performance optimizations are one type of experiments
-that developers can conduct by trying out different data structures and different
-algorithms; over time, better implementations may emerge within the same design framework.
+1. ndnSIM requires the customized version of NS-3 simulator (a number of patches required to make ndnSIM work with the latest development branch of NS-3).
 
-NFD will keep evolving in three aspects: improvement of the modularity framework, keeping
-up with the NDN protocol spec, and addition of other new features. We hope to keep the
-modular framework stable and lean, allowing researchers to implement and experiment with
-various features, some of which may eventually work into the protocol spec.
+2. Boost libraries should be installed on the system:
+
+  * For Ubuntu
+  
+    * 12.04
+  
+            sudo aptitude install libboost1.48-all-dev
+  
+    * 12.10, 13.04, and newer versions
+  
+            sudo aptitude install libboost-all-dev
+  
+  * For Fedora (for Fedora 18 and later only):
+  
+          sudo yum install boost-devel
+  
+  * For MacOS (macports):
+  
+          sudo port instal boost
+
+  **!!! ndnSIM requires boost version at least 1.48.**   Many linux distribution (Fedora 16, 17 at the time of this writing) ship an old version of boost, making it impossible to compile ndnSIM out-of-the-box.  Please install the latest version, following these simple instructions (http://ndnsim.net/faq.html#installing-boost-libraries).
+
+  **For Ubuntu 12.04**  Ubuntu 12.04 ships with two versions of boost libraries and it is known that if both are installed, then compilation of ndnSIM will most likely fail.  Please install ``libboost1.48-dev-all`` package and uninstall ``libboost-dev-all``.  If you want to install the latest version of boost libraries, then uninstall both ``libboost1.48-dev-all`` and ``libboost-dev-all``, so the libraries do not interfere with each other.
+
+  If you do not have root permissions to install boost, you can install it in your home folder.  However, you need to be make sure that `libboost_iostreams` library is successfully compiled and is installed.  Please refer to the following example http://ndnsim.net/faq.html#installing-boost-libraries for the hints how to successfully compile and install boost libraries on Ubuntu Linux.
+
+3. If you are planning to use other modules, like visualizer, a number of additional dependencies should be installed.  For example, in
+order to run visualizer module (http://www.nsnam.org/wiki/index.php/PyViz), the following should be installed:
+
+  * For Ubuntu (tested on Ubuntu 12.04, 12.10, 13.04, should work on later versions as well):
+  
+          sudo apt-get install python-dev python-pygraphviz python-kiwi
+          sudo apt-get install python-pygoocanvas python-gnome2
+          sudo apt-get install python-gnomedesktop python-rsvg ipython
+  
+  * For Fedora (tested on Fedora 16):
+  
+          sudo yum install pygoocanvas python-kiwi graphviz-python
+  
+          # easy_install method, since pygraphviz is not (yet?) packaged into Fedora (https://bugzilla.redhat.com/show_bug.cgi?id=740687)
+          sudo yum install graphviz-devel
+          sudo yum install python-pip
+          sudo easy_install pygraphviz
+  
+  * For MacOS (macports):
+  
+          sudo port install  py27-pygraphviz py27-goocanvas
+
+### Downloading ndnSIM source
+
+Download a custom branch of NS-3 that contains all necessary patches, python binding generation library (optional), and clone actual ndnSIM code and place it in src/ folder:
+
+    mkdir ndnSIM
+    cd ndnSIM
+    git clone git://github.com/cawka/ns-3-dev-ndnSIM.git ns-3
+    git clone git://github.com/cawka/pybindgen.git pybindgen
+    git clone git://github.com/NDN-Routing/ndnSIM.git ns-3/src/ndnSIM
+
+There are quite a few modification to the base NS-3 code that are necessary to run ndnSIM, and the code is periodically synchronized with the official developer branch.  Eventually, all the changes will be merged to the official branch, but for the time being, it is necessary to use the customized branch.
+
+If you have problems connecting to github, you can try to clone from google servers:
+
+    mkdir ndnSIM
+    cd ndnSIM
+    git clone https://code.google.com/p/ndnsim.ns3-base/ ns-3
+    git clone https://code.google.com/p/ndnsim.pybindgen/ pybindgen
+    git clone https://code.google.com/p/ndnsim/ ns-3/src/ndnSIM
+
+### Compiling and running ndnSIM
+
+ndnSIM uses standard NS-3 compilation procedure.  Normally the following commands should be sufficient to configure and build ndnSIM with python bindings enabled:
+
+    cd <ns-3-folder>
+    ./waf configure --enable-examples
+    ./waf
+
+On MacOS (with macports), you may need to modify the configure command to use macports version of python:
+
+    cd <ns-3-folder>
+    ./waf configure --with-python=/opt/local/bin/python2.7 --enable-examples
+    ./waf
+
+Python bindings is an optional and not very stable feature of NS-3 simulator.  It is possible to disable python bindings compilation either to speed up compilation or to avoid certain compilation errors (e.g., "Could not find a task generator for the name 'ns3-visualizer'"):
+
+    cd <ns-3-folder>
+    ./waf configure --disable-python --enable-examples
+    ./waf
+
+For more configuration options, please refer to ``./waf --help``.
+
+To run :doc:`sample ndnSIM simulations <examples>`:
+
+    ./waf --run=ndn-simple
+
+or:
+
+    ./waf --run=ndn-grid
+
+If you have compiled with python bindings, then you can try to run these simulations with visualizer:
+
+    ./waf --run=ndn-simple --vis
+
+or:
+
+    ./waf --run=ndn-grid --vis
+
+**Do not forget to configure and compile NS-3 in optimized mode (``./waf configure -d optimized``) in order to run actual simulations.**
+
+
+### Simulating using ndnSIM
+
+While it is possible to write simulations directly inside NS-3 (in ``scratch/`` folder) or ndnSIM (in ``examples/``), the recommended way is to write your simulation scenarios, as well as any custom extensions, separately from the NS-3 or ndnSIM core.
+
+For example, you can use the following template to write your extensions, simulation scenarios, and metric processing scripts: (http://github.com/cawka/ndnSIM-scenario-template):
+
+    mkdir ndnSIM
+    cd ndnSIM
+    git clone git://github.com/cawka/ns-3-dev-ndnSIM.git ns-3
+    git clone git://github.com/cawka/pybindgen.git pybindgen
+    git clone git://github.com/NDN-Routing/ndnSIM.git ns-3/src/ndnSIM
+    
+    # Build and install NS-3 and ndnSIM
+    cd ns-3
+    ./waf configure -d optimized
+    ./waf
+    
+    sudo ./waf install
+    cd ..
+    
+    git clone git://github.com/cawka/ndnSIM-scenario-template.git scenario
+    cd scenario
+    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
+    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+    
+    ./waf configure
+    
+    ./waf --run <scenario>
+
+For more detailed information, refer to README file (https://github.com/cawka/ndnSIM-scenario-template/blob/master/README.md).
+
+### Examples of template-based simulations
+
+1. ndnSIM examples from http://ndnsim.net website and more:
+
+- http://github.com/cawka/ndnSIM-examples or
+- http://code.google.com/p/ndnsim.ndnsim-examples/
+
+2. Script scenarios and graph processing scripts for simulations used in "A Case for Stateful Forwarding Plane" paper by Yi et al. (http://dx.doi.org/10.1016/j.comcom.2013.01.005):
+
+- http://github.com/cawka/ndnSIM-comcom-stateful-fw or
+- http://code.google.com/p/ndnsim.ndnsim-comcom/
+
+3. Script scenarios and graph processing scripts for simulations used in "Rapid Traffic Information Dissemination Using Named Data" paper by Wang et al. http://dx.doi.org/10.1145/2248361.2248365
+
+- http://github.com/cawka/ndnSIM-nom-rapid-car2car or
+- http://code.google.com/p/ndnsim.ndnsim-nom-rapid/
+
+- Rocketfuel-based topology generator for ndnSIM preferred format (randomly assigned link delays and bandwidth, based on estimated types of connections between nodes):
+
+- http://github.com/cawka/ndnSIM-sample-topologies or
+- http://code.google.com/p/ndnsim.ndnsim-sample-topo/
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..854f6d0
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+ndnSIM version 0.2.8
diff --git a/apps/ndn-app.cpp b/apps/ndn-app.cpp
new file mode 100644
index 0000000..4202111
--- /dev/null
+++ b/apps/ndn-app.cpp
@@ -0,0 +1,155 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-app.hpp"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/packet.h"
+
+#include "ns3/ndn-l3-protocol.hpp"
+#include "ns3/ndn-app-face.hpp"
+
+NS_LOG_COMPONENT_DEFINE("ndn.App");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(App);
+
+TypeId
+App::GetTypeId(void)
+{
+  static TypeId tid = TypeId("ns3::ndn::App")
+                        .SetGroupName("Ndn")
+                        .SetParent<Application>()
+                        .AddConstructor<App>()
+
+                        .AddTraceSource("ReceivedInterests", "ReceivedInterests",
+                                        MakeTraceSourceAccessor(&App::m_receivedInterests))
+
+                        .AddTraceSource("ReceivedDatas", "ReceivedDatas",
+                                        MakeTraceSourceAccessor(&App::m_receivedDatas))
+
+                        .AddTraceSource("TransmittedInterests", "TransmittedInterests",
+                                        MakeTraceSourceAccessor(&App::m_transmittedInterests))
+
+                        .AddTraceSource("TransmittedDatas", "TransmittedDatas",
+                                        MakeTraceSourceAccessor(&App::m_transmittedDatas));
+  return tid;
+}
+
+App::App()
+  : m_active(false)
+  , m_face(0)
+{
+}
+
+App::~App()
+{
+}
+
+void
+App::DoDispose(void)
+{
+  NS_LOG_FUNCTION_NOARGS();
+
+  // Unfortunately, this causes SEGFAULT
+  // The best reason I see is that apps are freed after ndn stack is removed
+  // StopApplication ();
+  Application::DoDispose();
+}
+
+uint32_t
+App::GetId() const
+{
+  if (m_face == 0)
+    return (uint32_t)-1;
+  else
+    return m_face->GetId();
+}
+
+void
+App::OnInterest(shared_ptr<const Interest> interest)
+{
+  NS_LOG_FUNCTION(this << interest);
+  m_receivedInterests(interest, this, m_face);
+}
+
+void
+App::OnData(shared_ptr<const Data> data)
+{
+  NS_LOG_FUNCTION(this << data);
+  m_receivedDatas(data, this, m_face);
+}
+
+// Application Methods
+void
+App::StartApplication() // Called at time specified by Start
+{
+  NS_LOG_FUNCTION_NOARGS();
+
+  NS_ASSERT(m_active != true);
+  m_active = true;
+
+  NS_ASSERT_MSG(GetNode()->GetObject<L3Protocol>() != 0,
+                "Ndn stack should be installed on the node " << GetNode());
+
+  // step 1. Create a face
+  m_face = CreateObject<AppFace>(/*Ptr<App> (this)*/ this);
+
+  // step 2. Add face to the Ndn stack
+  GetNode()->GetObject<L3Protocol>()->AddFace(m_face);
+
+  // step 3. Enable face
+  m_face->SetUp(true);
+}
+
+void
+App::StopApplication() // Called at time specified by Stop
+{
+  NS_LOG_FUNCTION_NOARGS();
+
+  if (!m_active)
+    return; // don't assert here, just return
+
+  NS_ASSERT(GetNode()->GetObject<L3Protocol>() != 0);
+
+  m_active = false;
+
+  // step 1. Disable face
+  m_face->SetUp(false);
+
+  // step 2. Remove face from Ndn stack
+  GetNode()->GetObject<L3Protocol>()->RemoveFace(m_face);
+
+  // step 3. Destroy face
+  if (m_face->GetReferenceCount() != 1) {
+    NS_LOG_ERROR("Please a bug report on https://github.com/NDN-Routing/ndnSIM/issues");
+    NS_LOG_ERROR("At this point, nobody else should have referenced this face, but we have "
+                 << m_face->GetReferenceCount() << " references");
+  }
+  // NS_ASSERT_MSG (m_face->GetReferenceCount ()==2,
+  //               "At this point, nobody else should have referenced this face, but we have "
+  //               << m_face->GetReferenceCount () << " references");
+  m_face = 0;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/apps/ndn-app.hpp b/apps/ndn-app.hpp
new file mode 100644
index 0000000..7a3cfd7
--- /dev/null
+++ b/apps/ndn-app.hpp
@@ -0,0 +1,120 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_APP_H
+#define NDN_APP_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+#include "ns3/ndnSIM/model/ndn-app-face.hpp"
+
+#include "ns3/application.h"
+#include "ns3/ptr.h"
+#include "ns3/callback.h"
+#include "ns3/traced-callback.h"
+
+namespace ns3 {
+
+class Packet;
+
+namespace ndn {
+
+/**
+ * \ingroup ndn
+ * \defgroup ndn-apps NDN applications
+ */
+/**
+ * @ingroup ndn-apps
+ * @brief Base class that all NDN applications should be derived from.
+ *
+ * The class implements virtual calls onInterest, onNack, and onData
+ */
+class App : public Application {
+public:
+  static TypeId
+  GetTypeId();
+
+  /**
+   * @brief Default constructor
+   */
+  App();
+  virtual ~App();
+
+  /**
+   * @brief Get application ID (ID of applications face)
+   */
+  uint32_t
+  GetId() const;
+
+  /**
+   * @brief Method that will be called every time new Interest arrives
+   * @param interest Interest header
+   * @param packet   "Payload" of the interests packet. The actual payload should be zero, but
+   * packet itself
+   *                 may be useful to get packet tags
+   */
+  virtual void
+  OnInterest(shared_ptr<const Interest> interest);
+
+  /**
+   * @brief Method that will be called every time new Data arrives
+   * @param contentObject Data header
+   * @param payload payload (potentially virtual) of the Data packet (may include packet tags of
+   * original packet)
+   */
+  virtual void
+  OnData(shared_ptr<const Data> data);
+
+protected:
+  /**
+   * @brief Do cleanup when application is destroyed
+   */
+  virtual void
+  DoDispose();
+
+  // inherited from Application base class. Originally they were private
+  virtual void
+  StartApplication(); ///< @brief Called at time specified by Start
+
+  virtual void
+  StopApplication(); ///< @brief Called at time specified by Stop
+
+protected:
+  bool m_active; ///< @brief Flag to indicate that application is active (set by StartApplication
+  /// and StopApplication)
+  shared_ptr<Face> m_face; ///< @brief automatically created application face through which application
+  /// communicates
+
+  TracedCallback<shared_ptr<const Interest>, Ptr<App>, shared_ptr<Face>>
+    m_receivedInterests; ///< @brief App-level trace of received Interests
+
+  TracedCallback<shared_ptr<const Data>, Ptr<App>,
+    shared_ptr<Face>> m_receivedDatas; ///< @brief App-level trace of received Data
+
+  TracedCallback<shared_ptr<const Interest>, Ptr<App>, shared_ptr<Face>>
+    m_transmittedInterests; ///< @brief App-level trace of transmitted Interests
+
+  TracedCallback<shared_ptr<const Data>, Ptr<App>, shared_ptr<Face>>
+    m_transmittedDatas; ///< @brief App-level trace of transmitted Data
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_APP_H
diff --git a/apps/ndn-consumer-batches.cpp b/apps/ndn-consumer-batches.cpp
new file mode 100644
index 0000000..b7406ae
--- /dev/null
+++ b/apps/ndn-consumer-batches.cpp
@@ -0,0 +1,104 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-consumer-batches.hpp"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/callback.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
+#include "ns3/double.h"
+
+#include "../utils/batches.hpp"
+
+NS_LOG_COMPONENT_DEFINE("ndn.ConsumerBatches");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(ConsumerBatches);
+
+TypeId
+ConsumerBatches::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::ConsumerBatches")
+      .SetGroupName("Ndn")
+      .SetParent<Consumer>()
+      .AddConstructor<ConsumerBatches>()
+
+      .AddAttribute("Batches",
+                    "Batches to schedule. Should be vector, containing pairs of time and amount",
+                    // TypeId::ATTR_SET,
+                    StringValue(""), MakeBatchesAccessor(&ConsumerBatches::m_batches),
+                    MakeBatchesChecker());
+
+  return tid;
+}
+
+ConsumerBatches::ConsumerBatches()
+  : m_initial(true)
+{
+}
+
+void
+ConsumerBatches::StartApplication()
+{
+  Consumer::StartApplication();
+
+  // std::cout << "Batches: " << batches << "\n";
+  for (Batches::const_iterator i = m_batches.begin(); i != m_batches.end(); i++) {
+    Simulator::ScheduleWithContext(GetNode()->GetId(), i->get<0>(), &ConsumerBatches::AddBatch,
+                                   this, i->get<1>());
+  }
+}
+
+void
+ConsumerBatches::AddBatch(uint32_t amount)
+{
+  // std::cout << Simulator::Now () << " adding batch of " << amount << "\n";
+  m_seqMax += amount;
+  m_rtt->ClearSent(); // this is important, otherwise RTT estimation for the new batch will be
+                      // affected by previous batch history
+  m_initial = true;
+  ScheduleNextPacket();
+}
+
+void
+ConsumerBatches::ScheduleNextPacket()
+{
+  if (!m_sendEvent.IsRunning()) {
+    Time delay = Seconds(0);
+    if (!m_initial)
+      delay = m_rtt->RetransmitTimeout();
+
+    m_initial = false;
+    m_sendEvent = Simulator::Schedule(delay, &Consumer::SendPacket, this);
+  }
+}
+
+///////////////////////////////////////////////////
+//          Process incoming packets             //
+///////////////////////////////////////////////////
+
+} // namespace ndn
+} // namespace ns3
diff --git a/apps/ndn-consumer-batches.hpp b/apps/ndn-consumer-batches.hpp
new file mode 100644
index 0000000..79b5d2b
--- /dev/null
+++ b/apps/ndn-consumer-batches.hpp
@@ -0,0 +1,85 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONSUMER_BATCHES_H
+#define NDN_CONSUMER_BATCHES_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-consumer.hpp"
+#include "ns3/traced-value.h"
+#include "../utils/batches.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-apps
+ * \brief Ndn application for sending out Interest packets in batches
+ */
+class ConsumerBatches : public Consumer {
+public:
+  static TypeId
+  GetTypeId();
+
+  /**
+   * \brief Default constructor
+   */
+  ConsumerBatches();
+
+  // From App
+  // virtual void
+  // OnInterest (const shared_ptr<const Interest> &interest);
+
+  // virtual void
+  // OnNack (const shared_ptr<const Interest> &interest);
+
+  // virtual void
+  // OnData (const shared_ptr<const Data> &contentObject,
+  //                  const Ptr<const Packet> &payload);
+
+  // virtual void
+  // OnTimeout (uint32_t sequenceNumber);
+
+private:
+  virtual void
+  StartApplication(); ///< @brief Called at time specified by Start
+
+  void
+  AddBatch(uint32_t amount);
+
+protected:
+  /**
+   * \brief Constructs the Interest packet and sends it using a callback to the underlying NDN
+   * protocol
+   */
+  virtual void
+  ScheduleNextPacket();
+
+private:
+  bool m_initial;
+
+  Batches m_batches;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif
diff --git a/apps/ndn-consumer-cbr.cpp b/apps/ndn-consumer-cbr.cpp
new file mode 100644
index 0000000..f64ae22
--- /dev/null
+++ b/apps/ndn-consumer-cbr.cpp
@@ -0,0 +1,142 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ndn-consumer-cbr.hpp"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/callback.h"
+#include "ns3/string.h"
+#include "ns3/boolean.h"
+#include "ns3/uinteger.h"
+#include "ns3/integer.h"
+#include "ns3/double.h"
+
+#include "ns3/ndn-app-face.hpp"
+
+NS_LOG_COMPONENT_DEFINE("ndn.ConsumerCbr");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(ConsumerCbr);
+
+TypeId
+ConsumerCbr::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::ConsumerCbr")
+      .SetGroupName("Ndn")
+      .SetParent<Consumer>()
+      .AddConstructor<ConsumerCbr>()
+
+      .AddAttribute("Frequency", "Frequency of interest packets", StringValue("1.0"),
+                    MakeDoubleAccessor(&ConsumerCbr::m_frequency), MakeDoubleChecker<double>())
+
+      .AddAttribute("Randomize",
+                    "Type of send time randomization: none (default), uniform, exponential",
+                    StringValue("none"),
+                    MakeStringAccessor(&ConsumerCbr::SetRandomize, &ConsumerCbr::GetRandomize),
+                    MakeStringChecker())
+
+      .AddAttribute("MaxSeq", "Maximum sequence number to request",
+                    IntegerValue(std::numeric_limits<uint32_t>::max()),
+                    MakeIntegerAccessor(&ConsumerCbr::m_seqMax), MakeIntegerChecker<uint32_t>())
+
+    ;
+
+  return tid;
+}
+
+ConsumerCbr::ConsumerCbr()
+  : m_frequency(1.0)
+  , m_firstTime(true)
+  , m_random(0)
+{
+  NS_LOG_FUNCTION_NOARGS();
+  m_seqMax = std::numeric_limits<uint32_t>::max();
+}
+
+ConsumerCbr::~ConsumerCbr()
+{
+  if (m_random)
+    delete m_random;
+}
+
+void
+ConsumerCbr::ScheduleNextPacket()
+{
+  // double mean = 8.0 * m_payloadSize / m_desiredRate.GetBitRate ();
+  // std::cout << "next: " << Simulator::Now().ToDouble(Time::S) + mean << "s\n";
+
+  if (m_firstTime) {
+    m_sendEvent = Simulator::Schedule(Seconds(0.0), &Consumer::SendPacket, this);
+    m_firstTime = false;
+  }
+  else if (!m_sendEvent.IsRunning())
+    m_sendEvent = Simulator::Schedule((m_random == 0) ? Seconds(1.0 / m_frequency)
+                                                      : Seconds(m_random->GetValue()),
+                                      &Consumer::SendPacket, this);
+}
+
+void
+ConsumerCbr::SetRandomize(const std::string& value)
+{
+  if (m_random)
+    delete m_random;
+
+  if (value == "uniform") {
+    m_random = new UniformVariable(0.0, 2 * 1.0 / m_frequency);
+  }
+  else if (value == "exponential") {
+    m_random = new ExponentialVariable(1.0 / m_frequency, 50 * 1.0 / m_frequency);
+  }
+  else
+    m_random = 0;
+
+  m_randomType = value;
+}
+
+std::string
+ConsumerCbr::GetRandomize() const
+{
+  return m_randomType;
+}
+
+///////////////////////////////////////////////////
+//          Process incoming packets             //
+///////////////////////////////////////////////////
+
+// void
+// Consumer::OnData (const shared_ptr<const Data> &contentObject,
+//                                const Ptr<const Packet> &payload)
+// {
+//   Consumer::OnData (contentObject, payload); // tracing inside
+// }
+
+// void
+// Consumer::OnNack (const shared_ptr<const Interest> &interest)
+// {
+//   Consumer::OnNack (interest); // tracing inside
+// }
+
+} // namespace ndn
+} // namespace ns3
diff --git a/apps/ndn-consumer-cbr.hpp b/apps/ndn-consumer-cbr.hpp
new file mode 100644
index 0000000..126560b
--- /dev/null
+++ b/apps/ndn-consumer-cbr.hpp
@@ -0,0 +1,104 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONSUMER_CBR_H
+#define NDN_CONSUMER_CBR_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-consumer.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-apps
+ * @brief Ndn application for sending out Interest packets at a "constant" rate (Poisson process)
+ */
+class ConsumerCbr : public Consumer {
+public:
+  static TypeId
+  GetTypeId();
+
+  /**
+   * \brief Default constructor
+   * Sets up randomizer function and packet sequence number
+   */
+  ConsumerCbr();
+  virtual ~ConsumerCbr();
+
+  // From NdnApp
+  // virtual void
+  // OnInterest (const shared_ptr<const Interest> &interest);
+
+  // virtual void
+  // OnNack (const shared_ptr<const Interest> &interest);
+
+  // virtual void
+  // OnData (const shared_ptr<const Data> &contentObject,
+  //                  const Ptr<const Packet> &payload);
+
+protected:
+  /**
+   * \brief Constructs the Interest packet and sends it using a callback to the underlying NDN
+   * protocol
+   */
+  virtual void
+  ScheduleNextPacket();
+
+  /**
+   * @brief Set type of frequency randomization
+   * @param value Either 'none', 'uniform', or 'exponential'
+   */
+  void
+  SetRandomize(const std::string& value);
+
+  /**
+   * @brief Get type of frequency randomization
+   * @returns either 'none', 'uniform', or 'exponential'
+   */
+  std::string
+  GetRandomize() const;
+
+private:
+  // void
+  // UpdateMean ();
+
+  // virtual void
+  // SetPayloadSize (uint32_t payload);
+
+  // void
+  // SetDesiredRate (DataRate rate);
+
+  // DataRate
+  // GetDesiredRate () const;
+
+protected:
+  double m_frequency; // Frequency of interest packets (in hertz)
+  bool m_firstTime;
+  RandomVariable* m_random;
+  std::string m_randomType;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif
diff --git a/apps/ndn-consumer-window.cpp b/apps/ndn-consumer-window.cpp
new file mode 100644
index 0000000..d1531bd
--- /dev/null
+++ b/apps/ndn-consumer-window.cpp
@@ -0,0 +1,238 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-consumer-window.hpp"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/callback.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
+#include "ns3/double.h"
+
+NS_LOG_COMPONENT_DEFINE("ndn.ConsumerWindow");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(ConsumerWindow);
+
+TypeId
+ConsumerWindow::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::ConsumerWindow")
+      .SetGroupName("Ndn")
+      .SetParent<Consumer>()
+      .AddConstructor<ConsumerWindow>()
+
+      .AddAttribute("Window", "Initial size of the window", StringValue("1"),
+                    MakeUintegerAccessor(&ConsumerWindow::GetWindow, &ConsumerWindow::SetWindow),
+                    MakeUintegerChecker<uint32_t>())
+
+      .AddAttribute("PayloadSize",
+                    "Average size of content object size (to calculate interest generation rate)",
+                    UintegerValue(1040), MakeUintegerAccessor(&ConsumerWindow::GetPayloadSize,
+                                                              &ConsumerWindow::SetPayloadSize),
+                    MakeUintegerChecker<uint32_t>())
+
+      .AddAttribute("Size", "Amount of data in megabytes to request, relying on PayloadSize "
+                            "parameter (alternative to MaxSeq attribute)",
+                    DoubleValue(-1), // don't impose limit by default
+                    MakeDoubleAccessor(&ConsumerWindow::GetMaxSize, &ConsumerWindow::SetMaxSize),
+                    MakeDoubleChecker<double>())
+
+      .AddAttribute("MaxSeq", "Maximum sequence number to request (alternative to Size attribute, "
+                              "would activate only if Size is -1). "
+                              "The parameter is activated only if Size negative (not set)",
+                    IntegerValue(std::numeric_limits<uint32_t>::max()),
+                    MakeUintegerAccessor(&ConsumerWindow::GetSeqMax, &ConsumerWindow::SetSeqMax),
+                    MakeUintegerChecker<uint32_t>())
+
+      .AddAttribute("InitialWindowOnTimeout", "Set window to initial value when timeout occurs",
+                    BooleanValue(true),
+                    MakeBooleanAccessor(&ConsumerWindow::m_setInitialWindowOnTimeout),
+                    MakeBooleanChecker())
+
+      .AddTraceSource("WindowTrace",
+                      "Window that controls how many outstanding interests are allowed",
+                      MakeTraceSourceAccessor(&ConsumerWindow::m_window))
+      .AddTraceSource("InFlight", "Current number of outstanding interests",
+                      MakeTraceSourceAccessor(&ConsumerWindow::m_inFlight));
+
+  return tid;
+}
+
+ConsumerWindow::ConsumerWindow()
+  : m_payloadSize(1040)
+  , m_inFlight(0)
+{
+}
+
+void
+ConsumerWindow::SetWindow(uint32_t window)
+{
+  m_initialWindow = window;
+  m_window = m_initialWindow;
+}
+
+uint32_t
+ConsumerWindow::GetWindow() const
+{
+  return m_initialWindow;
+}
+
+uint32_t
+ConsumerWindow::GetPayloadSize() const
+{
+  return m_payloadSize;
+}
+
+void
+ConsumerWindow::SetPayloadSize(uint32_t payload)
+{
+  m_payloadSize = payload;
+}
+
+double
+ConsumerWindow::GetMaxSize() const
+{
+  if (m_seqMax == 0)
+    return -1.0;
+
+  return m_maxSize;
+}
+
+void
+ConsumerWindow::SetMaxSize(double size)
+{
+  m_maxSize = size;
+  if (m_maxSize < 0) {
+    m_seqMax = 0;
+    return;
+  }
+
+  m_seqMax = floor(1.0 + m_maxSize * 1024.0 * 1024.0 / m_payloadSize);
+  NS_LOG_DEBUG("MaxSeqNo: " << m_seqMax);
+  // std::cout << "MaxSeqNo: " << m_seqMax << "\n";
+}
+
+uint32_t
+ConsumerWindow::GetSeqMax() const
+{
+  return m_seqMax;
+}
+
+void
+ConsumerWindow::SetSeqMax(uint32_t seqMax)
+{
+  if (m_maxSize < 0)
+    m_seqMax = seqMax;
+
+  // ignore otherwise
+}
+
+void
+ConsumerWindow::ScheduleNextPacket()
+{
+  if (m_window == static_cast<uint32_t>(0)) {
+    Simulator::Remove(m_sendEvent);
+
+    NS_LOG_DEBUG(
+      "Next event in " << (std::min<double>(0.5, m_rtt->RetransmitTimeout().ToDouble(Time::S)))
+                       << " sec");
+    m_sendEvent =
+      Simulator::Schedule(Seconds(
+                            std::min<double>(0.5, m_rtt->RetransmitTimeout().ToDouble(Time::S))),
+                          &Consumer::SendPacket, this);
+  }
+  else if (m_inFlight >= m_window) {
+    // simply do nothing
+  }
+  else {
+    if (m_sendEvent.IsRunning()) {
+      Simulator::Remove(m_sendEvent);
+    }
+
+    m_sendEvent = Simulator::ScheduleNow(&Consumer::SendPacket, this);
+  }
+}
+
+///////////////////////////////////////////////////
+//          Process incoming packets             //
+///////////////////////////////////////////////////
+
+void
+ConsumerWindow::OnData(shared_ptr<const Data> contentObject)
+{
+  Consumer::OnData(contentObject);
+
+  m_window = m_window + 1;
+
+  if (m_inFlight > static_cast<uint32_t>(0))
+    m_inFlight--;
+  NS_LOG_DEBUG("Window: " << m_window << ", InFlight: " << m_inFlight);
+
+  ScheduleNextPacket();
+}
+
+void
+ConsumerWindow::OnNack(shared_ptr<const Interest> interest)
+{
+  Consumer::OnNack(interest);
+
+  if (m_inFlight > static_cast<uint32_t>(0))
+    m_inFlight--;
+
+  if (m_window > static_cast<uint32_t>(0)) {
+    // m_window = 0.5 * m_window;//m_window - 1;
+    m_window = std::max<uint32_t>(0, m_window - 1);
+  }
+
+  NS_LOG_DEBUG("Window: " << m_window << ", InFlight: " << m_inFlight);
+
+  ScheduleNextPacket();
+}
+
+void
+ConsumerWindow::OnTimeout(uint32_t sequenceNumber)
+{
+  if (m_inFlight > static_cast<uint32_t>(0))
+    m_inFlight--;
+
+  if (m_setInitialWindowOnTimeout) {
+    // m_window = std::max<uint32_t> (0, m_window - 1);
+    m_window = m_initialWindow;
+  }
+
+  NS_LOG_DEBUG("Window: " << m_window << ", InFlight: " << m_inFlight);
+  Consumer::OnTimeout(sequenceNumber);
+}
+
+void
+ConsumerWindow::WillSendOutInterest(uint32_t sequenceNumber)
+{
+  m_inFlight++;
+  Consumer::WillSendOutInterest(sequenceNumber);
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/apps/ndn-consumer-window.hpp b/apps/ndn-consumer-window.hpp
new file mode 100644
index 0000000..0d0536f
--- /dev/null
+++ b/apps/ndn-consumer-window.hpp
@@ -0,0 +1,114 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONSUMER_WINDOW_H
+#define NDN_CONSUMER_WINDOW_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-consumer.hpp"
+#include "ns3/traced-value.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-apps
+ * \brief Ndn application for sending out Interest packets (window-based)
+ *
+ * !!! ATTENTION !!! This is highly experimental and relies on experimental features of the
+ *simulator.
+ * Behavior may be unpredictable if used incorrectly.
+ */
+class ConsumerWindow : public Consumer {
+public:
+  static TypeId
+  GetTypeId();
+
+  /**
+   * \brief Default constructor
+   */
+  ConsumerWindow();
+
+  // From App
+  // virtual void
+  // OnInterest (const shared_ptr<const Interest> &interest);
+
+  virtual void
+  OnNack(shared_ptr<const Interest> interest);
+
+  virtual void
+  OnData(shared_ptr<const Data> contentObject);
+
+  virtual void
+  OnTimeout(uint32_t sequenceNumber);
+
+  virtual void
+  WillSendOutInterest(uint32_t sequenceNumber);
+
+protected:
+  /**
+   * \brief Constructs the Interest packet and sends it using a callback to the underlying NDN
+   * protocol
+   */
+  virtual void
+  ScheduleNextPacket();
+
+private:
+  virtual void
+  SetWindow(uint32_t window);
+
+  uint32_t
+  GetWindow() const;
+
+  virtual void
+  SetPayloadSize(uint32_t payload);
+
+  uint32_t
+  GetPayloadSize() const;
+
+  double
+  GetMaxSize() const;
+
+  void
+  SetMaxSize(double size);
+
+  uint32_t
+  GetSeqMax() const;
+
+  void
+  SetSeqMax(uint32_t seqMax);
+
+private:
+  uint32_t m_payloadSize; // expected payload size
+  double m_maxSize;       // max size to request
+
+  uint32_t m_initialWindow;
+  bool m_setInitialWindowOnTimeout;
+
+  TracedValue<uint32_t> m_window;
+  TracedValue<uint32_t> m_inFlight;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif
diff --git a/apps/ndn-consumer-zipf-mandelbrot.cpp b/apps/ndn-consumer-zipf-mandelbrot.cpp
new file mode 100644
index 0000000..f6037e3
--- /dev/null
+++ b/apps/ndn-consumer-zipf-mandelbrot.cpp
@@ -0,0 +1,244 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 Tsinghua University, P.R.China
+ *
+ * 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: Xiaoke Jiang <shock.jiang@gmail.com>
+ */
+
+#include "ndn-consumer-zipf-mandelbrot.hpp"
+
+#include "ns3/ndn-app-face.hpp"
+
+#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.hpp"
+
+#include <math.h>
+
+NS_LOG_COMPONENT_DEFINE("ndn.ConsumerZipfMandelbrot");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(ConsumerZipfMandelbrot);
+
+TypeId
+ConsumerZipfMandelbrot::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::ConsumerZipfMandelbrot")
+      .SetGroupName("Ndn")
+      .SetParent<ConsumerCbr>()
+      .AddConstructor<ConsumerZipfMandelbrot>()
+
+      .AddAttribute("NumberOfContents", "Number of the Contents in total", StringValue("100"),
+                    MakeUintegerAccessor(&ConsumerZipfMandelbrot::SetNumberOfContents,
+                                         &ConsumerZipfMandelbrot::GetNumberOfContents),
+                    MakeUintegerChecker<uint32_t>())
+
+      .AddAttribute("q", "parameter of improve rank", StringValue("0.7"),
+                    MakeDoubleAccessor(&ConsumerZipfMandelbrot::SetQ,
+                                       &ConsumerZipfMandelbrot::GetQ),
+                    MakeDoubleChecker<double>())
+
+      .AddAttribute("s", "parameter of power", StringValue("0.7"),
+                    MakeDoubleAccessor(&ConsumerZipfMandelbrot::SetS,
+                                       &ConsumerZipfMandelbrot::GetS),
+                    MakeDoubleChecker<double>());
+
+  return tid;
+}
+
+ConsumerZipfMandelbrot::ConsumerZipfMandelbrot()
+  : m_N(100) // needed here to make sure when SetQ/SetS are called, there is a valid value of N
+  , m_q(0.7)
+  , m_s(0.7)
+  , m_SeqRng(0.0, 1.0)
+{
+  // SetNumberOfContents is called by NS-3 object system during the initialization
+}
+
+ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot()
+{
+}
+
+void
+ConsumerZipfMandelbrot::SetNumberOfContents(uint32_t numOfContents)
+{
+  m_N = numOfContents;
+
+  NS_LOG_DEBUG(m_q << " and " << m_s << " and " << m_N);
+
+  m_Pcum = std::vector<double>(m_N + 1);
+
+  m_Pcum[0] = 0.0;
+  for (uint32_t i = 1; i <= m_N; i++) {
+    m_Pcum[i] = m_Pcum[i - 1] + 1.0 / std::pow(i + m_q, m_s);
+  }
+
+  for (uint32_t i = 1; i <= m_N; i++) {
+    m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
+    NS_LOG_LOGIC("Cumulative probability [" << i << "]=" << m_Pcum[i]);
+  }
+}
+
+uint32_t
+ConsumerZipfMandelbrot::GetNumberOfContents() const
+{
+  return m_N;
+}
+
+void
+ConsumerZipfMandelbrot::SetQ(double q)
+{
+  m_q = q;
+  SetNumberOfContents(m_N);
+}
+
+double
+ConsumerZipfMandelbrot::GetQ() const
+{
+  return m_q;
+}
+
+void
+ConsumerZipfMandelbrot::SetS(double s)
+{
+  m_s = s;
+  SetNumberOfContents(m_N);
+}
+
+double
+ConsumerZipfMandelbrot::GetS() const
+{
+  return m_s;
+}
+
+void
+ConsumerZipfMandelbrot::SendPacket()
+{
+  if (!m_active)
+    return;
+
+  NS_LOG_FUNCTION_NOARGS();
+
+  uint32_t seq = std::numeric_limits<uint32_t>::max(); // invalid
+
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
+
+  while (m_retxSeqs.size()) {
+    seq = *m_retxSeqs.begin();
+    m_retxSeqs.erase(m_retxSeqs.begin());
+
+    // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
+    // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
+    //   {
+
+    //     NS_LOG_DEBUG ("Expire " << seq);
+    //     m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired
+    //     sequence number
+    //     continue;
+    //   }
+    NS_LOG_DEBUG("=interest seq " << seq << " from m_retxSeqs");
+    break;
+  }
+
+  if (seq == std::numeric_limits<uint32_t>::max()) // no retransmission
+  {
+    if (m_seqMax != std::numeric_limits<uint32_t>::max()) {
+      if (m_seq >= m_seqMax) {
+        return; // we are totally done
+      }
+    }
+
+    seq = ConsumerZipfMandelbrot::GetNextSeq();
+    m_seq++;
+  }
+
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
+
+  //
+  shared_ptr<Name> nameWithSequence = make_shared<Name>(m_interestName);
+  nameWithSequence->appendSeqNum(seq);
+  //
+
+  shared_ptr<Interest> interest = make_shared<Interest>();
+  interest->SetNonce(m_rand.GetValue());
+  interest->SetName(nameWithSequence);
+
+  // NS_LOG_INFO ("Requesting Interest: \n" << *interest);
+  NS_LOG_INFO("> Interest for " << seq << ", Total: " << m_seq << ", face: " << m_face->GetId());
+  NS_LOG_DEBUG("Trying to add " << seq << " with " << Simulator::Now() << ". already "
+                                << m_seqTimeouts.size() << " items");
+
+  m_seqTimeouts.insert(SeqTimeout(seq, Simulator::Now()));
+  m_seqFullDelay.insert(SeqTimeout(seq, Simulator::Now()));
+
+  m_seqLastDelay.erase(seq);
+  m_seqLastDelay.insert(SeqTimeout(seq, Simulator::Now()));
+
+  m_seqRetxCounts[seq]++;
+
+  m_rtt->SentSeq(SequenceNumber32(seq), 1);
+
+  FwHopCountTag hopCountTag;
+  interest->GetPayload()->AddPacketTag(hopCountTag);
+
+  m_transmittedInterests(interest, this, m_face);
+  m_face->ReceiveInterest(interest);
+
+  ConsumerZipfMandelbrot::ScheduleNextPacket();
+}
+
+uint32_t
+ConsumerZipfMandelbrot::GetNextSeq()
+{
+  uint32_t content_index = 1; //[1, m_N]
+  double p_sum = 0;
+
+  double p_random = m_SeqRng.GetValue();
+  while (p_random == 0) {
+    p_random = m_SeqRng.GetValue();
+  }
+  // if (p_random == 0)
+  NS_LOG_LOGIC("p_random=" << p_random);
+  for (uint32_t i = 1; i <= m_N; i++) {
+    p_sum = m_Pcum[i]; // m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0;   e.g.: p_cum[1] = p[1],
+                       // p_cum[2] = p[1] + p[2]
+    if (p_random <= p_sum) {
+      content_index = i;
+      break;
+    } // if
+  }   // for
+  // content_index = 1;
+  NS_LOG_DEBUG("RandomNumber=" << content_index);
+  return content_index;
+}
+
+void
+ConsumerZipfMandelbrot::ScheduleNextPacket()
+{
+
+  if (m_firstTime) {
+    m_sendEvent = Simulator::Schedule(Seconds(0.0), &ConsumerZipfMandelbrot::SendPacket, this);
+    m_firstTime = false;
+  }
+  else if (!m_sendEvent.IsRunning())
+    m_sendEvent = Simulator::Schedule((m_random == 0) ? Seconds(1.0 / m_frequency)
+                                                      : Seconds(m_random->GetValue()),
+                                      &ConsumerZipfMandelbrot::SendPacket, this);
+}
+
+} /* namespace ndn */
+} /* namespace ns3 */
diff --git a/apps/ndn-consumer-zipf-mandelbrot.hpp b/apps/ndn-consumer-zipf-mandelbrot.hpp
new file mode 100644
index 0000000..dd03563
--- /dev/null
+++ b/apps/ndn-consumer-zipf-mandelbrot.hpp
@@ -0,0 +1,101 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 Tsinghua University, P.R.China
+ *
+ * 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: Xiaoke Jiang <shock.jiang@gmail.com>
+ */
+
+#ifndef NDN_CONSUMER_ZIPF_MANDELBROT_H_
+#define NDN_CONSUMER_ZIPF_MANDELBROT_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-consumer.hpp"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/callback.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
+#include "ns3/double.h"
+#include "ndn-consumer-cbr.hpp"
+#include "ns3/random-variable.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-apps
+ * @brief NDN app requesting contents following Zipf-Mandelbrot Distbituion
+ *
+ * The class implements an app which requests contents following Zipf-Mandelbrot Distribution
+ * Here is the explaination of Zipf-Mandelbrot Distribution:
+ *http://en.wikipedia.org/wiki/Zipf%E2%80%93Mandelbrot_law
+ */
+class ConsumerZipfMandelbrot : public ConsumerCbr {
+public:
+  static TypeId
+  GetTypeId();
+
+  /**
+   * \brief Default constructor
+   * Sets up randomized Number Generator (RNG)
+   * Note: m_seq of its parent class ConsumerCbr here is used to record the interest number
+   */
+  ConsumerZipfMandelbrot();
+  virtual ~ConsumerZipfMandelbrot();
+
+  virtual void
+  SendPacket();
+  uint32_t
+  GetNextSeq();
+
+protected:
+  virtual void
+  ScheduleNextPacket();
+
+private:
+  void
+  SetNumberOfContents(uint32_t numOfContents);
+
+  uint32_t
+  GetNumberOfContents() const;
+
+  void
+  SetQ(double q);
+
+  double
+  GetQ() const;
+
+  void
+  SetS(double s);
+
+  double
+  GetS() const;
+
+private:
+  uint32_t m_N;               // number of the contents
+  double m_q;                 // q in (k+q)^s
+  double m_s;                 // s in (k+q)^s
+  std::vector<double> m_Pcum; // cumulative probability
+
+  UniformVariable m_SeqRng; // RNG
+};
+
+} /* namespace ndn */
+} /* namespace ns3 */
+#endif /* NDN_CONSUMER_ZIPF_MANDELBROT_H_ */
diff --git a/apps/ndn-consumer.cpp b/apps/ndn-consumer.cpp
new file mode 100644
index 0000000..c64bb7e
--- /dev/null
+++ b/apps/ndn-consumer.cpp
@@ -0,0 +1,311 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ndn-consumer.hpp"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/callback.h"
+#include "ns3/string.h"
+#include "ns3/boolean.h"
+#include "ns3/uinteger.h"
+#include "ns3/integer.h"
+#include "ns3/double.h"
+
+#include "ns3/ndn-app-face.hpp"
+#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.hpp"
+#include "ns3/ndnSIM/utils/ndn-rtt-mean-deviation.hpp"
+
+#include <boost/ref.hpp>
+
+NS_LOG_COMPONENT_DEFINE("ndn.Consumer");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(Consumer);
+
+TypeId
+Consumer::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::Consumer")
+      .SetGroupName("Ndn")
+      .SetParent<App>()
+      .AddAttribute("StartSeq", "Initial sequence number", IntegerValue(0),
+                    MakeIntegerAccessor(&Consumer::m_seq), MakeIntegerChecker<int32_t>())
+
+      .AddAttribute("Prefix", "Name of the Interest", StringValue("/"),
+                    MakeNameAccessor(&Consumer::m_interestName), MakeNameChecker())
+      .AddAttribute("LifeTime", "LifeTime for interest packet", StringValue("2s"),
+                    MakeTimeAccessor(&Consumer::m_interestLifeTime), MakeTimeChecker())
+
+      .AddAttribute("RetxTimer",
+                    "Timeout defining how frequent retransmission timeouts should be checked",
+                    StringValue("50ms"),
+                    MakeTimeAccessor(&Consumer::GetRetxTimer, &Consumer::SetRetxTimer),
+                    MakeTimeChecker())
+
+      .AddTraceSource("LastRetransmittedInterestDataDelay",
+                      "Delay between last retransmitted Interest and received Data",
+                      MakeTraceSourceAccessor(&Consumer::m_lastRetransmittedInterestDataDelay))
+
+      .AddTraceSource("FirstInterestDataDelay",
+                      "Delay between first transmitted Interest and received Data",
+                      MakeTraceSourceAccessor(&Consumer::m_firstInterestDataDelay));
+
+  return tid;
+}
+
+Consumer::Consumer()
+  : m_rand(0, std::numeric_limits<uint32_t>::max())
+  , m_seq(0)
+  , m_seqMax(0) // don't request anything
+{
+  NS_LOG_FUNCTION_NOARGS();
+
+  m_rtt = CreateObject<RttMeanDeviation>();
+}
+
+void
+Consumer::SetRetxTimer(Time retxTimer)
+{
+  m_retxTimer = retxTimer;
+  if (m_retxEvent.IsRunning()) {
+    // m_retxEvent.Cancel (); // cancel any scheduled cleanup events
+    Simulator::Remove(m_retxEvent); // slower, but better for memory
+  }
+
+  // schedule even with new timeout
+  m_retxEvent = Simulator::Schedule(m_retxTimer, &Consumer::CheckRetxTimeout, this);
+}
+
+Time
+Consumer::GetRetxTimer() const
+{
+  return m_retxTimer;
+}
+
+void
+Consumer::CheckRetxTimeout()
+{
+  Time now = Simulator::Now();
+
+  Time rto = m_rtt->RetransmitTimeout();
+  // NS_LOG_DEBUG ("Current RTO: " << rto.ToDouble (Time::S) << "s");
+
+  while (!m_seqTimeouts.empty()) {
+    SeqTimeoutsContainer::index<i_timestamp>::type::iterator entry =
+      m_seqTimeouts.get<i_timestamp>().begin();
+    if (entry->time + rto <= now) // timeout expired?
+    {
+      uint32_t seqNo = entry->seq;
+      m_seqTimeouts.get<i_timestamp>().erase(entry);
+      OnTimeout(seqNo);
+    }
+    else
+      break; // nothing else to do. All later packets need not be retransmitted
+  }
+
+  m_retxEvent = Simulator::Schedule(m_retxTimer, &Consumer::CheckRetxTimeout, this);
+}
+
+// Application Methods
+void
+Consumer::StartApplication() // Called at time specified by Start
+{
+  NS_LOG_FUNCTION_NOARGS();
+
+  // do base stuff
+  App::StartApplication();
+
+  ScheduleNextPacket();
+}
+
+void
+Consumer::StopApplication() // Called at time specified by Stop
+{
+  NS_LOG_FUNCTION_NOARGS();
+
+  // cancel periodic packet generation
+  Simulator::Cancel(m_sendEvent);
+
+  // cleanup base stuff
+  App::StopApplication();
+}
+
+void
+Consumer::SendPacket()
+{
+  if (!m_active)
+    return;
+
+  NS_LOG_FUNCTION_NOARGS();
+
+  uint32_t seq = std::numeric_limits<uint32_t>::max(); // invalid
+
+  while (m_retxSeqs.size()) {
+    seq = *m_retxSeqs.begin();
+    m_retxSeqs.erase(m_retxSeqs.begin());
+    break;
+  }
+
+  if (seq == std::numeric_limits<uint32_t>::max()) {
+    if (m_seqMax != std::numeric_limits<uint32_t>::max()) {
+      if (m_seq >= m_seqMax) {
+        return; // we are totally done
+      }
+    }
+
+    seq = m_seq++;
+  }
+
+  //
+  shared_ptr<Name> nameWithSequence = make_shared<Name>(m_interestName);
+  nameWithSequence->appendSeqNum(seq);
+  //
+
+  shared_ptr<Interest> interest = make_shared<Interest>();
+  interest->SetNonce(m_rand.GetValue());
+  interest->SetName(nameWithSequence);
+  interest->SetInterestLifetime(m_interestLifeTime);
+
+  // NS_LOG_INFO ("Requesting Interest: \n" << *interest);
+  NS_LOG_INFO("> Interest for " << seq);
+
+  WillSendOutInterest(seq);
+
+  FwHopCountTag hopCountTag;
+  interest->GetPayload()->AddPacketTag(hopCountTag);
+
+  m_transmittedInterests(interest, this, m_face);
+  m_face->ReceiveInterest(interest);
+
+  ScheduleNextPacket();
+}
+
+///////////////////////////////////////////////////
+//          Process incoming packets             //
+///////////////////////////////////////////////////
+
+void
+Consumer::OnData(shared_ptr<const Data> data)
+{
+  if (!m_active)
+    return;
+
+  App::OnData(data); // tracing inside
+
+  NS_LOG_FUNCTION(this << data);
+
+  // NS_LOG_INFO ("Received content object: " << boost::cref(*data));
+
+  uint32_t seq = data->GetName().get(-1).toSeqNum();
+  NS_LOG_INFO("< DATA for " << seq);
+
+  int hopCount = -1;
+  FwHopCountTag hopCountTag;
+  if (data->GetPayload()->PeekPacketTag(hopCountTag)) {
+    hopCount = hopCountTag.Get();
+  }
+
+  SeqTimeoutsContainer::iterator entry = m_seqLastDelay.find(seq);
+  if (entry != m_seqLastDelay.end()) {
+    m_lastRetransmittedInterestDataDelay(this, seq, Simulator::Now() - entry->time, hopCount);
+  }
+
+  entry = m_seqFullDelay.find(seq);
+  if (entry != m_seqFullDelay.end()) {
+    m_firstInterestDataDelay(this, seq, Simulator::Now() - entry->time, m_seqRetxCounts[seq],
+                             hopCount);
+  }
+
+  m_seqRetxCounts.erase(seq);
+  m_seqFullDelay.erase(seq);
+  m_seqLastDelay.erase(seq);
+
+  m_seqTimeouts.erase(seq);
+  m_retxSeqs.erase(seq);
+
+  m_rtt->AckSeq(SequenceNumber32(seq));
+}
+
+void
+Consumer::OnNack(shared_ptr<const Interest> interest)
+{
+  if (!m_active)
+    return;
+
+  App::OnNack(interest); // tracing inside
+
+  // NS_LOG_DEBUG ("Nack type: " << interest->GetNack ());
+
+  // NS_LOG_FUNCTION (interest->GetName ());
+
+  // NS_LOG_INFO ("Received NACK: " << boost::cref(*interest));
+  uint32_t seq = interest->GetName().get(-1).toSeqNum();
+  NS_LOG_INFO("< NACK for " << seq);
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << "NACK for " << seq << "\n";
+
+  // put in the queue of interests to be retransmitted
+  // NS_LOG_INFO ("Before: " << m_retxSeqs.size ());
+  m_retxSeqs.insert(seq);
+  // NS_LOG_INFO ("After: " << m_retxSeqs.size ());
+
+  m_seqTimeouts.erase(seq);
+
+  m_rtt->IncreaseMultiplier(); // Double the next RTO ??
+  ScheduleNextPacket();
+}
+
+void
+Consumer::OnTimeout(uint32_t sequenceNumber)
+{
+  NS_LOG_FUNCTION(sequenceNumber);
+  // std::cout << Simulator::Now () << ", TO: " << sequenceNumber << ", current RTO: " <<
+  // m_rtt->RetransmitTimeout ().ToDouble (Time::S) << "s\n";
+
+  m_rtt->IncreaseMultiplier(); // Double the next RTO
+  m_rtt->SentSeq(SequenceNumber32(sequenceNumber),
+                 1); // make sure to disable RTT calculation for this sample
+  m_retxSeqs.insert(sequenceNumber);
+  ScheduleNextPacket();
+}
+
+void
+Consumer::WillSendOutInterest(uint32_t sequenceNumber)
+{
+  NS_LOG_DEBUG("Trying to add " << sequenceNumber << " with " << Simulator::Now() << ". already "
+                                << m_seqTimeouts.size() << " items");
+
+  m_seqTimeouts.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
+  m_seqFullDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
+
+  m_seqLastDelay.erase(sequenceNumber);
+  m_seqLastDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
+
+  m_seqRetxCounts[sequenceNumber]++;
+
+  m_rtt->SentSeq(SequenceNumber32(sequenceNumber), 1);
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/apps/ndn-consumer.hpp b/apps/ndn-consumer.hpp
new file mode 100644
index 0000000..25de4cd
--- /dev/null
+++ b/apps/ndn-consumer.hpp
@@ -0,0 +1,215 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONSUMER_H
+#define NDN_CONSUMER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-app.hpp"
+#include "ns3/random-variable.h"
+#include "ns3/nstime.h"
+#include "ns3/data-rate.h"
+#include "ns3/ndn-rtt-estimator.hpp"
+
+#include <set>
+#include <map>
+
+#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/tag.hpp>
+#include <boost/multi_index/ordered_index.hpp>
+#include <boost/multi_index/member.hpp>
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-apps
+ * \brief NDN application for sending out Interest packets
+ */
+class Consumer : public App {
+public:
+  static TypeId
+  GetTypeId();
+
+  /**
+   * \brief Default constructor
+   * Sets up randomizer function and packet sequence number
+   */
+  Consumer();
+  virtual ~Consumer(){};
+
+  // From App
+  // virtual void
+  // OnInterest (const shared_ptr<const Interest> &interest);
+
+  virtual void
+  OnNack(shared_ptr<const Interest> interest);
+
+  virtual void
+  OnData(shared_ptr<const Data> contentObject);
+
+  /**
+   * @brief Timeout event
+   * @param sequenceNumber time outed sequence number
+   */
+  virtual void
+  OnTimeout(uint32_t sequenceNumber);
+
+  /**
+   * @brief Actually send packet
+   */
+  void
+  SendPacket();
+
+  /**
+   * @brief An event that is fired just before an Interest packet is actually send out (send is
+   *inevitable)
+   *
+   * The reason for "before" even is that in certain cases (when it is possible to satisfy from the
+   *local cache),
+   * the send call will immediately return data, and if "after" even was used, this after would be
+   *called after
+   * all processing of incoming data, potentially producing unexpected results.
+   */
+  virtual void
+  WillSendOutInterest(uint32_t sequenceNumber);
+
+protected:
+  // from App
+  virtual void
+  StartApplication();
+
+  virtual void
+  StopApplication();
+
+  /**
+   * \brief Constructs the Interest packet and sends it using a callback to the underlying NDN
+   * protocol
+   */
+  virtual void
+  ScheduleNextPacket() = 0;
+
+  /**
+   * \brief Checks if the packet need to be retransmitted becuase of retransmission timer expiration
+   */
+  void
+  CheckRetxTimeout();
+
+  /**
+   * \brief Modifies the frequency of checking the retransmission timeouts
+   * \param retxTimer Timeout defining how frequent retransmission timeouts should be checked
+   */
+  void
+  SetRetxTimer(Time retxTimer);
+
+  /**
+   * \brief Returns the frequency of checking the retransmission timeouts
+   * \return Timeout defining how frequent retransmission timeouts should be checked
+   */
+  Time
+  GetRetxTimer() const;
+
+protected:
+  UniformVariable m_rand; ///< @brief nonce generator
+
+  uint32_t m_seq;      ///< @brief currently requested sequence number
+  uint32_t m_seqMax;   ///< @brief maximum number of sequence number
+  EventId m_sendEvent; ///< @brief EventId of pending "send packet" event
+  Time m_retxTimer;    ///< @brief Currently estimated retransmission timer
+  EventId m_retxEvent; ///< @brief Event to check whether or not retransmission should be performed
+
+  Ptr<RttEstimator> m_rtt; ///< @brief RTT estimator
+
+  Time m_offTime;          ///< \brief Time interval between packets
+  Name m_interestName;     ///< \brief NDN Name of the Interest (use Name)
+  Time m_interestLifeTime; ///< \brief LifeTime for interest packet
+
+  /// @cond include_hidden
+  /**
+   * \struct This struct contains sequence numbers of packets to be retransmitted
+   */
+  struct RetxSeqsContainer : public std::set<uint32_t> {
+  };
+
+  RetxSeqsContainer m_retxSeqs; ///< \brief ordered set of sequence numbers to be retransmitted
+
+  /**
+   * \struct This struct contains a pair of packet sequence number and its timeout
+   */
+  struct SeqTimeout {
+    SeqTimeout(uint32_t _seq, Time _time)
+      : seq(_seq)
+      , time(_time)
+    {
+    }
+
+    uint32_t seq;
+    Time time;
+  };
+  /// @endcond
+
+  /// @cond include_hidden
+  class i_seq {
+  };
+  class i_timestamp {
+  };
+  /// @endcond
+
+  /// @cond include_hidden
+  /**
+   * \struct This struct contains a multi-index for the set of SeqTimeout structs
+   */
+  struct SeqTimeoutsContainer
+    : public boost::multi_index::
+        multi_index_container<SeqTimeout,
+                              boost::multi_index::
+                                indexed_by<boost::multi_index::
+                                             ordered_unique<boost::multi_index::tag<i_seq>,
+                                                            boost::multi_index::
+                                                              member<SeqTimeout, uint32_t,
+                                                                     &SeqTimeout::seq>>,
+                                           boost::multi_index::
+                                             ordered_non_unique<boost::multi_index::
+                                                                  tag<i_timestamp>,
+                                                                boost::multi_index::
+                                                                  member<SeqTimeout, Time,
+                                                                         &SeqTimeout::time>>>> {
+  };
+
+  SeqTimeoutsContainer m_seqTimeouts; ///< \brief multi-index for the set of SeqTimeout structs
+
+  SeqTimeoutsContainer m_seqLastDelay;
+  SeqTimeoutsContainer m_seqFullDelay;
+  std::map<uint32_t, uint32_t> m_seqRetxCounts;
+
+  TracedCallback<Ptr<App> /* app */, uint32_t /* seqno */, Time /* delay */, int32_t /*hop count*/>
+    m_lastRetransmittedInterestDataDelay;
+  TracedCallback<Ptr<App> /* app */, uint32_t /* seqno */, Time /* delay */,
+                 uint32_t /*retx count*/, int32_t /*hop count*/> m_firstInterestDataDelay;
+
+  /// @endcond
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif
diff --git a/apps/ndn-producer.cpp b/apps/ndn-producer.cpp
new file mode 100644
index 0000000..60bc1dc
--- /dev/null
+++ b/apps/ndn-producer.cpp
@@ -0,0 +1,150 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-producer.hpp"
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+
+#include "ns3/ndn-app-face.hpp"
+#include "ns3/ndn-fib.hpp"
+
+#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.hpp"
+
+#include <boost/ref.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+namespace ll = boost::lambda;
+
+NS_LOG_COMPONENT_DEFINE("ndn.Producer");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(Producer);
+
+TypeId
+Producer::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::Producer")
+      .SetGroupName("Ndn")
+      .SetParent<App>()
+      .AddConstructor<Producer>()
+      .AddAttribute("Prefix", "Prefix, for which producer has the data", StringValue("/"),
+                    MakeNameAccessor(&Producer::m_prefix), MakeNameChecker())
+      .AddAttribute(
+         "Postfix",
+         "Postfix that is added to the output data (e.g., for adding producer-uniqueness)",
+         StringValue("/"), MakeNameAccessor(&Producer::m_postfix), MakeNameChecker())
+      .AddAttribute("PayloadSize", "Virtual payload size for Content packets", UintegerValue(1024),
+                    MakeUintegerAccessor(&Producer::m_virtualPayloadSize),
+                    MakeUintegerChecker<uint32_t>())
+      .AddAttribute("Freshness", "Freshness of data packets, if 0, then unlimited freshness",
+                    TimeValue(Seconds(0)), MakeTimeAccessor(&Producer::m_freshness),
+                    MakeTimeChecker())
+      .AddAttribute(
+         "Signature",
+         "Fake signature, 0 valid signature (default), other values application-specific",
+         UintegerValue(0), MakeUintegerAccessor(&Producer::m_signature),
+         MakeUintegerChecker<uint32_t>())
+      .AddAttribute("KeyLocator",
+                    "Name to be used for key locator.  If root, then key locator is not used",
+                    NameValue(), MakeNameAccessor(&Producer::m_keyLocator), MakeNameChecker());
+  return tid;
+}
+
+Producer::Producer()
+{
+  // NS_LOG_FUNCTION_NOARGS ();
+}
+
+// inherited from Application base class.
+void
+Producer::StartApplication()
+{
+  NS_LOG_FUNCTION_NOARGS();
+  NS_ASSERT(GetNode()->GetObject<Fib>() != 0);
+
+  App::StartApplication();
+
+  NS_LOG_DEBUG("NodeID: " << GetNode()->GetId());
+
+  Ptr<Fib> fib = GetNode()->GetObject<Fib>();
+
+  Ptr<fib::Entry> fibEntry = fib->Add(m_prefix, m_face, 0);
+
+  fibEntry->UpdateStatus(m_face, fib::FaceMetric::NDN_FIB_GREEN);
+
+  // // make face green, so it will be used primarily
+  // StaticCast<fib::FibImpl> (fib)->modify (fibEntry,
+  //                                        ll::bind (&fib::Entry::UpdateStatus,
+  //                                                  ll::_1, m_face,
+  //                                                  fib::FaceMetric::NDN_FIB_GREEN));
+}
+
+void
+Producer::StopApplication()
+{
+  NS_LOG_FUNCTION_NOARGS();
+  NS_ASSERT(GetNode()->GetObject<Fib>() != 0);
+
+  App::StopApplication();
+}
+
+void
+Producer::OnInterest(shared_ptr<const Interest> interest)
+{
+  App::OnInterest(interest); // tracing inside
+
+  NS_LOG_FUNCTION(this << interest);
+
+  if (!m_active)
+    return;
+
+  shared_ptr<Data> data = make_shared<Data>(Create<Packet>(m_virtualPayloadSize));
+  shared_ptr<Name> dataName = make_shared<Name>(interest->GetName());
+  dataName->append(m_postfix);
+  data->SetName(dataName);
+  data->SetFreshness(m_freshness);
+  data->SetTimestamp(Simulator::Now());
+
+  data->SetSignature(m_signature);
+  if (m_keyLocator.size() > 0) {
+    data->SetKeyLocator(make_shared<Name>(m_keyLocator));
+  }
+
+  NS_LOG_INFO("node(" << GetNode()->GetId() << ") respodning with Data: " << data->GetName());
+
+  // Echo back FwHopCountTag if exists
+  FwHopCountTag hopCountTag;
+  if (interest->GetPayload()->PeekPacketTag(hopCountTag)) {
+    data->GetPayload()->AddPacketTag(hopCountTag);
+  }
+
+  m_face->ReceiveData(data);
+  m_transmittedDatas(data, this, m_face);
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/apps/ndn-producer.hpp b/apps/ndn-producer.hpp
new file mode 100644
index 0000000..e414f4e
--- /dev/null
+++ b/apps/ndn-producer.hpp
@@ -0,0 +1,77 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_PRODUCER_H
+#define NDN_PRODUCER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-app.hpp"
+
+#include "ns3/ptr.h"
+#include "ns3/ndn-name.hpp"
+#include "ns3/ndn-data.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-apps
+ * @brief A simple Interest-sink applia simple Interest-sink application
+ *
+ * A simple Interest-sink applia simple Interest-sink application,
+ * which replying every incoming Interest with Data packet with a specified
+ * size and name same as in Interest.cation, which replying every incoming Interest
+ * with Data packet with a specified size and name same as in Interest.
+ */
+class Producer : public App {
+public:
+  static TypeId
+  GetTypeId(void);
+
+  Producer();
+
+  // inherited from NdnApp
+  void
+  OnInterest(shared_ptr<const Interest> interest);
+
+protected:
+  // inherited from Application base class.
+  virtual void
+  StartApplication(); // Called at time specified by Start
+
+  virtual void
+  StopApplication(); // Called at time specified by Stop
+
+private:
+  Name m_prefix;
+  Name m_postfix;
+  uint32_t m_virtualPayloadSize;
+  Time m_freshness;
+
+  uint32_t m_signature;
+  Name m_keyLocator;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_PRODUCER_H
diff --git a/bindings/callbacks_list.py b/bindings/callbacks_list.py
new file mode 100644
index 0000000..e485155
--- /dev/null
+++ b/bindings/callbacks_list.py
@@ -0,0 +1,10 @@
+callback_classes = [
+    ['void', 'ns3::Ptr<ns3::ndn::Name const>', 'ns3::Ptr<ns3::ndn::Interest const>', '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::ndn::Interest const>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::ndn::Interest const>', 'ns3::Ptr<ns3::ndn::Data const>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::ndn::Face>', 'ns3::Ptr<ns3::ndn::Data>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::ndn::Face>', 'ns3::Ptr<ns3::ndn::Interest>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Application>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+]
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
new file mode 100644
index 0000000..3c3a2fb
--- /dev/null
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -0,0 +1,7933 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
+
+
+import pybindgen.settings
+import warnings
+
+class ErrorHandler(pybindgen.settings.ErrorHandler):
+    def handle_error(self, wrapper, exception, traceback_):
+        warnings.warn("exception %r in wrapper %s" % (exception, wrapper))
+        return True
+pybindgen.settings.error_handler = ErrorHandler()
+
+
+import sys
+
+def module_init():
+    root_module = Module('ns.ndnSIM', cpp_namespace='::ns3')
+    return root_module
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
+    ## application-container.h (module 'network'): ns3::ApplicationContainer [class]
+    module.add_class('ApplicationContainer', import_from_module='ns.network')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
+    module.add_class('AttributeConstructionList', import_from_module='ns.core')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
+    module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
+    ## buffer.h (module 'network'): ns3::Buffer [class]
+    module.add_class('Buffer', import_from_module='ns.network')
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
+    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
+    module.add_class('ByteTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
+    module.add_class('ByteTagList', import_from_module='ns.network')
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
+    ## callback.h (module 'core'): ns3::CallbackBase [class]
+    module.add_class('CallbackBase', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId [class]
+    module.add_class('EventId', import_from_module='ns.core')
+    ## hash.h (module 'core'): ns3::Hasher [class]
+    module.add_class('Hasher', import_from_module='ns.core')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
+    module.add_class('NetDeviceContainer', import_from_module='ns.network')
+    ## node-container.h (module 'network'): ns3::NodeContainer [class]
+    module.add_class('NodeContainer', import_from_module='ns.network')
+    ## object-base.h (module 'core'): ns3::ObjectBase [class]
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    ## object.h (module 'core'): ns3::ObjectDeleter [struct]
+    module.add_class('ObjectDeleter', import_from_module='ns.core')
+    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
+    module.add_class('ObjectFactory', import_from_module='ns.core')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
+    module.add_class('PacketMetadata', import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
+    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
+    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
+    module.add_class('PacketTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
+    module.add_class('PacketTagList', import_from_module='ns.network')
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
+    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
+    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## random-variable.h (module 'core'): ns3::RandomVariable [class]
+    module.add_class('RandomVariable', import_from_module='ns.core')
+    ## rng-seed-manager.h (module 'core'): ns3::RngSeedManager [class]
+    module.add_class('RngSeedManager', import_from_module='ns.core')
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int> [class]
+    module.add_class('SequenceNumber32', import_from_module='ns.network')
+    ## random-variable.h (module 'core'): ns3::SequentialVariable [class]
+    module.add_class('SequentialVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simulator.h (module 'core'): ns3::Simulator [class]
+    module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
+    ## tag.h (module 'network'): ns3::Tag [class]
+    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
+    module.add_class('TagBuffer', import_from_module='ns.network')
+    ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
+    module.add_class('TimeWithUnit', import_from_module='ns.core')
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::ndn::fib::FaceMetric::Status'])
+    ## random-variable.h (module 'core'): ns3::TriangularVariable [class]
+    module.add_class('TriangularVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## type-id.h (module 'core'): ns3::TypeId [class]
+    module.add_class('TypeId', import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
+    module.add_enum('AttributeFlag', ['ATTR_GET', 'ATTR_SET', 'ATTR_CONSTRUCT', 'ATTR_SGC'], outer_class=root_module['ns3::TypeId'], import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation [struct]
+    module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
+    module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## random-variable.h (module 'core'): ns3::UniformVariable [class]
+    module.add_class('UniformVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable [class]
+    module.add_class('WeibullVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ZetaVariable [class]
+    module.add_class('ZetaVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ZipfVariable [class]
+    module.add_class('ZipfVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## empty.h (module 'core'): ns3::empty [class]
+    module.add_class('empty', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
+    module.add_class('int64x64_t', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
+    module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## chunk.h (module 'network'): ns3::Chunk [class]
+    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## random-variable.h (module 'core'): ns3::ConstantVariable [class]
+    module.add_class('ConstantVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::DeterministicVariable [class]
+    module.add_class('DeterministicVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::EmpiricalVariable [class]
+    module.add_class('EmpiricalVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ErlangVariable [class]
+    module.add_class('ErlangVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable [class]
+    module.add_class('ExponentialVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::GammaVariable [class]
+    module.add_class('GammaVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## header.h (module 'network'): ns3::Header [class]
+    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## random-variable.h (module 'core'): ns3::IntEmpiricalVariable [class]
+    module.add_class('IntEmpiricalVariable', import_from_module='ns.core', parent=root_module['ns3::EmpiricalVariable'])
+    ## random-variable.h (module 'core'): ns3::LogNormalVariable [class]
+    module.add_class('LogNormalVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::NormalVariable [class]
+    module.add_class('NormalVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## object.h (module 'core'): ns3::Object [class]
+    module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
+    module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable [class]
+    module.add_class('ParetoVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::L2Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::L2Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TopologyReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TopologyReader>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::AppDelayTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::AppDelayTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::CsTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::CsTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::Data', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Data>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::Exclude', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Exclude>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::FaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::FaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::ndn::Interest', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Interest>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::L3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::L3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::Name', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Name>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::cs::Entry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::cs::Entry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::pit::Entry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::pit::Entry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader [class]
+    module.add_class('TopologyReader', import_from_module='ns.topology_read', parent=root_module['ns3::SimpleRefCount< ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >'])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link [class]
+    module.add_class('Link', import_from_module='ns.topology_read', outer_class=root_module['ns3::TopologyReader'])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
+    module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## trailer.h (module 'network'): ns3::Trailer [class]
+    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::AnnotatedTopologyReader [class]
+    module.add_class('AnnotatedTopologyReader', parent=root_module['ns3::TopologyReader'])
+    ## 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]
+    module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    ## attribute.h (module 'core'): ns3::AttributeChecker [class]
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    ## attribute.h (module 'core'): ns3::AttributeValue [class]
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    ## boolean.h (module 'core'): ns3::BooleanChecker [class]
+    module.add_class('BooleanChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## boolean.h (module 'core'): ns3::BooleanValue [class]
+    module.add_class('BooleanValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## callback-based-app.h (module 'ndnSIM'): ns3::CallbackBasedApp [class]
+    module.add_class('CallbackBasedApp', parent=root_module['ns3::Application'])
+    ## callback.h (module 'core'): ns3::CallbackChecker [class]
+    module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## callback.h (module 'core'): ns3::CallbackImplBase [class]
+    module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    ## callback.h (module 'core'): ns3::CallbackValue [class]
+    module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## double.h (module 'core'): ns3::DoubleValue [class]
+    module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
+    module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## enum.h (module 'core'): ns3::EnumChecker [class]
+    module.add_class('EnumChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## enum.h (module 'core'): ns3::EnumValue [class]
+    module.add_class('EnumValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## event-impl.h (module 'core'): ns3::EventImpl [class]
+    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## integer.h (module 'core'): ns3::IntegerValue [class]
+    module.add_class('IntegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
+    module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## l2-tracer.h (module 'ndnSIM'): ns3::L2Tracer [class]
+    module.add_class('L2Tracer', parent=root_module['ns3::SimpleRefCount< ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >'])
+    ## net-device.h (module 'network'): ns3::NetDevice [class]
+    module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
+    module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
+    ## nix-vector.h (module 'network'): ns3::NixVector [class]
+    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## node.h (module 'network'): ns3::Node [class]
+    module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
+    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
+    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## packet.h (module 'network'): ns3::Packet [class]
+    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    ## random-variable.h (module 'core'): ns3::RandomVariableChecker [class]
+    module.add_class('RandomVariableChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue [class]
+    module.add_class('RandomVariableValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::RocketfuelWeightsReader [class]
+    module.add_class('RocketfuelWeightsReader', parent=root_module['ns3::AnnotatedTopologyReader'])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::RocketfuelWeightsReader [enumeration]
+    module.add_enum('', ['LINKS', 'WEIGHTS', 'LATENCIES', 'POSITIONS'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+    ## nstime.h (module 'core'): ns3::TimeValue [class]
+    module.add_class('TimeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
+    module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## type-id.h (module 'core'): ns3::TypeIdValue [class]
+    module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## uinteger.h (module 'core'): ns3::UintegerValue [class]
+    module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## address.h (module 'network'): ns3::AddressValue [class]
+    module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## l2-rate-tracer.h (module 'ndnSIM'): ns3::L2RateTracer [class]
+    module.add_class('L2RateTracer', parent=root_module['ns3::L2Tracer'])
+    module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
+    module.add_container('std::list< ns3::TopologyReader::Link >', 'ns3::TopologyReader::Link', container_type='list')
+    typehandlers.add_type_alias('ns3::SequenceNumber< short unsigned int, short int >', 'ns3::SequenceNumber16')
+    typehandlers.add_type_alias('ns3::SequenceNumber< short unsigned int, short int >*', 'ns3::SequenceNumber16*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< short unsigned int, short int >&', 'ns3::SequenceNumber16&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
+    typehandlers.add_type_alias('ns3::RngSeedManager', 'ns3::SeedManager')
+    typehandlers.add_type_alias('ns3::RngSeedManager*', 'ns3::SeedManager*')
+    typehandlers.add_type_alias('ns3::RngSeedManager&', 'ns3::SeedManager&')
+    module.add_typedef(root_module['ns3::RngSeedManager'], 'SeedManager')
+    
+    ## Register a nested module for the namespace FatalImpl
+    
+    nested_module = module.add_cpp_namespace('FatalImpl')
+    register_types_ns3_FatalImpl(nested_module)
+    
+    
+    ## Register a nested module for the namespace Hash
+    
+    nested_module = module.add_cpp_namespace('Hash')
+    register_types_ns3_Hash(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
+    
+    ## Register a nested module for the namespace ndn
+    
+    nested_module = module.add_cpp_namespace('ndn')
+    register_types_ns3_ndn(nested_module)
+    
+
+def register_types_ns3_FatalImpl(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_Hash(module):
+    root_module = module.get_root()
+    
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
+    module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
+    
+    ## Register a nested module for the namespace Function
+    
+    nested_module = module.add_cpp_namespace('Function')
+    register_types_ns3_Hash_Function(nested_module)
+    
+
+def register_types_ns3_Hash_Function(module):
+    root_module = module.get_root()
+    
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a [class]
+    module.add_class('Fnv1a', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32 [class]
+    module.add_class('Hash32', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64 [class]
+    module.add_class('Hash64', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
+    module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_ndn(module):
+    root_module = module.get_root()
+    
+    ## ndn-app.h (module 'ndnSIM'): ns3::ndn::App [class]
+    module.add_class('App', parent=root_module['ns3::Application'])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer [class]
+    module.add_class('AppDelayTracer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >'])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ndn::AppHelper [class]
+    module.add_class('AppHelper')
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob [class]
+    module.add_class('Blob')
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::ContentStore [class]
+    module.add_class('ContentStore', parent=root_module['ns3::Object'])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer [class]
+    module.add_class('CsTracer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >'])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Data [class]
+    module.add_class('Data', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >'])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::DataException [class]
+    module.add_class('DataException')
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude [class]
+    module.add_class('Exclude', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >'])
+    ## ndn-face.h (module 'ndnSIM'): ns3::ndn::Face [class]
+    module.add_class('Face', parent=root_module['ns3::Object'])
+    ## ndn-face.h (module 'ndnSIM'): ns3::ndn::Face::Flags [enumeration]
+    module.add_enum('Flags', ['APPLICATION'], outer_class=root_module['ns3::ndn::Face'])
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::ndn::FaceContainer [class]
+    module.add_class('FaceContainer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >'])
+    ## ndn-fib.h (module 'ndnSIM'): ns3::ndn::Fib [class]
+    module.add_class('Fib', parent=root_module['ns3::Object'])
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): ns3::ndn::ForwardingStrategy [class]
+    module.add_class('ForwardingStrategy', parent=root_module['ns3::Object'])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): ns3::ndn::GlobalRoutingHelper [class]
+    module.add_class('GlobalRoutingHelper')
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper [class]
+    module.add_class('HeaderHelper')
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::Type [enumeration]
+    module.add_enum('Type', ['INTEREST_CCNB', 'CONTENT_OBJECT_CCNB', 'INTEREST_NDNSIM', 'CONTENT_OBJECT_NDNSIM'], outer_class=root_module['ns3::ndn::HeaderHelper'])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest [class]
+    module.add_class('Interest', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >'])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest [enumeration]
+    module.add_enum('', ['NORMAL_INTEREST', 'NACK_LOOP', 'NACK_CONGESTION', 'NACK_GIVEUP_PIT'], outer_class=root_module['ns3::ndn::Interest'])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::InterestException [class]
+    module.add_class('InterestException')
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): ns3::ndn::IpFacesHelper [class]
+    module.add_class('IpFacesHelper')
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol [class]
+    module.add_class('L3Protocol', parent=root_module['ns3::Object'])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer [class]
+    module.add_class('L3Tracer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >'])
+    ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits [class]
+    module.add_class('Limits', parent=root_module['ns3::Object'])
+    ## ndn-link-control-helper.h (module 'ndnSIM'): ns3::ndn::LinkControlHelper [class]
+    module.add_class('LinkControlHelper')
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name [class]
+    module.add_class('Name', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >'])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameChecker [class]
+    module.add_class('NameChecker', parent=root_module['ns3::AttributeChecker'])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue [class]
+    module.add_class('NameValue', parent=root_module['ns3::AttributeValue'])
+    ## ndn-net-device-face.h (module 'ndnSIM'): ns3::ndn::NetDeviceFace [class]
+    module.add_class('NetDeviceFace', parent=root_module['ns3::ndn::Face'])
+    ## ndn-pit.h (module 'ndnSIM'): ns3::ndn::Pit [class]
+    module.add_class('Pit', parent=root_module['ns3::Object'])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttEstimator [class]
+    module.add_class('RttEstimator', parent=root_module['ns3::Object'])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory [class]
+    module.add_class('RttHistory')
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::ndn::StackHelper [class]
+    module.add_class('StackHelper')
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::UnknownHeaderException [class]
+    module.add_class('UnknownHeaderException')
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire [struct]
+    module.add_class('Wire')
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire [enumeration]
+    module.add_enum('', ['WIRE_FORMAT_DEFAULT', 'WIRE_FORMAT_AUTODETECT', 'WIRE_FORMAT_NDNSIM', 'WIRE_FORMAT_CCNB'], outer_class=root_module['ns3::ndn::Wire'])
+    ## ndn-api-face.h (module 'ndnSIM'): ns3::ndn::ApiFace [class]
+    module.add_class('ApiFace', parent=root_module['ns3::ndn::Face'])
+    ## ndn-app-face.h (module 'ndnSIM'): ns3::ndn::AppFace [class]
+    module.add_class('AppFace', parent=root_module['ns3::ndn::Face'])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer [class]
+    module.add_class('L3AggregateTracer', parent=root_module['ns3::ndn::L3Tracer'])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer [class]
+    module.add_class('L3RateTracer', parent=root_module['ns3::ndn::L3Tracer'])
+    module.add_container('std::vector< char >', 'char', container_type='vector')
+    module.add_container('std::map< ns3::ndn::name::Component, bool, std::greater< ns3::ndn::name::Component >, std::allocator< std::pair< ns3::ndn::name::Component const, bool > > >', ('ns3::ndn::name::Component', 'bool'), container_type='map')
+    module.add_container('std::vector< ns3::Ptr< ns3::ndn::Face > >', 'ns3::Ptr< ns3::ndn::Face >', container_type='vector')
+    typehandlers.add_type_alias('ns3::ndn::Name', 'ns3::ndn::NameComponents')
+    typehandlers.add_type_alias('ns3::ndn::Name*', 'ns3::ndn::NameComponents*')
+    typehandlers.add_type_alias('ns3::ndn::Name&', 'ns3::ndn::NameComponents&')
+    module.add_typedef(root_module['ns3::ndn::Name'], 'NameComponents')
+    typehandlers.add_type_alias('ns3::ndn::Data', 'ns3::ndn::DataHeader')
+    typehandlers.add_type_alias('ns3::ndn::Data*', 'ns3::ndn::DataHeader*')
+    typehandlers.add_type_alias('ns3::ndn::Data&', 'ns3::ndn::DataHeader&')
+    module.add_typedef(root_module['ns3::ndn::Data'], 'DataHeader')
+    typehandlers.add_type_alias('std::deque< ns3::ndn::RttHistory, std::allocator< ns3::ndn::RttHistory > >', 'ns3::ndn::RttHistory_t')
+    typehandlers.add_type_alias('std::deque< ns3::ndn::RttHistory, std::allocator< ns3::ndn::RttHistory > >*', 'ns3::ndn::RttHistory_t*')
+    typehandlers.add_type_alias('std::deque< ns3::ndn::RttHistory, std::allocator< ns3::ndn::RttHistory > >&', 'ns3::ndn::RttHistory_t&')
+    typehandlers.add_type_alias('ns3::Time', 'ns3::ndn::TimeInterval')
+    typehandlers.add_type_alias('ns3::Time*', 'ns3::ndn::TimeInterval*')
+    typehandlers.add_type_alias('ns3::Time&', 'ns3::ndn::TimeInterval&')
+    module.add_typedef(root_module['ns3::Time'], 'TimeInterval')
+    typehandlers.add_type_alias('ns3::ndn::Interest', 'ns3::ndn::InterestHeader')
+    typehandlers.add_type_alias('ns3::ndn::Interest*', 'ns3::ndn::InterestHeader*')
+    typehandlers.add_type_alias('ns3::ndn::Interest&', 'ns3::ndn::InterestHeader&')
+    module.add_typedef(root_module['ns3::ndn::Interest'], 'InterestHeader')
+    
+    ## Register a nested module for the namespace cs
+    
+    nested_module = module.add_cpp_namespace('cs')
+    register_types_ns3_ndn_cs(nested_module)
+    
+    
+    ## Register a nested module for the namespace fib
+    
+    nested_module = module.add_cpp_namespace('fib')
+    register_types_ns3_ndn_fib(nested_module)
+    
+    
+    ## Register a nested module for the namespace fw
+    
+    nested_module = module.add_cpp_namespace('fw')
+    register_types_ns3_ndn_fw(nested_module)
+    
+    
+    ## Register a nested module for the namespace name
+    
+    nested_module = module.add_cpp_namespace('name')
+    register_types_ns3_ndn_name(nested_module)
+    
+    
+    ## Register a nested module for the namespace pit
+    
+    nested_module = module.add_cpp_namespace('pit')
+    register_types_ns3_ndn_pit(nested_module)
+    
+    
+    ## Register a nested module for the namespace time
+    
+    nested_module = module.add_cpp_namespace('time')
+    register_types_ns3_ndn_time(nested_module)
+    
+
+def register_types_ns3_ndn_cs(module):
+    root_module = module.get_root()
+    
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::cs::Entry [class]
+    module.add_class('Entry', parent=root_module['ns3::SimpleRefCount< ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >'])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats [struct]
+    module.add_class('Stats')
+
+def register_types_ns3_ndn_fib(module):
+    root_module = module.get_root()
+    
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry [class]
+    module.add_class('Entry', parent=root_module['ns3::Object'])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::NoFaces [class]
+    module.add_class('NoFaces', outer_class=root_module['ns3::ndn::fib::Entry'])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric [class]
+    module.add_class('FaceMetric')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::Status [enumeration]
+    module.add_enum('Status', ['NDN_FIB_GREEN', 'NDN_FIB_YELLOW', 'NDN_FIB_RED'], outer_class=root_module['ns3::ndn::fib::FaceMetric'])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetricContainer [struct]
+    module.add_class('FaceMetricContainer')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_face [class]
+    module.add_class('i_face')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_metric [class]
+    module.add_class('i_metric')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_nth [class]
+    module.add_class('i_nth')
+
+def register_types_ns3_ndn_fw(module):
+    root_module = module.get_root()
+    
+    ## ndn-fw-tag.h (module 'ndnSIM'): ns3::ndn::fw::Tag [class]
+    module.add_class('Tag')
+
+def register_types_ns3_ndn_name(module):
+    root_module = module.get_root()
+    
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component [class]
+    module.add_class('Component', parent=root_module['ns3::ndn::Blob'])
+
+def register_types_ns3_ndn_pit(module):
+    root_module = module.get_root()
+    
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry [class]
+    module.add_class('Entry', parent=root_module['ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >'])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty [struct]
+    module.add_class('EntryIsNotEmpty')
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace [struct]
+    module.add_class('IncomingFace')
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace [struct]
+    module.add_class('OutgoingFace')
+    module.add_container('std::set< ns3::ndn::pit::IncomingFace >', 'ns3::ndn::pit::IncomingFace', container_type='set')
+    module.add_container('std::set< ns3::ndn::pit::OutgoingFace >', 'ns3::ndn::pit::OutgoingFace', container_type='set')
+    module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
+
+def register_types_ns3_ndn_time(module):
+    root_module = module.get_root()
+    
+
+def register_methods(root_module):
+    register_Ns3Address_methods(root_module, root_module['ns3::Address'])
+    register_Ns3ApplicationContainer_methods(root_module, root_module['ns3::ApplicationContainer'])
+    register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
+    register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
+    register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
+    register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
+    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
+    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
+    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
+    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
+    register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
+    register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
+    register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
+    register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
+    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
+    register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
+    register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
+    register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
+    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
+    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
+    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
+    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3RandomVariable_methods(root_module, root_module['ns3::RandomVariable'])
+    register_Ns3RngSeedManager_methods(root_module, root_module['ns3::RngSeedManager'])
+    register_Ns3SequenceNumber32_methods(root_module, root_module['ns3::SequenceNumber32'])
+    register_Ns3SequentialVariable_methods(root_module, root_module['ns3::SequentialVariable'])
+    register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
+    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
+    register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
+    register_Ns3TracedValue__Ns3NdnFibFaceMetricStatus_methods(root_module, root_module['ns3::TracedValue< ns3::ndn::fib::FaceMetric::Status >'])
+    register_Ns3TriangularVariable_methods(root_module, root_module['ns3::TriangularVariable'])
+    register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
+    register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
+    register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3UniformVariable_methods(root_module, root_module['ns3::UniformVariable'])
+    register_Ns3WeibullVariable_methods(root_module, root_module['ns3::WeibullVariable'])
+    register_Ns3ZetaVariable_methods(root_module, root_module['ns3::ZetaVariable'])
+    register_Ns3ZipfVariable_methods(root_module, root_module['ns3::ZipfVariable'])
+    register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
+    register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
+    register_Ns3ConstantVariable_methods(root_module, root_module['ns3::ConstantVariable'])
+    register_Ns3DeterministicVariable_methods(root_module, root_module['ns3::DeterministicVariable'])
+    register_Ns3EmpiricalVariable_methods(root_module, root_module['ns3::EmpiricalVariable'])
+    register_Ns3ErlangVariable_methods(root_module, root_module['ns3::ErlangVariable'])
+    register_Ns3ExponentialVariable_methods(root_module, root_module['ns3::ExponentialVariable'])
+    register_Ns3GammaVariable_methods(root_module, root_module['ns3::GammaVariable'])
+    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3IntEmpiricalVariable_methods(root_module, root_module['ns3::IntEmpiricalVariable'])
+    register_Ns3LogNormalVariable_methods(root_module, root_module['ns3::LogNormalVariable'])
+    register_Ns3NormalVariable_methods(root_module, root_module['ns3::NormalVariable'])
+    register_Ns3Object_methods(root_module, root_module['ns3::Object'])
+    register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3ParetoVariable_methods(root_module, root_module['ns3::ParetoVariable'])
+    register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    register_Ns3SimpleRefCount__Ns3L2Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3L2Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >'])
+    register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3TopologyReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3TopologyReader__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >'])
+    register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3NdnAppDelayTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnAppDelayTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnCsTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnData_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnData__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >'])
+    register_Ns3SimpleRefCount__Ns3NdnExclude_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnExclude__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >'])
+    register_Ns3SimpleRefCount__Ns3NdnFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnInterest_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnInterest__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >'])
+    register_Ns3SimpleRefCount__Ns3NdnL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnName_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnName__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >'])
+    register_Ns3SimpleRefCount__Ns3NdnCsEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >'])
+    register_Ns3SimpleRefCount__Ns3NdnPitEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnPitEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
+    register_Ns3TopologyReader_methods(root_module, root_module['ns3::TopologyReader'])
+    register_Ns3TopologyReaderLink_methods(root_module, root_module['ns3::TopologyReader::Link'])
+    register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
+    register_Ns3AnnotatedTopologyReader_methods(root_module, root_module['ns3::AnnotatedTopologyReader'])
+    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'])
+    register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
+    register_Ns3BooleanChecker_methods(root_module, root_module['ns3::BooleanChecker'])
+    register_Ns3BooleanValue_methods(root_module, root_module['ns3::BooleanValue'])
+    register_Ns3CallbackBasedApp_methods(root_module, root_module['ns3::CallbackBasedApp'])
+    register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
+    register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
+    register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
+    register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
+    register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3EnumChecker_methods(root_module, root_module['ns3::EnumChecker'])
+    register_Ns3EnumValue_methods(root_module, root_module['ns3::EnumValue'])
+    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
+    register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3L2Tracer_methods(root_module, root_module['ns3::L2Tracer'])
+    register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
+    register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3Node_methods(root_module, root_module['ns3::Node'])
+    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
+    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
+    register_Ns3RandomVariableChecker_methods(root_module, root_module['ns3::RandomVariableChecker'])
+    register_Ns3RandomVariableValue_methods(root_module, root_module['ns3::RandomVariableValue'])
+    register_Ns3RocketfuelWeightsReader_methods(root_module, root_module['ns3::RocketfuelWeightsReader'])
+    register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
+    register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3L2RateTracer_methods(root_module, root_module['ns3::L2RateTracer'])
+    register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
+    register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
+    register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
+    register_Ns3HashFunctionHash64_methods(root_module, root_module['ns3::Hash::Function::Hash64'])
+    register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
+    register_Ns3NdnApp_methods(root_module, root_module['ns3::ndn::App'])
+    register_Ns3NdnAppDelayTracer_methods(root_module, root_module['ns3::ndn::AppDelayTracer'])
+    register_Ns3NdnAppHelper_methods(root_module, root_module['ns3::ndn::AppHelper'])
+    register_Ns3NdnBlob_methods(root_module, root_module['ns3::ndn::Blob'])
+    register_Ns3NdnContentStore_methods(root_module, root_module['ns3::ndn::ContentStore'])
+    register_Ns3NdnCsTracer_methods(root_module, root_module['ns3::ndn::CsTracer'])
+    register_Ns3NdnData_methods(root_module, root_module['ns3::ndn::Data'])
+    register_Ns3NdnDataException_methods(root_module, root_module['ns3::ndn::DataException'])
+    register_Ns3NdnExclude_methods(root_module, root_module['ns3::ndn::Exclude'])
+    register_Ns3NdnFace_methods(root_module, root_module['ns3::ndn::Face'])
+    register_Ns3NdnFaceContainer_methods(root_module, root_module['ns3::ndn::FaceContainer'])
+    register_Ns3NdnFib_methods(root_module, root_module['ns3::ndn::Fib'])
+    register_Ns3NdnForwardingStrategy_methods(root_module, root_module['ns3::ndn::ForwardingStrategy'])
+    register_Ns3NdnGlobalRoutingHelper_methods(root_module, root_module['ns3::ndn::GlobalRoutingHelper'])
+    register_Ns3NdnHeaderHelper_methods(root_module, root_module['ns3::ndn::HeaderHelper'])
+    register_Ns3NdnInterest_methods(root_module, root_module['ns3::ndn::Interest'])
+    register_Ns3NdnInterestException_methods(root_module, root_module['ns3::ndn::InterestException'])
+    register_Ns3NdnIpFacesHelper_methods(root_module, root_module['ns3::ndn::IpFacesHelper'])
+    register_Ns3NdnL3Protocol_methods(root_module, root_module['ns3::ndn::L3Protocol'])
+    register_Ns3NdnL3Tracer_methods(root_module, root_module['ns3::ndn::L3Tracer'])
+    register_Ns3NdnLimits_methods(root_module, root_module['ns3::ndn::Limits'])
+    register_Ns3NdnLinkControlHelper_methods(root_module, root_module['ns3::ndn::LinkControlHelper'])
+    register_Ns3NdnName_methods(root_module, root_module['ns3::ndn::Name'])
+    register_Ns3NdnNameChecker_methods(root_module, root_module['ns3::ndn::NameChecker'])
+    register_Ns3NdnNameValue_methods(root_module, root_module['ns3::ndn::NameValue'])
+    register_Ns3NdnNetDeviceFace_methods(root_module, root_module['ns3::ndn::NetDeviceFace'])
+    register_Ns3NdnPit_methods(root_module, root_module['ns3::ndn::Pit'])
+    register_Ns3NdnRttEstimator_methods(root_module, root_module['ns3::ndn::RttEstimator'])
+    register_Ns3NdnRttHistory_methods(root_module, root_module['ns3::ndn::RttHistory'])
+    register_Ns3NdnStackHelper_methods(root_module, root_module['ns3::ndn::StackHelper'])
+    register_Ns3NdnUnknownHeaderException_methods(root_module, root_module['ns3::ndn::UnknownHeaderException'])
+    register_Ns3NdnWire_methods(root_module, root_module['ns3::ndn::Wire'])
+    register_Ns3NdnApiFace_methods(root_module, root_module['ns3::ndn::ApiFace'])
+    register_Ns3NdnAppFace_methods(root_module, root_module['ns3::ndn::AppFace'])
+    register_Ns3NdnL3AggregateTracer_methods(root_module, root_module['ns3::ndn::L3AggregateTracer'])
+    register_Ns3NdnL3RateTracer_methods(root_module, root_module['ns3::ndn::L3RateTracer'])
+    register_Ns3NdnCsEntry_methods(root_module, root_module['ns3::ndn::cs::Entry'])
+    register_Ns3NdnCsStats_methods(root_module, root_module['ns3::ndn::cs::Stats'])
+    register_Ns3NdnFibEntry_methods(root_module, root_module['ns3::ndn::fib::Entry'])
+    register_Ns3NdnFibEntryNoFaces_methods(root_module, root_module['ns3::ndn::fib::Entry::NoFaces'])
+    register_Ns3NdnFibFaceMetric_methods(root_module, root_module['ns3::ndn::fib::FaceMetric'])
+    register_Ns3NdnFibFaceMetricContainer_methods(root_module, root_module['ns3::ndn::fib::FaceMetricContainer'])
+    register_Ns3NdnFibI_face_methods(root_module, root_module['ns3::ndn::fib::i_face'])
+    register_Ns3NdnFibI_metric_methods(root_module, root_module['ns3::ndn::fib::i_metric'])
+    register_Ns3NdnFibI_nth_methods(root_module, root_module['ns3::ndn::fib::i_nth'])
+    register_Ns3NdnFwTag_methods(root_module, root_module['ns3::ndn::fw::Tag'])
+    register_Ns3NdnNameComponent_methods(root_module, root_module['ns3::ndn::name::Component'])
+    register_Ns3NdnPitEntry_methods(root_module, root_module['ns3::ndn::pit::Entry'])
+    register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, root_module['ns3::ndn::pit::EntryIsNotEmpty'])
+    register_Ns3NdnPitIncomingFace_methods(root_module, root_module['ns3::ndn::pit::IncomingFace'])
+    register_Ns3NdnPitOutgoingFace_methods(root_module, root_module['ns3::ndn::pit::OutgoingFace'])
+    return
+
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
+def register_Ns3ApplicationContainer_methods(root_module, cls):
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer(ns3::ApplicationContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ApplicationContainer const &', 'arg0')])
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer() [constructor]
+    cls.add_constructor([])
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer(ns3::Ptr<ns3::Application> application) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Application >', 'application')])
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer(std::string name) [constructor]
+    cls.add_constructor([param('std::string', 'name')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Add(ns3::ApplicationContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ApplicationContainer', 'other')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Add(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Add(std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name')])
+    ## application-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Application>*,std::vector<ns3::Ptr<ns3::Application>, std::allocator<ns3::Ptr<ns3::Application> > > > ns3::ApplicationContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Application > const, std::vector< ns3::Ptr< ns3::Application > > >', 
+                   [], 
+                   is_const=True)
+    ## application-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Application>*,std::vector<ns3::Ptr<ns3::Application>, std::allocator<ns3::Ptr<ns3::Application> > > > ns3::ApplicationContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Application > const, std::vector< ns3::Ptr< ns3::Application > > >', 
+                   [], 
+                   is_const=True)
+    ## application-container.h (module 'network'): ns3::Ptr<ns3::Application> ns3::ApplicationContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## application-container.h (module 'network'): uint32_t ns3::ApplicationContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Start(ns3::Time start) [member function]
+    cls.add_method('Start', 
+                   'void', 
+                   [param('ns3::Time', 'start')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Stop(ns3::Time stop) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time', 'stop')])
+    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')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): void ns3::AttributeConstructionList::Add(std::string name, ns3::Ptr<ns3::AttributeChecker const> checker, ns3::Ptr<ns3::AttributeValue> value) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker'), param('ns3::Ptr< ns3::AttributeValue >', 'value')])
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::End() const [member function]
+    cls.add_method('End', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeConstructionList::Find(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionListItem_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item(ns3::AttributeConstructionList::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList::Item const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::value [variable]
+    cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
+    return
+
+def register_Ns3Buffer_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    cls.add_method('AddAtEnd', 
+                   'bool', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    cls.add_method('AddAtStart', 
+                   'bool', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Buffer', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
+    cls.add_method('CreateFullCopy', 
+                   'ns3::Buffer', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
+    cls.add_method('GetCurrentEndOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
+    cls.add_method('GetCurrentStartOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3BufferIterator_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator const &', 'o')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
+    cls.add_method('IsEnd', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
+    cls.add_method('IsStart', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::PeekU8() [member function]
+    cls.add_method('PeekU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(ns3::Buffer::Iterator start, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
+    cls.add_method('ReadLsbtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
+    cls.add_method('ReadLsbtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
+    cls.add_method('ReadLsbtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
+    cls.add_method('ReadNtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
+    cls.add_method('ReadNtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
+    cls.add_method('ReadNtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
+    cls.add_method('WriteHtolsbU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
+    cls.add_method('WriteHtolsbU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
+    cls.add_method('WriteHtolsbU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
+    cls.add_method('WriteHtonU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
+    cls.add_method('WriteHtonU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
+    cls.add_method('WriteHtonU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
+    return
+
+def register_Ns3ByteTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
+    cls.add_method('GetEnd', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
+    cls.add_method('GetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ByteTagList_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
+    cls.add_constructor([])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
+    cls.add_method('Add', 
+                   'ns3::TagBuffer', 
+                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+    cls.add_method('AddAtStart', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
+    cls.add_method('Begin', 
+                   'ns3::ByteTagList::Iterator', 
+                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIterator_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
+    cls.add_method('GetOffsetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagList::Iterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
+    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
+    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
+    cls.add_instance_attribute('end', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
+    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
+    cls.add_instance_attribute('start', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3CallbackBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::CallbackImplBase> ns3::CallbackBase::GetImpl() const [member function]
+    cls.add_method('GetImpl', 
+                   'ns3::Ptr< ns3::CallbackImplBase >', 
+                   [], 
+                   is_const=True)
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
+                        visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3EventId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
+    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
+    cls.add_constructor([])
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
+    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
+    cls.add_method('GetTs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
+    cls.add_method('PeekEventImpl', 
+                   'ns3::EventImpl *', 
+                   [], 
+                   is_const=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')])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher() [constructor]
+    cls.add_constructor([])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Ptr<ns3::Hash::Implementation> hp) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Hash::Implementation >', 'hp')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(std::string const s) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(std::string const s) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::Hasher::clear() [member function]
+    cls.add_method('clear', 
+                   'ns3::Hasher &', 
+                   [])
+    return
+
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NetDeviceContainer_methods(root_module, cls):
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer() [constructor]
+    cls.add_constructor([])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::NetDeviceContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'other')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(std::string deviceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'deviceName')])
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::NetDeviceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): uint32_t ns3::NetDeviceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NodeContainer_methods(root_module, cls):
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer() [constructor]
+    cls.add_constructor([])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(std::string nodeName) [constructor]
+    cls.add_constructor([param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d, ns3::NodeContainer const & e) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd'), param('ns3::NodeContainer const &', 'e')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::NodeContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NodeContainer', 'other')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(std::string nodeName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n, uint32_t systemId) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'systemId')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NodeContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## node-container.h (module 'network'): static ns3::NodeContainer ns3::NodeContainer::GetGlobal() [member function]
+    cls.add_method('GetGlobal', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_static=True)
+    ## node-container.h (module 'network'): uint32_t ns3::NodeContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::begin() [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node >, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::end() const [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::end() [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node >, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [])
+    ## node-container.h (module 'network'): uint32_t ns3::NodeContainer::size() const [member function]
+    cls.add_method('size', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ObjectBase_methods(root_module, cls):
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
+    cls.add_constructor([])
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase(ns3::ObjectBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectBase const &', 'arg0')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::GetAttribute(std::string name, ns3::AttributeValue & value) const [member function]
+    cls.add_method('GetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object-base.h (module 'core'): void ns3::ObjectBase::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::SetAttributeFailSafe(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::ConstructSelf(ns3::AttributeConstructionList const & attributes) [member function]
+    cls.add_method('ConstructSelf', 
+                   'void', 
+                   [param('ns3::AttributeConstructionList const &', 'attributes')], 
+                   visibility='protected')
+    ## object-base.h (module 'core'): void ns3::ObjectBase::NotifyConstructionCompleted() [member function]
+    cls.add_method('NotifyConstructionCompleted', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectDeleter_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter(ns3::ObjectDeleter const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectDeleter const &', 'arg0')])
+    ## object.h (module 'core'): static void ns3::ObjectDeleter::Delete(ns3::Object * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::Object *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3ObjectFactory_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
+    cls.add_constructor([param('std::string', 'typeId')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('ns3::TypeId', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('char const *', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('std::string', 'tid')])
+    return
+
+def register_Ns3PacketMetadata_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
+    cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [param('ns3::Buffer', 'buffer')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::PacketMetadata', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketMetadataItem_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
+    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
+    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
+    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
+    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
+    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
+    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketMetadata::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketTagList_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
+    cls.add_method('Head', 
+                   'ns3::PacketTagList::TagData const *', 
+                   [], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
+    cls.add_method('Peek', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
+    cls.add_method('Replace', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    return
+
+def register_Ns3PacketTagListTagData_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
+    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
+    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3RandomVariable_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## random-variable.h (module 'core'): ns3::RandomVariable::RandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::RandomVariable::RandomVariable(ns3::RandomVariable const & o) [copy constructor]
+    cls.add_constructor([param('ns3::RandomVariable const &', 'o')])
+    ## random-variable.h (module 'core'): uint32_t ns3::RandomVariable::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::RandomVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3RngSeedManager_methods(root_module, cls):
+    ## rng-seed-manager.h (module 'core'): ns3::RngSeedManager::RngSeedManager() [constructor]
+    cls.add_constructor([])
+    ## rng-seed-manager.h (module 'core'): ns3::RngSeedManager::RngSeedManager(ns3::RngSeedManager const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::RngSeedManager const &', 'arg0')])
+    ## rng-seed-manager.h (module 'core'): static uint64_t ns3::RngSeedManager::GetNextStreamIndex() [member function]
+    cls.add_method('GetNextStreamIndex', 
+                   'uint64_t', 
+                   [], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static uint64_t ns3::RngSeedManager::GetRun() [member function]
+    cls.add_method('GetRun', 
+                   'uint64_t', 
+                   [], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static uint32_t ns3::RngSeedManager::GetSeed() [member function]
+    cls.add_method('GetSeed', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static void ns3::RngSeedManager::SetRun(uint64_t run) [member function]
+    cls.add_method('SetRun', 
+                   'void', 
+                   [param('uint64_t', 'run')], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static void ns3::RngSeedManager::SetSeed(uint32_t seed) [member function]
+    cls.add_method('SetSeed', 
+                   'void', 
+                   [param('uint32_t', 'seed')], 
+                   is_static=True)
+    return
+
+def register_Ns3SequenceNumber32_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('+', root_module['ns3::SequenceNumber32'], root_module['ns3::SequenceNumber32'], param('ns3::SequenceNumber< unsigned int, int > const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::SequenceNumber32'], root_module['ns3::SequenceNumber32'], param('int', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('int', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::SequenceNumber32'], root_module['ns3::SequenceNumber32'], param('int', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('int', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('>=')
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int>::SequenceNumber() [constructor]
+    cls.add_constructor([])
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int>::SequenceNumber(unsigned int value) [constructor]
+    cls.add_constructor([param('unsigned int', 'value')])
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int>::SequenceNumber(ns3::SequenceNumber<unsigned int, int> const & value) [copy constructor]
+    cls.add_constructor([param('ns3::SequenceNumber< unsigned int, int > const &', 'value')])
+    ## sequence-number.h (module 'network'): unsigned int ns3::SequenceNumber<unsigned int, int>::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'unsigned int', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3SequentialVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::SequentialVariable::SequentialVariable(ns3::SequentialVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SequentialVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::SequentialVariable::SequentialVariable(double f, double l, double i=1, uint32_t c=1) [constructor]
+    cls.add_constructor([param('double', 'f'), param('double', 'l'), param('double', 'i', default_value='1'), param('uint32_t', 'c', default_value='1')])
+    ## random-variable.h (module 'core'): ns3::SequentialVariable::SequentialVariable(double f, double l, ns3::RandomVariable const & i, uint32_t c=1) [constructor]
+    cls.add_constructor([param('double', 'f'), param('double', 'l'), param('ns3::RandomVariable const &', 'i'), param('uint32_t', 'c', default_value='1')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount(ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Simulator_methods(root_module, cls):
+    ## simulator.h (module 'core'): ns3::Simulator::Simulator(ns3::Simulator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Simulator const &', 'arg0')])
+    ## simulator.h (module 'core'): static void ns3::Simulator::Cancel(ns3::EventId const & id) [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetContext() [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetDelayLeft(ns3::EventId const & id) [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Ptr<ns3::SimulatorImpl> ns3::Simulator::GetImplementation() [member function]
+    cls.add_method('GetImplementation', 
+                   'ns3::Ptr< ns3::SimulatorImpl >', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetMaximumSimulationTime() [member function]
+    cls.add_method('GetMaximumSimulationTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetSystemId() [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsExpired(ns3::EventId const & id) [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsFinished() [member function]
+    cls.add_method('IsFinished', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::Now() [member function]
+    cls.add_method('Now', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Remove(ns3::EventId const & id) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetImplementation(ns3::Ptr<ns3::SimulatorImpl> impl) [member function]
+    cls.add_method('SetImplementation', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimulatorImpl >', 'impl')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
+    cls.add_method('SetScheduler', 
+                   'void', 
+                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time const &', 'time')], 
+                   is_static=True)
+    return
+
+def register_Ns3Tag_methods(root_module, cls):
+    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
+    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'o')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): double ns3::TagBuffer::ReadDouble() [member function]
+    cls.add_method('ReadDouble', 
+                   'double', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint16_t ns3::TagBuffer::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint32_t ns3::TagBuffer::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint64_t ns3::TagBuffer::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint8_t ns3::TagBuffer::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::TrimAtEnd(uint32_t trim) [member function]
+    cls.add_method('TrimAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'trim')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteDouble(double v) [member function]
+    cls.add_method('WriteDouble', 
+                   'void', 
+                   [param('double', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU64(uint64_t v) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU8(uint8_t v) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'v')])
+    return
+
+def register_Ns3TimeWithUnit_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::TimeWithUnit const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeWithUnit const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::Time const time, ns3::Time::Unit const unit) [constructor]
+    cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
+    return
+
+def register_Ns3TracedValue__Ns3NdnFibFaceMetricStatus_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::TracedValue(ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::ndn::fib::FaceMetric::Status > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::TracedValue(ns3::ndn::fib::FaceMetric::Status const & v) [constructor]
+    cls.add_constructor([param('ns3::ndn::fib::FaceMetric::Status const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    cls.add_method('Disconnect', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): ns3::ndn::fib::FaceMetric::Status ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ndn::fib::FaceMetric::Status', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Set(ns3::ndn::fib::FaceMetric::Status const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ndn::fib::FaceMetric::Status const &', 'v')])
+    return
+
+def register_Ns3TriangularVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::TriangularVariable::TriangularVariable(ns3::TriangularVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TriangularVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::TriangularVariable::TriangularVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::TriangularVariable::TriangularVariable(double s, double l, double mean) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'l'), param('double', 'mean')])
+    return
+
+def register_Ns3TypeId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
+    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'o')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, uint32_t flags, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('uint32_t', 'flags'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
+    cls.add_method('GetAttribute', 
+                   'ns3::TypeId::AttributeInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetAttributeFullName(uint32_t i) const [member function]
+    cls.add_method('GetAttributeFullName', 
+                   'std::string', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetAttributeN() const [member function]
+    cls.add_method('GetAttributeN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::Callback<ns3::ObjectBase*,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> ns3::TypeId::GetConstructor() const [member function]
+    cls.add_method('GetConstructor', 
+                   'ns3::Callback< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetGroupName() const [member function]
+    cls.add_method('GetGroupName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetHash() const [member function]
+    cls.add_method('GetHash', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::GetRegistered(uint32_t i) [member function]
+    cls.add_method('GetRegistered', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'i')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static uint32_t ns3::TypeId::GetRegisteredN() [member function]
+    cls.add_method('GetRegisteredN', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
+    cls.add_method('GetTraceSource', 
+                   'ns3::TypeId::TraceSourceInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetTraceSourceN() const [member function]
+    cls.add_method('GetTraceSourceN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint16_t ns3::TypeId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasConstructor() const [member function]
+    cls.add_method('HasConstructor', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasParent() const [member function]
+    cls.add_method('HasParent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::HideFromDocumentation() [member function]
+    cls.add_method('HideFromDocumentation', 
+                   'ns3::TypeId', 
+                   [])
+    ## type-id.h (module 'core'): bool ns3::TypeId::IsChildOf(ns3::TypeId other) const [member function]
+    cls.add_method('IsChildOf', 
+                   'bool', 
+                   [param('ns3::TypeId', 'other')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::LookupAttributeByName(std::string name, ns3::TypeId::AttributeInformation * info) const [member function]
+    cls.add_method('LookupAttributeByName', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::TypeId::AttributeInformation *', 'info', transfer_ownership=False)], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByHash(uint32_t hash) [member function]
+    cls.add_method('LookupByHash', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'hash')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static bool ns3::TypeId::LookupByHashFailSafe(uint32_t hash, ns3::TypeId * tid) [member function]
+    cls.add_method('LookupByHashFailSafe', 
+                   'bool', 
+                   [param('uint32_t', 'hash'), param('ns3::TypeId *', 'tid')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByName(std::string name) [member function]
+    cls.add_method('LookupByName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::TraceSourceAccessor const> ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function]
+    cls.add_method('LookupTraceSourceByName', 
+                   'ns3::Ptr< ns3::TraceSourceAccessor const >', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::MustHideFromDocumentation() const [member function]
+    cls.add_method('MustHideFromDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::SetAttributeInitialValue(uint32_t i, ns3::Ptr<ns3::AttributeValue const> initialValue) [member function]
+    cls.add_method('SetAttributeInitialValue', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ptr< ns3::AttributeValue const >', 'initialValue')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetGroupName(std::string groupName) [member function]
+    cls.add_method('SetGroupName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'groupName')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent(ns3::TypeId tid) [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
+    cls.add_method('SetUid', 
+                   'void', 
+                   [param('uint16_t', 'tid')])
+    return
+
+def register_Ns3TypeIdAttributeInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation(ns3::TypeId::AttributeInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::AttributeInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::AttributeAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::flags [variable]
+    cls.add_instance_attribute('flags', 'uint32_t', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::initialValue [variable]
+    cls.add_instance_attribute('initialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::originalInitialValue [variable]
+    cls.add_instance_attribute('originalInitialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    return
+
+def register_Ns3TypeIdTraceSourceInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation(ns3::TypeId::TraceSourceInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    return
+
+def register_Ns3UniformVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::UniformVariable::UniformVariable(ns3::UniformVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UniformVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::UniformVariable::UniformVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::UniformVariable::UniformVariable(double s, double l) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'l')])
+    ## random-variable.h (module 'core'): uint32_t ns3::UniformVariable::GetInteger(uint32_t s, uint32_t l) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 's'), param('uint32_t', 'l')])
+    ## random-variable.h (module 'core'): double ns3::UniformVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::UniformVariable::GetValue(double s, double l) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 's'), param('double', 'l')])
+    return
+
+def register_Ns3WeibullVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(ns3::WeibullVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WeibullVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(double m) [constructor]
+    cls.add_constructor([param('double', 'm')])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(double m, double s) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's')])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(double m, double s, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's'), param('double', 'b')])
+    return
+
+def register_Ns3ZetaVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ZetaVariable::ZetaVariable(ns3::ZetaVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ZetaVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ZetaVariable::ZetaVariable(double alpha) [constructor]
+    cls.add_constructor([param('double', 'alpha')])
+    ## random-variable.h (module 'core'): ns3::ZetaVariable::ZetaVariable() [constructor]
+    cls.add_constructor([])
+    return
+
+def register_Ns3ZipfVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ZipfVariable::ZipfVariable(ns3::ZipfVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ZipfVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ZipfVariable::ZipfVariable(long int N, double alpha) [constructor]
+    cls.add_constructor([param('long int', 'N'), param('double', 'alpha')])
+    ## random-variable.h (module 'core'): ns3::ZipfVariable::ZipfVariable() [constructor]
+    cls.add_constructor([])
+    return
+
+def register_Ns3Empty_methods(root_module, cls):
+    ## empty.h (module 'core'): ns3::empty::empty() [constructor]
+    cls.add_constructor([])
+    ## empty.h (module 'core'): ns3::empty::empty(ns3::empty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::empty const &', 'arg0')])
+    return
+
+def register_Ns3Int64x64_t_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_unary_numeric_operator('-')
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
+    cls.add_constructor([])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long double v) [constructor]
+    cls.add_constructor([param('long double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t hi, uint64_t lo) [constructor]
+    cls.add_constructor([param('int64_t', 'hi'), param('uint64_t', 'lo')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [copy constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): double ns3::int64x64_t::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): int64_t ns3::int64x64_t::GetHigh() const [member function]
+    cls.add_method('GetHigh', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
+    cls.add_method('GetLow', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): static ns3::int64x64_t ns3::int64x64_t::Invert(uint64_t v) [member function]
+    cls.add_method('Invert', 
+                   'ns3::int64x64_t', 
+                   [param('uint64_t', 'v')], 
+                   is_static=True)
+    ## int64x64-double.h (module 'core'): void ns3::int64x64_t::MulByInvert(ns3::int64x64_t const & o) [member function]
+    cls.add_method('MulByInvert', 
+                   'void', 
+                   [param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::implementation [variable]
+    cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
+    return
+
+def register_Ns3Chunk_methods(root_module, cls):
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
+    cls.add_constructor([])
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
+    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3ConstantVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ConstantVariable::ConstantVariable(ns3::ConstantVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ConstantVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ConstantVariable::ConstantVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ConstantVariable::ConstantVariable(double c) [constructor]
+    cls.add_constructor([param('double', 'c')])
+    ## random-variable.h (module 'core'): void ns3::ConstantVariable::SetConstant(double c) [member function]
+    cls.add_method('SetConstant', 
+                   'void', 
+                   [param('double', 'c')])
+    return
+
+def register_Ns3DeterministicVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::DeterministicVariable::DeterministicVariable(ns3::DeterministicVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeterministicVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::DeterministicVariable::DeterministicVariable(double * d, uint32_t c) [constructor]
+    cls.add_constructor([param('double *', 'd'), param('uint32_t', 'c')])
+    return
+
+def register_Ns3EmpiricalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::EmpiricalVariable::EmpiricalVariable(ns3::EmpiricalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmpiricalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::EmpiricalVariable::EmpiricalVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): void ns3::EmpiricalVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
+                   'void', 
+                   [param('double', 'v'), param('double', 'c')])
+    return
+
+def register_Ns3ErlangVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ErlangVariable::ErlangVariable(ns3::ErlangVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ErlangVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ErlangVariable::ErlangVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ErlangVariable::ErlangVariable(unsigned int k, double lambda) [constructor]
+    cls.add_constructor([param('unsigned int', 'k'), param('double', 'lambda')])
+    ## random-variable.h (module 'core'): double ns3::ErlangVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::ErlangVariable::GetValue(unsigned int k, double lambda) const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('unsigned int', 'k'), param('double', 'lambda')], 
+                   is_const=True)
+    return
+
+def register_Ns3ExponentialVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable(ns3::ExponentialVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ExponentialVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable(double m) [constructor]
+    cls.add_constructor([param('double', 'm')])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable(double m, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 'b')])
+    return
+
+def register_Ns3GammaVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::GammaVariable::GammaVariable(ns3::GammaVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::GammaVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::GammaVariable::GammaVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::GammaVariable::GammaVariable(double alpha, double beta) [constructor]
+    cls.add_constructor([param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable.h (module 'core'): double ns3::GammaVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::GammaVariable::GetValue(double alpha, double beta) const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')], 
+                   is_const=True)
+    return
+
+def register_Ns3Header_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## header.h (module 'network'): ns3::Header::Header() [constructor]
+    cls.add_constructor([])
+    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Header const &', 'arg0')])
+    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3IntEmpiricalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::IntEmpiricalVariable::IntEmpiricalVariable(ns3::IntEmpiricalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntEmpiricalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::IntEmpiricalVariable::IntEmpiricalVariable() [constructor]
+    cls.add_constructor([])
+    return
+
+def register_Ns3LogNormalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::LogNormalVariable::LogNormalVariable(ns3::LogNormalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LogNormalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::LogNormalVariable::LogNormalVariable(double mu, double sigma) [constructor]
+    cls.add_constructor([param('double', 'mu'), param('double', 'sigma')])
+    return
+
+def register_Ns3NormalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable(ns3::NormalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NormalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable(double m, double v) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 'v')])
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable(double m, double v, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 'v'), param('double', 'b')])
+    return
+
+def register_Ns3Object_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::Object() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): void ns3::Object::AggregateObject(ns3::Ptr<ns3::Object> other) [member function]
+    cls.add_method('AggregateObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'other')])
+    ## object.h (module 'core'): void ns3::Object::Dispose() [member function]
+    cls.add_method('Dispose', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator ns3::Object::GetAggregateIterator() const [member function]
+    cls.add_method('GetAggregateIterator', 
+                   'ns3::Object::AggregateIterator', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::TypeId ns3::Object::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::ndn::ContentStore> ns3::Object::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::ndn::ContentStore >', 
+                   [], 
+                   is_const=True, template_parameters=['ns3::ndn::ContentStore'])
+    ## object.h (module 'core'): ns3::Ptr<ns3::ndn::Fib> ns3::Object::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::ndn::Fib >', 
+                   [], 
+                   is_const=True, template_parameters=['ns3::ndn::Fib'])
+    ## object.h (module 'core'): ns3::Ptr<ns3::ndn::Pit> ns3::Object::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::ndn::Pit >', 
+                   [], 
+                   is_const=True, template_parameters=['ns3::ndn::Pit'])
+    ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object.h (module 'core'): void ns3::Object::Initialize() [member function]
+    cls.add_method('Initialize', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::Object(ns3::Object const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Object const &', 'o')], 
+                        visibility='protected')
+    ## object.h (module 'core'): void ns3::Object::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectAggregateIterator_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator(ns3::Object::AggregateIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Object::AggregateIterator const &', 'arg0')])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): bool ns3::Object::AggregateIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::Object const> ns3::Object::AggregateIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::Object const >', 
+                   [])
+    return
+
+def register_Ns3ParetoVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(ns3::ParetoVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ParetoVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(double m) [constructor]
+    cls.add_constructor([param('double', 'm')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(double m, double s) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(double m, double s, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's'), param('double', 'b')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(std::pair<double,double> params) [constructor]
+    cls.add_constructor([param('std::pair< double, double >', 'params')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(std::pair<double,double> params, double b) [constructor]
+    cls.add_constructor([param('std::pair< double, double >', 'params'), param('double', 'b')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3L2Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3L2Tracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter< ns3::L2Tracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TopologyReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3TopologyReader__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter< ns3::TopologyReader > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnAppDelayTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnAppDelayTracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::AppDelayTracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnCsTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsTracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::CsTracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnData_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnData__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Data > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnExclude_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnExclude__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Exclude > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnFaceContainer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::FaceContainer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnInterest_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnInterest__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Interest > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnL3Tracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::L3Tracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnName_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnName__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Name > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnCsEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsEntry__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter< ns3::ndn::cs::Entry > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnPitEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnPitEntry__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter< ns3::ndn::pit::Entry > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit) const [member function]
+    cls.add_method('As', 
+                   'ns3::TimeWithUnit', 
+                   [param('ns3::Time::Unit const', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    return
+
+def register_Ns3TopologyReader_methods(root_module, cls):
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::TopologyReader() [constructor]
+    cls.add_constructor([])
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::AddLink(ns3::TopologyReader::Link link) [member function]
+    cls.add_method('AddLink', 
+                   'void', 
+                   [param('ns3::TopologyReader::Link', 'link')])
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::GetFileName() const [member function]
+    cls.add_method('GetFileName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::_List_const_iterator<ns3::TopologyReader::Link> ns3::TopologyReader::LinksBegin() const [member function]
+    cls.add_method('LinksBegin', 
+                   'std::_List_const_iterator< ns3::TopologyReader::Link >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): bool ns3::TopologyReader::LinksEmpty() const [member function]
+    cls.add_method('LinksEmpty', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::_List_const_iterator<ns3::TopologyReader::Link> ns3::TopologyReader::LinksEnd() const [member function]
+    cls.add_method('LinksEnd', 
+                   'std::_List_const_iterator< ns3::TopologyReader::Link >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): int ns3::TopologyReader::LinksSize() const [member function]
+    cls.add_method('LinksSize', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::NodeContainer ns3::TopologyReader::Read() [member function]
+    cls.add_method('Read', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::SetFileName(std::string const & fileName) [member function]
+    cls.add_method('SetFileName', 
+                   'void', 
+                   [param('std::string const &', 'fileName')])
+    return
+
+def register_Ns3TopologyReaderLink_methods(root_module, cls):
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link::Link(ns3::TopologyReader::Link const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TopologyReader::Link const &', 'arg0')])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link::Link() [constructor]
+    cls.add_constructor([])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link::Link(ns3::Ptr<ns3::Node> fromPtr, std::string const & fromName, ns3::Ptr<ns3::Node> toPtr, std::string const & toName) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'fromPtr'), param('std::string const &', 'fromName'), param('ns3::Ptr< ns3::Node >', 'toPtr'), param('std::string const &', 'toName')])
+    ## topology-reader.h (module 'topology-read'): std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ns3::TopologyReader::Link::AttributesBegin() [member function]
+    cls.add_method('AttributesBegin', 
+                   'std::_Rb_tree_const_iterator< std::pair< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >', 
+                   [])
+    ## topology-reader.h (module 'topology-read'): std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ns3::TopologyReader::Link::AttributesEnd() [member function]
+    cls.add_method('AttributesEnd', 
+                   'std::_Rb_tree_const_iterator< std::pair< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >', 
+                   [])
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::Link::GetAttribute(std::string const & name) const [member function]
+    cls.add_method('GetAttribute', 
+                   'std::string', 
+                   [param('std::string const &', 'name')], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): bool ns3::TopologyReader::Link::GetAttributeFailSafe(std::string const & name, std::string & value) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string const &', 'name'), param('std::string &', 'value')], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::NetDevice> ns3::TopologyReader::Link::GetFromNetDevice() const [member function]
+    cls.add_method('GetFromNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::Node> ns3::TopologyReader::Link::GetFromNode() const [member function]
+    cls.add_method('GetFromNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::Link::GetFromNodeName() const [member function]
+    cls.add_method('GetFromNodeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::NetDevice> ns3::TopologyReader::Link::GetToNetDevice() const [member function]
+    cls.add_method('GetToNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::Node> ns3::TopologyReader::Link::GetToNode() const [member function]
+    cls.add_method('GetToNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::Link::GetToNodeName() const [member function]
+    cls.add_method('GetToNodeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::Link::SetAttribute(std::string const & name, std::string const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string const &', 'name'), param('std::string const &', 'value')])
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::Link::SetNetDevices(ns3::Ptr<ns3::NetDevice> from, ns3::Ptr<ns3::NetDevice> to) [member function]
+    cls.add_method('SetNetDevices', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'from'), param('ns3::Ptr< ns3::NetDevice >', 'to')])
+    return
+
+def register_Ns3TraceSourceAccessor_methods(root_module, cls):
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor() [constructor]
+    cls.add_constructor([])
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Connect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Connect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Disconnect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Trailer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
+    cls.add_constructor([])
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'end')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AnnotatedTopologyReader_methods(root_module, cls):
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="", double scale=1.0e+0) [constructor]
+    cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::NodeContainer ns3::AnnotatedTopologyReader::Read() [member function]
+    cls.add_method('Read', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::NodeContainer ns3::AnnotatedTopologyReader::GetNodes() const [member function]
+    cls.add_method('GetNodes', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): std::list<ns3::TopologyReader::Link, std::allocator<ns3::TopologyReader::Link> > const & ns3::AnnotatedTopologyReader::GetLinks() const [member function]
+    cls.add_method('GetLinks', 
+                   'std::list< ns3::TopologyReader::Link > const &', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::AssignIpv4Addresses(ns3::Ipv4Address base) [member function]
+    cls.add_method('AssignIpv4Addresses', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'base')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SetBoundingBox(double ulx, double uly, double lrx, double lry) [member function]
+    cls.add_method('SetBoundingBox', 
+                   'void', 
+                   [param('double', 'ulx'), param('double', 'uly'), param('double', 'lrx'), param('double', 'lry')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SetMobilityModel(std::string const & model) [member function]
+    cls.add_method('SetMobilityModel', 
+                   'void', 
+                   [param('std::string const &', 'model')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::ApplyOspfMetric() [member function]
+    cls.add_method('ApplyOspfMetric', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SaveTopology(std::string const & file) [member function]
+    cls.add_method('SaveTopology', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SaveGraphviz(std::string const & file) [member function]
+    cls.add_method('SaveGraphviz', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::Ptr<ns3::Node> ns3::AnnotatedTopologyReader::CreateNode(std::string const name, uint32_t systemId) [member function]
+    cls.add_method('CreateNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('std::string const', 'name'), param('uint32_t', 'systemId')], 
+                   visibility='protected')
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::Ptr<ns3::Node> ns3::AnnotatedTopologyReader::CreateNode(std::string const name, double posX, double posY, uint32_t systemId) [member function]
+    cls.add_method('CreateNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('std::string const', 'name'), param('double', 'posX'), param('double', 'posY'), param('uint32_t', 'systemId')], 
+                   visibility='protected')
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::ApplySettings() [member function]
+    cls.add_method('ApplySettings', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    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')])
+    ## application.h (module 'network'): ns3::Application::Application() [constructor]
+    cls.add_constructor([])
+    ## application.h (module 'network'): ns3::Ptr<ns3::Node> ns3::Application::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## application.h (module 'network'): static ns3::TypeId ns3::Application::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## application.h (module 'network'): void ns3::Application::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## application.h (module 'network'): void ns3::Application::SetStartTime(ns3::Time start) [member function]
+    cls.add_method('SetStartTime', 
+                   'void', 
+                   [param('ns3::Time', 'start')])
+    ## application.h (module 'network'): void ns3::Application::SetStopTime(ns3::Time stop) [member function]
+    cls.add_method('SetStopTime', 
+                   'void', 
+                   [param('ns3::Time', 'stop')])
+    ## application.h (module 'network'): void ns3::Application::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## application.h (module 'network'): void ns3::Application::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## application.h (module 'network'): void ns3::Application::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## application.h (module 'network'): void ns3::Application::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=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')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
+def register_Ns3CallbackBasedApp_methods(root_module, cls):
+    ## callback-based-app.h (module 'ndnSIM'): ns3::CallbackBasedApp::CallbackBasedApp(ns3::CallbackBasedApp const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBasedApp const &', 'arg0')])
+    ## callback-based-app.h (module 'ndnSIM'): ns3::CallbackBasedApp::CallbackBasedApp() [constructor]
+    cls.add_constructor([])
+    ## callback-based-app.h (module 'ndnSIM'): static ns3::TypeId ns3::CallbackBasedApp::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::SetOnStartCallback(ns3::Callback<void, ns3::Ptr<ns3::Application>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onStart) [member function]
+    cls.add_method('SetOnStartCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Application >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onStart')])
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::SetOnStopCallback(ns3::Callback<void, ns3::Ptr<ns3::Application>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onStart) [member function]
+    cls.add_method('SetOnStopCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Application >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onStart')])
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3DoubleValue_methods(root_module, cls):
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
+    cls.add_constructor([])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
+    cls.add_constructor([param('double const &', 'value')])
+    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('double const &', 'value')])
+    return
+
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int v, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'v'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int v, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'v'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int', 'v')])
+    return
+
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+    cls.add_constructor([])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
+    return
+
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3L2Tracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## l2-tracer.h (module 'ndnSIM'): ns3::L2Tracer::L2Tracer(ns3::L2Tracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::L2Tracer const &', 'arg0')])
+    ## l2-tracer.h (module 'ndnSIM'): ns3::L2Tracer::L2Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::Drop(ns3::Ptr<ns3::Packet const> arg0) [member function]
+    cls.add_method('Drop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
+    cls.add_constructor([])
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,const ns3::Address&,ns3::NetDevice::PacketType,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3Node_methods(root_module, cls):
+    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Node const &', 'arg0')])
+    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+    cls.add_constructor([])
+    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
+    cls.add_constructor([param('uint32_t', 'systemId')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('AddApplication', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddDevice', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
+    cls.add_method('ChecksumEnabled', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
+    cls.add_method('GetApplication', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
+    cls.add_method('GetNApplications', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('RegisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
+    cls.add_method('RegisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('UnregisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler) [member function]
+    cls.add_method('UnregisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(std::string const & buffer) [constructor]
+    cls.add_constructor([param('std::string const &', 'buffer')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   deprecated=True, is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
+                   is_const=True)
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    return
+
+def register_Ns3RandomVariableChecker_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::RandomVariableChecker::RandomVariableChecker() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::RandomVariableChecker::RandomVariableChecker(ns3::RandomVariableChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::RandomVariableChecker const &', 'arg0')])
+    return
+
+def register_Ns3RandomVariableValue_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue::RandomVariableValue() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue::RandomVariableValue(ns3::RandomVariableValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::RandomVariableValue const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue::RandomVariableValue(ns3::RandomVariable const & value) [constructor]
+    cls.add_constructor([param('ns3::RandomVariable const &', 'value')])
+    ## random-variable.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::RandomVariableValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## random-variable.h (module 'core'): bool ns3::RandomVariableValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## random-variable.h (module 'core'): ns3::RandomVariable ns3::RandomVariableValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::RandomVariable', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): std::string ns3::RandomVariableValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## random-variable.h (module 'core'): void ns3::RandomVariableValue::Set(ns3::RandomVariable const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::RandomVariable const &', 'value')])
+    return
+
+def register_Ns3RocketfuelWeightsReader_methods(root_module, cls):
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::RocketfuelWeightsReader::RocketfuelWeightsReader(std::string const & path="", double scale=1.0e+0) [constructor]
+    cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::SetFileType(uint8_t inputType) [member function]
+    cls.add_method('SetFileType', 
+                   'void', 
+                   [param('uint8_t', 'inputType')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::NodeContainer ns3::RocketfuelWeightsReader::Read() [member function]
+    cls.add_method('Read', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_virtual=True)
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::Commit() [member function]
+    cls.add_method('Commit', 
+                   'void', 
+                   [])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::SetDefaultBandwidth(std::string const & bw) [member function]
+    cls.add_method('SetDefaultBandwidth', 
+                   'void', 
+                   [param('std::string const &', 'bw')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): std::string ns3::RocketfuelWeightsReader::GetDefaultBandwidth() const [member function]
+    cls.add_method('GetDefaultBandwidth', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::SetDefaultQueue(std::string const & queue) [member function]
+    cls.add_method('SetDefaultQueue', 
+                   'void', 
+                   [param('std::string const &', 'queue')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): std::string ns3::RocketfuelWeightsReader::GetDefaultQueue() const [member function]
+    cls.add_method('GetDefaultQueue', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
+    return
+
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint64_t const &', 'value')])
+    return
+
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3L2RateTracer_methods(root_module, cls):
+    ## l2-rate-tracer.h (module 'ndnSIM'): ns3::L2RateTracer::L2RateTracer(ns3::L2RateTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::L2RateTracer const &', 'arg0')])
+    ## l2-rate-tracer.h (module 'ndnSIM'): ns3::L2RateTracer::L2RateTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## l2-rate-tracer.h (module 'ndnSIM'): static void ns3::L2RateTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::Drop(ns3::Ptr<ns3::Packet const> arg0) [member function]
+    cls.add_method('Drop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
+                   is_virtual=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): static void ns3::L2RateTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::SetAveragingPeriod(ns3::Time const & period) [member function]
+    cls.add_method('SetAveragingPeriod', 
+                   'void', 
+                   [param('ns3::Time const &', 'period')])
+    return
+
+def register_Ns3HashImplementation_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation() [constructor]
+    cls.add_constructor([])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Implementation::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Implementation::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a(ns3::Hash::Function::Fnv1a const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Fnv1a const &', 'arg0')])
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a() [constructor]
+    cls.add_constructor([])
+    ## hash-fnv.h (module 'core'): uint32_t ns3::Hash::Function::Fnv1a::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): uint64_t ns3::Hash::Function::Fnv1a::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): void ns3::Hash::Function::Fnv1a::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash32_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Function::Hash32 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash32 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Hash32Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash32Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash32::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash32::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash64_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Function::Hash64 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash64 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Hash64Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash64Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash64::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Function::Hash64::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash64::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionMurmur3_methods(root_module, cls):
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3(ns3::Hash::Function::Murmur3 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Murmur3 const &', 'arg0')])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3() [constructor]
+    cls.add_constructor([])
+    ## hash-murmur3.h (module 'core'): uint32_t ns3::Hash::Function::Murmur3::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): uint64_t ns3::Hash::Function::Murmur3::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): void ns3::Hash::Function::Murmur3::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NdnApp_methods(root_module, cls):
+    ## ndn-app.h (module 'ndnSIM'): ns3::ndn::App::App(ns3::ndn::App const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::App const &', 'arg0')])
+    ## ndn-app.h (module 'ndnSIM'): ns3::ndn::App::App() [constructor]
+    cls.add_constructor([])
+    ## ndn-app.h (module 'ndnSIM'): uint32_t ns3::ndn::App::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-app.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::App::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::OnData(ns3::Ptr<ns3::ndn::Data const> contentObject) [member function]
+    cls.add_method('OnData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'contentObject')], 
+                   is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::OnInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('OnInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::OnNack(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('OnNack', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnAppDelayTracer_methods(root_module, cls):
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer::AppDelayTracer(ns3::ndn::AppDelayTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::AppDelayTracer const &', 'arg0')])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer::AppDelayTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer::AppDelayTracer(boost::shared_ptr<std::ostream> os, std::string const & node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'node')])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::Install(ns3::NodeContainer const & nodes, std::string const & file) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::AppDelayTracer> ns3::ndn::AppDelayTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::AppDelayTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::InstallAll(std::string const & file) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): void ns3::ndn::AppDelayTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnAppHelper_methods(root_module, cls):
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ndn::AppHelper::AppHelper(ns3::ndn::AppHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::AppHelper const &', 'arg0')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ndn::AppHelper::AppHelper(std::string const & prefix) [constructor]
+    cls.add_constructor([param('std::string const &', 'prefix')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ApplicationContainer ns3::ndn::AppHelper::Install(ns3::NodeContainer c) [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('ns3::NodeContainer', 'c')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ApplicationContainer ns3::ndn::AppHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ApplicationContainer ns3::ndn::AppHelper::Install(std::string nodeName) [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('std::string', 'nodeName')])
+    ## ndn-app-helper.h (module 'ndnSIM'): void ns3::ndn::AppHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## ndn-app-helper.h (module 'ndnSIM'): void ns3::ndn::AppHelper::SetPrefix(std::string const & prefix) [member function]
+    cls.add_method('SetPrefix', 
+                   'void', 
+                   [param('std::string const &', 'prefix')])
+    return
+
+def register_Ns3NdnBlob_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob(ns3::ndn::Blob const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Blob const &', 'arg0')])
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob() [constructor]
+    cls.add_constructor([])
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob(std::string const & data) [constructor]
+    cls.add_constructor([param('std::string const &', 'data')])
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob(void const * buf, size_t length) [constructor]
+    cls.add_constructor([param('void const *', 'buf'), param('size_t', 'length')])
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::begin() [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< char *, std::vector< char > >', 
+                   [])
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char const*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::begin() const [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< char const *, std::vector< char > >', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): char * ns3::ndn::Blob::buf() [member function]
+    cls.add_method('buf', 
+                   'char *', 
+                   [])
+    ## blob.h (module 'ndnSIM'): char const * ns3::ndn::Blob::buf() const [member function]
+    cls.add_method('buf', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): void ns3::ndn::Blob::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [])
+    ## blob.h (module 'ndnSIM'): bool ns3::ndn::Blob::empty() const [member function]
+    cls.add_method('empty', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::end() [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< char *, std::vector< char > >', 
+                   [])
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char const*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::end() const [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< char const *, std::vector< char > >', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): char ns3::ndn::Blob::getItem(size_t pos) const [member function]
+    cls.add_method('getItem', 
+                   'char', 
+                   [param('size_t', 'pos')], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): void ns3::ndn::Blob::push_back(char val) [member function]
+    cls.add_method('push_back', 
+                   'void', 
+                   [param('char', 'val')])
+    ## blob.h (module 'ndnSIM'): size_t ns3::ndn::Blob::size() const [member function]
+    cls.add_method('size', 
+                   'size_t', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): void ns3::ndn::Blob::swap(ns3::ndn::Blob & x) [member function]
+    cls.add_method('swap', 
+                   'void', 
+                   [param('ns3::ndn::Blob &', 'x')])
+    return
+
+def register_Ns3NdnContentStore_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::ContentStore::ContentStore() [constructor]
+    cls.add_constructor([])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::ContentStore::ContentStore(ns3::ndn::ContentStore const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::ContentStore const &', 'arg0')])
+    ## ndn-content-store.h (module 'ndnSIM'): bool ns3::ndn::ContentStore::Add(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('Add', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::cs::Entry> ns3::ndn::ContentStore::Begin() [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::cs::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::cs::Entry> ns3::ndn::ContentStore::End() [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::cs::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::ContentStore> ns3::ndn::ContentStore::GetContentStore(ns3::Ptr<ns3::Object> node) [member function]
+    cls.add_method('GetContentStore', 
+                   'ns3::Ptr< ns3::ndn::ContentStore >', 
+                   [param('ns3::Ptr< ns3::Object >', 'node')], 
+                   is_static=True)
+    ## ndn-content-store.h (module 'ndnSIM'): uint32_t ns3::ndn::ContentStore::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::ContentStore::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Data> ns3::ndn::ContentStore::Lookup(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('Lookup', 
+                   'ns3::Ptr< ns3::ndn::Data >', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::cs::Entry> ns3::ndn::ContentStore::Next(ns3::Ptr<ns3::ndn::cs::Entry> arg0) [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::cs::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::cs::Entry >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): void ns3::ndn::ContentStore::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NdnCsTracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer::CsTracer(ns3::ndn::CsTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::CsTracer const &', 'arg0')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer::CsTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer::CsTracer(boost::shared_ptr<std::ostream> os, std::string const & node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'node')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::Install(ns3::NodeContainer const & nodes, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::CsTracer> ns3::ndn::CsTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::CsTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): void ns3::ndn::CsTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): void ns3::ndn::CsTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnData_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Data::Data(ns3::Ptr<ns3::Packet> payload=ns3::Create( )) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'payload', default_value='ns3::Create( )')])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Data::Data(ns3::ndn::Data const & other) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Data const &', 'other')])
+    ## ndn-data.h (module 'ndnSIM'): ns3::Time ns3::ndn::Data::GetFreshness() const [member function]
+    cls.add_method('GetFreshness', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Name const> ns3::ndn::Data::GetKeyLocator() const [member function]
+    cls.add_method('GetKeyLocator', 
+                   'ns3::Ptr< ns3::ndn::Name const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::Data::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Name const> ns3::ndn::Data::GetNamePtr() const [member function]
+    cls.add_method('GetNamePtr', 
+                   'ns3::Ptr< ns3::ndn::Name const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Data::GetPayload() const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): uint32_t ns3::ndn::Data::GetSignature() const [member function]
+    cls.add_method('GetSignature', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Time ns3::ndn::Data::GetTimestamp() const [member function]
+    cls.add_method('GetTimestamp', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Data::GetWire() const [member function]
+    cls.add_method('GetWire', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetFreshness(ns3::Time const & freshness) [member function]
+    cls.add_method('SetFreshness', 
+                   'void', 
+                   [param('ns3::Time const &', 'freshness')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetKeyLocator(ns3::Ptr<ns3::ndn::Name> keyLocator) [member function]
+    cls.add_method('SetKeyLocator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name >', 'keyLocator')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetName(ns3::Ptr<ns3::ndn::Name> name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name >', 'name')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetName(ns3::ndn::Name const & name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::ndn::Name const &', 'name')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetPayload(ns3::Ptr<ns3::Packet> payload) [member function]
+    cls.add_method('SetPayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'payload')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetSignature(uint32_t signature) [member function]
+    cls.add_method('SetSignature', 
+                   'void', 
+                   [param('uint32_t', 'signature')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetTimestamp(ns3::Time const & timestamp) [member function]
+    cls.add_method('SetTimestamp', 
+                   'void', 
+                   [param('ns3::Time const &', 'timestamp')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetWire(ns3::Ptr<ns3::Packet const> packet) const [member function]
+    cls.add_method('SetWire', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnDataException_methods(root_module, cls):
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::DataException::DataException() [constructor]
+    cls.add_constructor([])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::DataException::DataException(ns3::ndn::DataException const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::DataException const &', 'arg0')])
+    return
+
+def register_Ns3NdnExclude_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude::Exclude(ns3::ndn::Exclude const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Exclude const &', 'arg0')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude::Exclude() [constructor]
+    cls.add_constructor([])
+    ## exclude.h (module 'ndnSIM'): void ns3::ndn::Exclude::appendExclude(ns3::ndn::name::Component const & name, bool any) [member function]
+    cls.add_method('appendExclude', 
+                   'void', 
+                   [param('ns3::ndn::name::Component const &', 'name'), param('bool', 'any')])
+    ## exclude.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > ns3::ndn::Exclude::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > ns3::ndn::Exclude::end() const [member function]
+    cls.add_method('end', 
+                   'std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeAfter(ns3::ndn::name::Component const & from) [member function]
+    cls.add_method('excludeAfter', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'from')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeBefore(ns3::ndn::name::Component const & to) [member function]
+    cls.add_method('excludeBefore', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'to')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeOne(ns3::ndn::name::Component const & comp) [member function]
+    cls.add_method('excludeOne', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'comp')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeRange(ns3::ndn::name::Component const & from, ns3::ndn::name::Component const & to) [member function]
+    cls.add_method('excludeRange', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'from'), param('ns3::ndn::name::Component const &', 'to')])
+    ## exclude.h (module 'ndnSIM'): bool ns3::ndn::Exclude::isExcluded(ns3::ndn::name::Component const & comp) const [member function]
+    cls.add_method('isExcluded', 
+                   'bool', 
+                   [param('ns3::ndn::name::Component const &', 'comp')], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): std::reverse_iterator<std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > > ns3::ndn::Exclude::rbegin() const [member function]
+    cls.add_method('rbegin', 
+                   'std::reverse_iterator< std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): std::reverse_iterator<std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > > ns3::ndn::Exclude::rend() const [member function]
+    cls.add_method('rend', 
+                   'std::reverse_iterator< std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): size_t ns3::ndn::Exclude::size() const [member function]
+    cls.add_method('size', 
+                   'size_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnFace_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
+    ## ndn-face.h (module 'ndnSIM'): ns3::ndn::Face::Face(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-face.h (module 'ndnSIM'): uint32_t ns3::ndn::Face::GetFlags() const [member function]
+    cls.add_method('GetFlags', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): uint32_t ns3::ndn::Face::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): uint16_t ns3::ndn::Face::GetMetric() const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): ns3::Ptr<ns3::Node> ns3::ndn::Face::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Face::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::IsUp() const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::Face::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::ReceiveData(ns3::Ptr<ns3::ndn::Data> data) [member function]
+    cls.add_method('ReceiveData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data >', 'data')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::ReceiveInterest(ns3::Ptr<ns3::ndn::Interest> interest) [member function]
+    cls.add_method('ReceiveInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::RegisterProtocolHandlers(ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Interest>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & interestHandler, ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Data>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & dataHandler) [member function]
+    cls.add_method('RegisterProtocolHandlers', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Interest >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'interestHandler'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Data >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'dataHandler')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::SendData(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('SendData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::SendInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('SendInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetId(uint32_t id) [member function]
+    cls.add_method('SetId', 
+                   'void', 
+                   [param('uint32_t', 'id')])
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetMetric(uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint16_t', 'metric')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetUp(bool up=true) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('bool', 'up', default_value='true')])
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::UnRegisterProtocolHandlers() [member function]
+    cls.add_method('UnRegisterProtocolHandlers', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::Receive(ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Receive', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::Send(ns3::Ptr<ns3::Packet> packet) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetFlags(uint32_t flags) [member function]
+    cls.add_method('SetFlags', 
+                   'void', 
+                   [param('uint32_t', 'flags')], 
+                   visibility='protected')
+    return
+
+def register_Ns3NdnFaceContainer_methods(root_module, cls):
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::ndn::FaceContainer::FaceContainer() [constructor]
+    cls.add_constructor([])
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::ndn::FaceContainer::FaceContainer(ns3::ndn::FaceContainer const & other) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::FaceContainer const &', 'other')])
+    ## ndn-face-container.h (module 'ndnSIM'): void ns3::ndn::FaceContainer::Add(ns3::Ptr<ns3::ndn::Face> const & face) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face > const &', 'face')])
+    ## ndn-face-container.h (module 'ndnSIM'): void ns3::ndn::FaceContainer::AddAll(ns3::Ptr<ns3::ndn::FaceContainer> other) [member function]
+    cls.add_method('AddAll', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::FaceContainer >', 'other')])
+    ## ndn-face-container.h (module 'ndnSIM'): void ns3::ndn::FaceContainer::AddAll(ns3::ndn::FaceContainer const & other) [member function]
+    cls.add_method('AddAll', 
+                   'void', 
+                   [param('ns3::ndn::FaceContainer const &', 'other')])
+    ## ndn-face-container.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::ndn::Face>*,std::vector<ns3::Ptr<ns3::ndn::Face>, std::allocator<ns3::Ptr<ns3::ndn::Face> > > > ns3::ndn::FaceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::ndn::Face > const, std::vector< ns3::Ptr< ns3::ndn::Face > > >', 
+                   [], 
+                   is_const=True)
+    ## ndn-face-container.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::ndn::Face>*,std::vector<ns3::Ptr<ns3::ndn::Face>, std::allocator<ns3::Ptr<ns3::ndn::Face> > > > ns3::ndn::FaceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::ndn::Face > const, std::vector< ns3::Ptr< ns3::ndn::Face > > >', 
+                   [], 
+                   is_const=True)
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::FaceContainer::Get(__gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::ndn::Face>*,std::vector<ns3::Ptr<ns3::ndn::Face>, std::allocator<ns3::Ptr<ns3::ndn::Face> > > > i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::ndn::Face > const, std::vector< ns3::Ptr< ns3::ndn::Face > > >', 'i')], 
+                   is_const=True)
+    ## ndn-face-container.h (module 'ndnSIM'): uint32_t ns3::ndn::FaceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnFib_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-fib.h (module 'ndnSIM'): ns3::ndn::Fib::Fib() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Add(ns3::ndn::Name const & prefix, ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('Add', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::ndn::Name const &', 'prefix'), param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Add(ns3::Ptr<ns3::ndn::Name const> const & prefix, ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('Add', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::Name const > const &', 'prefix'), param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::fib::Entry> ns3::ndn::Fib::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry const >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Begin() [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::fib::Entry> ns3::ndn::Fib::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry const >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::End() [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Find(ns3::ndn::Name const & prefix) [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::ndn::Name const &', 'prefix')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Fib> ns3::ndn::Fib::GetFib(ns3::Ptr<ns3::Object> node) [member function]
+    cls.add_method('GetFib', 
+                   'ns3::Ptr< ns3::ndn::Fib >', 
+                   [param('ns3::Ptr< ns3::Object >', 'node')], 
+                   is_static=True)
+    ## ndn-fib.h (module 'ndnSIM'): uint32_t ns3::ndn::Fib::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Fib::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::InvalidateAll() [member function]
+    cls.add_method('InvalidateAll', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::LongestPrefixMatch(ns3::ndn::Interest const & interest) [member function]
+    cls.add_method('LongestPrefixMatch', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::ndn::Interest const &', 'interest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::fib::Entry> ns3::ndn::Fib::Next(ns3::Ptr<const ns3::ndn::fib::Entry> arg0) const [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry const >', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry const >', 'arg0')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Next(ns3::Ptr<ns3::ndn::fib::Entry> arg0) [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::Remove(ns3::Ptr<ns3::ndn::Name const> const & prefix) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name const > const &', 'prefix')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::RemoveFromAll(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveFromAll', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3NdnForwardingStrategy_methods(root_module, cls):
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): ns3::ndn::ForwardingStrategy::ForwardingStrategy(ns3::ndn::ForwardingStrategy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::ForwardingStrategy const &', 'arg0')])
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): ns3::ndn::ForwardingStrategy::ForwardingStrategy() [constructor]
+    cls.add_constructor([])
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::AddFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('AddFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidAddFibEntry(ns3::Ptr<ns3::ndn::fib::Entry> fibEntry) [member function]
+    cls.add_method('DidAddFibEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry >', 'fibEntry')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): static std::string ns3::ndn::ForwardingStrategy::GetLogName() [member function]
+    cls.add_method('GetLogName', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::ForwardingStrategy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::OnData(ns3::Ptr<ns3::ndn::Face> face, ns3::Ptr<ns3::ndn::Data> data) [member function]
+    cls.add_method('OnData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Ptr< ns3::ndn::Data >', 'data')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::OnInterest(ns3::Ptr<ns3::ndn::Face> face, ns3::Ptr<ns3::ndn::Interest> interest) [member function]
+    cls.add_method('OnInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Ptr< ns3::ndn::Interest >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::RemoveFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::WillEraseTimedOutPendingInterest(ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('WillEraseTimedOutPendingInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::WillRemoveFibEntry(ns3::Ptr<ns3::ndn::fib::Entry> fibEntry) [member function]
+    cls.add_method('WillRemoveFibEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry >', 'fibEntry')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::CanSendOutInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('CanSendOutInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::DetectRetransmittedInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DetectRetransmittedInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidCreatePitEntry(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidCreatePitEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidExhaustForwardingOptions(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidExhaustForwardingOptions', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidForwardSimilarInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidForwardSimilarInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveDuplicateInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidReceiveDuplicateInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveSolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Data const> data, bool didCreateCacheEntry) [member function]
+    cls.add_method('DidReceiveSolicitedData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('bool', 'didCreateCacheEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveUnsolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Data const> data, bool didCreateCacheEntry) [member function]
+    cls.add_method('DidReceiveUnsolicitedData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('bool', 'didCreateCacheEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSendOutData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Data const> data, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidSendOutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSendOutInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidSendOutInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSuppressSimilarInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidSuppressSimilarInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::DoPropagateInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DoPropagateInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::FailedToCreatePitEntry(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('FailedToCreatePitEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::PropagateInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('PropagateInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::SatisfyPendingInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Data const> data, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('SatisfyPendingInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::ShouldSuppressIncomingInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('ShouldSuppressIncomingInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::TrySendOutInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('TrySendOutInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::WillSatisfyPendingInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('WillSatisfyPendingInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnGlobalRoutingHelper_methods(root_module, cls):
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): ns3::ndn::GlobalRoutingHelper::GlobalRoutingHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): ns3::ndn::GlobalRoutingHelper::GlobalRoutingHelper(ns3::ndn::GlobalRoutingHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::GlobalRoutingHelper const &', 'arg0')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOrigin(std::string const & prefix, ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOrigin(std::string const & prefix, std::string const & nodeName) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('std::string const &', 'nodeName')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOrigins(std::string const & prefix, ns3::NodeContainer const & nodes) [member function]
+    cls.add_method('AddOrigins', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('ns3::NodeContainer const &', 'nodes')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOriginsForAll() [member function]
+    cls.add_method('AddOriginsForAll', 
+                   'void', 
+                   [])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): static void ns3::ndn::GlobalRoutingHelper::CalculateAllPossibleRoutes(bool invalidatedRoutes=true) [member function]
+    cls.add_method('CalculateAllPossibleRoutes', 
+                   'void', 
+                   [param('bool', 'invalidatedRoutes', default_value='true')], 
+                   is_static=True)
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): static void ns3::ndn::GlobalRoutingHelper::CalculateRoutes(bool invalidatedRoutes=true) [member function]
+    cls.add_method('CalculateRoutes', 
+                   'void', 
+                   [param('bool', 'invalidatedRoutes', default_value='true')], 
+                   is_static=True)
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::Install(ns3::NodeContainer const & nodes) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::InstallAll() [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3NdnHeaderHelper_methods(root_module, cls):
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::HeaderHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::HeaderHelper(ns3::ndn::HeaderHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::HeaderHelper const &', 'arg0')])
+    ## ndn-header-helper.h (module 'ndnSIM'): static ns3::ndn::HeaderHelper::Type ns3::ndn::HeaderHelper::GetNdnHeaderType(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('GetNdnHeaderType', 
+                   'ns3::ndn::HeaderHelper::Type', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnInterest_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest::Interest(ns3::Ptr<ns3::Packet> payload=ns3::Create( )) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'payload', default_value='ns3::Create( )')])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest::Interest(ns3::ndn::Interest const & interest) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Interest const &', 'interest')])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::Exclude> ns3::ndn::Interest::GetExclude() const [member function]
+    cls.add_method('GetExclude', 
+                   'ns3::Ptr< ns3::ndn::Exclude const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Time ns3::ndn::Interest::GetInterestLifetime() const [member function]
+    cls.add_method('GetInterestLifetime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): uint8_t ns3::ndn::Interest::GetNack() const [member function]
+    cls.add_method('GetNack', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::Interest::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Name const> ns3::ndn::Interest::GetNamePtr() const [member function]
+    cls.add_method('GetNamePtr', 
+                   'ns3::Ptr< ns3::ndn::Name const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): uint32_t ns3::ndn::Interest::GetNonce() const [member function]
+    cls.add_method('GetNonce', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Interest::GetPayload() const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): int8_t ns3::ndn::Interest::GetScope() const [member function]
+    cls.add_method('GetScope', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Interest::GetWire() const [member function]
+    cls.add_method('GetWire', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetExclude(ns3::Ptr<ns3::ndn::Exclude> exclude) [member function]
+    cls.add_method('SetExclude', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Exclude >', 'exclude')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetInterestLifetime(ns3::Time time) [member function]
+    cls.add_method('SetInterestLifetime', 
+                   'void', 
+                   [param('ns3::Time', 'time')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetNack(uint8_t nackType) [member function]
+    cls.add_method('SetNack', 
+                   'void', 
+                   [param('uint8_t', 'nackType')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetName(ns3::Ptr<ns3::ndn::Name> name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name >', 'name')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetName(ns3::ndn::Name const & name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::ndn::Name const &', 'name')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetNonce(uint32_t nonce) [member function]
+    cls.add_method('SetNonce', 
+                   'void', 
+                   [param('uint32_t', 'nonce')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetPayload(ns3::Ptr<ns3::Packet> payload) [member function]
+    cls.add_method('SetPayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'payload')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetScope(int8_t scope) [member function]
+    cls.add_method('SetScope', 
+                   'void', 
+                   [param('int8_t', 'scope')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetWire(ns3::Ptr<ns3::Packet const> packet) const [member function]
+    cls.add_method('SetWire', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnInterestException_methods(root_module, cls):
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::InterestException::InterestException() [constructor]
+    cls.add_constructor([])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::InterestException::InterestException(ns3::ndn::InterestException const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::InterestException const &', 'arg0')])
+    return
+
+def register_Ns3NdnIpFacesHelper_methods(root_module, cls):
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): ns3::ndn::IpFacesHelper::IpFacesHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): ns3::ndn::IpFacesHelper::IpFacesHelper(ns3::ndn::IpFacesHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::IpFacesHelper const &', 'arg0')])
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::CreateTcpFace(ns3::Time const & when, ns3::Ptr<ns3::Node> node, ns3::Ipv4Address address, std::string const & prefix, int16_t metric=1) [member function]
+    cls.add_method('CreateTcpFace', 
+                   'void', 
+                   [param('ns3::Time const &', 'when'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ipv4Address', 'address'), param('std::string const &', 'prefix'), param('int16_t', 'metric', default_value='1')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::CreateUdpFace(ns3::Time const & when, ns3::Ptr<ns3::Node> node, ns3::Ipv4Address address, std::string const & prefix, int16_t metric=1) [member function]
+    cls.add_method('CreateUdpFace', 
+                   'void', 
+                   [param('ns3::Time const &', 'when'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ipv4Address', 'address'), param('std::string const &', 'prefix'), param('int16_t', 'metric', default_value='1')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::Install(ns3::NodeContainer const & nodes) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::InstallAll() [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnL3Protocol_methods(root_module, cls):
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol::ETHERNET_FRAME_TYPE [variable]
+    cls.add_static_attribute('ETHERNET_FRAME_TYPE', 'uint16_t const', is_const=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol::IP_STACK_PORT [variable]
+    cls.add_static_attribute('IP_STACK_PORT', 'uint16_t const', is_const=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::L3Protocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol::L3Protocol() [constructor]
+    cls.add_constructor([])
+    ## ndn-l3-protocol.h (module 'ndnSIM'): uint32_t ns3::ndn::L3Protocol::AddFace(ns3::Ptr<ns3::ndn::Face> const & face) [member function]
+    cls.add_method('AddFace', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::ndn::Face > const &', 'face')], 
+                   is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): uint32_t ns3::ndn::L3Protocol::GetNFaces() const [member function]
+    cls.add_method('GetNFaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::L3Protocol::GetFace(uint32_t face) const [member function]
+    cls.add_method('GetFace', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('uint32_t', 'face')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::L3Protocol::GetFaceById(uint32_t face) const [member function]
+    cls.add_method('GetFaceById', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('uint32_t', 'face')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): void ns3::ndn::L3Protocol::RemoveFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::L3Protocol::GetFaceByNetDevice(ns3::Ptr<ns3::NetDevice> netDevice) const [member function]
+    cls.add_method('GetFaceByNetDevice', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'netDevice')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): void ns3::ndn::L3Protocol::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): void ns3::ndn::L3Protocol::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnL3Tracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer::L3Tracer(ns3::ndn::L3Tracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::L3Tracer const &', 'arg0')])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer::L3Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer::L3Tracer(std::string const & node) [constructor]
+    cls.add_constructor([param('std::string const &', 'node')])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::DropData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::DropInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::DropNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::InData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::InInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::InNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::OutData(ns3::Ptr<ns3::ndn::Data const> arg0, bool fromCache, ns3::Ptr<const ns3::ndn::Face> arg2) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg2')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::OutInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::OutNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::SatisfiedInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('SatisfiedInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::TimedOutInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('TimedOutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnLimits_methods(root_module, cls):
+    ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits::Limits(ns3::ndn::Limits const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Limits const &', 'arg0')])
+    ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits::Limits() [constructor]
+    cls.add_constructor([])
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::BorrowLimit() [member function]
+    cls.add_method('BorrowLimit', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetCurrentLimit() const [member function]
+    cls.add_method('GetCurrentLimit', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetCurrentLimitRate() const [member function]
+    cls.add_method('GetCurrentLimitRate', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetLinkDelay() const [member function]
+    cls.add_method('GetLinkDelay', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetMaxDelay() const [member function]
+    cls.add_method('GetMaxDelay', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetMaxLimit() const [member function]
+    cls.add_method('GetMaxLimit', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetMaxRate() const [member function]
+    cls.add_method('GetMaxRate', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Limits::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-limits.h (module 'ndnSIM'): bool ns3::ndn::Limits::IsBelowLimit() [member function]
+    cls.add_method('IsBelowLimit', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): bool ns3::ndn::Limits::IsEnabled() const [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::RegisterAvailableSlotCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> handler) [member function]
+    cls.add_method('RegisterAvailableSlotCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::ReturnLimit() [member function]
+    cls.add_method('ReturnLimit', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::SetLimits(double rate, double delay) [member function]
+    cls.add_method('SetLimits', 
+                   'void', 
+                   [param('double', 'rate'), param('double', 'delay')], 
+                   is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::SetLinkDelay(double delay) [member function]
+    cls.add_method('SetLinkDelay', 
+                   'void', 
+                   [param('double', 'delay')], 
+                   is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::UpdateCurrentLimit(double limit) [member function]
+    cls.add_method('UpdateCurrentLimit', 
+                   'void', 
+                   [param('double', 'limit')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::FireAvailableSlotCallback() [member function]
+    cls.add_method('FireAvailableSlotCallback', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    return
+
+def register_Ns3NdnLinkControlHelper_methods(root_module, cls):
+    ## ndn-link-control-helper.h (module 'ndnSIM'): ns3::ndn::LinkControlHelper::LinkControlHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-link-control-helper.h (module 'ndnSIM'): ns3::ndn::LinkControlHelper::LinkControlHelper(ns3::ndn::LinkControlHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::LinkControlHelper const &', 'arg0')])
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::FailLink(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+    cls.add_method('FailLink', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')], 
+                   is_static=True)
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::FailLinkByName(std::string const & node1, std::string const & node2) [member function]
+    cls.add_method('FailLinkByName', 
+                   'void', 
+                   [param('std::string const &', 'node1'), param('std::string const &', 'node2')], 
+                   is_static=True)
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::UpLink(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+    cls.add_method('UpLink', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')], 
+                   is_static=True)
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::UpLinkByName(std::string const & node1, std::string const & node2) [member function]
+    cls.add_method('UpLinkByName', 
+                   'void', 
+                   [param('std::string const &', 'node1'), param('std::string const &', 'node2')], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnName_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('+', root_module['ns3::ndn::Name'], root_module['ns3::ndn::Name'], param('ns3::ndn::Name const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('>=')
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name() [constructor]
+    cls.add_constructor([])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name(ns3::ndn::Name const & other) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Name const &', 'other')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::string const & url) [constructor]
+    cls.add_constructor([param('std::string const &', 'url')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name(__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > begin, __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > end) [constructor]
+    cls.add_constructor([param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'begin'), param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'end')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(ns3::ndn::name::Component const & comp) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('ns3::ndn::name::Component const &', 'comp')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > begin, __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > end) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'begin'), param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'end')], 
+                   template_parameters=['__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > >'])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(ns3::ndn::Name const & comp) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('ns3::ndn::Name const &', 'comp')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(std::string const & compStr) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('std::string const &', 'compStr')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(void const * buf, size_t size) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('void const *', 'buf'), param('size_t', 'size')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendBlkId(uint64_t blkid) [member function]
+    cls.add_method('appendBlkId', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'blkid')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendBySwap(ns3::ndn::name::Component & comp) [member function]
+    cls.add_method('appendBySwap', 
+                   'ns3::ndn::Name &', 
+                   [param('ns3::ndn::name::Component &', 'comp')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendControlNum(uint64_t control) [member function]
+    cls.add_method('appendControlNum', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'control')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendNumber(uint64_t number) [member function]
+    cls.add_method('appendNumber', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'number')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendNumberWithMarker(uint64_t number, unsigned char marker) [member function]
+    cls.add_method('appendNumberWithMarker', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'number'), param('unsigned char', 'marker')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendSeqNum(uint64_t seqno) [member function]
+    cls.add_method('appendSeqNum', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'seqno')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendVersion(uint64_t version=ns3::ndn::Name::nversion) [member function]
+    cls.add_method('appendVersion', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'version', default_value='ns3::ndn::Name::nversion')])
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::begin() const [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::begin() [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): int ns3::ndn::Name::compare(ns3::ndn::Name const & name) const [member function]
+    cls.add_method('compare', 
+                   'int', 
+                   [param('ns3::ndn::Name const &', 'name')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::end() const [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::end() [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): ns3::ndn::name::Component const & ns3::ndn::Name::get(int index) const [member function]
+    cls.add_method('get', 
+                   'ns3::ndn::name::Component const &', 
+                   [param('int', 'index')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::Name::get(int index) [member function]
+    cls.add_method('get', 
+                   'ns3::ndn::name::Component &', 
+                   [param('int', 'index')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::getPostfix(size_t len, size_t skip=0) const [member function]
+    cls.add_method('getPostfix', 
+                   'ns3::ndn::Name', 
+                   [param('size_t', 'len'), param('size_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::getPrefix(size_t len, size_t skip=0) const [member function]
+    cls.add_method('getPrefix', 
+                   'ns3::ndn::Name', 
+                   [param('size_t', 'len'), param('size_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::getSubName(size_t pos=0, size_t len=ns3::ndn::Name::npos) const [member function]
+    cls.add_method('getSubName', 
+                   'ns3::ndn::Name', 
+                   [param('size_t', 'pos', default_value='0'), param('size_t', 'len', default_value='ns3::ndn::Name::npos')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rbegin() const [member function]
+    cls.add_method('rbegin', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rbegin() [member function]
+    cls.add_method('rbegin', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rend() const [member function]
+    cls.add_method('rend', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rend() [member function]
+    cls.add_method('rend', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): size_t ns3::ndn::Name::size() const [member function]
+    cls.add_method('size', 
+                   'size_t', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::string ns3::ndn::Name::toUri() const [member function]
+    cls.add_method('toUri', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): void ns3::ndn::Name::toUri(std::ostream & os) const [member function]
+    cls.add_method('toUri', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::npos [variable]
+    cls.add_static_attribute('npos', 'size_t const', is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::nversion [variable]
+    cls.add_static_attribute('nversion', 'uint64_t const', is_const=True)
+    return
+
+def register_Ns3NdnNameChecker_methods(root_module, cls):
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker() [constructor]
+    cls.add_constructor([])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker(ns3::ndn::NameChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::NameChecker const &', 'arg0')])
+    return
+
+def register_Ns3NdnNameValue_methods(root_module, cls):
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue() [constructor]
+    cls.add_constructor([])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::NameValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::NameValue const &', 'arg0')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::Name const & value) [constructor]
+    cls.add_constructor([param('ns3::ndn::Name const &', 'value')])
+    ## name.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## name.h (module 'ndnSIM'): bool ns3::ndn::NameValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::NameValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ndn::Name', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::string ns3::ndn::NameValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## name.h (module 'ndnSIM'): void ns3::ndn::NameValue::Set(ns3::ndn::Name const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ndn::Name const &', 'value')])
+    return
+
+def register_Ns3NdnNetDeviceFace_methods(root_module, cls):
+    ## ndn-net-device-face.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::NetDeviceFace::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): ns3::ndn::NetDeviceFace::NetDeviceFace(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> const & netDevice) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice > const &', 'netDevice')])
+    ## ndn-net-device-face.h (module 'ndnSIM'): void ns3::ndn::NetDeviceFace::RegisterProtocolHandlers(ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Interest>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & interestHandler, ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Data>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & dataHandler) [member function]
+    cls.add_method('RegisterProtocolHandlers', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Interest >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'interestHandler'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Data >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'dataHandler')], 
+                   is_virtual=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): void ns3::ndn::NetDeviceFace::UnRegisterProtocolHandlers() [member function]
+    cls.add_method('UnRegisterProtocolHandlers', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::NetDeviceFace::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): ns3::Ptr<ns3::NetDevice> ns3::ndn::NetDeviceFace::GetNetDevice() const [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): bool ns3::ndn::NetDeviceFace::Send(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnPit_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-pit.h (module 'ndnSIM'): ns3::ndn::Pit::Pit(ns3::ndn::Pit const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Pit const &', 'arg0')])
+    ## ndn-pit.h (module 'ndnSIM'): ns3::ndn::Pit::Pit() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Begin() [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Create(ns3::Ptr<ns3::ndn::Interest const> header) [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'header')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::End() [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Find(ns3::ndn::Name const & prefix) [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::ndn::Name const &', 'prefix')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Time const & ns3::ndn::Pit::GetMaxPitEntryLifetime() const [member function]
+    cls.add_method('GetMaxPitEntryLifetime', 
+                   'ns3::Time const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Pit> ns3::ndn::Pit::GetPit(ns3::Ptr<ns3::Object> node) [member function]
+    cls.add_method('GetPit', 
+                   'ns3::Ptr< ns3::ndn::Pit >', 
+                   [param('ns3::Ptr< ns3::Object >', 'node')], 
+                   is_static=True)
+    ## ndn-pit.h (module 'ndnSIM'): uint32_t ns3::ndn::Pit::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Pit::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Lookup(ns3::ndn::Data const & header) [member function]
+    cls.add_method('Lookup', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::ndn::Data const &', 'header')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Lookup(ns3::ndn::Interest const & header) [member function]
+    cls.add_method('Lookup', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::ndn::Interest const &', 'header')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): void ns3::ndn::Pit::MarkErased(ns3::Ptr<ns3::ndn::pit::Entry> entry) [member function]
+    cls.add_method('MarkErased', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'entry')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Next(ns3::Ptr<ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): void ns3::ndn::Pit::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): void ns3::ndn::Pit::SetMaxPitEntryLifetime(ns3::Time const & maxLifetime) [member function]
+    cls.add_method('SetMaxPitEntryLifetime', 
+                   'void', 
+                   [param('ns3::Time const &', 'maxLifetime')])
+    return
+
+def register_Ns3NdnRttEstimator_methods(root_module, cls):
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttEstimator::RttEstimator() [constructor]
+    cls.add_constructor([])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttEstimator::RttEstimator(ns3::ndn::RttEstimator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::RttEstimator const &', 'arg0')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::AckSeq(ns3::SequenceNumber32 ackSeq) [member function]
+    cls.add_method('AckSeq', 
+                   'ns3::Time', 
+                   [param('ns3::SequenceNumber32', 'ackSeq')], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::ClearSent() [member function]
+    cls.add_method('ClearSent', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::RttEstimator> ns3::ndn::RttEstimator::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::ndn::RttEstimator >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::GetCurrentEstimate() const [member function]
+    cls.add_method('GetCurrentEstimate', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::TypeId ns3::ndn::RttEstimator::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::GetMaxRto() const [member function]
+    cls.add_method('GetMaxRto', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::GetMinRto() const [member function]
+    cls.add_method('GetMinRto', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::RttEstimator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::IncreaseMultiplier() [member function]
+    cls.add_method('IncreaseMultiplier', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::Measurement(ns3::Time t) [member function]
+    cls.add_method('Measurement', 
+                   'void', 
+                   [param('ns3::Time', 't')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::ResetMultiplier() [member function]
+    cls.add_method('ResetMultiplier', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::RetransmitTimeout() [member function]
+    cls.add_method('RetransmitTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SentSeq(ns3::SequenceNumber32 seq, uint32_t size) [member function]
+    cls.add_method('SentSeq', 
+                   'void', 
+                   [param('ns3::SequenceNumber32', 'seq'), param('uint32_t', 'size')], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SetCurrentEstimate(ns3::Time estimate) [member function]
+    cls.add_method('SetCurrentEstimate', 
+                   'void', 
+                   [param('ns3::Time', 'estimate')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SetMaxRto(ns3::Time maxRto) [member function]
+    cls.add_method('SetMaxRto', 
+                   'void', 
+                   [param('ns3::Time', 'maxRto')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SetMinRto(ns3::Time minRto) [member function]
+    cls.add_method('SetMinRto', 
+                   'void', 
+                   [param('ns3::Time', 'minRto')])
+    return
+
+def register_Ns3NdnRttHistory_methods(root_module, cls):
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::RttHistory(ns3::SequenceNumber32 s, uint32_t c, ns3::Time t) [constructor]
+    cls.add_constructor([param('ns3::SequenceNumber32', 's'), param('uint32_t', 'c'), param('ns3::Time', 't')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::RttHistory(ns3::ndn::RttHistory const & h) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::RttHistory const &', 'h')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::retx [variable]
+    cls.add_instance_attribute('retx', 'bool', is_const=False)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::seq [variable]
+    cls.add_instance_attribute('seq', 'ns3::SequenceNumber32', is_const=False)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::time [variable]
+    cls.add_instance_attribute('time', 'ns3::Time', is_const=False)
+    return
+
+def register_Ns3NdnStackHelper_methods(root_module, cls):
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::ndn::StackHelper::StackHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetStackAttributes(std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetStackAttributes', 
+                   'void', 
+                   [param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetForwardingStrategy(std::string const & forwardingStrategyClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetForwardingStrategy', 
+                   'void', 
+                   [param('std::string const &', 'forwardingStrategyClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetContentStore(std::string const & contentStoreClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetContentStore', 
+                   'void', 
+                   [param('std::string const &', 'contentStoreClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetPit(std::string const & pitClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetPit', 
+                   'void', 
+                   [param('std::string const &', 'pitClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetFib(std::string const & fibClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetFib', 
+                   'void', 
+                   [param('std::string const &', 'fibClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::AddNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::ndn::L3Protocol>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::ndn::L3Protocol >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::UpdateNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::ndn::L3Protocol>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('UpdateNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::ndn::L3Protocol >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::RemoveNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::ndn::L3Protocol>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('RemoveNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::ndn::L3Protocol >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::EnableLimits(bool enable=true, ns3::Time avgRtt=ns3::Seconds( ), uint32_t avgData=1100, uint32_t avgInterest=40) [member function]
+    cls.add_method('EnableLimits', 
+                   'void', 
+                   [param('bool', 'enable', default_value='true'), param('ns3::Time', 'avgRtt', default_value='ns3::Seconds(0)'), param('uint32_t', 'avgData', default_value='1100'), param('uint32_t', 'avgInterest', default_value='40')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::Install(std::string const & nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [param('std::string const &', 'nodeName')], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::Install(ns3::NodeContainer const & c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [param('ns3::NodeContainer const &', 'c')], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::InstallAll() const [member function]
+    cls.add_method('InstallAll', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(std::string const & nodeName, std::string const & prefix, uint32_t faceId, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('std::string const &', 'nodeName'), param('std::string const &', 'prefix'), param('uint32_t', 'faceId'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(ns3::Ptr<ns3::Node> node, std::string const & prefix, uint32_t faceId, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'prefix'), param('uint32_t', 'faceId'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(ns3::Ptr<ns3::Node> node, std::string const & prefix, ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(ns3::Ptr<ns3::Node> node, std::string const & prefix, ns3::Ptr<ns3::Node> otherNode, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'otherNode'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(std::string const & nodeName, std::string const & prefix, std::string const & otherNodeName, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('std::string const &', 'nodeName'), param('std::string const &', 'prefix'), param('std::string const &', 'otherNodeName'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetDefaultRoutes(bool needSet) [member function]
+    cls.add_method('SetDefaultRoutes', 
+                   'void', 
+                   [param('bool', 'needSet')])
+    return
+
+def register_Ns3NdnUnknownHeaderException_methods(root_module, cls):
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::UnknownHeaderException::UnknownHeaderException() [constructor]
+    cls.add_constructor([])
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::UnknownHeaderException::UnknownHeaderException(ns3::ndn::UnknownHeaderException const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::UnknownHeaderException const &', 'arg0')])
+    return
+
+def register_Ns3NdnWire_methods(root_module, cls):
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire::Wire() [constructor]
+    cls.add_constructor([])
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire::Wire(ns3::ndn::Wire const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Wire const &', 'arg0')])
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::Packet> ns3::ndn::Wire::FromData(ns3::Ptr<ns3::ndn::Data const> data, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromData', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static std::string ns3::ndn::Wire::FromDataStr(ns3::Ptr<ns3::ndn::Data const> data, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromDataStr', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::Packet> ns3::ndn::Wire::FromInterest(ns3::Ptr<ns3::ndn::Interest const> interest, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromInterest', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static std::string ns3::ndn::Wire::FromInterestStr(ns3::Ptr<ns3::ndn::Interest const> interest, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromInterestStr', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static std::string ns3::ndn::Wire::FromName(ns3::Ptr<ns3::ndn::Name const> name, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromName', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::ndn::Name const >', 'name'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Data> ns3::ndn::Wire::ToData(ns3::Ptr<ns3::Packet> packet, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToData', 
+                   'ns3::Ptr< ns3::ndn::Data >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Data> ns3::ndn::Wire::ToDataStr(std::string const & wire, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToDataStr', 
+                   'ns3::Ptr< ns3::ndn::Data >', 
+                   [param('std::string const &', 'wire'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Interest> ns3::ndn::Wire::ToInterest(ns3::Ptr<ns3::Packet> packet, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToInterest', 
+                   'ns3::Ptr< ns3::ndn::Interest >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Interest> ns3::ndn::Wire::ToInterestStr(std::string const & wire, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToInterestStr', 
+                   'ns3::Ptr< ns3::ndn::Interest >', 
+                   [param('std::string const &', 'wire'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Name> ns3::ndn::Wire::ToName(std::string const & wire, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('ToName', 
+                   'ns3::Ptr< ns3::ndn::Name >', 
+                   [param('std::string const &', 'wire'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnApiFace_methods(root_module, cls):
+    ## ndn-api-face.h (module 'ndnSIM'): ns3::ndn::ApiFace::ApiFace(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::Shutdown() [member function]
+    cls.add_method('Shutdown', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::ExpressInterest(ns3::Ptr<ns3::ndn::Interest> interest, ns3::Callback<void, ns3::Ptr<ns3::ndn::Interest const>, ns3::Ptr<ns3::ndn::Data const>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onData, ns3::Callback<void, ns3::Ptr<ns3::ndn::Interest const>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onTimeout) [member function]
+    cls.add_method('ExpressInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest >', 'interest'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Interest const >, ns3::Ptr< ns3::ndn::Data const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onData'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Interest const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onTimeout')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::SetInterestFilter(ns3::Ptr<ns3::ndn::Name const> prefix, ns3::Callback<void, ns3::Ptr<ns3::ndn::Name const>, ns3::Ptr<ns3::ndn::Interest const>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onInterest) [member function]
+    cls.add_method('SetInterestFilter', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name const >', 'prefix'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Name const >, ns3::Ptr< ns3::ndn::Interest const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onInterest')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::ClearInterestFilter(ns3::Ptr<ns3::ndn::Name const> prefix) [member function]
+    cls.add_method('ClearInterestFilter', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name const >', 'prefix')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::Put(ns3::Ptr<ns3::ndn::Data> data) [member function]
+    cls.add_method('Put', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data >', 'data')])
+    ## ndn-api-face.h (module 'ndnSIM'): bool ns3::ndn::ApiFace::SendInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('SendInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-api-face.h (module 'ndnSIM'): bool ns3::ndn::ApiFace::SendData(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('SendData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_virtual=True)
+    ## ndn-api-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::ApiFace::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NdnAppFace_methods(root_module, cls):
+    ## ndn-app-face.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::AppFace::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-app-face.h (module 'ndnSIM'): ns3::ndn::AppFace::AppFace(ns3::Ptr<ns3::ndn::App> app) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::App >', 'app')])
+    ## ndn-app-face.h (module 'ndnSIM'): bool ns3::ndn::AppFace::SendInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('SendInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-app-face.h (module 'ndnSIM'): bool ns3::ndn::AppFace::SendData(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('SendData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_virtual=True)
+    ## ndn-app-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::AppFace::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NdnL3AggregateTracer_methods(root_module, cls):
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer::L3AggregateTracer(ns3::ndn::L3AggregateTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::L3AggregateTracer const &', 'arg0')])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer::L3AggregateTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer::L3AggregateTracer(boost::shared_ptr<std::ostream> os, std::string const & nodeName) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'nodeName')])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::Install(ns3::NodeContainer const & nodes, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::L3AggregateTracer> ns3::ndn::L3AggregateTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::L3AggregateTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::DropData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::DropInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::DropNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::InData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::InInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::InNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::OutData(ns3::Ptr<ns3::ndn::Data const> arg0, bool fromCache, ns3::Ptr<const ns3::ndn::Face> arg2) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg2')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::OutInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::OutNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::PeriodicPrinter() [member function]
+    cls.add_method('PeriodicPrinter', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::SatisfiedInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('SatisfiedInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::SetAveragingPeriod(ns3::Time const & period) [member function]
+    cls.add_method('SetAveragingPeriod', 
+                   'void', 
+                   [param('ns3::Time const &', 'period')], 
+                   visibility='protected')
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::TimedOutInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('TimedOutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnL3RateTracer_methods(root_module, cls):
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer::L3RateTracer(ns3::ndn::L3RateTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::L3RateTracer const &', 'arg0')])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, std::string const & node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'node')])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::Install(ns3::NodeContainer const & nodes, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::L3RateTracer> ns3::ndn::L3RateTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::L3RateTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::DropData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::DropInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::DropNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::InData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::InInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::InNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::OutData(ns3::Ptr<ns3::ndn::Data const> arg0, bool fromCache, ns3::Ptr<const ns3::ndn::Face> arg2) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg2')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::OutInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::OutNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::SatisfiedInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('SatisfiedInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::TimedOutInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('TimedOutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnCsEntry_methods(root_module, cls):
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::cs::Entry::Entry(ns3::ndn::cs::Entry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::cs::Entry const &', 'arg0')])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::cs::Entry::Entry(ns3::Ptr<ns3::ndn::ContentStore> cs, ns3::Ptr<ns3::ndn::Data const> data) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::ContentStore >', 'cs'), param('ns3::Ptr< ns3::ndn::Data const >', 'data')])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::ContentStore> ns3::ndn::cs::Entry::GetContentStore() [member function]
+    cls.add_method('GetContentStore', 
+                   'ns3::Ptr< ns3::ndn::ContentStore >', 
+                   [])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Data const> ns3::ndn::cs::Entry::GetData() const [member function]
+    cls.add_method('GetData', 
+                   'ns3::Ptr< ns3::ndn::Data const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::cs::Entry::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnCsStats_methods(root_module, cls):
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::Stats() [constructor]
+    cls.add_constructor([])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::Stats(ns3::ndn::cs::Stats const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::cs::Stats const &', 'arg0')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): void ns3::ndn::cs::Stats::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::m_cacheHits [variable]
+    cls.add_instance_attribute('m_cacheHits', 'double', is_const=False)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::m_cacheMisses [variable]
+    cls.add_instance_attribute('m_cacheMisses', 'double', is_const=False)
+    return
+
+def register_Ns3NdnFibEntry_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::Entry(ns3::ndn::fib::Entry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::Entry const &', 'arg0')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::Entry(ns3::Ptr<ns3::ndn::Fib> fib, ns3::Ptr<ns3::ndn::Name const> const & prefix) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Fib >', 'fib'), param('ns3::Ptr< ns3::ndn::Name const > const &', 'prefix')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::AddOrUpdateRoutingMetric(ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('AddOrUpdateRoutingMetric', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric const & ns3::ndn::fib::Entry::FindBestCandidate(uint32_t skip=0) const [member function]
+    cls.add_method('FindBestCandidate', 
+                   'ns3::ndn::fib::FaceMetric const &', 
+                   [param('uint32_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Fib> ns3::ndn::fib::Entry::GetFib() [member function]
+    cls.add_method('GetFib', 
+                   'ns3::Ptr< ns3::ndn::Fib >', 
+                   [])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::fib::Entry::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::Invalidate() [member function]
+    cls.add_method('Invalidate', 
+                   'void', 
+                   [])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::RemoveFace(ns3::Ptr<ns3::ndn::Face> const & face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face > const &', 'face')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::SetRealDelayToProducer(ns3::Ptr<ns3::ndn::Face> face, ns3::Time delay) [member function]
+    cls.add_method('SetRealDelayToProducer', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Time', 'delay')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::UpdateFaceRtt(ns3::Ptr<ns3::ndn::Face> face, ns3::Time const & sample) [member function]
+    cls.add_method('UpdateFaceRtt', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Time const &', 'sample')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::UpdateStatus(ns3::Ptr<ns3::ndn::Face> face, ns3::ndn::fib::FaceMetric::Status status) [member function]
+    cls.add_method('UpdateStatus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::ndn::fib::FaceMetric::Status', 'status')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_faces [variable]
+    cls.add_instance_attribute('m_faces', 'boost::multi_index::multi_index_container< ns3::ndn::fib::FaceMetric, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ns3::ndn::fib::i_face, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::const_mem_fun< ns3::ndn::fib::FaceMetric, ns3::Ptr< ns3::ndn::Face >, & ( ns3::ndn::fib::FaceMetric::GetFace (  ) const ) >, mpl_::na >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ns3::ndn::fib::i_metric, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::composite_key< ns3::ndn::fib::FaceMetric, boost::multi_index::const_mem_fun< ns3::ndn::fib::FaceMetric, ns3::ndn::fib::FaceMetric::Status, & ( ns3::ndn::fib::FaceMetric::GetStatus (  ) const ) >, boost::multi_index::const_mem_fun< ns3::ndn::fib::FaceMetric, int, & ( ns3::ndn::fib::FaceMetric::GetRoutingCost (  ) const ) >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type >, mpl_::na >, boost::multi_index::random_access< boost::multi_index::tag< ns3::ndn::fib::i_nth, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, std::allocator< ns3::ndn::fib::FaceMetric > >', is_const=False)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_fib [variable]
+    cls.add_instance_attribute('m_fib', 'ns3::Ptr< ns3::ndn::Fib >', is_const=False)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_needsProbing [variable]
+    cls.add_instance_attribute('m_needsProbing', 'bool', is_const=False)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_prefix [variable]
+    cls.add_instance_attribute('m_prefix', 'ns3::Ptr< ns3::ndn::Name const >', is_const=False)
+    return
+
+def register_Ns3NdnFibEntryNoFaces_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::NoFaces::NoFaces() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::NoFaces::NoFaces(ns3::ndn::fib::Entry::NoFaces const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::Entry::NoFaces const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibFaceMetric_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::FaceMetric(ns3::ndn::fib::FaceMetric const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::FaceMetric const &', 'arg0')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::FaceMetric(ns3::Ptr<ns3::ndn::Face> face, int32_t cost) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'cost')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::fib::FaceMetric::GetFace() const [member function]
+    cls.add_method('GetFace', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Time ns3::ndn::fib::FaceMetric::GetRealDelay() const [member function]
+    cls.add_method('GetRealDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): int32_t ns3::ndn::fib::FaceMetric::GetRoutingCost() const [member function]
+    cls.add_method('GetRoutingCost', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Time ns3::ndn::fib::FaceMetric::GetRttVar() const [member function]
+    cls.add_method('GetRttVar', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Time ns3::ndn::fib::FaceMetric::GetSRtt() const [member function]
+    cls.add_method('GetSRtt', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::Status ns3::ndn::fib::FaceMetric::GetStatus() const [member function]
+    cls.add_method('GetStatus', 
+                   'ns3::ndn::fib::FaceMetric::Status', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status> & ns3::ndn::fib::FaceMetric::GetStatusTrace() [member function]
+    cls.add_method('GetStatusTrace', 
+                   'ns3::TracedValue< ns3::ndn::fib::FaceMetric::Status > &', 
+                   [])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::SetRealDelay(ns3::Time realDelay) [member function]
+    cls.add_method('SetRealDelay', 
+                   'void', 
+                   [param('ns3::Time', 'realDelay')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::SetRoutingCost(int32_t routingCost) [member function]
+    cls.add_method('SetRoutingCost', 
+                   'void', 
+                   [param('int32_t', 'routingCost')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::SetStatus(ns3::ndn::fib::FaceMetric::Status status) [member function]
+    cls.add_method('SetStatus', 
+                   'void', 
+                   [param('ns3::ndn::fib::FaceMetric::Status', 'status')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::UpdateRtt(ns3::Time const & rttSample) [member function]
+    cls.add_method('UpdateRtt', 
+                   'void', 
+                   [param('ns3::Time const &', 'rttSample')])
+    return
+
+def register_Ns3NdnFibFaceMetricContainer_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetricContainer::FaceMetricContainer() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetricContainer::FaceMetricContainer(ns3::ndn::fib::FaceMetricContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::FaceMetricContainer const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibI_face_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_face::i_face() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_face::i_face(ns3::ndn::fib::i_face const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::i_face const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibI_metric_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_metric::i_metric() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_metric::i_metric(ns3::ndn::fib::i_metric const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::i_metric const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibI_nth_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_nth::i_nth() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_nth::i_nth(ns3::ndn::fib::i_nth const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::i_nth const &', 'arg0')])
+    return
+
+def register_Ns3NdnFwTag_methods(root_module, cls):
+    ## ndn-fw-tag.h (module 'ndnSIM'): ns3::ndn::fw::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## ndn-fw-tag.h (module 'ndnSIM'): ns3::ndn::fw::Tag::Tag(ns3::ndn::fw::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fw::Tag const &', 'arg0')])
+    return
+
+def register_Ns3NdnNameComponent_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('>=')
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(ns3::ndn::name::Component const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::name::Component const &', 'arg0')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component() [constructor]
+    cls.add_constructor([])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(std::string const & uri) [constructor]
+    cls.add_constructor([param('std::string const &', 'uri')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(__gnu_cxx::__normal_iterator<char const*, std::string> begin, __gnu_cxx::__normal_iterator<char const*, std::string> end) [constructor]
+    cls.add_constructor([param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'begin'), param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'end')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(void const * buf, size_t length) [constructor]
+    cls.add_constructor([param('void const *', 'buf'), param('size_t', 'length')])
+    ## name-component.h (module 'ndnSIM'): int ns3::ndn::name::Component::compare(ns3::ndn::name::Component const & other) const [member function]
+    cls.add_method('compare', 
+                   'int', 
+                   [param('ns3::ndn::name::Component const &', 'other')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromNumber(uint64_t number) [member function]
+    cls.add_method('fromNumber', 
+                   'ns3::ndn::name::Component &', 
+                   [param('uint64_t', 'number')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromNumberWithMarker(uint64_t number, unsigned char marker) [member function]
+    cls.add_method('fromNumberWithMarker', 
+                   'ns3::ndn::name::Component &', 
+                   [param('uint64_t', 'number'), param('unsigned char', 'marker')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromUri(std::string const & uri) [member function]
+    cls.add_method('fromUri', 
+                   'ns3::ndn::name::Component &', 
+                   [param('std::string const &', 'uri')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromUri(__gnu_cxx::__normal_iterator<char const*, std::string> begin, __gnu_cxx::__normal_iterator<char const*, std::string> end) [member function]
+    cls.add_method('fromUri', 
+                   'ns3::ndn::name::Component &', 
+                   [param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'begin'), param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'end')])
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toBlkId() const [member function]
+    cls.add_method('toBlkId', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): std::string ns3::ndn::name::Component::toBlob() const [member function]
+    cls.add_method('toBlob', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): void ns3::ndn::name::Component::toBlob(std::ostream & os) const [member function]
+    cls.add_method('toBlob', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toControlNum() const [member function]
+    cls.add_method('toControlNum', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toNumber() const [member function]
+    cls.add_method('toNumber', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toNumberWithMarker(unsigned char marker) const [member function]
+    cls.add_method('toNumberWithMarker', 
+                   'uint64_t', 
+                   [param('unsigned char', 'marker')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toSeqNum() const [member function]
+    cls.add_method('toSeqNum', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): std::string ns3::ndn::name::Component::toUri() const [member function]
+    cls.add_method('toUri', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): void ns3::ndn::name::Component::toUri(std::ostream & os) const [member function]
+    cls.add_method('toUri', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toVersion() const [member function]
+    cls.add_method('toVersion', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnPitEntry_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry::Entry(ns3::ndn::pit::Entry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::Entry const &', 'arg0')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry::Entry(ns3::ndn::Pit & container, ns3::Ptr<ns3::ndn::Interest const> header, ns3::Ptr<ns3::ndn::fib::Entry> fibEntry) [constructor]
+    cls.add_constructor([param('ns3::ndn::Pit &', 'container'), param('ns3::Ptr< ns3::ndn::Interest const >', 'header'), param('ns3::Ptr< ns3::ndn::fib::Entry >', 'fibEntry')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::AddFwTag(boost::shared_ptr<ns3::ndn::fw::Tag> tag) [member function]
+    cls.add_method('AddFwTag', 
+                   'void', 
+                   [param('boost::shared_ptr< ns3::ndn::fw::Tag >', 'tag')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<ns3::ndn::pit::IncomingFace> ns3::ndn::pit::Entry::AddIncoming(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('AddIncoming', 
+                   'std::_Rb_tree_const_iterator< ns3::ndn::pit::IncomingFace >', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<ns3::ndn::pit::OutgoingFace> ns3::ndn::pit::Entry::AddOutgoing(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('AddOutgoing', 
+                   'std::_Rb_tree_const_iterator< ns3::ndn::pit::OutgoingFace >', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::AddSeenNonce(uint32_t nonce) [member function]
+    cls.add_method('AddSeenNonce', 
+                   'void', 
+                   [param('uint32_t', 'nonce')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::Entry::AreAllOutgoingInVain() const [member function]
+    cls.add_method('AreAllOutgoingInVain', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::Entry::AreTherePromisingOutgoingFacesExcept(ns3::Ptr<ns3::ndn::Face> face) const [member function]
+    cls.add_method('AreTherePromisingOutgoingFacesExcept', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::ClearIncoming() [member function]
+    cls.add_method('ClearIncoming', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::ClearOutgoing() [member function]
+    cls.add_method('ClearOutgoing', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::Time const & ns3::ndn::pit::Entry::GetExpireTime() const [member function]
+    cls.add_method('GetExpireTime', 
+                   'ns3::Time const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::pit::Entry::GetFibEntry() [member function]
+    cls.add_method('GetFibEntry', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [])
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::set<ns3::ndn::pit::IncomingFace, std::less<ns3::ndn::pit::IncomingFace>, std::allocator<ns3::ndn::pit::IncomingFace> > const & ns3::ndn::pit::Entry::GetIncoming() const [member function]
+    cls.add_method('GetIncoming', 
+                   'std::set< ns3::ndn::pit::IncomingFace > const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Interest const> ns3::ndn::pit::Entry::GetInterest() const [member function]
+    cls.add_method('GetInterest', 
+                   'ns3::Ptr< ns3::ndn::Interest const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): uint32_t ns3::ndn::pit::Entry::GetMaxRetxCount() const [member function]
+    cls.add_method('GetMaxRetxCount', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::set<ns3::ndn::pit::OutgoingFace, std::less<ns3::ndn::pit::OutgoingFace>, std::allocator<ns3::ndn::pit::OutgoingFace> > const & ns3::ndn::pit::Entry::GetOutgoing() const [member function]
+    cls.add_method('GetOutgoing', 
+                   'std::set< ns3::ndn::pit::OutgoingFace > const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): uint32_t ns3::ndn::pit::Entry::GetOutgoingCount() const [member function]
+    cls.add_method('GetOutgoingCount', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::pit::Entry::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::IncreaseAllowedRetxCount() [member function]
+    cls.add_method('IncreaseAllowedRetxCount', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::Entry::IsNonceSeen(uint32_t nonce) const [member function]
+    cls.add_method('IsNonceSeen', 
+                   'bool', 
+                   [param('uint32_t', 'nonce')], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::OffsetLifetime(ns3::Time const & offsetTime) [member function]
+    cls.add_method('OffsetLifetime', 
+                   'void', 
+                   [param('ns3::Time const &', 'offsetTime')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::RemoveAllReferencesToFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveAllReferencesToFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::RemoveIncoming(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveIncoming', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::SetWaitingInVain(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('SetWaitingInVain', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::UpdateLifetime(ns3::Time const & lifetime) [member function]
+    cls.add_method('UpdateLifetime', 
+                   'void', 
+                   [param('ns3::Time const &', 'lifetime')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, cls):
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty(ns3::ndn::pit::EntryIsNotEmpty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::EntryIsNotEmpty const &', 'arg0')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::EntryIsNotEmpty::operator()(ns3::Ptr<ns3::ndn::pit::Entry> entry) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'entry')], 
+                   custom_name='__call__')
+    return
+
+def register_Ns3NdnPitIncomingFace_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::IncomingFace(ns3::ndn::pit::IncomingFace const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::IncomingFace const &', 'arg0')])
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::IncomingFace(ns3::Ptr<ns3::ndn::Face> face) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Face >', 'face')])
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::IncomingFace() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::m_arrivalTime [variable]
+    cls.add_instance_attribute('m_arrivalTime', 'ns3::Time', is_const=False)
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::m_face [variable]
+    cls.add_instance_attribute('m_face', 'ns3::Ptr< ns3::ndn::Face >', is_const=False)
+    return
+
+def register_Ns3NdnPitOutgoingFace_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::OutgoingFace(ns3::ndn::pit::OutgoingFace const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::OutgoingFace const &', 'arg0')])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::OutgoingFace(ns3::Ptr<ns3::ndn::Face> face) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Face >', 'face')])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::OutgoingFace() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): void ns3::ndn::pit::OutgoingFace::UpdateOnRetransmit() [member function]
+    cls.add_method('UpdateOnRetransmit', 
+                   'void', 
+                   [])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_face [variable]
+    cls.add_instance_attribute('m_face', 'ns3::Ptr< ns3::ndn::Face >', is_const=False)
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_retxCount [variable]
+    cls.add_instance_attribute('m_retxCount', 'uint32_t', is_const=False)
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_sendTime [variable]
+    cls.add_instance_attribute('m_sendTime', 'ns3::Time', is_const=False)
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_waitingInVain [variable]
+    cls.add_instance_attribute('m_waitingInVain', 'bool', is_const=False)
+    return
+
+def register_functions(root_module):
+    module = root_module
+    register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
+    register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
+    register_functions_ns3_ndn(module.get_submodule('ndn'), root_module)
+    return
+
+def register_functions_ns3_FatalImpl(module, root_module):
+    return
+
+def register_functions_ns3_Hash(module, root_module):
+    register_functions_ns3_Hash_Function(module.get_submodule('Function'), root_module)
+    return
+
+def register_functions_ns3_Hash_Function(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
+def register_functions_ns3_ndn(module, root_module):
+    ## ndn-wire.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet> ns3::ndn::BufferToPacket(std::string const & buffer) [free function]
+    module.add_function('BufferToPacket', 
+                        'ns3::Ptr< ns3::Packet >', 
+                        [param('std::string const &', 'buffer')])
+    ## name.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameChecker() [free function]
+    module.add_function('MakeNameChecker', 
+                        'ns3::Ptr< ns3::AttributeChecker const >', 
+                        [])
+    ## ndn-wire.h (module 'ndnSIM'): std::string ns3::ndn::PacketToBuffer(ns3::Ptr<ns3::Packet const> pkt) [free function]
+    module.add_function('PacketToBuffer', 
+                        'std::string', 
+                        [param('ns3::Ptr< ns3::Packet const >', 'pkt')])
+    register_functions_ns3_ndn_cs(module.get_submodule('cs'), root_module)
+    register_functions_ns3_ndn_fib(module.get_submodule('fib'), root_module)
+    register_functions_ns3_ndn_fw(module.get_submodule('fw'), root_module)
+    register_functions_ns3_ndn_name(module.get_submodule('name'), root_module)
+    register_functions_ns3_ndn_pit(module.get_submodule('pit'), root_module)
+    register_functions_ns3_ndn_time(module.get_submodule('time'), root_module)
+    return
+
+def register_functions_ns3_ndn_cs(module, root_module):
+    return
+
+def register_functions_ns3_ndn_fib(module, root_module):
+    return
+
+def register_functions_ns3_ndn_fw(module, root_module):
+    return
+
+def register_functions_ns3_ndn_name(module, root_module):
+    return
+
+def register_functions_ns3_ndn_pit(module, root_module):
+    return
+
+def register_functions_ns3_ndn_time(module, root_module):
+    ## ndn-common.h (module 'ndnSIM'): ns3::Time ns3::ndn::time::NowUnixTimestamp() [free function]
+    module.add_function('NowUnixTimestamp', 
+                        'ns3::Time', 
+                        [])
+    return
+
+def main():
+    out = FileCodeSink(sys.stdout)
+    root_module = module_init()
+    register_types(root_module)
+    register_methods(root_module)
+    register_functions(root_module)
+    root_module.generate(out)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
new file mode 100644
index 0000000..3c3a2fb
--- /dev/null
+++ b/bindings/modulegen__gcc_LP64.py
@@ -0,0 +1,7933 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
+
+
+import pybindgen.settings
+import warnings
+
+class ErrorHandler(pybindgen.settings.ErrorHandler):
+    def handle_error(self, wrapper, exception, traceback_):
+        warnings.warn("exception %r in wrapper %s" % (exception, wrapper))
+        return True
+pybindgen.settings.error_handler = ErrorHandler()
+
+
+import sys
+
+def module_init():
+    root_module = Module('ns.ndnSIM', cpp_namespace='::ns3')
+    return root_module
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
+    ## application-container.h (module 'network'): ns3::ApplicationContainer [class]
+    module.add_class('ApplicationContainer', import_from_module='ns.network')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
+    module.add_class('AttributeConstructionList', import_from_module='ns.core')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
+    module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
+    ## buffer.h (module 'network'): ns3::Buffer [class]
+    module.add_class('Buffer', import_from_module='ns.network')
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
+    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
+    module.add_class('ByteTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
+    module.add_class('ByteTagList', import_from_module='ns.network')
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
+    ## callback.h (module 'core'): ns3::CallbackBase [class]
+    module.add_class('CallbackBase', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId [class]
+    module.add_class('EventId', import_from_module='ns.core')
+    ## hash.h (module 'core'): ns3::Hasher [class]
+    module.add_class('Hasher', import_from_module='ns.core')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
+    module.add_class('NetDeviceContainer', import_from_module='ns.network')
+    ## node-container.h (module 'network'): ns3::NodeContainer [class]
+    module.add_class('NodeContainer', import_from_module='ns.network')
+    ## object-base.h (module 'core'): ns3::ObjectBase [class]
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    ## object.h (module 'core'): ns3::ObjectDeleter [struct]
+    module.add_class('ObjectDeleter', import_from_module='ns.core')
+    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
+    module.add_class('ObjectFactory', import_from_module='ns.core')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
+    module.add_class('PacketMetadata', import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
+    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
+    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
+    module.add_class('PacketTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
+    module.add_class('PacketTagList', import_from_module='ns.network')
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
+    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
+    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## random-variable.h (module 'core'): ns3::RandomVariable [class]
+    module.add_class('RandomVariable', import_from_module='ns.core')
+    ## rng-seed-manager.h (module 'core'): ns3::RngSeedManager [class]
+    module.add_class('RngSeedManager', import_from_module='ns.core')
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int> [class]
+    module.add_class('SequenceNumber32', import_from_module='ns.network')
+    ## random-variable.h (module 'core'): ns3::SequentialVariable [class]
+    module.add_class('SequentialVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simulator.h (module 'core'): ns3::Simulator [class]
+    module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
+    ## tag.h (module 'network'): ns3::Tag [class]
+    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
+    module.add_class('TagBuffer', import_from_module='ns.network')
+    ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
+    module.add_class('TimeWithUnit', import_from_module='ns.core')
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::ndn::fib::FaceMetric::Status'])
+    ## random-variable.h (module 'core'): ns3::TriangularVariable [class]
+    module.add_class('TriangularVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## type-id.h (module 'core'): ns3::TypeId [class]
+    module.add_class('TypeId', import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
+    module.add_enum('AttributeFlag', ['ATTR_GET', 'ATTR_SET', 'ATTR_CONSTRUCT', 'ATTR_SGC'], outer_class=root_module['ns3::TypeId'], import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation [struct]
+    module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
+    module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## random-variable.h (module 'core'): ns3::UniformVariable [class]
+    module.add_class('UniformVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable [class]
+    module.add_class('WeibullVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ZetaVariable [class]
+    module.add_class('ZetaVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ZipfVariable [class]
+    module.add_class('ZipfVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## empty.h (module 'core'): ns3::empty [class]
+    module.add_class('empty', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
+    module.add_class('int64x64_t', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
+    module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## chunk.h (module 'network'): ns3::Chunk [class]
+    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## random-variable.h (module 'core'): ns3::ConstantVariable [class]
+    module.add_class('ConstantVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::DeterministicVariable [class]
+    module.add_class('DeterministicVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::EmpiricalVariable [class]
+    module.add_class('EmpiricalVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ErlangVariable [class]
+    module.add_class('ErlangVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable [class]
+    module.add_class('ExponentialVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::GammaVariable [class]
+    module.add_class('GammaVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## header.h (module 'network'): ns3::Header [class]
+    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## random-variable.h (module 'core'): ns3::IntEmpiricalVariable [class]
+    module.add_class('IntEmpiricalVariable', import_from_module='ns.core', parent=root_module['ns3::EmpiricalVariable'])
+    ## random-variable.h (module 'core'): ns3::LogNormalVariable [class]
+    module.add_class('LogNormalVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## random-variable.h (module 'core'): ns3::NormalVariable [class]
+    module.add_class('NormalVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## object.h (module 'core'): ns3::Object [class]
+    module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
+    module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable [class]
+    module.add_class('ParetoVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::L2Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::L2Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TopologyReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TopologyReader>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::AppDelayTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::AppDelayTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::CsTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::CsTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::Data', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Data>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::Exclude', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Exclude>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::FaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::FaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::ndn::Interest', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Interest>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::L3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::L3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::Name', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::Name>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::cs::Entry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::cs::Entry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::ndn::pit::Entry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ndn::pit::Entry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader [class]
+    module.add_class('TopologyReader', import_from_module='ns.topology_read', parent=root_module['ns3::SimpleRefCount< ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >'])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link [class]
+    module.add_class('Link', import_from_module='ns.topology_read', outer_class=root_module['ns3::TopologyReader'])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
+    module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## trailer.h (module 'network'): ns3::Trailer [class]
+    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::AnnotatedTopologyReader [class]
+    module.add_class('AnnotatedTopologyReader', parent=root_module['ns3::TopologyReader'])
+    ## 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]
+    module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    ## attribute.h (module 'core'): ns3::AttributeChecker [class]
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    ## attribute.h (module 'core'): ns3::AttributeValue [class]
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    ## boolean.h (module 'core'): ns3::BooleanChecker [class]
+    module.add_class('BooleanChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## boolean.h (module 'core'): ns3::BooleanValue [class]
+    module.add_class('BooleanValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## callback-based-app.h (module 'ndnSIM'): ns3::CallbackBasedApp [class]
+    module.add_class('CallbackBasedApp', parent=root_module['ns3::Application'])
+    ## callback.h (module 'core'): ns3::CallbackChecker [class]
+    module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## callback.h (module 'core'): ns3::CallbackImplBase [class]
+    module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    ## callback.h (module 'core'): ns3::CallbackValue [class]
+    module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## double.h (module 'core'): ns3::DoubleValue [class]
+    module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
+    module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## enum.h (module 'core'): ns3::EnumChecker [class]
+    module.add_class('EnumChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## enum.h (module 'core'): ns3::EnumValue [class]
+    module.add_class('EnumValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## event-impl.h (module 'core'): ns3::EventImpl [class]
+    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## integer.h (module 'core'): ns3::IntegerValue [class]
+    module.add_class('IntegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
+    module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## l2-tracer.h (module 'ndnSIM'): ns3::L2Tracer [class]
+    module.add_class('L2Tracer', parent=root_module['ns3::SimpleRefCount< ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >'])
+    ## net-device.h (module 'network'): ns3::NetDevice [class]
+    module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
+    module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
+    ## nix-vector.h (module 'network'): ns3::NixVector [class]
+    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## node.h (module 'network'): ns3::Node [class]
+    module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
+    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
+    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## packet.h (module 'network'): ns3::Packet [class]
+    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    ## random-variable.h (module 'core'): ns3::RandomVariableChecker [class]
+    module.add_class('RandomVariableChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue [class]
+    module.add_class('RandomVariableValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::RocketfuelWeightsReader [class]
+    module.add_class('RocketfuelWeightsReader', parent=root_module['ns3::AnnotatedTopologyReader'])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::RocketfuelWeightsReader [enumeration]
+    module.add_enum('', ['LINKS', 'WEIGHTS', 'LATENCIES', 'POSITIONS'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+    ## nstime.h (module 'core'): ns3::TimeValue [class]
+    module.add_class('TimeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
+    module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## type-id.h (module 'core'): ns3::TypeIdValue [class]
+    module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## uinteger.h (module 'core'): ns3::UintegerValue [class]
+    module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## address.h (module 'network'): ns3::AddressValue [class]
+    module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## l2-rate-tracer.h (module 'ndnSIM'): ns3::L2RateTracer [class]
+    module.add_class('L2RateTracer', parent=root_module['ns3::L2Tracer'])
+    module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
+    module.add_container('std::list< ns3::TopologyReader::Link >', 'ns3::TopologyReader::Link', container_type='list')
+    typehandlers.add_type_alias('ns3::SequenceNumber< short unsigned int, short int >', 'ns3::SequenceNumber16')
+    typehandlers.add_type_alias('ns3::SequenceNumber< short unsigned int, short int >*', 'ns3::SequenceNumber16*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< short unsigned int, short int >&', 'ns3::SequenceNumber16&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
+    typehandlers.add_type_alias('ns3::RngSeedManager', 'ns3::SeedManager')
+    typehandlers.add_type_alias('ns3::RngSeedManager*', 'ns3::SeedManager*')
+    typehandlers.add_type_alias('ns3::RngSeedManager&', 'ns3::SeedManager&')
+    module.add_typedef(root_module['ns3::RngSeedManager'], 'SeedManager')
+    
+    ## Register a nested module for the namespace FatalImpl
+    
+    nested_module = module.add_cpp_namespace('FatalImpl')
+    register_types_ns3_FatalImpl(nested_module)
+    
+    
+    ## Register a nested module for the namespace Hash
+    
+    nested_module = module.add_cpp_namespace('Hash')
+    register_types_ns3_Hash(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
+    
+    ## Register a nested module for the namespace ndn
+    
+    nested_module = module.add_cpp_namespace('ndn')
+    register_types_ns3_ndn(nested_module)
+    
+
+def register_types_ns3_FatalImpl(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_Hash(module):
+    root_module = module.get_root()
+    
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
+    module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
+    
+    ## Register a nested module for the namespace Function
+    
+    nested_module = module.add_cpp_namespace('Function')
+    register_types_ns3_Hash_Function(nested_module)
+    
+
+def register_types_ns3_Hash_Function(module):
+    root_module = module.get_root()
+    
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a [class]
+    module.add_class('Fnv1a', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32 [class]
+    module.add_class('Hash32', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64 [class]
+    module.add_class('Hash64', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
+    module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_ndn(module):
+    root_module = module.get_root()
+    
+    ## ndn-app.h (module 'ndnSIM'): ns3::ndn::App [class]
+    module.add_class('App', parent=root_module['ns3::Application'])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer [class]
+    module.add_class('AppDelayTracer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >'])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ndn::AppHelper [class]
+    module.add_class('AppHelper')
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob [class]
+    module.add_class('Blob')
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::ContentStore [class]
+    module.add_class('ContentStore', parent=root_module['ns3::Object'])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer [class]
+    module.add_class('CsTracer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >'])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Data [class]
+    module.add_class('Data', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >'])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::DataException [class]
+    module.add_class('DataException')
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude [class]
+    module.add_class('Exclude', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >'])
+    ## ndn-face.h (module 'ndnSIM'): ns3::ndn::Face [class]
+    module.add_class('Face', parent=root_module['ns3::Object'])
+    ## ndn-face.h (module 'ndnSIM'): ns3::ndn::Face::Flags [enumeration]
+    module.add_enum('Flags', ['APPLICATION'], outer_class=root_module['ns3::ndn::Face'])
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::ndn::FaceContainer [class]
+    module.add_class('FaceContainer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >'])
+    ## ndn-fib.h (module 'ndnSIM'): ns3::ndn::Fib [class]
+    module.add_class('Fib', parent=root_module['ns3::Object'])
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): ns3::ndn::ForwardingStrategy [class]
+    module.add_class('ForwardingStrategy', parent=root_module['ns3::Object'])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): ns3::ndn::GlobalRoutingHelper [class]
+    module.add_class('GlobalRoutingHelper')
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper [class]
+    module.add_class('HeaderHelper')
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::Type [enumeration]
+    module.add_enum('Type', ['INTEREST_CCNB', 'CONTENT_OBJECT_CCNB', 'INTEREST_NDNSIM', 'CONTENT_OBJECT_NDNSIM'], outer_class=root_module['ns3::ndn::HeaderHelper'])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest [class]
+    module.add_class('Interest', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >'])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest [enumeration]
+    module.add_enum('', ['NORMAL_INTEREST', 'NACK_LOOP', 'NACK_CONGESTION', 'NACK_GIVEUP_PIT'], outer_class=root_module['ns3::ndn::Interest'])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::InterestException [class]
+    module.add_class('InterestException')
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): ns3::ndn::IpFacesHelper [class]
+    module.add_class('IpFacesHelper')
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol [class]
+    module.add_class('L3Protocol', parent=root_module['ns3::Object'])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer [class]
+    module.add_class('L3Tracer', parent=root_module['ns3::SimpleRefCount< ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >'])
+    ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits [class]
+    module.add_class('Limits', parent=root_module['ns3::Object'])
+    ## ndn-link-control-helper.h (module 'ndnSIM'): ns3::ndn::LinkControlHelper [class]
+    module.add_class('LinkControlHelper')
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name [class]
+    module.add_class('Name', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >'])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameChecker [class]
+    module.add_class('NameChecker', parent=root_module['ns3::AttributeChecker'])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue [class]
+    module.add_class('NameValue', parent=root_module['ns3::AttributeValue'])
+    ## ndn-net-device-face.h (module 'ndnSIM'): ns3::ndn::NetDeviceFace [class]
+    module.add_class('NetDeviceFace', parent=root_module['ns3::ndn::Face'])
+    ## ndn-pit.h (module 'ndnSIM'): ns3::ndn::Pit [class]
+    module.add_class('Pit', parent=root_module['ns3::Object'])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttEstimator [class]
+    module.add_class('RttEstimator', parent=root_module['ns3::Object'])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory [class]
+    module.add_class('RttHistory')
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::ndn::StackHelper [class]
+    module.add_class('StackHelper')
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::UnknownHeaderException [class]
+    module.add_class('UnknownHeaderException')
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire [struct]
+    module.add_class('Wire')
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire [enumeration]
+    module.add_enum('', ['WIRE_FORMAT_DEFAULT', 'WIRE_FORMAT_AUTODETECT', 'WIRE_FORMAT_NDNSIM', 'WIRE_FORMAT_CCNB'], outer_class=root_module['ns3::ndn::Wire'])
+    ## ndn-api-face.h (module 'ndnSIM'): ns3::ndn::ApiFace [class]
+    module.add_class('ApiFace', parent=root_module['ns3::ndn::Face'])
+    ## ndn-app-face.h (module 'ndnSIM'): ns3::ndn::AppFace [class]
+    module.add_class('AppFace', parent=root_module['ns3::ndn::Face'])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer [class]
+    module.add_class('L3AggregateTracer', parent=root_module['ns3::ndn::L3Tracer'])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer [class]
+    module.add_class('L3RateTracer', parent=root_module['ns3::ndn::L3Tracer'])
+    module.add_container('std::vector< char >', 'char', container_type='vector')
+    module.add_container('std::map< ns3::ndn::name::Component, bool, std::greater< ns3::ndn::name::Component >, std::allocator< std::pair< ns3::ndn::name::Component const, bool > > >', ('ns3::ndn::name::Component', 'bool'), container_type='map')
+    module.add_container('std::vector< ns3::Ptr< ns3::ndn::Face > >', 'ns3::Ptr< ns3::ndn::Face >', container_type='vector')
+    typehandlers.add_type_alias('ns3::ndn::Name', 'ns3::ndn::NameComponents')
+    typehandlers.add_type_alias('ns3::ndn::Name*', 'ns3::ndn::NameComponents*')
+    typehandlers.add_type_alias('ns3::ndn::Name&', 'ns3::ndn::NameComponents&')
+    module.add_typedef(root_module['ns3::ndn::Name'], 'NameComponents')
+    typehandlers.add_type_alias('ns3::ndn::Data', 'ns3::ndn::DataHeader')
+    typehandlers.add_type_alias('ns3::ndn::Data*', 'ns3::ndn::DataHeader*')
+    typehandlers.add_type_alias('ns3::ndn::Data&', 'ns3::ndn::DataHeader&')
+    module.add_typedef(root_module['ns3::ndn::Data'], 'DataHeader')
+    typehandlers.add_type_alias('std::deque< ns3::ndn::RttHistory, std::allocator< ns3::ndn::RttHistory > >', 'ns3::ndn::RttHistory_t')
+    typehandlers.add_type_alias('std::deque< ns3::ndn::RttHistory, std::allocator< ns3::ndn::RttHistory > >*', 'ns3::ndn::RttHistory_t*')
+    typehandlers.add_type_alias('std::deque< ns3::ndn::RttHistory, std::allocator< ns3::ndn::RttHistory > >&', 'ns3::ndn::RttHistory_t&')
+    typehandlers.add_type_alias('ns3::Time', 'ns3::ndn::TimeInterval')
+    typehandlers.add_type_alias('ns3::Time*', 'ns3::ndn::TimeInterval*')
+    typehandlers.add_type_alias('ns3::Time&', 'ns3::ndn::TimeInterval&')
+    module.add_typedef(root_module['ns3::Time'], 'TimeInterval')
+    typehandlers.add_type_alias('ns3::ndn::Interest', 'ns3::ndn::InterestHeader')
+    typehandlers.add_type_alias('ns3::ndn::Interest*', 'ns3::ndn::InterestHeader*')
+    typehandlers.add_type_alias('ns3::ndn::Interest&', 'ns3::ndn::InterestHeader&')
+    module.add_typedef(root_module['ns3::ndn::Interest'], 'InterestHeader')
+    
+    ## Register a nested module for the namespace cs
+    
+    nested_module = module.add_cpp_namespace('cs')
+    register_types_ns3_ndn_cs(nested_module)
+    
+    
+    ## Register a nested module for the namespace fib
+    
+    nested_module = module.add_cpp_namespace('fib')
+    register_types_ns3_ndn_fib(nested_module)
+    
+    
+    ## Register a nested module for the namespace fw
+    
+    nested_module = module.add_cpp_namespace('fw')
+    register_types_ns3_ndn_fw(nested_module)
+    
+    
+    ## Register a nested module for the namespace name
+    
+    nested_module = module.add_cpp_namespace('name')
+    register_types_ns3_ndn_name(nested_module)
+    
+    
+    ## Register a nested module for the namespace pit
+    
+    nested_module = module.add_cpp_namespace('pit')
+    register_types_ns3_ndn_pit(nested_module)
+    
+    
+    ## Register a nested module for the namespace time
+    
+    nested_module = module.add_cpp_namespace('time')
+    register_types_ns3_ndn_time(nested_module)
+    
+
+def register_types_ns3_ndn_cs(module):
+    root_module = module.get_root()
+    
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::cs::Entry [class]
+    module.add_class('Entry', parent=root_module['ns3::SimpleRefCount< ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >'])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats [struct]
+    module.add_class('Stats')
+
+def register_types_ns3_ndn_fib(module):
+    root_module = module.get_root()
+    
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry [class]
+    module.add_class('Entry', parent=root_module['ns3::Object'])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::NoFaces [class]
+    module.add_class('NoFaces', outer_class=root_module['ns3::ndn::fib::Entry'])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric [class]
+    module.add_class('FaceMetric')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::Status [enumeration]
+    module.add_enum('Status', ['NDN_FIB_GREEN', 'NDN_FIB_YELLOW', 'NDN_FIB_RED'], outer_class=root_module['ns3::ndn::fib::FaceMetric'])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetricContainer [struct]
+    module.add_class('FaceMetricContainer')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_face [class]
+    module.add_class('i_face')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_metric [class]
+    module.add_class('i_metric')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_nth [class]
+    module.add_class('i_nth')
+
+def register_types_ns3_ndn_fw(module):
+    root_module = module.get_root()
+    
+    ## ndn-fw-tag.h (module 'ndnSIM'): ns3::ndn::fw::Tag [class]
+    module.add_class('Tag')
+
+def register_types_ns3_ndn_name(module):
+    root_module = module.get_root()
+    
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component [class]
+    module.add_class('Component', parent=root_module['ns3::ndn::Blob'])
+
+def register_types_ns3_ndn_pit(module):
+    root_module = module.get_root()
+    
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry [class]
+    module.add_class('Entry', parent=root_module['ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >'])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty [struct]
+    module.add_class('EntryIsNotEmpty')
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace [struct]
+    module.add_class('IncomingFace')
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace [struct]
+    module.add_class('OutgoingFace')
+    module.add_container('std::set< ns3::ndn::pit::IncomingFace >', 'ns3::ndn::pit::IncomingFace', container_type='set')
+    module.add_container('std::set< ns3::ndn::pit::OutgoingFace >', 'ns3::ndn::pit::OutgoingFace', container_type='set')
+    module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
+
+def register_types_ns3_ndn_time(module):
+    root_module = module.get_root()
+    
+
+def register_methods(root_module):
+    register_Ns3Address_methods(root_module, root_module['ns3::Address'])
+    register_Ns3ApplicationContainer_methods(root_module, root_module['ns3::ApplicationContainer'])
+    register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
+    register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
+    register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
+    register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
+    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
+    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
+    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
+    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
+    register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
+    register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
+    register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
+    register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
+    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
+    register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
+    register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
+    register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
+    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
+    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
+    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
+    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3RandomVariable_methods(root_module, root_module['ns3::RandomVariable'])
+    register_Ns3RngSeedManager_methods(root_module, root_module['ns3::RngSeedManager'])
+    register_Ns3SequenceNumber32_methods(root_module, root_module['ns3::SequenceNumber32'])
+    register_Ns3SequentialVariable_methods(root_module, root_module['ns3::SequentialVariable'])
+    register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
+    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
+    register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
+    register_Ns3TracedValue__Ns3NdnFibFaceMetricStatus_methods(root_module, root_module['ns3::TracedValue< ns3::ndn::fib::FaceMetric::Status >'])
+    register_Ns3TriangularVariable_methods(root_module, root_module['ns3::TriangularVariable'])
+    register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
+    register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
+    register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3UniformVariable_methods(root_module, root_module['ns3::UniformVariable'])
+    register_Ns3WeibullVariable_methods(root_module, root_module['ns3::WeibullVariable'])
+    register_Ns3ZetaVariable_methods(root_module, root_module['ns3::ZetaVariable'])
+    register_Ns3ZipfVariable_methods(root_module, root_module['ns3::ZipfVariable'])
+    register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
+    register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
+    register_Ns3ConstantVariable_methods(root_module, root_module['ns3::ConstantVariable'])
+    register_Ns3DeterministicVariable_methods(root_module, root_module['ns3::DeterministicVariable'])
+    register_Ns3EmpiricalVariable_methods(root_module, root_module['ns3::EmpiricalVariable'])
+    register_Ns3ErlangVariable_methods(root_module, root_module['ns3::ErlangVariable'])
+    register_Ns3ExponentialVariable_methods(root_module, root_module['ns3::ExponentialVariable'])
+    register_Ns3GammaVariable_methods(root_module, root_module['ns3::GammaVariable'])
+    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3IntEmpiricalVariable_methods(root_module, root_module['ns3::IntEmpiricalVariable'])
+    register_Ns3LogNormalVariable_methods(root_module, root_module['ns3::LogNormalVariable'])
+    register_Ns3NormalVariable_methods(root_module, root_module['ns3::NormalVariable'])
+    register_Ns3Object_methods(root_module, root_module['ns3::Object'])
+    register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3ParetoVariable_methods(root_module, root_module['ns3::ParetoVariable'])
+    register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    register_Ns3SimpleRefCount__Ns3L2Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3L2Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >'])
+    register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3TopologyReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3TopologyReader__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >'])
+    register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3NdnAppDelayTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnAppDelayTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnCsTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnData_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnData__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >'])
+    register_Ns3SimpleRefCount__Ns3NdnExclude_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnExclude__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >'])
+    register_Ns3SimpleRefCount__Ns3NdnFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnInterest_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnInterest__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >'])
+    register_Ns3SimpleRefCount__Ns3NdnL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >'])
+    register_Ns3SimpleRefCount__Ns3NdnName_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnName__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >'])
+    register_Ns3SimpleRefCount__Ns3NdnCsEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >'])
+    register_Ns3SimpleRefCount__Ns3NdnPitEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnPitEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
+    register_Ns3TopologyReader_methods(root_module, root_module['ns3::TopologyReader'])
+    register_Ns3TopologyReaderLink_methods(root_module, root_module['ns3::TopologyReader::Link'])
+    register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
+    register_Ns3AnnotatedTopologyReader_methods(root_module, root_module['ns3::AnnotatedTopologyReader'])
+    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'])
+    register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
+    register_Ns3BooleanChecker_methods(root_module, root_module['ns3::BooleanChecker'])
+    register_Ns3BooleanValue_methods(root_module, root_module['ns3::BooleanValue'])
+    register_Ns3CallbackBasedApp_methods(root_module, root_module['ns3::CallbackBasedApp'])
+    register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
+    register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
+    register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
+    register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
+    register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3EnumChecker_methods(root_module, root_module['ns3::EnumChecker'])
+    register_Ns3EnumValue_methods(root_module, root_module['ns3::EnumValue'])
+    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
+    register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3L2Tracer_methods(root_module, root_module['ns3::L2Tracer'])
+    register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
+    register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3Node_methods(root_module, root_module['ns3::Node'])
+    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
+    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
+    register_Ns3RandomVariableChecker_methods(root_module, root_module['ns3::RandomVariableChecker'])
+    register_Ns3RandomVariableValue_methods(root_module, root_module['ns3::RandomVariableValue'])
+    register_Ns3RocketfuelWeightsReader_methods(root_module, root_module['ns3::RocketfuelWeightsReader'])
+    register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
+    register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3L2RateTracer_methods(root_module, root_module['ns3::L2RateTracer'])
+    register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
+    register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
+    register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
+    register_Ns3HashFunctionHash64_methods(root_module, root_module['ns3::Hash::Function::Hash64'])
+    register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
+    register_Ns3NdnApp_methods(root_module, root_module['ns3::ndn::App'])
+    register_Ns3NdnAppDelayTracer_methods(root_module, root_module['ns3::ndn::AppDelayTracer'])
+    register_Ns3NdnAppHelper_methods(root_module, root_module['ns3::ndn::AppHelper'])
+    register_Ns3NdnBlob_methods(root_module, root_module['ns3::ndn::Blob'])
+    register_Ns3NdnContentStore_methods(root_module, root_module['ns3::ndn::ContentStore'])
+    register_Ns3NdnCsTracer_methods(root_module, root_module['ns3::ndn::CsTracer'])
+    register_Ns3NdnData_methods(root_module, root_module['ns3::ndn::Data'])
+    register_Ns3NdnDataException_methods(root_module, root_module['ns3::ndn::DataException'])
+    register_Ns3NdnExclude_methods(root_module, root_module['ns3::ndn::Exclude'])
+    register_Ns3NdnFace_methods(root_module, root_module['ns3::ndn::Face'])
+    register_Ns3NdnFaceContainer_methods(root_module, root_module['ns3::ndn::FaceContainer'])
+    register_Ns3NdnFib_methods(root_module, root_module['ns3::ndn::Fib'])
+    register_Ns3NdnForwardingStrategy_methods(root_module, root_module['ns3::ndn::ForwardingStrategy'])
+    register_Ns3NdnGlobalRoutingHelper_methods(root_module, root_module['ns3::ndn::GlobalRoutingHelper'])
+    register_Ns3NdnHeaderHelper_methods(root_module, root_module['ns3::ndn::HeaderHelper'])
+    register_Ns3NdnInterest_methods(root_module, root_module['ns3::ndn::Interest'])
+    register_Ns3NdnInterestException_methods(root_module, root_module['ns3::ndn::InterestException'])
+    register_Ns3NdnIpFacesHelper_methods(root_module, root_module['ns3::ndn::IpFacesHelper'])
+    register_Ns3NdnL3Protocol_methods(root_module, root_module['ns3::ndn::L3Protocol'])
+    register_Ns3NdnL3Tracer_methods(root_module, root_module['ns3::ndn::L3Tracer'])
+    register_Ns3NdnLimits_methods(root_module, root_module['ns3::ndn::Limits'])
+    register_Ns3NdnLinkControlHelper_methods(root_module, root_module['ns3::ndn::LinkControlHelper'])
+    register_Ns3NdnName_methods(root_module, root_module['ns3::ndn::Name'])
+    register_Ns3NdnNameChecker_methods(root_module, root_module['ns3::ndn::NameChecker'])
+    register_Ns3NdnNameValue_methods(root_module, root_module['ns3::ndn::NameValue'])
+    register_Ns3NdnNetDeviceFace_methods(root_module, root_module['ns3::ndn::NetDeviceFace'])
+    register_Ns3NdnPit_methods(root_module, root_module['ns3::ndn::Pit'])
+    register_Ns3NdnRttEstimator_methods(root_module, root_module['ns3::ndn::RttEstimator'])
+    register_Ns3NdnRttHistory_methods(root_module, root_module['ns3::ndn::RttHistory'])
+    register_Ns3NdnStackHelper_methods(root_module, root_module['ns3::ndn::StackHelper'])
+    register_Ns3NdnUnknownHeaderException_methods(root_module, root_module['ns3::ndn::UnknownHeaderException'])
+    register_Ns3NdnWire_methods(root_module, root_module['ns3::ndn::Wire'])
+    register_Ns3NdnApiFace_methods(root_module, root_module['ns3::ndn::ApiFace'])
+    register_Ns3NdnAppFace_methods(root_module, root_module['ns3::ndn::AppFace'])
+    register_Ns3NdnL3AggregateTracer_methods(root_module, root_module['ns3::ndn::L3AggregateTracer'])
+    register_Ns3NdnL3RateTracer_methods(root_module, root_module['ns3::ndn::L3RateTracer'])
+    register_Ns3NdnCsEntry_methods(root_module, root_module['ns3::ndn::cs::Entry'])
+    register_Ns3NdnCsStats_methods(root_module, root_module['ns3::ndn::cs::Stats'])
+    register_Ns3NdnFibEntry_methods(root_module, root_module['ns3::ndn::fib::Entry'])
+    register_Ns3NdnFibEntryNoFaces_methods(root_module, root_module['ns3::ndn::fib::Entry::NoFaces'])
+    register_Ns3NdnFibFaceMetric_methods(root_module, root_module['ns3::ndn::fib::FaceMetric'])
+    register_Ns3NdnFibFaceMetricContainer_methods(root_module, root_module['ns3::ndn::fib::FaceMetricContainer'])
+    register_Ns3NdnFibI_face_methods(root_module, root_module['ns3::ndn::fib::i_face'])
+    register_Ns3NdnFibI_metric_methods(root_module, root_module['ns3::ndn::fib::i_metric'])
+    register_Ns3NdnFibI_nth_methods(root_module, root_module['ns3::ndn::fib::i_nth'])
+    register_Ns3NdnFwTag_methods(root_module, root_module['ns3::ndn::fw::Tag'])
+    register_Ns3NdnNameComponent_methods(root_module, root_module['ns3::ndn::name::Component'])
+    register_Ns3NdnPitEntry_methods(root_module, root_module['ns3::ndn::pit::Entry'])
+    register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, root_module['ns3::ndn::pit::EntryIsNotEmpty'])
+    register_Ns3NdnPitIncomingFace_methods(root_module, root_module['ns3::ndn::pit::IncomingFace'])
+    register_Ns3NdnPitOutgoingFace_methods(root_module, root_module['ns3::ndn::pit::OutgoingFace'])
+    return
+
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
+def register_Ns3ApplicationContainer_methods(root_module, cls):
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer(ns3::ApplicationContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ApplicationContainer const &', 'arg0')])
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer() [constructor]
+    cls.add_constructor([])
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer(ns3::Ptr<ns3::Application> application) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Application >', 'application')])
+    ## application-container.h (module 'network'): ns3::ApplicationContainer::ApplicationContainer(std::string name) [constructor]
+    cls.add_constructor([param('std::string', 'name')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Add(ns3::ApplicationContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ApplicationContainer', 'other')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Add(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Add(std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name')])
+    ## application-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Application>*,std::vector<ns3::Ptr<ns3::Application>, std::allocator<ns3::Ptr<ns3::Application> > > > ns3::ApplicationContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Application > const, std::vector< ns3::Ptr< ns3::Application > > >', 
+                   [], 
+                   is_const=True)
+    ## application-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Application>*,std::vector<ns3::Ptr<ns3::Application>, std::allocator<ns3::Ptr<ns3::Application> > > > ns3::ApplicationContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Application > const, std::vector< ns3::Ptr< ns3::Application > > >', 
+                   [], 
+                   is_const=True)
+    ## application-container.h (module 'network'): ns3::Ptr<ns3::Application> ns3::ApplicationContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## application-container.h (module 'network'): uint32_t ns3::ApplicationContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Start(ns3::Time start) [member function]
+    cls.add_method('Start', 
+                   'void', 
+                   [param('ns3::Time', 'start')])
+    ## application-container.h (module 'network'): void ns3::ApplicationContainer::Stop(ns3::Time stop) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time', 'stop')])
+    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')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): void ns3::AttributeConstructionList::Add(std::string name, ns3::Ptr<ns3::AttributeChecker const> checker, ns3::Ptr<ns3::AttributeValue> value) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker'), param('ns3::Ptr< ns3::AttributeValue >', 'value')])
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::End() const [member function]
+    cls.add_method('End', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeConstructionList::Find(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionListItem_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item(ns3::AttributeConstructionList::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList::Item const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::value [variable]
+    cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
+    return
+
+def register_Ns3Buffer_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    cls.add_method('AddAtEnd', 
+                   'bool', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    cls.add_method('AddAtStart', 
+                   'bool', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Buffer', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
+    cls.add_method('CreateFullCopy', 
+                   'ns3::Buffer', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
+    cls.add_method('GetCurrentEndOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
+    cls.add_method('GetCurrentStartOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3BufferIterator_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator const &', 'o')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
+    cls.add_method('IsEnd', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
+    cls.add_method('IsStart', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::PeekU8() [member function]
+    cls.add_method('PeekU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(ns3::Buffer::Iterator start, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
+    cls.add_method('ReadLsbtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
+    cls.add_method('ReadLsbtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
+    cls.add_method('ReadLsbtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
+    cls.add_method('ReadNtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
+    cls.add_method('ReadNtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
+    cls.add_method('ReadNtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
+    cls.add_method('WriteHtolsbU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
+    cls.add_method('WriteHtolsbU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
+    cls.add_method('WriteHtolsbU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
+    cls.add_method('WriteHtonU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
+    cls.add_method('WriteHtonU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
+    cls.add_method('WriteHtonU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
+    return
+
+def register_Ns3ByteTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
+    cls.add_method('GetEnd', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
+    cls.add_method('GetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ByteTagList_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
+    cls.add_constructor([])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
+    cls.add_method('Add', 
+                   'ns3::TagBuffer', 
+                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+    cls.add_method('AddAtStart', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
+    cls.add_method('Begin', 
+                   'ns3::ByteTagList::Iterator', 
+                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIterator_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
+    cls.add_method('GetOffsetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagList::Iterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
+    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
+    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
+    cls.add_instance_attribute('end', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
+    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
+    cls.add_instance_attribute('start', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3CallbackBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::CallbackImplBase> ns3::CallbackBase::GetImpl() const [member function]
+    cls.add_method('GetImpl', 
+                   'ns3::Ptr< ns3::CallbackImplBase >', 
+                   [], 
+                   is_const=True)
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
+                        visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3EventId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
+    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
+    cls.add_constructor([])
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
+    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
+    cls.add_method('GetTs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
+    cls.add_method('PeekEventImpl', 
+                   'ns3::EventImpl *', 
+                   [], 
+                   is_const=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')])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher() [constructor]
+    cls.add_constructor([])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Ptr<ns3::Hash::Implementation> hp) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Hash::Implementation >', 'hp')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(std::string const s) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(std::string const s) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::Hasher::clear() [member function]
+    cls.add_method('clear', 
+                   'ns3::Hasher &', 
+                   [])
+    return
+
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NetDeviceContainer_methods(root_module, cls):
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer() [constructor]
+    cls.add_constructor([])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::NetDeviceContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'other')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(std::string deviceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'deviceName')])
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::NetDeviceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): uint32_t ns3::NetDeviceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NodeContainer_methods(root_module, cls):
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer() [constructor]
+    cls.add_constructor([])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(std::string nodeName) [constructor]
+    cls.add_constructor([param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d, ns3::NodeContainer const & e) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd'), param('ns3::NodeContainer const &', 'e')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::NodeContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NodeContainer', 'other')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(std::string nodeName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n, uint32_t systemId) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'systemId')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NodeContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## node-container.h (module 'network'): static ns3::NodeContainer ns3::NodeContainer::GetGlobal() [member function]
+    cls.add_method('GetGlobal', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_static=True)
+    ## node-container.h (module 'network'): uint32_t ns3::NodeContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::begin() [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node >, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::end() const [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::end() [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node >, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [])
+    ## node-container.h (module 'network'): uint32_t ns3::NodeContainer::size() const [member function]
+    cls.add_method('size', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ObjectBase_methods(root_module, cls):
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
+    cls.add_constructor([])
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase(ns3::ObjectBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectBase const &', 'arg0')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::GetAttribute(std::string name, ns3::AttributeValue & value) const [member function]
+    cls.add_method('GetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object-base.h (module 'core'): void ns3::ObjectBase::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::SetAttributeFailSafe(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::ConstructSelf(ns3::AttributeConstructionList const & attributes) [member function]
+    cls.add_method('ConstructSelf', 
+                   'void', 
+                   [param('ns3::AttributeConstructionList const &', 'attributes')], 
+                   visibility='protected')
+    ## object-base.h (module 'core'): void ns3::ObjectBase::NotifyConstructionCompleted() [member function]
+    cls.add_method('NotifyConstructionCompleted', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectDeleter_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter(ns3::ObjectDeleter const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectDeleter const &', 'arg0')])
+    ## object.h (module 'core'): static void ns3::ObjectDeleter::Delete(ns3::Object * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::Object *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3ObjectFactory_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
+    cls.add_constructor([param('std::string', 'typeId')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('ns3::TypeId', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('char const *', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('std::string', 'tid')])
+    return
+
+def register_Ns3PacketMetadata_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
+    cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [param('ns3::Buffer', 'buffer')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::PacketMetadata', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketMetadataItem_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
+    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
+    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
+    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
+    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
+    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
+    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketMetadata::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketTagList_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
+    cls.add_method('Head', 
+                   'ns3::PacketTagList::TagData const *', 
+                   [], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
+    cls.add_method('Peek', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
+    cls.add_method('Replace', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    return
+
+def register_Ns3PacketTagListTagData_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
+    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
+    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3RandomVariable_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## random-variable.h (module 'core'): ns3::RandomVariable::RandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::RandomVariable::RandomVariable(ns3::RandomVariable const & o) [copy constructor]
+    cls.add_constructor([param('ns3::RandomVariable const &', 'o')])
+    ## random-variable.h (module 'core'): uint32_t ns3::RandomVariable::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::RandomVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3RngSeedManager_methods(root_module, cls):
+    ## rng-seed-manager.h (module 'core'): ns3::RngSeedManager::RngSeedManager() [constructor]
+    cls.add_constructor([])
+    ## rng-seed-manager.h (module 'core'): ns3::RngSeedManager::RngSeedManager(ns3::RngSeedManager const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::RngSeedManager const &', 'arg0')])
+    ## rng-seed-manager.h (module 'core'): static uint64_t ns3::RngSeedManager::GetNextStreamIndex() [member function]
+    cls.add_method('GetNextStreamIndex', 
+                   'uint64_t', 
+                   [], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static uint64_t ns3::RngSeedManager::GetRun() [member function]
+    cls.add_method('GetRun', 
+                   'uint64_t', 
+                   [], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static uint32_t ns3::RngSeedManager::GetSeed() [member function]
+    cls.add_method('GetSeed', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static void ns3::RngSeedManager::SetRun(uint64_t run) [member function]
+    cls.add_method('SetRun', 
+                   'void', 
+                   [param('uint64_t', 'run')], 
+                   is_static=True)
+    ## rng-seed-manager.h (module 'core'): static void ns3::RngSeedManager::SetSeed(uint32_t seed) [member function]
+    cls.add_method('SetSeed', 
+                   'void', 
+                   [param('uint32_t', 'seed')], 
+                   is_static=True)
+    return
+
+def register_Ns3SequenceNumber32_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('+', root_module['ns3::SequenceNumber32'], root_module['ns3::SequenceNumber32'], param('ns3::SequenceNumber< unsigned int, int > const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::SequenceNumber32'], root_module['ns3::SequenceNumber32'], param('int', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('int', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::SequenceNumber32'], root_module['ns3::SequenceNumber32'], param('int', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('int', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('>=')
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int>::SequenceNumber() [constructor]
+    cls.add_constructor([])
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int>::SequenceNumber(unsigned int value) [constructor]
+    cls.add_constructor([param('unsigned int', 'value')])
+    ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int>::SequenceNumber(ns3::SequenceNumber<unsigned int, int> const & value) [copy constructor]
+    cls.add_constructor([param('ns3::SequenceNumber< unsigned int, int > const &', 'value')])
+    ## sequence-number.h (module 'network'): unsigned int ns3::SequenceNumber<unsigned int, int>::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'unsigned int', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3SequentialVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::SequentialVariable::SequentialVariable(ns3::SequentialVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SequentialVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::SequentialVariable::SequentialVariable(double f, double l, double i=1, uint32_t c=1) [constructor]
+    cls.add_constructor([param('double', 'f'), param('double', 'l'), param('double', 'i', default_value='1'), param('uint32_t', 'c', default_value='1')])
+    ## random-variable.h (module 'core'): ns3::SequentialVariable::SequentialVariable(double f, double l, ns3::RandomVariable const & i, uint32_t c=1) [constructor]
+    cls.add_constructor([param('double', 'f'), param('double', 'l'), param('ns3::RandomVariable const &', 'i'), param('uint32_t', 'c', default_value='1')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount(ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Simulator_methods(root_module, cls):
+    ## simulator.h (module 'core'): ns3::Simulator::Simulator(ns3::Simulator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Simulator const &', 'arg0')])
+    ## simulator.h (module 'core'): static void ns3::Simulator::Cancel(ns3::EventId const & id) [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetContext() [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetDelayLeft(ns3::EventId const & id) [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Ptr<ns3::SimulatorImpl> ns3::Simulator::GetImplementation() [member function]
+    cls.add_method('GetImplementation', 
+                   'ns3::Ptr< ns3::SimulatorImpl >', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetMaximumSimulationTime() [member function]
+    cls.add_method('GetMaximumSimulationTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetSystemId() [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsExpired(ns3::EventId const & id) [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsFinished() [member function]
+    cls.add_method('IsFinished', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::Now() [member function]
+    cls.add_method('Now', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Remove(ns3::EventId const & id) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetImplementation(ns3::Ptr<ns3::SimulatorImpl> impl) [member function]
+    cls.add_method('SetImplementation', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimulatorImpl >', 'impl')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
+    cls.add_method('SetScheduler', 
+                   'void', 
+                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time const &', 'time')], 
+                   is_static=True)
+    return
+
+def register_Ns3Tag_methods(root_module, cls):
+    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
+    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'o')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): double ns3::TagBuffer::ReadDouble() [member function]
+    cls.add_method('ReadDouble', 
+                   'double', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint16_t ns3::TagBuffer::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint32_t ns3::TagBuffer::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint64_t ns3::TagBuffer::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint8_t ns3::TagBuffer::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::TrimAtEnd(uint32_t trim) [member function]
+    cls.add_method('TrimAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'trim')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteDouble(double v) [member function]
+    cls.add_method('WriteDouble', 
+                   'void', 
+                   [param('double', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU64(uint64_t v) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU8(uint8_t v) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'v')])
+    return
+
+def register_Ns3TimeWithUnit_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::TimeWithUnit const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeWithUnit const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::Time const time, ns3::Time::Unit const unit) [constructor]
+    cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
+    return
+
+def register_Ns3TracedValue__Ns3NdnFibFaceMetricStatus_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::TracedValue(ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::ndn::fib::FaceMetric::Status > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::TracedValue(ns3::ndn::fib::FaceMetric::Status const & v) [constructor]
+    cls.add_constructor([param('ns3::ndn::fib::FaceMetric::Status const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    cls.add_method('Disconnect', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): ns3::ndn::fib::FaceMetric::Status ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ndn::fib::FaceMetric::Status', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status>::Set(ns3::ndn::fib::FaceMetric::Status const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ndn::fib::FaceMetric::Status const &', 'v')])
+    return
+
+def register_Ns3TriangularVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::TriangularVariable::TriangularVariable(ns3::TriangularVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TriangularVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::TriangularVariable::TriangularVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::TriangularVariable::TriangularVariable(double s, double l, double mean) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'l'), param('double', 'mean')])
+    return
+
+def register_Ns3TypeId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
+    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'o')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, uint32_t flags, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('uint32_t', 'flags'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
+    cls.add_method('GetAttribute', 
+                   'ns3::TypeId::AttributeInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetAttributeFullName(uint32_t i) const [member function]
+    cls.add_method('GetAttributeFullName', 
+                   'std::string', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetAttributeN() const [member function]
+    cls.add_method('GetAttributeN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::Callback<ns3::ObjectBase*,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> ns3::TypeId::GetConstructor() const [member function]
+    cls.add_method('GetConstructor', 
+                   'ns3::Callback< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetGroupName() const [member function]
+    cls.add_method('GetGroupName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetHash() const [member function]
+    cls.add_method('GetHash', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::GetRegistered(uint32_t i) [member function]
+    cls.add_method('GetRegistered', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'i')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static uint32_t ns3::TypeId::GetRegisteredN() [member function]
+    cls.add_method('GetRegisteredN', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
+    cls.add_method('GetTraceSource', 
+                   'ns3::TypeId::TraceSourceInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetTraceSourceN() const [member function]
+    cls.add_method('GetTraceSourceN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint16_t ns3::TypeId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasConstructor() const [member function]
+    cls.add_method('HasConstructor', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasParent() const [member function]
+    cls.add_method('HasParent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::HideFromDocumentation() [member function]
+    cls.add_method('HideFromDocumentation', 
+                   'ns3::TypeId', 
+                   [])
+    ## type-id.h (module 'core'): bool ns3::TypeId::IsChildOf(ns3::TypeId other) const [member function]
+    cls.add_method('IsChildOf', 
+                   'bool', 
+                   [param('ns3::TypeId', 'other')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::LookupAttributeByName(std::string name, ns3::TypeId::AttributeInformation * info) const [member function]
+    cls.add_method('LookupAttributeByName', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::TypeId::AttributeInformation *', 'info', transfer_ownership=False)], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByHash(uint32_t hash) [member function]
+    cls.add_method('LookupByHash', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'hash')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static bool ns3::TypeId::LookupByHashFailSafe(uint32_t hash, ns3::TypeId * tid) [member function]
+    cls.add_method('LookupByHashFailSafe', 
+                   'bool', 
+                   [param('uint32_t', 'hash'), param('ns3::TypeId *', 'tid')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByName(std::string name) [member function]
+    cls.add_method('LookupByName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::TraceSourceAccessor const> ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function]
+    cls.add_method('LookupTraceSourceByName', 
+                   'ns3::Ptr< ns3::TraceSourceAccessor const >', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::MustHideFromDocumentation() const [member function]
+    cls.add_method('MustHideFromDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::SetAttributeInitialValue(uint32_t i, ns3::Ptr<ns3::AttributeValue const> initialValue) [member function]
+    cls.add_method('SetAttributeInitialValue', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ptr< ns3::AttributeValue const >', 'initialValue')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetGroupName(std::string groupName) [member function]
+    cls.add_method('SetGroupName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'groupName')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent(ns3::TypeId tid) [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
+    cls.add_method('SetUid', 
+                   'void', 
+                   [param('uint16_t', 'tid')])
+    return
+
+def register_Ns3TypeIdAttributeInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation(ns3::TypeId::AttributeInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::AttributeInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::AttributeAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::flags [variable]
+    cls.add_instance_attribute('flags', 'uint32_t', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::initialValue [variable]
+    cls.add_instance_attribute('initialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::originalInitialValue [variable]
+    cls.add_instance_attribute('originalInitialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    return
+
+def register_Ns3TypeIdTraceSourceInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation(ns3::TypeId::TraceSourceInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    return
+
+def register_Ns3UniformVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::UniformVariable::UniformVariable(ns3::UniformVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UniformVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::UniformVariable::UniformVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::UniformVariable::UniformVariable(double s, double l) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'l')])
+    ## random-variable.h (module 'core'): uint32_t ns3::UniformVariable::GetInteger(uint32_t s, uint32_t l) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 's'), param('uint32_t', 'l')])
+    ## random-variable.h (module 'core'): double ns3::UniformVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::UniformVariable::GetValue(double s, double l) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 's'), param('double', 'l')])
+    return
+
+def register_Ns3WeibullVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(ns3::WeibullVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WeibullVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(double m) [constructor]
+    cls.add_constructor([param('double', 'm')])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(double m, double s) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's')])
+    ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(double m, double s, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's'), param('double', 'b')])
+    return
+
+def register_Ns3ZetaVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ZetaVariable::ZetaVariable(ns3::ZetaVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ZetaVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ZetaVariable::ZetaVariable(double alpha) [constructor]
+    cls.add_constructor([param('double', 'alpha')])
+    ## random-variable.h (module 'core'): ns3::ZetaVariable::ZetaVariable() [constructor]
+    cls.add_constructor([])
+    return
+
+def register_Ns3ZipfVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ZipfVariable::ZipfVariable(ns3::ZipfVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ZipfVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ZipfVariable::ZipfVariable(long int N, double alpha) [constructor]
+    cls.add_constructor([param('long int', 'N'), param('double', 'alpha')])
+    ## random-variable.h (module 'core'): ns3::ZipfVariable::ZipfVariable() [constructor]
+    cls.add_constructor([])
+    return
+
+def register_Ns3Empty_methods(root_module, cls):
+    ## empty.h (module 'core'): ns3::empty::empty() [constructor]
+    cls.add_constructor([])
+    ## empty.h (module 'core'): ns3::empty::empty(ns3::empty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::empty const &', 'arg0')])
+    return
+
+def register_Ns3Int64x64_t_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_unary_numeric_operator('-')
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
+    cls.add_constructor([])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long double v) [constructor]
+    cls.add_constructor([param('long double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t hi, uint64_t lo) [constructor]
+    cls.add_constructor([param('int64_t', 'hi'), param('uint64_t', 'lo')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [copy constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): double ns3::int64x64_t::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): int64_t ns3::int64x64_t::GetHigh() const [member function]
+    cls.add_method('GetHigh', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
+    cls.add_method('GetLow', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): static ns3::int64x64_t ns3::int64x64_t::Invert(uint64_t v) [member function]
+    cls.add_method('Invert', 
+                   'ns3::int64x64_t', 
+                   [param('uint64_t', 'v')], 
+                   is_static=True)
+    ## int64x64-double.h (module 'core'): void ns3::int64x64_t::MulByInvert(ns3::int64x64_t const & o) [member function]
+    cls.add_method('MulByInvert', 
+                   'void', 
+                   [param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::implementation [variable]
+    cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
+    return
+
+def register_Ns3Chunk_methods(root_module, cls):
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
+    cls.add_constructor([])
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
+    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3ConstantVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ConstantVariable::ConstantVariable(ns3::ConstantVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ConstantVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ConstantVariable::ConstantVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ConstantVariable::ConstantVariable(double c) [constructor]
+    cls.add_constructor([param('double', 'c')])
+    ## random-variable.h (module 'core'): void ns3::ConstantVariable::SetConstant(double c) [member function]
+    cls.add_method('SetConstant', 
+                   'void', 
+                   [param('double', 'c')])
+    return
+
+def register_Ns3DeterministicVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::DeterministicVariable::DeterministicVariable(ns3::DeterministicVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeterministicVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::DeterministicVariable::DeterministicVariable(double * d, uint32_t c) [constructor]
+    cls.add_constructor([param('double *', 'd'), param('uint32_t', 'c')])
+    return
+
+def register_Ns3EmpiricalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::EmpiricalVariable::EmpiricalVariable(ns3::EmpiricalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmpiricalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::EmpiricalVariable::EmpiricalVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): void ns3::EmpiricalVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
+                   'void', 
+                   [param('double', 'v'), param('double', 'c')])
+    return
+
+def register_Ns3ErlangVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ErlangVariable::ErlangVariable(ns3::ErlangVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ErlangVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ErlangVariable::ErlangVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ErlangVariable::ErlangVariable(unsigned int k, double lambda) [constructor]
+    cls.add_constructor([param('unsigned int', 'k'), param('double', 'lambda')])
+    ## random-variable.h (module 'core'): double ns3::ErlangVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::ErlangVariable::GetValue(unsigned int k, double lambda) const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('unsigned int', 'k'), param('double', 'lambda')], 
+                   is_const=True)
+    return
+
+def register_Ns3ExponentialVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable(ns3::ExponentialVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ExponentialVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable(double m) [constructor]
+    cls.add_constructor([param('double', 'm')])
+    ## random-variable.h (module 'core'): ns3::ExponentialVariable::ExponentialVariable(double m, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 'b')])
+    return
+
+def register_Ns3GammaVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::GammaVariable::GammaVariable(ns3::GammaVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::GammaVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::GammaVariable::GammaVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::GammaVariable::GammaVariable(double alpha, double beta) [constructor]
+    cls.add_constructor([param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable.h (module 'core'): double ns3::GammaVariable::GetValue() const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): double ns3::GammaVariable::GetValue(double alpha, double beta) const [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')], 
+                   is_const=True)
+    return
+
+def register_Ns3Header_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## header.h (module 'network'): ns3::Header::Header() [constructor]
+    cls.add_constructor([])
+    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Header const &', 'arg0')])
+    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3IntEmpiricalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::IntEmpiricalVariable::IntEmpiricalVariable(ns3::IntEmpiricalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntEmpiricalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::IntEmpiricalVariable::IntEmpiricalVariable() [constructor]
+    cls.add_constructor([])
+    return
+
+def register_Ns3LogNormalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::LogNormalVariable::LogNormalVariable(ns3::LogNormalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LogNormalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::LogNormalVariable::LogNormalVariable(double mu, double sigma) [constructor]
+    cls.add_constructor([param('double', 'mu'), param('double', 'sigma')])
+    return
+
+def register_Ns3NormalVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable(ns3::NormalVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NormalVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable(double m, double v) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 'v')])
+    ## random-variable.h (module 'core'): ns3::NormalVariable::NormalVariable(double m, double v, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 'v'), param('double', 'b')])
+    return
+
+def register_Ns3Object_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::Object() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): void ns3::Object::AggregateObject(ns3::Ptr<ns3::Object> other) [member function]
+    cls.add_method('AggregateObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'other')])
+    ## object.h (module 'core'): void ns3::Object::Dispose() [member function]
+    cls.add_method('Dispose', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator ns3::Object::GetAggregateIterator() const [member function]
+    cls.add_method('GetAggregateIterator', 
+                   'ns3::Object::AggregateIterator', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::TypeId ns3::Object::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::ndn::ContentStore> ns3::Object::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::ndn::ContentStore >', 
+                   [], 
+                   is_const=True, template_parameters=['ns3::ndn::ContentStore'])
+    ## object.h (module 'core'): ns3::Ptr<ns3::ndn::Fib> ns3::Object::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::ndn::Fib >', 
+                   [], 
+                   is_const=True, template_parameters=['ns3::ndn::Fib'])
+    ## object.h (module 'core'): ns3::Ptr<ns3::ndn::Pit> ns3::Object::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::ndn::Pit >', 
+                   [], 
+                   is_const=True, template_parameters=['ns3::ndn::Pit'])
+    ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object.h (module 'core'): void ns3::Object::Initialize() [member function]
+    cls.add_method('Initialize', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::Object(ns3::Object const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Object const &', 'o')], 
+                        visibility='protected')
+    ## object.h (module 'core'): void ns3::Object::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectAggregateIterator_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator(ns3::Object::AggregateIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Object::AggregateIterator const &', 'arg0')])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): bool ns3::Object::AggregateIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::Object const> ns3::Object::AggregateIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::Object const >', 
+                   [])
+    return
+
+def register_Ns3ParetoVariable_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(ns3::ParetoVariable const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ParetoVariable const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(double m) [constructor]
+    cls.add_constructor([param('double', 'm')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(double m, double s) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(double m, double s, double b) [constructor]
+    cls.add_constructor([param('double', 'm'), param('double', 's'), param('double', 'b')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(std::pair<double,double> params) [constructor]
+    cls.add_constructor([param('std::pair< double, double >', 'params')])
+    ## random-variable.h (module 'core'): ns3::ParetoVariable::ParetoVariable(std::pair<double,double> params, double b) [constructor]
+    cls.add_constructor([param('std::pair< double, double >', 'params'), param('double', 'b')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3L2Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3L2Tracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter< ns3::L2Tracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::L2Tracer, ns3::empty, ns3::DefaultDeleter<ns3::L2Tracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TopologyReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3TopologyReader__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter< ns3::TopologyReader > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TopologyReader, ns3::empty, ns3::DefaultDeleter<ns3::TopologyReader> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnAppDelayTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnAppDelayTracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::AppDelayTracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::AppDelayTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::AppDelayTracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnCsTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsTracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::CsTracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::CsTracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::CsTracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnData_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnData__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Data > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Data, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Data> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnExclude_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnExclude__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Exclude > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Exclude, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Exclude> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnFaceContainer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::FaceContainer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::FaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::FaceContainer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnInterest_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnInterest__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Interest > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Interest, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Interest> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnL3Tracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter< ns3::ndn::L3Tracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::L3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::ndn::L3Tracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnName_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnName__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter< ns3::ndn::Name > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnCsEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnCsEntry__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter< ns3::ndn::cs::Entry > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::cs::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::cs::Entry> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NdnPitEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3NdnPitEntry__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter< ns3::ndn::pit::Entry > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit) const [member function]
+    cls.add_method('As', 
+                   'ns3::TimeWithUnit', 
+                   [param('ns3::Time::Unit const', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    return
+
+def register_Ns3TopologyReader_methods(root_module, cls):
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::TopologyReader() [constructor]
+    cls.add_constructor([])
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::AddLink(ns3::TopologyReader::Link link) [member function]
+    cls.add_method('AddLink', 
+                   'void', 
+                   [param('ns3::TopologyReader::Link', 'link')])
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::GetFileName() const [member function]
+    cls.add_method('GetFileName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::_List_const_iterator<ns3::TopologyReader::Link> ns3::TopologyReader::LinksBegin() const [member function]
+    cls.add_method('LinksBegin', 
+                   'std::_List_const_iterator< ns3::TopologyReader::Link >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): bool ns3::TopologyReader::LinksEmpty() const [member function]
+    cls.add_method('LinksEmpty', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::_List_const_iterator<ns3::TopologyReader::Link> ns3::TopologyReader::LinksEnd() const [member function]
+    cls.add_method('LinksEnd', 
+                   'std::_List_const_iterator< ns3::TopologyReader::Link >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): int ns3::TopologyReader::LinksSize() const [member function]
+    cls.add_method('LinksSize', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::NodeContainer ns3::TopologyReader::Read() [member function]
+    cls.add_method('Read', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::SetFileName(std::string const & fileName) [member function]
+    cls.add_method('SetFileName', 
+                   'void', 
+                   [param('std::string const &', 'fileName')])
+    return
+
+def register_Ns3TopologyReaderLink_methods(root_module, cls):
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link::Link(ns3::TopologyReader::Link const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TopologyReader::Link const &', 'arg0')])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link::Link() [constructor]
+    cls.add_constructor([])
+    ## topology-reader.h (module 'topology-read'): ns3::TopologyReader::Link::Link(ns3::Ptr<ns3::Node> fromPtr, std::string const & fromName, ns3::Ptr<ns3::Node> toPtr, std::string const & toName) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'fromPtr'), param('std::string const &', 'fromName'), param('ns3::Ptr< ns3::Node >', 'toPtr'), param('std::string const &', 'toName')])
+    ## topology-reader.h (module 'topology-read'): std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ns3::TopologyReader::Link::AttributesBegin() [member function]
+    cls.add_method('AttributesBegin', 
+                   'std::_Rb_tree_const_iterator< std::pair< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >', 
+                   [])
+    ## topology-reader.h (module 'topology-read'): std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ns3::TopologyReader::Link::AttributesEnd() [member function]
+    cls.add_method('AttributesEnd', 
+                   'std::_Rb_tree_const_iterator< std::pair< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >', 
+                   [])
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::Link::GetAttribute(std::string const & name) const [member function]
+    cls.add_method('GetAttribute', 
+                   'std::string', 
+                   [param('std::string const &', 'name')], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): bool ns3::TopologyReader::Link::GetAttributeFailSafe(std::string const & name, std::string & value) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string const &', 'name'), param('std::string &', 'value')], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::NetDevice> ns3::TopologyReader::Link::GetFromNetDevice() const [member function]
+    cls.add_method('GetFromNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::Node> ns3::TopologyReader::Link::GetFromNode() const [member function]
+    cls.add_method('GetFromNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::Link::GetFromNodeName() const [member function]
+    cls.add_method('GetFromNodeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::NetDevice> ns3::TopologyReader::Link::GetToNetDevice() const [member function]
+    cls.add_method('GetToNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): ns3::Ptr<ns3::Node> ns3::TopologyReader::Link::GetToNode() const [member function]
+    cls.add_method('GetToNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): std::string ns3::TopologyReader::Link::GetToNodeName() const [member function]
+    cls.add_method('GetToNodeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::Link::SetAttribute(std::string const & name, std::string const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string const &', 'name'), param('std::string const &', 'value')])
+    ## topology-reader.h (module 'topology-read'): void ns3::TopologyReader::Link::SetNetDevices(ns3::Ptr<ns3::NetDevice> from, ns3::Ptr<ns3::NetDevice> to) [member function]
+    cls.add_method('SetNetDevices', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'from'), param('ns3::Ptr< ns3::NetDevice >', 'to')])
+    return
+
+def register_Ns3TraceSourceAccessor_methods(root_module, cls):
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor() [constructor]
+    cls.add_constructor([])
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Connect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Connect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Disconnect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Trailer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
+    cls.add_constructor([])
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'end')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AnnotatedTopologyReader_methods(root_module, cls):
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="", double scale=1.0e+0) [constructor]
+    cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::NodeContainer ns3::AnnotatedTopologyReader::Read() [member function]
+    cls.add_method('Read', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::NodeContainer ns3::AnnotatedTopologyReader::GetNodes() const [member function]
+    cls.add_method('GetNodes', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): std::list<ns3::TopologyReader::Link, std::allocator<ns3::TopologyReader::Link> > const & ns3::AnnotatedTopologyReader::GetLinks() const [member function]
+    cls.add_method('GetLinks', 
+                   'std::list< ns3::TopologyReader::Link > const &', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::AssignIpv4Addresses(ns3::Ipv4Address base) [member function]
+    cls.add_method('AssignIpv4Addresses', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'base')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SetBoundingBox(double ulx, double uly, double lrx, double lry) [member function]
+    cls.add_method('SetBoundingBox', 
+                   'void', 
+                   [param('double', 'ulx'), param('double', 'uly'), param('double', 'lrx'), param('double', 'lry')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SetMobilityModel(std::string const & model) [member function]
+    cls.add_method('SetMobilityModel', 
+                   'void', 
+                   [param('std::string const &', 'model')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::ApplyOspfMetric() [member function]
+    cls.add_method('ApplyOspfMetric', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SaveTopology(std::string const & file) [member function]
+    cls.add_method('SaveTopology', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::SaveGraphviz(std::string const & file) [member function]
+    cls.add_method('SaveGraphviz', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_virtual=True)
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::Ptr<ns3::Node> ns3::AnnotatedTopologyReader::CreateNode(std::string const name, uint32_t systemId) [member function]
+    cls.add_method('CreateNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('std::string const', 'name'), param('uint32_t', 'systemId')], 
+                   visibility='protected')
+    ## annotated-topology-reader.h (module 'ndnSIM'): ns3::Ptr<ns3::Node> ns3::AnnotatedTopologyReader::CreateNode(std::string const name, double posX, double posY, uint32_t systemId) [member function]
+    cls.add_method('CreateNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('std::string const', 'name'), param('double', 'posX'), param('double', 'posY'), param('uint32_t', 'systemId')], 
+                   visibility='protected')
+    ## annotated-topology-reader.h (module 'ndnSIM'): void ns3::AnnotatedTopologyReader::ApplySettings() [member function]
+    cls.add_method('ApplySettings', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    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')])
+    ## application.h (module 'network'): ns3::Application::Application() [constructor]
+    cls.add_constructor([])
+    ## application.h (module 'network'): ns3::Ptr<ns3::Node> ns3::Application::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## application.h (module 'network'): static ns3::TypeId ns3::Application::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## application.h (module 'network'): void ns3::Application::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## application.h (module 'network'): void ns3::Application::SetStartTime(ns3::Time start) [member function]
+    cls.add_method('SetStartTime', 
+                   'void', 
+                   [param('ns3::Time', 'start')])
+    ## application.h (module 'network'): void ns3::Application::SetStopTime(ns3::Time stop) [member function]
+    cls.add_method('SetStopTime', 
+                   'void', 
+                   [param('ns3::Time', 'stop')])
+    ## application.h (module 'network'): void ns3::Application::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## application.h (module 'network'): void ns3::Application::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## application.h (module 'network'): void ns3::Application::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## application.h (module 'network'): void ns3::Application::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=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')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
+def register_Ns3CallbackBasedApp_methods(root_module, cls):
+    ## callback-based-app.h (module 'ndnSIM'): ns3::CallbackBasedApp::CallbackBasedApp(ns3::CallbackBasedApp const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBasedApp const &', 'arg0')])
+    ## callback-based-app.h (module 'ndnSIM'): ns3::CallbackBasedApp::CallbackBasedApp() [constructor]
+    cls.add_constructor([])
+    ## callback-based-app.h (module 'ndnSIM'): static ns3::TypeId ns3::CallbackBasedApp::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::SetOnStartCallback(ns3::Callback<void, ns3::Ptr<ns3::Application>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onStart) [member function]
+    cls.add_method('SetOnStartCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Application >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onStart')])
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::SetOnStopCallback(ns3::Callback<void, ns3::Ptr<ns3::Application>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onStart) [member function]
+    cls.add_method('SetOnStopCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Application >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onStart')])
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## callback-based-app.h (module 'ndnSIM'): void ns3::CallbackBasedApp::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3DoubleValue_methods(root_module, cls):
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
+    cls.add_constructor([])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
+    cls.add_constructor([param('double const &', 'value')])
+    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('double const &', 'value')])
+    return
+
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int v, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'v'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int v, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'v'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int', 'v')])
+    return
+
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+    cls.add_constructor([])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
+    return
+
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3L2Tracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## l2-tracer.h (module 'ndnSIM'): ns3::L2Tracer::L2Tracer(ns3::L2Tracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::L2Tracer const &', 'arg0')])
+    ## l2-tracer.h (module 'ndnSIM'): ns3::L2Tracer::L2Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::Drop(ns3::Ptr<ns3::Packet const> arg0) [member function]
+    cls.add_method('Drop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## l2-tracer.h (module 'ndnSIM'): void ns3::L2Tracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
+    cls.add_constructor([])
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,const ns3::Address&,ns3::NetDevice::PacketType,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3Node_methods(root_module, cls):
+    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Node const &', 'arg0')])
+    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+    cls.add_constructor([])
+    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
+    cls.add_constructor([param('uint32_t', 'systemId')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('AddApplication', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddDevice', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
+    cls.add_method('ChecksumEnabled', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
+    cls.add_method('GetApplication', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
+    cls.add_method('GetNApplications', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('RegisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
+    cls.add_method('RegisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('UnregisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler) [member function]
+    cls.add_method('UnregisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(std::string const & buffer) [constructor]
+    cls.add_constructor([param('std::string const &', 'buffer')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   deprecated=True, is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
+                   is_const=True)
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    return
+
+def register_Ns3RandomVariableChecker_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::RandomVariableChecker::RandomVariableChecker() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::RandomVariableChecker::RandomVariableChecker(ns3::RandomVariableChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::RandomVariableChecker const &', 'arg0')])
+    return
+
+def register_Ns3RandomVariableValue_methods(root_module, cls):
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue::RandomVariableValue() [constructor]
+    cls.add_constructor([])
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue::RandomVariableValue(ns3::RandomVariableValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::RandomVariableValue const &', 'arg0')])
+    ## random-variable.h (module 'core'): ns3::RandomVariableValue::RandomVariableValue(ns3::RandomVariable const & value) [constructor]
+    cls.add_constructor([param('ns3::RandomVariable const &', 'value')])
+    ## random-variable.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::RandomVariableValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## random-variable.h (module 'core'): bool ns3::RandomVariableValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## random-variable.h (module 'core'): ns3::RandomVariable ns3::RandomVariableValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::RandomVariable', 
+                   [], 
+                   is_const=True)
+    ## random-variable.h (module 'core'): std::string ns3::RandomVariableValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## random-variable.h (module 'core'): void ns3::RandomVariableValue::Set(ns3::RandomVariable const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::RandomVariable const &', 'value')])
+    return
+
+def register_Ns3RocketfuelWeightsReader_methods(root_module, cls):
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::RocketfuelWeightsReader::RocketfuelWeightsReader(std::string const & path="", double scale=1.0e+0) [constructor]
+    cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::SetFileType(uint8_t inputType) [member function]
+    cls.add_method('SetFileType', 
+                   'void', 
+                   [param('uint8_t', 'inputType')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): ns3::NodeContainer ns3::RocketfuelWeightsReader::Read() [member function]
+    cls.add_method('Read', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_virtual=True)
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::Commit() [member function]
+    cls.add_method('Commit', 
+                   'void', 
+                   [])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::SetDefaultBandwidth(std::string const & bw) [member function]
+    cls.add_method('SetDefaultBandwidth', 
+                   'void', 
+                   [param('std::string const &', 'bw')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): std::string ns3::RocketfuelWeightsReader::GetDefaultBandwidth() const [member function]
+    cls.add_method('GetDefaultBandwidth', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): void ns3::RocketfuelWeightsReader::SetDefaultQueue(std::string const & queue) [member function]
+    cls.add_method('SetDefaultQueue', 
+                   'void', 
+                   [param('std::string const &', 'queue')])
+    ## rocketfuel-weights-reader.h (module 'ndnSIM'): std::string ns3::RocketfuelWeightsReader::GetDefaultQueue() const [member function]
+    cls.add_method('GetDefaultQueue', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
+    return
+
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint64_t const &', 'value')])
+    return
+
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3L2RateTracer_methods(root_module, cls):
+    ## l2-rate-tracer.h (module 'ndnSIM'): ns3::L2RateTracer::L2RateTracer(ns3::L2RateTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::L2RateTracer const &', 'arg0')])
+    ## l2-rate-tracer.h (module 'ndnSIM'): ns3::L2RateTracer::L2RateTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## l2-rate-tracer.h (module 'ndnSIM'): static void ns3::L2RateTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::Drop(ns3::Ptr<ns3::Packet const> arg0) [member function]
+    cls.add_method('Drop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
+                   is_virtual=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): static void ns3::L2RateTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## l2-rate-tracer.h (module 'ndnSIM'): void ns3::L2RateTracer::SetAveragingPeriod(ns3::Time const & period) [member function]
+    cls.add_method('SetAveragingPeriod', 
+                   'void', 
+                   [param('ns3::Time const &', 'period')])
+    return
+
+def register_Ns3HashImplementation_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation() [constructor]
+    cls.add_constructor([])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Implementation::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Implementation::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a(ns3::Hash::Function::Fnv1a const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Fnv1a const &', 'arg0')])
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a() [constructor]
+    cls.add_constructor([])
+    ## hash-fnv.h (module 'core'): uint32_t ns3::Hash::Function::Fnv1a::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): uint64_t ns3::Hash::Function::Fnv1a::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): void ns3::Hash::Function::Fnv1a::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash32_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Function::Hash32 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash32 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Hash32Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash32Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash32::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash32::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash64_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Function::Hash64 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash64 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Hash64Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash64Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash64::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Function::Hash64::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash64::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionMurmur3_methods(root_module, cls):
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3(ns3::Hash::Function::Murmur3 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Murmur3 const &', 'arg0')])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3() [constructor]
+    cls.add_constructor([])
+    ## hash-murmur3.h (module 'core'): uint32_t ns3::Hash::Function::Murmur3::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): uint64_t ns3::Hash::Function::Murmur3::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): void ns3::Hash::Function::Murmur3::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NdnApp_methods(root_module, cls):
+    ## ndn-app.h (module 'ndnSIM'): ns3::ndn::App::App(ns3::ndn::App const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::App const &', 'arg0')])
+    ## ndn-app.h (module 'ndnSIM'): ns3::ndn::App::App() [constructor]
+    cls.add_constructor([])
+    ## ndn-app.h (module 'ndnSIM'): uint32_t ns3::ndn::App::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-app.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::App::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::OnData(ns3::Ptr<ns3::ndn::Data const> contentObject) [member function]
+    cls.add_method('OnData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'contentObject')], 
+                   is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::OnInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('OnInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::OnNack(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('OnNack', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-app.h (module 'ndnSIM'): void ns3::ndn::App::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnAppDelayTracer_methods(root_module, cls):
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer::AppDelayTracer(ns3::ndn::AppDelayTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::AppDelayTracer const &', 'arg0')])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer::AppDelayTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): ns3::ndn::AppDelayTracer::AppDelayTracer(boost::shared_ptr<std::ostream> os, std::string const & node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'node')])
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::Install(ns3::NodeContainer const & nodes, std::string const & file) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::AppDelayTracer> ns3::ndn::AppDelayTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::AppDelayTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): static void ns3::ndn::AppDelayTracer::InstallAll(std::string const & file) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_static=True)
+    ## ndn-app-delay-tracer.h (module 'ndnSIM'): void ns3::ndn::AppDelayTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnAppHelper_methods(root_module, cls):
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ndn::AppHelper::AppHelper(ns3::ndn::AppHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::AppHelper const &', 'arg0')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ndn::AppHelper::AppHelper(std::string const & prefix) [constructor]
+    cls.add_constructor([param('std::string const &', 'prefix')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ApplicationContainer ns3::ndn::AppHelper::Install(ns3::NodeContainer c) [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('ns3::NodeContainer', 'c')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ApplicationContainer ns3::ndn::AppHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-app-helper.h (module 'ndnSIM'): ns3::ApplicationContainer ns3::ndn::AppHelper::Install(std::string nodeName) [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('std::string', 'nodeName')])
+    ## ndn-app-helper.h (module 'ndnSIM'): void ns3::ndn::AppHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## ndn-app-helper.h (module 'ndnSIM'): void ns3::ndn::AppHelper::SetPrefix(std::string const & prefix) [member function]
+    cls.add_method('SetPrefix', 
+                   'void', 
+                   [param('std::string const &', 'prefix')])
+    return
+
+def register_Ns3NdnBlob_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob(ns3::ndn::Blob const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Blob const &', 'arg0')])
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob() [constructor]
+    cls.add_constructor([])
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob(std::string const & data) [constructor]
+    cls.add_constructor([param('std::string const &', 'data')])
+    ## blob.h (module 'ndnSIM'): ns3::ndn::Blob::Blob(void const * buf, size_t length) [constructor]
+    cls.add_constructor([param('void const *', 'buf'), param('size_t', 'length')])
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::begin() [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< char *, std::vector< char > >', 
+                   [])
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char const*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::begin() const [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< char const *, std::vector< char > >', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): char * ns3::ndn::Blob::buf() [member function]
+    cls.add_method('buf', 
+                   'char *', 
+                   [])
+    ## blob.h (module 'ndnSIM'): char const * ns3::ndn::Blob::buf() const [member function]
+    cls.add_method('buf', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): void ns3::ndn::Blob::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [])
+    ## blob.h (module 'ndnSIM'): bool ns3::ndn::Blob::empty() const [member function]
+    cls.add_method('empty', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::end() [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< char *, std::vector< char > >', 
+                   [])
+    ## blob.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<char const*, std::vector<char, std::allocator<char> > > ns3::ndn::Blob::end() const [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< char const *, std::vector< char > >', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): char ns3::ndn::Blob::getItem(size_t pos) const [member function]
+    cls.add_method('getItem', 
+                   'char', 
+                   [param('size_t', 'pos')], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): void ns3::ndn::Blob::push_back(char val) [member function]
+    cls.add_method('push_back', 
+                   'void', 
+                   [param('char', 'val')])
+    ## blob.h (module 'ndnSIM'): size_t ns3::ndn::Blob::size() const [member function]
+    cls.add_method('size', 
+                   'size_t', 
+                   [], 
+                   is_const=True)
+    ## blob.h (module 'ndnSIM'): void ns3::ndn::Blob::swap(ns3::ndn::Blob & x) [member function]
+    cls.add_method('swap', 
+                   'void', 
+                   [param('ns3::ndn::Blob &', 'x')])
+    return
+
+def register_Ns3NdnContentStore_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::ContentStore::ContentStore() [constructor]
+    cls.add_constructor([])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::ContentStore::ContentStore(ns3::ndn::ContentStore const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::ContentStore const &', 'arg0')])
+    ## ndn-content-store.h (module 'ndnSIM'): bool ns3::ndn::ContentStore::Add(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('Add', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::cs::Entry> ns3::ndn::ContentStore::Begin() [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::cs::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::cs::Entry> ns3::ndn::ContentStore::End() [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::cs::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::ContentStore> ns3::ndn::ContentStore::GetContentStore(ns3::Ptr<ns3::Object> node) [member function]
+    cls.add_method('GetContentStore', 
+                   'ns3::Ptr< ns3::ndn::ContentStore >', 
+                   [param('ns3::Ptr< ns3::Object >', 'node')], 
+                   is_static=True)
+    ## ndn-content-store.h (module 'ndnSIM'): uint32_t ns3::ndn::ContentStore::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::ContentStore::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Data> ns3::ndn::ContentStore::Lookup(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('Lookup', 
+                   'ns3::Ptr< ns3::ndn::Data >', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::cs::Entry> ns3::ndn::ContentStore::Next(ns3::Ptr<ns3::ndn::cs::Entry> arg0) [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::cs::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::cs::Entry >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-content-store.h (module 'ndnSIM'): void ns3::ndn::ContentStore::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NdnCsTracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer::CsTracer(ns3::ndn::CsTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::CsTracer const &', 'arg0')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer::CsTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::CsTracer::CsTracer(boost::shared_ptr<std::ostream> os, std::string const & node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'node')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::Install(ns3::NodeContainer const & nodes, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::CsTracer> ns3::ndn::CsTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::CsTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): static void ns3::ndn::CsTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): void ns3::ndn::CsTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): void ns3::ndn::CsTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnData_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Data::Data(ns3::Ptr<ns3::Packet> payload=ns3::Create( )) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'payload', default_value='ns3::Create( )')])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Data::Data(ns3::ndn::Data const & other) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Data const &', 'other')])
+    ## ndn-data.h (module 'ndnSIM'): ns3::Time ns3::ndn::Data::GetFreshness() const [member function]
+    cls.add_method('GetFreshness', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Name const> ns3::ndn::Data::GetKeyLocator() const [member function]
+    cls.add_method('GetKeyLocator', 
+                   'ns3::Ptr< ns3::ndn::Name const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::Data::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Name const> ns3::ndn::Data::GetNamePtr() const [member function]
+    cls.add_method('GetNamePtr', 
+                   'ns3::Ptr< ns3::ndn::Name const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Data::GetPayload() const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): uint32_t ns3::ndn::Data::GetSignature() const [member function]
+    cls.add_method('GetSignature', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Time ns3::ndn::Data::GetTimestamp() const [member function]
+    cls.add_method('GetTimestamp', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Data::GetWire() const [member function]
+    cls.add_method('GetWire', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetFreshness(ns3::Time const & freshness) [member function]
+    cls.add_method('SetFreshness', 
+                   'void', 
+                   [param('ns3::Time const &', 'freshness')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetKeyLocator(ns3::Ptr<ns3::ndn::Name> keyLocator) [member function]
+    cls.add_method('SetKeyLocator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name >', 'keyLocator')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetName(ns3::Ptr<ns3::ndn::Name> name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name >', 'name')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetName(ns3::ndn::Name const & name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::ndn::Name const &', 'name')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetPayload(ns3::Ptr<ns3::Packet> payload) [member function]
+    cls.add_method('SetPayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'payload')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetSignature(uint32_t signature) [member function]
+    cls.add_method('SetSignature', 
+                   'void', 
+                   [param('uint32_t', 'signature')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetTimestamp(ns3::Time const & timestamp) [member function]
+    cls.add_method('SetTimestamp', 
+                   'void', 
+                   [param('ns3::Time const &', 'timestamp')])
+    ## ndn-data.h (module 'ndnSIM'): void ns3::ndn::Data::SetWire(ns3::Ptr<ns3::Packet const> packet) const [member function]
+    cls.add_method('SetWire', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnDataException_methods(root_module, cls):
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::DataException::DataException() [constructor]
+    cls.add_constructor([])
+    ## ndn-data.h (module 'ndnSIM'): ns3::ndn::DataException::DataException(ns3::ndn::DataException const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::DataException const &', 'arg0')])
+    return
+
+def register_Ns3NdnExclude_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude::Exclude(ns3::ndn::Exclude const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Exclude const &', 'arg0')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude::Exclude() [constructor]
+    cls.add_constructor([])
+    ## exclude.h (module 'ndnSIM'): void ns3::ndn::Exclude::appendExclude(ns3::ndn::name::Component const & name, bool any) [member function]
+    cls.add_method('appendExclude', 
+                   'void', 
+                   [param('ns3::ndn::name::Component const &', 'name'), param('bool', 'any')])
+    ## exclude.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > ns3::ndn::Exclude::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > ns3::ndn::Exclude::end() const [member function]
+    cls.add_method('end', 
+                   'std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeAfter(ns3::ndn::name::Component const & from) [member function]
+    cls.add_method('excludeAfter', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'from')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeBefore(ns3::ndn::name::Component const & to) [member function]
+    cls.add_method('excludeBefore', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'to')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeOne(ns3::ndn::name::Component const & comp) [member function]
+    cls.add_method('excludeOne', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'comp')])
+    ## exclude.h (module 'ndnSIM'): ns3::ndn::Exclude & ns3::ndn::Exclude::excludeRange(ns3::ndn::name::Component const & from, ns3::ndn::name::Component const & to) [member function]
+    cls.add_method('excludeRange', 
+                   'ns3::ndn::Exclude &', 
+                   [param('ns3::ndn::name::Component const &', 'from'), param('ns3::ndn::name::Component const &', 'to')])
+    ## exclude.h (module 'ndnSIM'): bool ns3::ndn::Exclude::isExcluded(ns3::ndn::name::Component const & comp) const [member function]
+    cls.add_method('isExcluded', 
+                   'bool', 
+                   [param('ns3::ndn::name::Component const &', 'comp')], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): std::reverse_iterator<std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > > ns3::ndn::Exclude::rbegin() const [member function]
+    cls.add_method('rbegin', 
+                   'std::reverse_iterator< std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): std::reverse_iterator<std::_Rb_tree_const_iterator<std::pair<ns3::ndn::name::Component const, bool> > > ns3::ndn::Exclude::rend() const [member function]
+    cls.add_method('rend', 
+                   'std::reverse_iterator< std::_Rb_tree_const_iterator< std::pair< ns3::ndn::name::Component const, bool > > >', 
+                   [], 
+                   is_const=True)
+    ## exclude.h (module 'ndnSIM'): size_t ns3::ndn::Exclude::size() const [member function]
+    cls.add_method('size', 
+                   'size_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnFace_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
+    ## ndn-face.h (module 'ndnSIM'): ns3::ndn::Face::Face(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-face.h (module 'ndnSIM'): uint32_t ns3::ndn::Face::GetFlags() const [member function]
+    cls.add_method('GetFlags', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): uint32_t ns3::ndn::Face::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): uint16_t ns3::ndn::Face::GetMetric() const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): ns3::Ptr<ns3::Node> ns3::ndn::Face::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Face::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::IsUp() const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ndn-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::Face::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::ReceiveData(ns3::Ptr<ns3::ndn::Data> data) [member function]
+    cls.add_method('ReceiveData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data >', 'data')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::ReceiveInterest(ns3::Ptr<ns3::ndn::Interest> interest) [member function]
+    cls.add_method('ReceiveInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::RegisterProtocolHandlers(ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Interest>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & interestHandler, ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Data>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & dataHandler) [member function]
+    cls.add_method('RegisterProtocolHandlers', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Interest >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'interestHandler'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Data >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'dataHandler')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::SendData(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('SendData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::SendInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('SendInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetId(uint32_t id) [member function]
+    cls.add_method('SetId', 
+                   'void', 
+                   [param('uint32_t', 'id')])
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetMetric(uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint16_t', 'metric')], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetUp(bool up=true) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('bool', 'up', default_value='true')])
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::UnRegisterProtocolHandlers() [member function]
+    cls.add_method('UnRegisterProtocolHandlers', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::Receive(ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Receive', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): bool ns3::ndn::Face::Send(ns3::Ptr<ns3::Packet> packet) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-face.h (module 'ndnSIM'): void ns3::ndn::Face::SetFlags(uint32_t flags) [member function]
+    cls.add_method('SetFlags', 
+                   'void', 
+                   [param('uint32_t', 'flags')], 
+                   visibility='protected')
+    return
+
+def register_Ns3NdnFaceContainer_methods(root_module, cls):
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::ndn::FaceContainer::FaceContainer() [constructor]
+    cls.add_constructor([])
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::ndn::FaceContainer::FaceContainer(ns3::ndn::FaceContainer const & other) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::FaceContainer const &', 'other')])
+    ## ndn-face-container.h (module 'ndnSIM'): void ns3::ndn::FaceContainer::Add(ns3::Ptr<ns3::ndn::Face> const & face) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face > const &', 'face')])
+    ## ndn-face-container.h (module 'ndnSIM'): void ns3::ndn::FaceContainer::AddAll(ns3::Ptr<ns3::ndn::FaceContainer> other) [member function]
+    cls.add_method('AddAll', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::FaceContainer >', 'other')])
+    ## ndn-face-container.h (module 'ndnSIM'): void ns3::ndn::FaceContainer::AddAll(ns3::ndn::FaceContainer const & other) [member function]
+    cls.add_method('AddAll', 
+                   'void', 
+                   [param('ns3::ndn::FaceContainer const &', 'other')])
+    ## ndn-face-container.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::ndn::Face>*,std::vector<ns3::Ptr<ns3::ndn::Face>, std::allocator<ns3::Ptr<ns3::ndn::Face> > > > ns3::ndn::FaceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::ndn::Face > const, std::vector< ns3::Ptr< ns3::ndn::Face > > >', 
+                   [], 
+                   is_const=True)
+    ## ndn-face-container.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::ndn::Face>*,std::vector<ns3::Ptr<ns3::ndn::Face>, std::allocator<ns3::Ptr<ns3::ndn::Face> > > > ns3::ndn::FaceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::ndn::Face > const, std::vector< ns3::Ptr< ns3::ndn::Face > > >', 
+                   [], 
+                   is_const=True)
+    ## ndn-face-container.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::FaceContainer::Get(__gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::ndn::Face>*,std::vector<ns3::Ptr<ns3::ndn::Face>, std::allocator<ns3::Ptr<ns3::ndn::Face> > > > i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::ndn::Face > const, std::vector< ns3::Ptr< ns3::ndn::Face > > >', 'i')], 
+                   is_const=True)
+    ## ndn-face-container.h (module 'ndnSIM'): uint32_t ns3::ndn::FaceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnFib_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-fib.h (module 'ndnSIM'): ns3::ndn::Fib::Fib() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Add(ns3::ndn::Name const & prefix, ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('Add', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::ndn::Name const &', 'prefix'), param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Add(ns3::Ptr<ns3::ndn::Name const> const & prefix, ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('Add', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::Name const > const &', 'prefix'), param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::fib::Entry> ns3::ndn::Fib::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry const >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Begin() [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::fib::Entry> ns3::ndn::Fib::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry const >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::End() [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Find(ns3::ndn::Name const & prefix) [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::ndn::Name const &', 'prefix')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Fib> ns3::ndn::Fib::GetFib(ns3::Ptr<ns3::Object> node) [member function]
+    cls.add_method('GetFib', 
+                   'ns3::Ptr< ns3::ndn::Fib >', 
+                   [param('ns3::Ptr< ns3::Object >', 'node')], 
+                   is_static=True)
+    ## ndn-fib.h (module 'ndnSIM'): uint32_t ns3::ndn::Fib::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Fib::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::InvalidateAll() [member function]
+    cls.add_method('InvalidateAll', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::LongestPrefixMatch(ns3::ndn::Interest const & interest) [member function]
+    cls.add_method('LongestPrefixMatch', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::ndn::Interest const &', 'interest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::fib::Entry> ns3::ndn::Fib::Next(ns3::Ptr<const ns3::ndn::fib::Entry> arg0) const [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry const >', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry const >', 'arg0')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::Fib::Next(ns3::Ptr<ns3::ndn::fib::Entry> arg0) [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::Remove(ns3::Ptr<ns3::ndn::Name const> const & prefix) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name const > const &', 'prefix')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-fib.h (module 'ndnSIM'): void ns3::ndn::Fib::RemoveFromAll(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveFromAll', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3NdnForwardingStrategy_methods(root_module, cls):
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): ns3::ndn::ForwardingStrategy::ForwardingStrategy(ns3::ndn::ForwardingStrategy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::ForwardingStrategy const &', 'arg0')])
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): ns3::ndn::ForwardingStrategy::ForwardingStrategy() [constructor]
+    cls.add_constructor([])
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::AddFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('AddFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidAddFibEntry(ns3::Ptr<ns3::ndn::fib::Entry> fibEntry) [member function]
+    cls.add_method('DidAddFibEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry >', 'fibEntry')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): static std::string ns3::ndn::ForwardingStrategy::GetLogName() [member function]
+    cls.add_method('GetLogName', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::ForwardingStrategy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::OnData(ns3::Ptr<ns3::ndn::Face> face, ns3::Ptr<ns3::ndn::Data> data) [member function]
+    cls.add_method('OnData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Ptr< ns3::ndn::Data >', 'data')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::OnInterest(ns3::Ptr<ns3::ndn::Face> face, ns3::Ptr<ns3::ndn::Interest> interest) [member function]
+    cls.add_method('OnInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Ptr< ns3::ndn::Interest >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::RemoveFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::WillEraseTimedOutPendingInterest(ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('WillEraseTimedOutPendingInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::WillRemoveFibEntry(ns3::Ptr<ns3::ndn::fib::Entry> fibEntry) [member function]
+    cls.add_method('WillRemoveFibEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::fib::Entry >', 'fibEntry')], 
+                   is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::CanSendOutInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('CanSendOutInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::DetectRetransmittedInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DetectRetransmittedInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidCreatePitEntry(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidCreatePitEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidExhaustForwardingOptions(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidExhaustForwardingOptions', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidForwardSimilarInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidForwardSimilarInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveDuplicateInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidReceiveDuplicateInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveSolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Data const> data, bool didCreateCacheEntry) [member function]
+    cls.add_method('DidReceiveSolicitedData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('bool', 'didCreateCacheEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveUnsolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Data const> data, bool didCreateCacheEntry) [member function]
+    cls.add_method('DidReceiveUnsolicitedData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('bool', 'didCreateCacheEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSendOutData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Data const> data, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidSendOutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSendOutInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidSendOutInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSuppressSimilarInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DidSuppressSimilarInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::DoPropagateInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('DoPropagateInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::FailedToCreatePitEntry(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('FailedToCreatePitEntry', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::PropagateInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('PropagateInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::SatisfyPendingInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Data const> data, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('SatisfyPendingInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::ShouldSuppressIncomingInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('ShouldSuppressIncomingInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): bool ns3::ndn::ForwardingStrategy::TrySendOutInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::Interest const> interest, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('TrySendOutInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::Face >', 'outFace'), param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::WillSatisfyPendingInterest(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
+    cls.add_method('WillSatisfyPendingInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnGlobalRoutingHelper_methods(root_module, cls):
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): ns3::ndn::GlobalRoutingHelper::GlobalRoutingHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): ns3::ndn::GlobalRoutingHelper::GlobalRoutingHelper(ns3::ndn::GlobalRoutingHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::GlobalRoutingHelper const &', 'arg0')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOrigin(std::string const & prefix, ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOrigin(std::string const & prefix, std::string const & nodeName) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('std::string const &', 'nodeName')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOrigins(std::string const & prefix, ns3::NodeContainer const & nodes) [member function]
+    cls.add_method('AddOrigins', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('ns3::NodeContainer const &', 'nodes')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::AddOriginsForAll() [member function]
+    cls.add_method('AddOriginsForAll', 
+                   'void', 
+                   [])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): static void ns3::ndn::GlobalRoutingHelper::CalculateAllPossibleRoutes(bool invalidatedRoutes=true) [member function]
+    cls.add_method('CalculateAllPossibleRoutes', 
+                   'void', 
+                   [param('bool', 'invalidatedRoutes', default_value='true')], 
+                   is_static=True)
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): static void ns3::ndn::GlobalRoutingHelper::CalculateRoutes(bool invalidatedRoutes=true) [member function]
+    cls.add_method('CalculateRoutes', 
+                   'void', 
+                   [param('bool', 'invalidatedRoutes', default_value='true')], 
+                   is_static=True)
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::Install(ns3::NodeContainer const & nodes) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes')])
+    ## ndn-global-routing-helper.h (module 'ndnSIM'): void ns3::ndn::GlobalRoutingHelper::InstallAll() [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3NdnHeaderHelper_methods(root_module, cls):
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::HeaderHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::HeaderHelper(ns3::ndn::HeaderHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::HeaderHelper const &', 'arg0')])
+    ## ndn-header-helper.h (module 'ndnSIM'): static ns3::ndn::HeaderHelper::Type ns3::ndn::HeaderHelper::GetNdnHeaderType(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('GetNdnHeaderType', 
+                   'ns3::ndn::HeaderHelper::Type', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnInterest_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest::Interest(ns3::Ptr<ns3::Packet> payload=ns3::Create( )) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'payload', default_value='ns3::Create( )')])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Interest::Interest(ns3::ndn::Interest const & interest) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Interest const &', 'interest')])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::Exclude> ns3::ndn::Interest::GetExclude() const [member function]
+    cls.add_method('GetExclude', 
+                   'ns3::Ptr< ns3::ndn::Exclude const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Time ns3::ndn::Interest::GetInterestLifetime() const [member function]
+    cls.add_method('GetInterestLifetime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): uint8_t ns3::ndn::Interest::GetNack() const [member function]
+    cls.add_method('GetNack', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::Interest::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Name const> ns3::ndn::Interest::GetNamePtr() const [member function]
+    cls.add_method('GetNamePtr', 
+                   'ns3::Ptr< ns3::ndn::Name const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): uint32_t ns3::ndn::Interest::GetNonce() const [member function]
+    cls.add_method('GetNonce', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Interest::GetPayload() const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): int8_t ns3::ndn::Interest::GetScope() const [member function]
+    cls.add_method('GetScope', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet const> ns3::ndn::Interest::GetWire() const [member function]
+    cls.add_method('GetWire', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetExclude(ns3::Ptr<ns3::ndn::Exclude> exclude) [member function]
+    cls.add_method('SetExclude', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Exclude >', 'exclude')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetInterestLifetime(ns3::Time time) [member function]
+    cls.add_method('SetInterestLifetime', 
+                   'void', 
+                   [param('ns3::Time', 'time')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetNack(uint8_t nackType) [member function]
+    cls.add_method('SetNack', 
+                   'void', 
+                   [param('uint8_t', 'nackType')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetName(ns3::Ptr<ns3::ndn::Name> name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name >', 'name')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetName(ns3::ndn::Name const & name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('ns3::ndn::Name const &', 'name')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetNonce(uint32_t nonce) [member function]
+    cls.add_method('SetNonce', 
+                   'void', 
+                   [param('uint32_t', 'nonce')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetPayload(ns3::Ptr<ns3::Packet> payload) [member function]
+    cls.add_method('SetPayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'payload')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetScope(int8_t scope) [member function]
+    cls.add_method('SetScope', 
+                   'void', 
+                   [param('int8_t', 'scope')])
+    ## ndn-interest.h (module 'ndnSIM'): void ns3::ndn::Interest::SetWire(ns3::Ptr<ns3::Packet const> packet) const [member function]
+    cls.add_method('SetWire', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnInterestException_methods(root_module, cls):
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::InterestException::InterestException() [constructor]
+    cls.add_constructor([])
+    ## ndn-interest.h (module 'ndnSIM'): ns3::ndn::InterestException::InterestException(ns3::ndn::InterestException const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::InterestException const &', 'arg0')])
+    return
+
+def register_Ns3NdnIpFacesHelper_methods(root_module, cls):
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): ns3::ndn::IpFacesHelper::IpFacesHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): ns3::ndn::IpFacesHelper::IpFacesHelper(ns3::ndn::IpFacesHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::IpFacesHelper const &', 'arg0')])
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::CreateTcpFace(ns3::Time const & when, ns3::Ptr<ns3::Node> node, ns3::Ipv4Address address, std::string const & prefix, int16_t metric=1) [member function]
+    cls.add_method('CreateTcpFace', 
+                   'void', 
+                   [param('ns3::Time const &', 'when'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ipv4Address', 'address'), param('std::string const &', 'prefix'), param('int16_t', 'metric', default_value='1')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::CreateUdpFace(ns3::Time const & when, ns3::Ptr<ns3::Node> node, ns3::Ipv4Address address, std::string const & prefix, int16_t metric=1) [member function]
+    cls.add_method('CreateUdpFace', 
+                   'void', 
+                   [param('ns3::Time const &', 'when'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ipv4Address', 'address'), param('std::string const &', 'prefix'), param('int16_t', 'metric', default_value='1')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::Install(ns3::NodeContainer const & nodes) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes')], 
+                   is_static=True)
+    ## ndn-ip-faces-helper.h (module 'ndnSIM'): static void ns3::ndn::IpFacesHelper::InstallAll() [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnL3Protocol_methods(root_module, cls):
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol::ETHERNET_FRAME_TYPE [variable]
+    cls.add_static_attribute('ETHERNET_FRAME_TYPE', 'uint16_t const', is_const=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol::IP_STACK_PORT [variable]
+    cls.add_static_attribute('IP_STACK_PORT', 'uint16_t const', is_const=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::L3Protocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::ndn::L3Protocol::L3Protocol() [constructor]
+    cls.add_constructor([])
+    ## ndn-l3-protocol.h (module 'ndnSIM'): uint32_t ns3::ndn::L3Protocol::AddFace(ns3::Ptr<ns3::ndn::Face> const & face) [member function]
+    cls.add_method('AddFace', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::ndn::Face > const &', 'face')], 
+                   is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): uint32_t ns3::ndn::L3Protocol::GetNFaces() const [member function]
+    cls.add_method('GetNFaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::L3Protocol::GetFace(uint32_t face) const [member function]
+    cls.add_method('GetFace', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('uint32_t', 'face')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::L3Protocol::GetFaceById(uint32_t face) const [member function]
+    cls.add_method('GetFaceById', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('uint32_t', 'face')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): void ns3::ndn::L3Protocol::RemoveFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::L3Protocol::GetFaceByNetDevice(ns3::Ptr<ns3::NetDevice> netDevice) const [member function]
+    cls.add_method('GetFaceByNetDevice', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'netDevice')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): void ns3::ndn::L3Protocol::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-protocol.h (module 'ndnSIM'): void ns3::ndn::L3Protocol::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnL3Tracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer::L3Tracer(ns3::ndn::L3Tracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::L3Tracer const &', 'arg0')])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer::L3Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): ns3::ndn::L3Tracer::L3Tracer(std::string const & node) [constructor]
+    cls.add_constructor([param('std::string const &', 'node')])
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::DropData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::DropInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::DropNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::InData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::InInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::InNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::OutData(ns3::Ptr<ns3::ndn::Data const> arg0, bool fromCache, ns3::Ptr<const ns3::ndn::Face> arg2) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg2')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::OutInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::OutNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::SatisfiedInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('SatisfiedInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-tracer.h (module 'ndnSIM'): void ns3::ndn::L3Tracer::TimedOutInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('TimedOutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnLimits_methods(root_module, cls):
+    ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits::Limits(ns3::ndn::Limits const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Limits const &', 'arg0')])
+    ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits::Limits() [constructor]
+    cls.add_constructor([])
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::BorrowLimit() [member function]
+    cls.add_method('BorrowLimit', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetCurrentLimit() const [member function]
+    cls.add_method('GetCurrentLimit', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetCurrentLimitRate() const [member function]
+    cls.add_method('GetCurrentLimitRate', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetLinkDelay() const [member function]
+    cls.add_method('GetLinkDelay', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetMaxDelay() const [member function]
+    cls.add_method('GetMaxDelay', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetMaxLimit() const [member function]
+    cls.add_method('GetMaxLimit', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): double ns3::ndn::Limits::GetMaxRate() const [member function]
+    cls.add_method('GetMaxRate', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Limits::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-limits.h (module 'ndnSIM'): bool ns3::ndn::Limits::IsBelowLimit() [member function]
+    cls.add_method('IsBelowLimit', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): bool ns3::ndn::Limits::IsEnabled() const [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::RegisterAvailableSlotCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> handler) [member function]
+    cls.add_method('RegisterAvailableSlotCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::ReturnLimit() [member function]
+    cls.add_method('ReturnLimit', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::SetLimits(double rate, double delay) [member function]
+    cls.add_method('SetLimits', 
+                   'void', 
+                   [param('double', 'rate'), param('double', 'delay')], 
+                   is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::SetLinkDelay(double delay) [member function]
+    cls.add_method('SetLinkDelay', 
+                   'void', 
+                   [param('double', 'delay')], 
+                   is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::UpdateCurrentLimit(double limit) [member function]
+    cls.add_method('UpdateCurrentLimit', 
+                   'void', 
+                   [param('double', 'limit')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-limits.h (module 'ndnSIM'): void ns3::ndn::Limits::FireAvailableSlotCallback() [member function]
+    cls.add_method('FireAvailableSlotCallback', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    return
+
+def register_Ns3NdnLinkControlHelper_methods(root_module, cls):
+    ## ndn-link-control-helper.h (module 'ndnSIM'): ns3::ndn::LinkControlHelper::LinkControlHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-link-control-helper.h (module 'ndnSIM'): ns3::ndn::LinkControlHelper::LinkControlHelper(ns3::ndn::LinkControlHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::LinkControlHelper const &', 'arg0')])
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::FailLink(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+    cls.add_method('FailLink', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')], 
+                   is_static=True)
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::FailLinkByName(std::string const & node1, std::string const & node2) [member function]
+    cls.add_method('FailLinkByName', 
+                   'void', 
+                   [param('std::string const &', 'node1'), param('std::string const &', 'node2')], 
+                   is_static=True)
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::UpLink(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+    cls.add_method('UpLink', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')], 
+                   is_static=True)
+    ## ndn-link-control-helper.h (module 'ndnSIM'): static void ns3::ndn::LinkControlHelper::UpLinkByName(std::string const & node1, std::string const & node2) [member function]
+    cls.add_method('UpLinkByName', 
+                   'void', 
+                   [param('std::string const &', 'node1'), param('std::string const &', 'node2')], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnName_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('+', root_module['ns3::ndn::Name'], root_module['ns3::ndn::Name'], param('ns3::ndn::Name const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('>=')
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name() [constructor]
+    cls.add_constructor([])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name(ns3::ndn::Name const & other) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Name const &', 'other')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::string const & url) [constructor]
+    cls.add_constructor([param('std::string const &', 'url')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::Name(__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > begin, __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > end) [constructor]
+    cls.add_constructor([param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'begin'), param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'end')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(ns3::ndn::name::Component const & comp) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('ns3::ndn::name::Component const &', 'comp')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > begin, __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > end) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'begin'), param('__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 'end')], 
+                   template_parameters=['__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > >'])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(ns3::ndn::Name const & comp) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('ns3::ndn::Name const &', 'comp')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(std::string const & compStr) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('std::string const &', 'compStr')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::append(void const * buf, size_t size) [member function]
+    cls.add_method('append', 
+                   'ns3::ndn::Name &', 
+                   [param('void const *', 'buf'), param('size_t', 'size')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendBlkId(uint64_t blkid) [member function]
+    cls.add_method('appendBlkId', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'blkid')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendBySwap(ns3::ndn::name::Component & comp) [member function]
+    cls.add_method('appendBySwap', 
+                   'ns3::ndn::Name &', 
+                   [param('ns3::ndn::name::Component &', 'comp')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendControlNum(uint64_t control) [member function]
+    cls.add_method('appendControlNum', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'control')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendNumber(uint64_t number) [member function]
+    cls.add_method('appendNumber', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'number')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendNumberWithMarker(uint64_t number, unsigned char marker) [member function]
+    cls.add_method('appendNumberWithMarker', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'number'), param('unsigned char', 'marker')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendSeqNum(uint64_t seqno) [member function]
+    cls.add_method('appendSeqNum', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'seqno')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name & ns3::ndn::Name::appendVersion(uint64_t version=ns3::ndn::Name::nversion) [member function]
+    cls.add_method('appendVersion', 
+                   'ns3::ndn::Name &', 
+                   [param('uint64_t', 'version', default_value='ns3::ndn::Name::nversion')])
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::begin() const [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::begin() [member function]
+    cls.add_method('begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): int ns3::ndn::Name::compare(ns3::ndn::Name const & name) const [member function]
+    cls.add_method('compare', 
+                   'int', 
+                   [param('ns3::ndn::Name const &', 'name')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::end() const [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): __gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > ns3::ndn::Name::end() [member function]
+    cls.add_method('end', 
+                   '__gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): ns3::ndn::name::Component const & ns3::ndn::Name::get(int index) const [member function]
+    cls.add_method('get', 
+                   'ns3::ndn::name::Component const &', 
+                   [param('int', 'index')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::Name::get(int index) [member function]
+    cls.add_method('get', 
+                   'ns3::ndn::name::Component &', 
+                   [param('int', 'index')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::getPostfix(size_t len, size_t skip=0) const [member function]
+    cls.add_method('getPostfix', 
+                   'ns3::ndn::Name', 
+                   [param('size_t', 'len'), param('size_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::getPrefix(size_t len, size_t skip=0) const [member function]
+    cls.add_method('getPrefix', 
+                   'ns3::ndn::Name', 
+                   [param('size_t', 'len'), param('size_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::getSubName(size_t pos=0, size_t len=ns3::ndn::Name::npos) const [member function]
+    cls.add_method('getSubName', 
+                   'ns3::ndn::Name', 
+                   [param('size_t', 'pos', default_value='0'), param('size_t', 'len', default_value='ns3::ndn::Name::npos')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rbegin() const [member function]
+    cls.add_method('rbegin', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rbegin() [member function]
+    cls.add_method('rbegin', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component const*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rend() const [member function]
+    cls.add_method('rend', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component const *, std::vector< ns3::ndn::name::Component > > >', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::reverse_iterator<__gnu_cxx::__normal_iterator<ns3::ndn::name::Component*, std::vector<ns3::ndn::name::Component, std::allocator<ns3::ndn::name::Component> > > > ns3::ndn::Name::rend() [member function]
+    cls.add_method('rend', 
+                   'std::reverse_iterator< __gnu_cxx::__normal_iterator< ns3::ndn::name::Component *, std::vector< ns3::ndn::name::Component > > >', 
+                   [])
+    ## name.h (module 'ndnSIM'): size_t ns3::ndn::Name::size() const [member function]
+    cls.add_method('size', 
+                   'size_t', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::string ns3::ndn::Name::toUri() const [member function]
+    cls.add_method('toUri', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): void ns3::ndn::Name::toUri(std::ostream & os) const [member function]
+    cls.add_method('toUri', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::npos [variable]
+    cls.add_static_attribute('npos', 'size_t const', is_const=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name::nversion [variable]
+    cls.add_static_attribute('nversion', 'uint64_t const', is_const=True)
+    return
+
+def register_Ns3NdnNameChecker_methods(root_module, cls):
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker() [constructor]
+    cls.add_constructor([])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker(ns3::ndn::NameChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::NameChecker const &', 'arg0')])
+    return
+
+def register_Ns3NdnNameValue_methods(root_module, cls):
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue() [constructor]
+    cls.add_constructor([])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::NameValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::NameValue const &', 'arg0')])
+    ## name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::Name const & value) [constructor]
+    cls.add_constructor([param('ns3::ndn::Name const &', 'value')])
+    ## name.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## name.h (module 'ndnSIM'): bool ns3::ndn::NameValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::NameValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ndn::Name', 
+                   [], 
+                   is_const=True)
+    ## name.h (module 'ndnSIM'): std::string ns3::ndn::NameValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## name.h (module 'ndnSIM'): void ns3::ndn::NameValue::Set(ns3::ndn::Name const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ndn::Name const &', 'value')])
+    return
+
+def register_Ns3NdnNetDeviceFace_methods(root_module, cls):
+    ## ndn-net-device-face.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::NetDeviceFace::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): ns3::ndn::NetDeviceFace::NetDeviceFace(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> const & netDevice) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice > const &', 'netDevice')])
+    ## ndn-net-device-face.h (module 'ndnSIM'): void ns3::ndn::NetDeviceFace::RegisterProtocolHandlers(ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Interest>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & interestHandler, ns3::Callback<void, ns3::Ptr<ns3::ndn::Face>, ns3::Ptr<ns3::ndn::Data>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & dataHandler) [member function]
+    cls.add_method('RegisterProtocolHandlers', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Interest >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'interestHandler'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Face >, ns3::Ptr< ns3::ndn::Data >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'dataHandler')], 
+                   is_virtual=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): void ns3::ndn::NetDeviceFace::UnRegisterProtocolHandlers() [member function]
+    cls.add_method('UnRegisterProtocolHandlers', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::NetDeviceFace::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): ns3::Ptr<ns3::NetDevice> ns3::ndn::NetDeviceFace::GetNetDevice() const [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## ndn-net-device-face.h (module 'ndnSIM'): bool ns3::ndn::NetDeviceFace::Send(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnPit_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-pit.h (module 'ndnSIM'): ns3::ndn::Pit::Pit(ns3::ndn::Pit const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Pit const &', 'arg0')])
+    ## ndn-pit.h (module 'ndnSIM'): ns3::ndn::Pit::Pit() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Begin() [member function]
+    cls.add_method('Begin', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Create(ns3::Ptr<ns3::ndn::Interest const> header) [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'header')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::End() [member function]
+    cls.add_method('End', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Find(ns3::ndn::Name const & prefix) [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::ndn::Name const &', 'prefix')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Time const & ns3::ndn::Pit::GetMaxPitEntryLifetime() const [member function]
+    cls.add_method('GetMaxPitEntryLifetime', 
+                   'ns3::Time const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Pit> ns3::ndn::Pit::GetPit(ns3::Ptr<ns3::Object> node) [member function]
+    cls.add_method('GetPit', 
+                   'ns3::Ptr< ns3::ndn::Pit >', 
+                   [param('ns3::Ptr< ns3::Object >', 'node')], 
+                   is_static=True)
+    ## ndn-pit.h (module 'ndnSIM'): uint32_t ns3::ndn::Pit::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::Pit::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Lookup(ns3::ndn::Data const & header) [member function]
+    cls.add_method('Lookup', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::ndn::Data const &', 'header')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Lookup(ns3::ndn::Interest const & header) [member function]
+    cls.add_method('Lookup', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::ndn::Interest const &', 'header')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): void ns3::ndn::Pit::MarkErased(ns3::Ptr<ns3::ndn::pit::Entry> entry) [member function]
+    cls.add_method('MarkErased', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'entry')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::pit::Entry> ns3::ndn::Pit::Next(ns3::Ptr<ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::ndn::pit::Entry >', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'arg0')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): void ns3::ndn::Pit::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-pit.h (module 'ndnSIM'): void ns3::ndn::Pit::SetMaxPitEntryLifetime(ns3::Time const & maxLifetime) [member function]
+    cls.add_method('SetMaxPitEntryLifetime', 
+                   'void', 
+                   [param('ns3::Time const &', 'maxLifetime')])
+    return
+
+def register_Ns3NdnRttEstimator_methods(root_module, cls):
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttEstimator::RttEstimator() [constructor]
+    cls.add_constructor([])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttEstimator::RttEstimator(ns3::ndn::RttEstimator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::RttEstimator const &', 'arg0')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::AckSeq(ns3::SequenceNumber32 ackSeq) [member function]
+    cls.add_method('AckSeq', 
+                   'ns3::Time', 
+                   [param('ns3::SequenceNumber32', 'ackSeq')], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::ClearSent() [member function]
+    cls.add_method('ClearSent', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::RttEstimator> ns3::ndn::RttEstimator::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::ndn::RttEstimator >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::GetCurrentEstimate() const [member function]
+    cls.add_method('GetCurrentEstimate', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::TypeId ns3::ndn::RttEstimator::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::GetMaxRto() const [member function]
+    cls.add_method('GetMaxRto', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::GetMinRto() const [member function]
+    cls.add_method('GetMinRto', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::RttEstimator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::IncreaseMultiplier() [member function]
+    cls.add_method('IncreaseMultiplier', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::Measurement(ns3::Time t) [member function]
+    cls.add_method('Measurement', 
+                   'void', 
+                   [param('ns3::Time', 't')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::ResetMultiplier() [member function]
+    cls.add_method('ResetMultiplier', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::Time ns3::ndn::RttEstimator::RetransmitTimeout() [member function]
+    cls.add_method('RetransmitTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SentSeq(ns3::SequenceNumber32 seq, uint32_t size) [member function]
+    cls.add_method('SentSeq', 
+                   'void', 
+                   [param('ns3::SequenceNumber32', 'seq'), param('uint32_t', 'size')], 
+                   is_virtual=True)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SetCurrentEstimate(ns3::Time estimate) [member function]
+    cls.add_method('SetCurrentEstimate', 
+                   'void', 
+                   [param('ns3::Time', 'estimate')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SetMaxRto(ns3::Time maxRto) [member function]
+    cls.add_method('SetMaxRto', 
+                   'void', 
+                   [param('ns3::Time', 'maxRto')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): void ns3::ndn::RttEstimator::SetMinRto(ns3::Time minRto) [member function]
+    cls.add_method('SetMinRto', 
+                   'void', 
+                   [param('ns3::Time', 'minRto')])
+    return
+
+def register_Ns3NdnRttHistory_methods(root_module, cls):
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::RttHistory(ns3::SequenceNumber32 s, uint32_t c, ns3::Time t) [constructor]
+    cls.add_constructor([param('ns3::SequenceNumber32', 's'), param('uint32_t', 'c'), param('ns3::Time', 't')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::RttHistory(ns3::ndn::RttHistory const & h) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::RttHistory const &', 'h')])
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::retx [variable]
+    cls.add_instance_attribute('retx', 'bool', is_const=False)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::seq [variable]
+    cls.add_instance_attribute('seq', 'ns3::SequenceNumber32', is_const=False)
+    ## ndn-rtt-estimator.h (module 'ndnSIM'): ns3::ndn::RttHistory::time [variable]
+    cls.add_instance_attribute('time', 'ns3::Time', is_const=False)
+    return
+
+def register_Ns3NdnStackHelper_methods(root_module, cls):
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::ndn::StackHelper::StackHelper() [constructor]
+    cls.add_constructor([])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetStackAttributes(std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetStackAttributes', 
+                   'void', 
+                   [param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetForwardingStrategy(std::string const & forwardingStrategyClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetForwardingStrategy', 
+                   'void', 
+                   [param('std::string const &', 'forwardingStrategyClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetContentStore(std::string const & contentStoreClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetContentStore', 
+                   'void', 
+                   [param('std::string const &', 'contentStoreClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetPit(std::string const & pitClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetPit', 
+                   'void', 
+                   [param('std::string const &', 'pitClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetFib(std::string const & fibClass, std::string const & attr1="", std::string const & value1="", std::string const & attr2="", std::string const & value2="", std::string const & attr3="", std::string const & value3="", std::string const & attr4="", std::string const & value4="") [member function]
+    cls.add_method('SetFib', 
+                   'void', 
+                   [param('std::string const &', 'fibClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::AddNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::ndn::L3Protocol>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::ndn::L3Protocol >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::UpdateNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::ndn::L3Protocol>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('UpdateNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::ndn::L3Protocol >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::RemoveNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::ndn::L3Protocol>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('RemoveNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::ndn::L3Protocol >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::EnableLimits(bool enable=true, ns3::Time avgRtt=ns3::Seconds( ), uint32_t avgData=1100, uint32_t avgInterest=40) [member function]
+    cls.add_method('EnableLimits', 
+                   'void', 
+                   [param('bool', 'enable', default_value='true'), param('ns3::Time', 'avgRtt', default_value='ns3::Seconds(0)'), param('uint32_t', 'avgData', default_value='1100'), param('uint32_t', 'avgInterest', default_value='40')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::Install(std::string const & nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [param('std::string const &', 'nodeName')], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::Install(ns3::NodeContainer const & c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [param('ns3::NodeContainer const &', 'c')], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::FaceContainer> ns3::ndn::StackHelper::InstallAll() const [member function]
+    cls.add_method('InstallAll', 
+                   'ns3::Ptr< ns3::ndn::FaceContainer >', 
+                   [], 
+                   is_const=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(std::string const & nodeName, std::string const & prefix, uint32_t faceId, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('std::string const &', 'nodeName'), param('std::string const &', 'prefix'), param('uint32_t', 'faceId'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(ns3::Ptr<ns3::Node> node, std::string const & prefix, uint32_t faceId, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'prefix'), param('uint32_t', 'faceId'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(ns3::Ptr<ns3::Node> node, std::string const & prefix, ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(ns3::Ptr<ns3::Node> node, std::string const & prefix, ns3::Ptr<ns3::Node> otherNode, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'otherNode'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): static void ns3::ndn::StackHelper::AddRoute(std::string const & nodeName, std::string const & prefix, std::string const & otherNodeName, int32_t metric) [member function]
+    cls.add_method('AddRoute', 
+                   'void', 
+                   [param('std::string const &', 'nodeName'), param('std::string const &', 'prefix'), param('std::string const &', 'otherNodeName'), param('int32_t', 'metric')], 
+                   is_static=True)
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::SetDefaultRoutes(bool needSet) [member function]
+    cls.add_method('SetDefaultRoutes', 
+                   'void', 
+                   [param('bool', 'needSet')])
+    return
+
+def register_Ns3NdnUnknownHeaderException_methods(root_module, cls):
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::UnknownHeaderException::UnknownHeaderException() [constructor]
+    cls.add_constructor([])
+    ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::UnknownHeaderException::UnknownHeaderException(ns3::ndn::UnknownHeaderException const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::UnknownHeaderException const &', 'arg0')])
+    return
+
+def register_Ns3NdnWire_methods(root_module, cls):
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire::Wire() [constructor]
+    cls.add_constructor([])
+    ## ndn-wire.h (module 'ndnSIM'): ns3::ndn::Wire::Wire(ns3::ndn::Wire const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::Wire const &', 'arg0')])
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::Packet> ns3::ndn::Wire::FromData(ns3::Ptr<ns3::ndn::Data const> data, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromData', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static std::string ns3::ndn::Wire::FromDataStr(ns3::Ptr<ns3::ndn::Data const> data, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromDataStr', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::Packet> ns3::ndn::Wire::FromInterest(ns3::Ptr<ns3::ndn::Interest const> interest, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromInterest', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static std::string ns3::ndn::Wire::FromInterestStr(ns3::Ptr<ns3::ndn::Interest const> interest, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromInterestStr', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static std::string ns3::ndn::Wire::FromName(ns3::Ptr<ns3::ndn::Name const> name, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('FromName', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::ndn::Name const >', 'name'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Data> ns3::ndn::Wire::ToData(ns3::Ptr<ns3::Packet> packet, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToData', 
+                   'ns3::Ptr< ns3::ndn::Data >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Data> ns3::ndn::Wire::ToDataStr(std::string const & wire, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToDataStr', 
+                   'ns3::Ptr< ns3::ndn::Data >', 
+                   [param('std::string const &', 'wire'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Interest> ns3::ndn::Wire::ToInterest(ns3::Ptr<ns3::Packet> packet, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToInterest', 
+                   'ns3::Ptr< ns3::ndn::Interest >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Interest> ns3::ndn::Wire::ToInterestStr(std::string const & wire, int8_t type=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)) [member function]
+    cls.add_method('ToInterestStr', 
+                   'ns3::Ptr< ns3::ndn::Interest >', 
+                   [param('std::string const &', 'wire'), param('int8_t', 'type', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_AUTODETECT)')], 
+                   is_static=True)
+    ## ndn-wire.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::Name> ns3::ndn::Wire::ToName(std::string const & wire, int8_t wireFormat=::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)) [member function]
+    cls.add_method('ToName', 
+                   'ns3::Ptr< ns3::ndn::Name >', 
+                   [param('std::string const &', 'wire'), param('int8_t', 'wireFormat', default_value='::int8_t(::ns3::ndn::Wire::WIRE_FORMAT_DEFAULT)')], 
+                   is_static=True)
+    return
+
+def register_Ns3NdnApiFace_methods(root_module, cls):
+    ## ndn-api-face.h (module 'ndnSIM'): ns3::ndn::ApiFace::ApiFace(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::Shutdown() [member function]
+    cls.add_method('Shutdown', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::ExpressInterest(ns3::Ptr<ns3::ndn::Interest> interest, ns3::Callback<void, ns3::Ptr<ns3::ndn::Interest const>, ns3::Ptr<ns3::ndn::Data const>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onData, ns3::Callback<void, ns3::Ptr<ns3::ndn::Interest const>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onTimeout) [member function]
+    cls.add_method('ExpressInterest', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest >', 'interest'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Interest const >, ns3::Ptr< ns3::ndn::Data const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onData'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Interest const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onTimeout')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::SetInterestFilter(ns3::Ptr<ns3::ndn::Name const> prefix, ns3::Callback<void, ns3::Ptr<ns3::ndn::Name const>, ns3::Ptr<ns3::ndn::Interest const>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> onInterest) [member function]
+    cls.add_method('SetInterestFilter', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name const >', 'prefix'), param('ns3::Callback< void, ns3::Ptr< ns3::ndn::Name const >, ns3::Ptr< ns3::ndn::Interest const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'onInterest')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::ClearInterestFilter(ns3::Ptr<ns3::ndn::Name const> prefix) [member function]
+    cls.add_method('ClearInterestFilter', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Name const >', 'prefix')])
+    ## ndn-api-face.h (module 'ndnSIM'): void ns3::ndn::ApiFace::Put(ns3::Ptr<ns3::ndn::Data> data) [member function]
+    cls.add_method('Put', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data >', 'data')])
+    ## ndn-api-face.h (module 'ndnSIM'): bool ns3::ndn::ApiFace::SendInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('SendInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-api-face.h (module 'ndnSIM'): bool ns3::ndn::ApiFace::SendData(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('SendData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_virtual=True)
+    ## ndn-api-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::ApiFace::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NdnAppFace_methods(root_module, cls):
+    ## ndn-app-face.h (module 'ndnSIM'): static ns3::TypeId ns3::ndn::AppFace::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ndn-app-face.h (module 'ndnSIM'): ns3::ndn::AppFace::AppFace(ns3::Ptr<ns3::ndn::App> app) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::App >', 'app')])
+    ## ndn-app-face.h (module 'ndnSIM'): bool ns3::ndn::AppFace::SendInterest(ns3::Ptr<ns3::ndn::Interest const> interest) [member function]
+    cls.add_method('SendInterest', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'interest')], 
+                   is_virtual=True)
+    ## ndn-app-face.h (module 'ndnSIM'): bool ns3::ndn::AppFace::SendData(ns3::Ptr<ns3::ndn::Data const> data) [member function]
+    cls.add_method('SendData', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'data')], 
+                   is_virtual=True)
+    ## ndn-app-face.h (module 'ndnSIM'): std::ostream & ns3::ndn::AppFace::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'std::ostream &', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NdnL3AggregateTracer_methods(root_module, cls):
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer::L3AggregateTracer(ns3::ndn::L3AggregateTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::L3AggregateTracer const &', 'arg0')])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer::L3AggregateTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): ns3::ndn::L3AggregateTracer::L3AggregateTracer(boost::shared_ptr<std::ostream> os, std::string const & nodeName) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'nodeName')])
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::Install(ns3::NodeContainer const & nodes, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::L3AggregateTracer> ns3::ndn::L3AggregateTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::L3AggregateTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3AggregateTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::DropData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::DropInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::DropNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::InData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::InInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::InNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::OutData(ns3::Ptr<ns3::ndn::Data const> arg0, bool fromCache, ns3::Ptr<const ns3::ndn::Face> arg2) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg2')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::OutInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::OutNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::PeriodicPrinter() [member function]
+    cls.add_method('PeriodicPrinter', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::SatisfiedInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('SatisfiedInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::SetAveragingPeriod(ns3::Time const & period) [member function]
+    cls.add_method('SetAveragingPeriod', 
+                   'void', 
+                   [param('ns3::Time const &', 'period')], 
+                   visibility='protected')
+    ## ndn-l3-aggregate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3AggregateTracer::TimedOutInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('TimedOutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnL3RateTracer_methods(root_module, cls):
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer::L3RateTracer(ns3::ndn::L3RateTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::L3RateTracer const &', 'arg0')])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): ns3::ndn::L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, std::string const & node) [constructor]
+    cls.add_constructor([param('boost::shared_ptr< std::ostream >', 'os'), param('std::string const &', 'node')])
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::Install(ns3::NodeContainer const & nodes, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer const &', 'nodes'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::Install(ns3::Ptr<ns3::Node> node, std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static ns3::Ptr<ns3::ndn::L3RateTracer> ns3::ndn::L3RateTracer::Install(ns3::Ptr<ns3::Node> node, boost::shared_ptr<std::ostream> outputStream, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('Install', 
+                   'ns3::Ptr< ns3::ndn::L3RateTracer >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('boost::shared_ptr< std::ostream >', 'outputStream'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): static void ns3::ndn::L3RateTracer::InstallAll(std::string const & file, ns3::Time averagingPeriod=ns3::Seconds( )) [member function]
+    cls.add_method('InstallAll', 
+                   'void', 
+                   [param('std::string const &', 'file'), param('ns3::Time', 'averagingPeriod', default_value='ns3::Seconds(0)')], 
+                   is_static=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::DropData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::DropInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::DropNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::InData(ns3::Ptr<ns3::ndn::Data const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::InInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::InNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::OutData(ns3::Ptr<ns3::ndn::Data const> arg0, bool fromCache, ns3::Ptr<const ns3::ndn::Face> arg2) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Data const >', 'arg0'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg2')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::OutInterests(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::OutNacks(ns3::Ptr<ns3::ndn::Interest const> arg0, ns3::Ptr<const ns3::ndn::Face> arg1) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Interest const >', 'arg0'), param('ns3::Ptr< ns3::ndn::Face const >', 'arg1')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::SatisfiedInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('SatisfiedInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-l3-rate-tracer.h (module 'ndnSIM'): void ns3::ndn::L3RateTracer::TimedOutInterests(ns3::Ptr<const ns3::ndn::pit::Entry> arg0) [member function]
+    cls.add_method('TimedOutInterests', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry const >', 'arg0')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NdnCsEntry_methods(root_module, cls):
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::cs::Entry::Entry(ns3::ndn::cs::Entry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::cs::Entry const &', 'arg0')])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::cs::Entry::Entry(ns3::Ptr<ns3::ndn::ContentStore> cs, ns3::Ptr<ns3::ndn::Data const> data) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::ContentStore >', 'cs'), param('ns3::Ptr< ns3::ndn::Data const >', 'data')])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::ContentStore> ns3::ndn::cs::Entry::GetContentStore() [member function]
+    cls.add_method('GetContentStore', 
+                   'ns3::Ptr< ns3::ndn::ContentStore >', 
+                   [])
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Data const> ns3::ndn::cs::Entry::GetData() const [member function]
+    cls.add_method('GetData', 
+                   'ns3::Ptr< ns3::ndn::Data const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-content-store.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::cs::Entry::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnCsStats_methods(root_module, cls):
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::Stats() [constructor]
+    cls.add_constructor([])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::Stats(ns3::ndn::cs::Stats const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::cs::Stats const &', 'arg0')])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): void ns3::ndn::cs::Stats::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::m_cacheHits [variable]
+    cls.add_instance_attribute('m_cacheHits', 'double', is_const=False)
+    ## ndn-cs-tracer.h (module 'ndnSIM'): ns3::ndn::cs::Stats::m_cacheMisses [variable]
+    cls.add_instance_attribute('m_cacheMisses', 'double', is_const=False)
+    return
+
+def register_Ns3NdnFibEntry_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::Entry(ns3::ndn::fib::Entry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::Entry const &', 'arg0')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::Entry(ns3::Ptr<ns3::ndn::Fib> fib, ns3::Ptr<ns3::ndn::Name const> const & prefix) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Fib >', 'fib'), param('ns3::Ptr< ns3::ndn::Name const > const &', 'prefix')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::AddOrUpdateRoutingMetric(ns3::Ptr<ns3::ndn::Face> face, int32_t metric) [member function]
+    cls.add_method('AddOrUpdateRoutingMetric', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'metric')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric const & ns3::ndn::fib::Entry::FindBestCandidate(uint32_t skip=0) const [member function]
+    cls.add_method('FindBestCandidate', 
+                   'ns3::ndn::fib::FaceMetric const &', 
+                   [param('uint32_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Fib> ns3::ndn::fib::Entry::GetFib() [member function]
+    cls.add_method('GetFib', 
+                   'ns3::Ptr< ns3::ndn::Fib >', 
+                   [])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::fib::Entry::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::Invalidate() [member function]
+    cls.add_method('Invalidate', 
+                   'void', 
+                   [])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::RemoveFace(ns3::Ptr<ns3::ndn::Face> const & face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face > const &', 'face')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::SetRealDelayToProducer(ns3::Ptr<ns3::ndn::Face> face, ns3::Time delay) [member function]
+    cls.add_method('SetRealDelayToProducer', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Time', 'delay')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::UpdateFaceRtt(ns3::Ptr<ns3::ndn::Face> face, ns3::Time const & sample) [member function]
+    cls.add_method('UpdateFaceRtt', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::Time const &', 'sample')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::Entry::UpdateStatus(ns3::Ptr<ns3::ndn::Face> face, ns3::ndn::fib::FaceMetric::Status status) [member function]
+    cls.add_method('UpdateStatus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('ns3::ndn::fib::FaceMetric::Status', 'status')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_faces [variable]
+    cls.add_instance_attribute('m_faces', 'boost::multi_index::multi_index_container< ns3::ndn::fib::FaceMetric, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ns3::ndn::fib::i_face, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::const_mem_fun< ns3::ndn::fib::FaceMetric, ns3::Ptr< ns3::ndn::Face >, & ( ns3::ndn::fib::FaceMetric::GetFace (  ) const ) >, mpl_::na >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ns3::ndn::fib::i_metric, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::composite_key< ns3::ndn::fib::FaceMetric, boost::multi_index::const_mem_fun< ns3::ndn::fib::FaceMetric, ns3::ndn::fib::FaceMetric::Status, & ( ns3::ndn::fib::FaceMetric::GetStatus (  ) const ) >, boost::multi_index::const_mem_fun< ns3::ndn::fib::FaceMetric, int, & ( ns3::ndn::fib::FaceMetric::GetRoutingCost (  ) const ) >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type >, mpl_::na >, boost::multi_index::random_access< boost::multi_index::tag< ns3::ndn::fib::i_nth, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, std::allocator< ns3::ndn::fib::FaceMetric > >', is_const=False)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_fib [variable]
+    cls.add_instance_attribute('m_fib', 'ns3::Ptr< ns3::ndn::Fib >', is_const=False)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_needsProbing [variable]
+    cls.add_instance_attribute('m_needsProbing', 'bool', is_const=False)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::m_prefix [variable]
+    cls.add_instance_attribute('m_prefix', 'ns3::Ptr< ns3::ndn::Name const >', is_const=False)
+    return
+
+def register_Ns3NdnFibEntryNoFaces_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::NoFaces::NoFaces() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::Entry::NoFaces::NoFaces(ns3::ndn::fib::Entry::NoFaces const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::Entry::NoFaces const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibFaceMetric_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<')
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::FaceMetric(ns3::ndn::fib::FaceMetric const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::FaceMetric const &', 'arg0')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::FaceMetric(ns3::Ptr<ns3::ndn::Face> face, int32_t cost) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Face >', 'face'), param('int32_t', 'cost')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Face> ns3::ndn::fib::FaceMetric::GetFace() const [member function]
+    cls.add_method('GetFace', 
+                   'ns3::Ptr< ns3::ndn::Face >', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Time ns3::ndn::fib::FaceMetric::GetRealDelay() const [member function]
+    cls.add_method('GetRealDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): int32_t ns3::ndn::fib::FaceMetric::GetRoutingCost() const [member function]
+    cls.add_method('GetRoutingCost', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Time ns3::ndn::fib::FaceMetric::GetRttVar() const [member function]
+    cls.add_method('GetRttVar', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::Time ns3::ndn::fib::FaceMetric::GetSRtt() const [member function]
+    cls.add_method('GetSRtt', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetric::Status ns3::ndn::fib::FaceMetric::GetStatus() const [member function]
+    cls.add_method('GetStatus', 
+                   'ns3::ndn::fib::FaceMetric::Status', 
+                   [], 
+                   is_const=True)
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::TracedValue<ns3::ndn::fib::FaceMetric::Status> & ns3::ndn::fib::FaceMetric::GetStatusTrace() [member function]
+    cls.add_method('GetStatusTrace', 
+                   'ns3::TracedValue< ns3::ndn::fib::FaceMetric::Status > &', 
+                   [])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::SetRealDelay(ns3::Time realDelay) [member function]
+    cls.add_method('SetRealDelay', 
+                   'void', 
+                   [param('ns3::Time', 'realDelay')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::SetRoutingCost(int32_t routingCost) [member function]
+    cls.add_method('SetRoutingCost', 
+                   'void', 
+                   [param('int32_t', 'routingCost')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::SetStatus(ns3::ndn::fib::FaceMetric::Status status) [member function]
+    cls.add_method('SetStatus', 
+                   'void', 
+                   [param('ns3::ndn::fib::FaceMetric::Status', 'status')])
+    ## ndn-fib-entry.h (module 'ndnSIM'): void ns3::ndn::fib::FaceMetric::UpdateRtt(ns3::Time const & rttSample) [member function]
+    cls.add_method('UpdateRtt', 
+                   'void', 
+                   [param('ns3::Time const &', 'rttSample')])
+    return
+
+def register_Ns3NdnFibFaceMetricContainer_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetricContainer::FaceMetricContainer() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::FaceMetricContainer::FaceMetricContainer(ns3::ndn::fib::FaceMetricContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::FaceMetricContainer const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibI_face_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_face::i_face() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_face::i_face(ns3::ndn::fib::i_face const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::i_face const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibI_metric_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_metric::i_metric() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_metric::i_metric(ns3::ndn::fib::i_metric const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::i_metric const &', 'arg0')])
+    return
+
+def register_Ns3NdnFibI_nth_methods(root_module, cls):
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_nth::i_nth() [constructor]
+    cls.add_constructor([])
+    ## ndn-fib-entry.h (module 'ndnSIM'): ns3::ndn::fib::i_nth::i_nth(ns3::ndn::fib::i_nth const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fib::i_nth const &', 'arg0')])
+    return
+
+def register_Ns3NdnFwTag_methods(root_module, cls):
+    ## ndn-fw-tag.h (module 'ndnSIM'): ns3::ndn::fw::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## ndn-fw-tag.h (module 'ndnSIM'): ns3::ndn::fw::Tag::Tag(ns3::ndn::fw::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::fw::Tag const &', 'arg0')])
+    return
+
+def register_Ns3NdnNameComponent_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('>=')
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(ns3::ndn::name::Component const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::name::Component const &', 'arg0')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component() [constructor]
+    cls.add_constructor([])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(std::string const & uri) [constructor]
+    cls.add_constructor([param('std::string const &', 'uri')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(__gnu_cxx::__normal_iterator<char const*, std::string> begin, __gnu_cxx::__normal_iterator<char const*, std::string> end) [constructor]
+    cls.add_constructor([param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'begin'), param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'end')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component::Component(void const * buf, size_t length) [constructor]
+    cls.add_constructor([param('void const *', 'buf'), param('size_t', 'length')])
+    ## name-component.h (module 'ndnSIM'): int ns3::ndn::name::Component::compare(ns3::ndn::name::Component const & other) const [member function]
+    cls.add_method('compare', 
+                   'int', 
+                   [param('ns3::ndn::name::Component const &', 'other')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromNumber(uint64_t number) [member function]
+    cls.add_method('fromNumber', 
+                   'ns3::ndn::name::Component &', 
+                   [param('uint64_t', 'number')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromNumberWithMarker(uint64_t number, unsigned char marker) [member function]
+    cls.add_method('fromNumberWithMarker', 
+                   'ns3::ndn::name::Component &', 
+                   [param('uint64_t', 'number'), param('unsigned char', 'marker')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromUri(std::string const & uri) [member function]
+    cls.add_method('fromUri', 
+                   'ns3::ndn::name::Component &', 
+                   [param('std::string const &', 'uri')])
+    ## name-component.h (module 'ndnSIM'): ns3::ndn::name::Component & ns3::ndn::name::Component::fromUri(__gnu_cxx::__normal_iterator<char const*, std::string> begin, __gnu_cxx::__normal_iterator<char const*, std::string> end) [member function]
+    cls.add_method('fromUri', 
+                   'ns3::ndn::name::Component &', 
+                   [param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'begin'), param('__gnu_cxx::__normal_iterator< char const *, std::string >', 'end')])
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toBlkId() const [member function]
+    cls.add_method('toBlkId', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): std::string ns3::ndn::name::Component::toBlob() const [member function]
+    cls.add_method('toBlob', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): void ns3::ndn::name::Component::toBlob(std::ostream & os) const [member function]
+    cls.add_method('toBlob', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toControlNum() const [member function]
+    cls.add_method('toControlNum', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toNumber() const [member function]
+    cls.add_method('toNumber', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toNumberWithMarker(unsigned char marker) const [member function]
+    cls.add_method('toNumberWithMarker', 
+                   'uint64_t', 
+                   [param('unsigned char', 'marker')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toSeqNum() const [member function]
+    cls.add_method('toSeqNum', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): std::string ns3::ndn::name::Component::toUri() const [member function]
+    cls.add_method('toUri', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): void ns3::ndn::name::Component::toUri(std::ostream & os) const [member function]
+    cls.add_method('toUri', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## name-component.h (module 'ndnSIM'): uint64_t ns3::ndn::name::Component::toVersion() const [member function]
+    cls.add_method('toVersion', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NdnPitEntry_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry::Entry(ns3::ndn::pit::Entry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::Entry const &', 'arg0')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry::Entry(ns3::ndn::Pit & container, ns3::Ptr<ns3::ndn::Interest const> header, ns3::Ptr<ns3::ndn::fib::Entry> fibEntry) [constructor]
+    cls.add_constructor([param('ns3::ndn::Pit &', 'container'), param('ns3::Ptr< ns3::ndn::Interest const >', 'header'), param('ns3::Ptr< ns3::ndn::fib::Entry >', 'fibEntry')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::AddFwTag(boost::shared_ptr<ns3::ndn::fw::Tag> tag) [member function]
+    cls.add_method('AddFwTag', 
+                   'void', 
+                   [param('boost::shared_ptr< ns3::ndn::fw::Tag >', 'tag')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<ns3::ndn::pit::IncomingFace> ns3::ndn::pit::Entry::AddIncoming(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('AddIncoming', 
+                   'std::_Rb_tree_const_iterator< ns3::ndn::pit::IncomingFace >', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::_Rb_tree_const_iterator<ns3::ndn::pit::OutgoingFace> ns3::ndn::pit::Entry::AddOutgoing(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('AddOutgoing', 
+                   'std::_Rb_tree_const_iterator< ns3::ndn::pit::OutgoingFace >', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::AddSeenNonce(uint32_t nonce) [member function]
+    cls.add_method('AddSeenNonce', 
+                   'void', 
+                   [param('uint32_t', 'nonce')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::Entry::AreAllOutgoingInVain() const [member function]
+    cls.add_method('AreAllOutgoingInVain', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::Entry::AreTherePromisingOutgoingFacesExcept(ns3::Ptr<ns3::ndn::Face> face) const [member function]
+    cls.add_method('AreTherePromisingOutgoingFacesExcept', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::ClearIncoming() [member function]
+    cls.add_method('ClearIncoming', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::ClearOutgoing() [member function]
+    cls.add_method('ClearOutgoing', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::Time const & ns3::ndn::pit::Entry::GetExpireTime() const [member function]
+    cls.add_method('GetExpireTime', 
+                   'ns3::Time const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::fib::Entry> ns3::ndn::pit::Entry::GetFibEntry() [member function]
+    cls.add_method('GetFibEntry', 
+                   'ns3::Ptr< ns3::ndn::fib::Entry >', 
+                   [])
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::set<ns3::ndn::pit::IncomingFace, std::less<ns3::ndn::pit::IncomingFace>, std::allocator<ns3::ndn::pit::IncomingFace> > const & ns3::ndn::pit::Entry::GetIncoming() const [member function]
+    cls.add_method('GetIncoming', 
+                   'std::set< ns3::ndn::pit::IncomingFace > const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::Ptr<ns3::ndn::Interest const> ns3::ndn::pit::Entry::GetInterest() const [member function]
+    cls.add_method('GetInterest', 
+                   'ns3::Ptr< ns3::ndn::Interest const >', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): uint32_t ns3::ndn::pit::Entry::GetMaxRetxCount() const [member function]
+    cls.add_method('GetMaxRetxCount', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): std::set<ns3::ndn::pit::OutgoingFace, std::less<ns3::ndn::pit::OutgoingFace>, std::allocator<ns3::ndn::pit::OutgoingFace> > const & ns3::ndn::pit::Entry::GetOutgoing() const [member function]
+    cls.add_method('GetOutgoing', 
+                   'std::set< ns3::ndn::pit::OutgoingFace > const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): uint32_t ns3::ndn::pit::Entry::GetOutgoingCount() const [member function]
+    cls.add_method('GetOutgoingCount', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::Name const & ns3::ndn::pit::Entry::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::ndn::Name const &', 
+                   [], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::IncreaseAllowedRetxCount() [member function]
+    cls.add_method('IncreaseAllowedRetxCount', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::Entry::IsNonceSeen(uint32_t nonce) const [member function]
+    cls.add_method('IsNonceSeen', 
+                   'bool', 
+                   [param('uint32_t', 'nonce')], 
+                   is_const=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::OffsetLifetime(ns3::Time const & offsetTime) [member function]
+    cls.add_method('OffsetLifetime', 
+                   'void', 
+                   [param('ns3::Time const &', 'offsetTime')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::RemoveAllReferencesToFace(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveAllReferencesToFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::RemoveIncoming(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('RemoveIncoming', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::SetWaitingInVain(ns3::Ptr<ns3::ndn::Face> face) [member function]
+    cls.add_method('SetWaitingInVain', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'face')], 
+                   is_virtual=True)
+    ## ndn-pit-entry.h (module 'ndnSIM'): void ns3::ndn::pit::Entry::UpdateLifetime(ns3::Time const & lifetime) [member function]
+    cls.add_method('UpdateLifetime', 
+                   'void', 
+                   [param('ns3::Time const &', 'lifetime')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, cls):
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty(ns3::ndn::pit::EntryIsNotEmpty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::EntryIsNotEmpty const &', 'arg0')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::EntryIsNotEmpty::operator()(ns3::Ptr<ns3::ndn::pit::Entry> entry) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'entry')], 
+                   custom_name='__call__')
+    return
+
+def register_Ns3NdnPitIncomingFace_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::IncomingFace(ns3::ndn::pit::IncomingFace const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::IncomingFace const &', 'arg0')])
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::IncomingFace(ns3::Ptr<ns3::ndn::Face> face) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Face >', 'face')])
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::IncomingFace() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::m_arrivalTime [variable]
+    cls.add_instance_attribute('m_arrivalTime', 'ns3::Time', is_const=False)
+    ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace::m_face [variable]
+    cls.add_instance_attribute('m_face', 'ns3::Ptr< ns3::ndn::Face >', is_const=False)
+    return
+
+def register_Ns3NdnPitOutgoingFace_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('<')
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::OutgoingFace(ns3::ndn::pit::OutgoingFace const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::OutgoingFace const &', 'arg0')])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::OutgoingFace(ns3::Ptr<ns3::ndn::Face> face) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::ndn::Face >', 'face')])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::OutgoingFace() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): void ns3::ndn::pit::OutgoingFace::UpdateOnRetransmit() [member function]
+    cls.add_method('UpdateOnRetransmit', 
+                   'void', 
+                   [])
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_face [variable]
+    cls.add_instance_attribute('m_face', 'ns3::Ptr< ns3::ndn::Face >', is_const=False)
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_retxCount [variable]
+    cls.add_instance_attribute('m_retxCount', 'uint32_t', is_const=False)
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_sendTime [variable]
+    cls.add_instance_attribute('m_sendTime', 'ns3::Time', is_const=False)
+    ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace::m_waitingInVain [variable]
+    cls.add_instance_attribute('m_waitingInVain', 'bool', is_const=False)
+    return
+
+def register_functions(root_module):
+    module = root_module
+    register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
+    register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
+    register_functions_ns3_ndn(module.get_submodule('ndn'), root_module)
+    return
+
+def register_functions_ns3_FatalImpl(module, root_module):
+    return
+
+def register_functions_ns3_Hash(module, root_module):
+    register_functions_ns3_Hash_Function(module.get_submodule('Function'), root_module)
+    return
+
+def register_functions_ns3_Hash_Function(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
+def register_functions_ns3_ndn(module, root_module):
+    ## ndn-wire.h (module 'ndnSIM'): ns3::Ptr<ns3::Packet> ns3::ndn::BufferToPacket(std::string const & buffer) [free function]
+    module.add_function('BufferToPacket', 
+                        'ns3::Ptr< ns3::Packet >', 
+                        [param('std::string const &', 'buffer')])
+    ## name.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameChecker() [free function]
+    module.add_function('MakeNameChecker', 
+                        'ns3::Ptr< ns3::AttributeChecker const >', 
+                        [])
+    ## ndn-wire.h (module 'ndnSIM'): std::string ns3::ndn::PacketToBuffer(ns3::Ptr<ns3::Packet const> pkt) [free function]
+    module.add_function('PacketToBuffer', 
+                        'std::string', 
+                        [param('ns3::Ptr< ns3::Packet const >', 'pkt')])
+    register_functions_ns3_ndn_cs(module.get_submodule('cs'), root_module)
+    register_functions_ns3_ndn_fib(module.get_submodule('fib'), root_module)
+    register_functions_ns3_ndn_fw(module.get_submodule('fw'), root_module)
+    register_functions_ns3_ndn_name(module.get_submodule('name'), root_module)
+    register_functions_ns3_ndn_pit(module.get_submodule('pit'), root_module)
+    register_functions_ns3_ndn_time(module.get_submodule('time'), root_module)
+    return
+
+def register_functions_ns3_ndn_cs(module, root_module):
+    return
+
+def register_functions_ns3_ndn_fib(module, root_module):
+    return
+
+def register_functions_ns3_ndn_fw(module, root_module):
+    return
+
+def register_functions_ns3_ndn_name(module, root_module):
+    return
+
+def register_functions_ns3_ndn_pit(module, root_module):
+    return
+
+def register_functions_ns3_ndn_time(module, root_module):
+    ## ndn-common.h (module 'ndnSIM'): ns3::Time ns3::ndn::time::NowUnixTimestamp() [free function]
+    module.add_function('NowUnixTimestamp', 
+                        'ns3::Time', 
+                        [])
+    return
+
+def main():
+    out = FileCodeSink(sys.stdout)
+    root_module = module_init()
+    register_types(root_module)
+    register_methods(root_module)
+    register_functions(root_module)
+    root_module.generate(out)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/bindings/modulegen_customizations.py b/bindings/modulegen_customizations.py
new file mode 100644
index 0000000..d81a727
--- /dev/null
+++ b/bindings/modulegen_customizations.py
@@ -0,0 +1,37 @@
+import re
+import os
+import sys
+
+from pybindgen.typehandlers import base as typehandlers
+from pybindgen import ReturnValue, Parameter
+from pybindgen.cppmethod import CustomCppMethodWrapper, CustomCppConstructorWrapper
+from pybindgen.typehandlers.codesink import MemoryCodeSink
+from pybindgen.typehandlers import ctypeparser
+from pybindgen import cppclass, param, retval
+import warnings
+
+from pybindgen.typehandlers.base import CodeGenerationError
+
+def add_vector_defs (module):
+    # mod = module.get_submodule('ndn')
+    # nested_module = mod.add_cpp_namespace('error')
+    # nested_module.add_class ('Name')
+
+
+    # # module.add_class ('Name', 
+    # # module.add_exception ('Error', foreign_cpp_namespace='ns3::ndn::error', message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # # module.add_exception ('Uri', foreign_cpp_namespace='ns3::ndn::error', message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # # module.add_exception ('StringTransform', foreign_cpp_namespace='ns3::ndn::error', message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # nested_module.add_exception ('Name', message_rvalue='fuck you')
+    # # message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # # module.add_exception ('Component', foreign_cpp_namespace='ns3::ndn::error::name', message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # # module.add_exception ('Exclude', foreign_cpp_namespace='ns3::ndn::error', message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # # module.add_exception ('KeyLocator', foreign_cpp_namespace='ns3::ndn::error', message_rvalue='ns3::ndn::error::get_msg (%(EXC)s)')
+    # # print dir(module)
+    # # module.add_container ('ns3::ndn::Blob', 'char', container_type='vector')
+    # # module.add_stl_container('ns3::ndn::Blob', 'char', 'vector', custom_name="Blob2")
+    pass
+
+
+def post_register_types (root_module):
+    add_vector_defs (root_module)
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..0271209
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,5 @@
+build/
+doxygen/
+introspected-doxygen.h
+ndnSIM.tag
+
diff --git a/docs/Doxyfile b/docs/Doxyfile
new file mode 100644
index 0000000..ebe4bb0
--- /dev/null
+++ b/docs/Doxyfile
@@ -0,0 +1,1540 @@
+# Doxyfile 1.6.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = "ndnSIM"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         =
+
+PROJECT_LOGO           = ./doc/ns3_html_theme/static/ndn-logo.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = 
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        = ../..
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses.
+# With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this tag.
+# The format is ext=language, where ext is a file extension, and language is one of
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = YES
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# of the layout file.
+
+LAYOUT_FILE            =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           = doxygen.warnings.log
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = ../model ../ndn.cxx ../helper ../utils ../apps \
+                       ../plugins/topology ../plugins/ip-faces \
+                       introspected-doxygen.h doxygen.h
+
+# introspected-doxygen.h should be manually created:
+# For example:
+# ../../../build/utils/ns3-dev-print-introspected-doxygen-debug --group Ndn > introspected-doxygen.h
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.h \
+                         *.cc
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */test/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           = ../examples
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             = ns3_html_theme/static
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = build/html/doxygen
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            = ns3_html_theme/ns3_doxy_header.html
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            = ns3_html_theme/ns3_doxy_footer.html
+#HTML_FOOTER            = analytics.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = ns3_html_theme/static/ns3_stylesheet.css
+
+HTML_EXTRA_FILES       = ns3_html_theme/static/doxygen.css \
+                         ns3_html_theme/static/bar-top.png \
+                         ns3_html_theme/static/favicon.ico
+
+HTML_COLORSTYLE_HUE    = 0
+HTML_COLORSTYLE_SAT    = 0
+HTML_COLORSTYLE_GAMMA  = 91
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 300
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP)
+# there is already a search function so this one should typically
+# be disabled.
+
+SEARCHENGINE           = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = amsmath
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = YES
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           = ../../../build
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             = NS3_ASSERT_ENABLE \
+                         NS3_LOG_ENABLE \
+                         DOXYGEN \
+                         "NDN_NAMESPACE_BEGIN=namespace ns3 { namespace ndn {" \
+                         "NDN_NAMESPACE_END="}}"
+
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = ATTRIBUTE_VALUE_DEFINE \
+                         ATTRIBUTE_VALUE_DEFINE_WITH_NAME \
+                         ATTRIBUTE_HELPER_HEADER_2
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE = ndnSIM.tag
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..ceb8254
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,153 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ndnSIMNS-3basedNDNsimulator.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ndnSIMNS-3basedNDNsimulator.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/ndnSIMNS-3basedNDNsimulator"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ndnSIMNS-3basedNDNsimulator"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/docs/analytics.html b/docs/analytics.html
new file mode 100644
index 0000000..f3bfda5
--- /dev/null
+++ b/docs/analytics.html
@@ -0,0 +1,20 @@
+<address style="text-align: right;"><small> 
+		<a href="http://irl.cs.ucla.edu/ndnSIM/">ndnSIM: NS-3 based NDN simulator</a> API Reference - Generated using <a href="http://www.doxygen.org">Doxygen $doxygenversion</a>
+</small></address>
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-21372502-8']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+</body> 
+</html>
diff --git a/docs/default.css b/docs/default.css
new file mode 100644
index 0000000..21f3f50
--- /dev/null
+++ b/docs/default.css
@@ -0,0 +1,256 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 0 20px 30px 20px;
+}
+
+div.footer {
+    color: #ffffff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #ffffff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    line-height: 30px;
+    color: #ffffff;
+}
+
+div.related a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: #ffffff;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+
+
+/* -- hyperlink styles ------------------------------------------------------ */
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:visited {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+
+
+/* -- body styles ----------------------------------------------------------- */
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.admonition p {
+    margin-bottom: 5px;
+}
+
+div.admonition pre {
+    margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+    margin-bottom: 5px;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: #eeffcc;
+    color: #333333;
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+th {
+    background-color: #ede;
+}
+
+.warning tt {
+    background: #efc2c2;
+}
+
+.note tt {
+    background: #d6d6d6;
+}
+
+.viewcode-back {
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
\ No newline at end of file
diff --git a/docs/doxygen.hpp b/docs/doxygen.hpp
new file mode 100644
index 0000000..008ebdb
--- /dev/null
+++ b/docs/doxygen.hpp
@@ -0,0 +1,22 @@
+/**
+ * \mainpage ndnSIM documentation
+ *
+ * Please refer to <a href="../index.html">ndnSIM documentation page</a>
+ */
+
+// explicit instantiation and registering
+
+/**
+ * @brief ContentStore with LRU cache replacement policy
+ */
+template class ContentStoreImpl<lru_policy_traits>;
+/**
+ * @brief ContentStore with random cache replacement policy
+ */
+
+template class ContentStoreImpl<random_policy_traits>;
+
+/**
+ * @brief ContentStore with FIFO cache replacement policy
+ */
+template class ContentStoreImpl<fifo_policy_traits>;
diff --git a/docs/ns3_html_theme/README.rst b/docs/ns3_html_theme/README.rst
new file mode 100644
index 0000000..1b5671f
--- /dev/null
+++ b/docs/ns3_html_theme/README.rst
@@ -0,0 +1,85 @@
+.. ns3-theme documentation master file, created by
+   sphinx-quickstart on Fri Jun 15 12:53:37 2012.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+
+The files in this directory customize the Doxygen and Sphinx
+layout and rendering to give a common look.
+
+
+Design
+------
+
+The basic color scheme is taken from the ns3 homepage, http://www.nsnam.org/
+
+Since Sphinx provides more flexible layout and configuration control,
+the Doxygen layout and images are used as the basis.
+
+The top bar design is derived from Doxygen's default when a logo,
+project name and description are given in the Doxygen configuration file.
+The files ``layout.html`` and ``ns3_doxy_header.html`` should kept in sync.
+
+
+Sphinx Files
+------------
+
+``layout.html`` (:ref:`static filename <sphinx-static-filenames>`)
+    Augments the default page layout, including the top bar.
+
+``theme.conf`` (:ref:`static filename <sphinx-static-filenames>`)
+    Configuration parameters for ``layout.html`` and ``default.css_t``.
+
+``static/bc_s.png``
+    Angle bracket in Sphinx relbar, taken from the Doxygen html output.
+
+``static/default.css_t`` (:ref:`static filename <sphinx-static-filenames>`)
+    Default Sphinx CSS template, copied from the default theme.
+
+``static/nav_f.png``
+    Background image for headings, taken from the Doxygen html output.
+
+``static/sidebar.js`` (:ref:`static filename <sphinx-static-filenames>`)
+    Sidebar script, copied from the default theme.
+
+``static/tab_b.png``
+    Background image for the Sphinx relbar, taken from the Doxygen html output.
+
+.. _sphinx-static-filenames:
+.. note:: **Static Filenames**
+
+  Sphinx uses hard-coded file  names (and the ``static`` directory name).
+  The files referenced above can't be renamed.
+
+
+Doxygen Files
+-------------
+
+``ns3_doxy_footer.html``
+    Defines the page footer.
+
+``ns3_doxy_header.html``
+    Defines the page header, including the top bar.
+
+``static/doxygen.css``
+    Default Doxygen CSS file, obtained by the ``doxygen -w html ...``
+    command.
+
+Shared Files
+------------
+
+``README.rst``
+    This file, not used by Doxygen or Sphinx.
+
+``static/bar-top.png``
+    Background image for the top bar, resized from the ns-3 homepage.
+
+``static/favicon.ico``
+    Browser location bar favicon, referenced in ``layout.html`` and
+    ``ns3_doxy_header.html``, taken from the ns-3 homepage.
+
+``static/ns-3-inverted-notext-small.png``
+    Logo used in the top bar, taken from the ns-3 media kit.
+
+``static/ns3_stylesheet.css``
+    Style customizations for both Doxygen and Sphinx.
diff --git a/docs/ns3_html_theme/layout.html b/docs/ns3_html_theme/layout.html
new file mode 100644
index 0000000..b401d9a
--- /dev/null
+++ b/docs/ns3_html_theme/layout.html
@@ -0,0 +1,69 @@
+{#
+    ns-3/layout.html
+    ~~~~~~~~~~~~~~~~~~~
+
+    Sphinx layout template for ns-3.
+
+    :copyright: Copyright 2012 by ns-3, see AUTHORS.
+    :license: GPL, see LICENSE for details.
+#}
+{% extends "basic/layout.html" %}
+
+{% set reldelim1 = '<span class="navelem">&nbsp;</span>' %}
+{# set reldelim1 = ' @' #}
+  
+{%- block extrahead %}
+  {%- if theme_customstylesheet %}
+  <link rel="stylesheet" type="text/css"
+    href="{{ pathto('_static/'+theme_customstylesheet, 1) }}" />
+  {%- endif %}
+    
+  {%- if theme_favicon %}
+    <link rel="icon" type="image/ico" 
+      href="{{ pathto('_static/'+theme_favicon, 1) }}" />
+  {%- endif %}
+{% endblock %}
+      
+{% block header %}
+  <div id="titlearea">
+    <table cellspacing="0" cellpadding="0" width="100%">
+      <tbody>
+	<tr style="height: 56px;">
+	  <td id="projectlogo">
+	    <a href="{{ theme_homepage }}">
+	      <img alt="ndnSIM Logo"
+		   src="{{ pathto('_static/' + theme_logo, 1)}}"/>
+	    </a>
+	    <a href="{{ theme_homepage2 }}">
+	      <img alt="irl Logo"
+		   src="{{ pathto('_static/' + theme_logo2, 1)}}"/>
+	    </a>
+	  </td>
+	  <td id="projecttext">
+	    <div id="projectbrief">{{ theme_projectbrief }} </div>
+	      <span id="projectnumber">{{ theme_projectnumber }}</span>
+	  </td>
+	  <td id="projectsection">
+	    <span style="margin-right:10px">{{ docstitle }}</span>
+	  </td>
+	</tr>
+      </tbody>
+    </table>
+  </div>
+      
+{% endblock %}
+
+{% block rootrellink %}
+    <li style="background: none"><a href="index.html">{{ theme_projectname }}</a><span class="navelem">&nbsp;</span></li>
+    <li style="background: none"><a href="doxygen/annotated.html">{{ theme_apidocs }}</a><span class="">&nbsp;</span></li>
+    <li style="background: none"><span class="">&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
+    <li style="background: none"><a href="getting-started.html">Getting started</a><span class="">&nbsp;</span></li>
+    <li style="background: none"><a href="ndnsim-research-papers.html">Research papers</a><span class="">&nbsp;</span></li>
+{#
+    {{ super() }}
+#}
+{% endblock %}
+      
+{% if theme_collapsiblesidebar|tobool %}
+  {% set script_files = script_files + ['_static/sidebar.js'] %}
+{% endif %}
diff --git a/docs/ns3_html_theme/ns3_doxy_footer.html b/docs/ns3_html_theme/ns3_doxy_footer.html
new file mode 100644
index 0000000..848e0f3
--- /dev/null
+++ b/docs/ns3_html_theme/ns3_doxy_footer.html
@@ -0,0 +1,34 @@
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    $navpath
+    <li class="footer">$generatedby
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="$relpath$doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+  </ul>
+</div>
+<!--END GENERATE_TREEVIEW-->
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-21372502-8']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+</body>
+</html>
diff --git a/docs/ns3_html_theme/ns3_doxy_header.html b/docs/ns3_html_theme/ns3_doxy_header.html
new file mode 100644
index 0000000..a927ead
--- /dev/null
+++ b/docs/ns3_html_theme/ns3_doxy_header.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="$relpath$jquery.js"></script>
+<script type="text/javascript" src="$relpath$dynsections.js"></script>
+$treeview
+$search
+$mathjax
+<link href="$relpath$doxygen.css" rel="stylesheet" type="text/css"/>
+<link href="$relpath$ns3_stylesheet.css" rel="stylesheet" type="text/css" />
+<link href="$relpath$favicon.ico" rel="shortcut icon" type="image/ico" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0" width="100%">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo">
+	<a href="http://ndnSIM.net/">
+	<img alt="$projectname Logo" src="../_static/ndn-logo.png"/>
+        </a>
+	<a href="http://irl.cs.ucla.edu/">
+	<img alt="IRL Logo" src="../_static/irl-logo.png"/>
+        </a>
+  </td>
+  <td id="projecttext">
+   <div id="projectbrief">NS-3 based Named Data Networking (NDN) simulator</div>
+   <span id="projectnumber">ndnSIM: NDN, CCN, CCNx, content centric networks</span>
+  </td>
+  <!--BEGIN DISABLE_INDEX-->
+   <!--BEGIN SEARCHENGINE-->
+   <td>$searchbox</td>
+   <!--END SEARCHENGINE-->
+  <!--END DISABLE_INDEX-->
+  <td id="projectsection">
+    <span style="margin-right:10px">API Documentation</span>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!--END TITLEAREA-->
+<!-- end header part -->
diff --git a/docs/named_data_theme/static/bar-top.png b/docs/ns3_html_theme/static/bar-top.png
similarity index 100%
copy from docs/named_data_theme/static/bar-top.png
copy to docs/ns3_html_theme/static/bar-top.png
Binary files differ
diff --git a/docs/named_data_theme/static/bc_s.png b/docs/ns3_html_theme/static/bc_s.png
similarity index 100%
copy from docs/named_data_theme/static/bc_s.png
copy to docs/ns3_html_theme/static/bc_s.png
Binary files differ
diff --git a/docs/ns3_html_theme/static/default.css_t b/docs/ns3_html_theme/static/default.css_t
new file mode 100644
index 0000000..85c9436
--- /dev/null
+++ b/docs/ns3_html_theme/static/default.css_t
@@ -0,0 +1,310 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: {{ theme_bodyfont }};
+    font-size: 100%;
+    background-color: {{ theme_footerbgcolor }};
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: {{ theme_sidebarbgcolor }};
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 {{ theme_sidebarwidth|toint }}px;
+}
+
+div.body {
+    background-color: {{ theme_bgcolor }};
+    color: {{ theme_textcolor }};
+    padding: 0 20px 30px 20px;
+}
+
+{%- if theme_rightsidebar|tobool %}
+div.bodywrapper {
+    margin: 0 {{ theme_sidebarwidth|toint }}px 0 0;
+}
+{%- endif %}
+
+div.footer {
+    color: {{ theme_footertextcolor }};
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: {{ theme_footertextcolor }};
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: {{ theme_relbarbgcolor }};
+    line-height: 30px;
+    color: {{ theme_relbartextcolor }};
+}
+
+div.related a {
+    color: {{ theme_relbarlinkcolor }};
+}
+
+div.sphinxsidebar {
+    {%- if theme_stickysidebar|tobool %}
+    top: 30px;
+    bottom: 0;
+    margin: 0;
+    position: fixed;
+    overflow: auto;
+    height: auto;
+    {%- endif %}
+    {%- if theme_rightsidebar|tobool %}
+    float: right;
+    {%- if theme_stickysidebar|tobool %}
+    right: 0;
+    {%- endif %}
+    {%- endif %}
+}
+
+{%- if theme_stickysidebar|tobool %}
+/* this is nice, but it it leads to hidden headings when jumping
+   to an anchor */
+/*
+div.related {
+    position: fixed;
+}
+
+div.documentwrapper {
+    margin-top: 30px;
+}
+*/
+{%- endif %}
+
+div.sphinxsidebar h3 {
+    font-family: {{ theme_headfont }};
+    color: {{ theme_sidebartextcolor }};
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: {{ theme_sidebartextcolor }};
+}
+
+div.sphinxsidebar h4 {
+    font-family: {{ theme_headfont }};
+    color: {{ theme_sidebartextcolor }};
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: {{ theme_sidebartextcolor }};
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: {{ theme_sidebartextcolor }};
+}
+
+div.sphinxsidebar a {
+    color: {{ theme_sidebarlinkcolor }};
+}
+
+div.sphinxsidebar input {
+    border: 1px solid {{ theme_sidebarlinkcolor }};
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+{% if theme_collapsiblesidebar|tobool %}
+/* for collapsible sidebar */
+div#sidebarbutton {
+    background-color: {{ theme_sidebarbtncolor }};
+}
+{% endif %}
+
+/* -- hyperlink styles ------------------------------------------------------ */
+
+a {
+    color: {{ theme_linkcolor }};
+    text-decoration: none;
+}
+
+a:visited {
+    color: {{ theme_visitedlinkcolor }};
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+{% if theme_externalrefs|tobool %}
+a.external {
+   text-decoration: none;
+   border-bottom: 1px dashed {{ theme_linkcolor }};
+}
+
+a.external:hover {
+   text-decoration: none;
+   border-bottom: none;
+}
+
+a.external:visited {
+    text-decoration: none;
+    border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
+}
+{% endif %}
+
+/* -- body styles ----------------------------------------------------------- */
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: {{ theme_headfont }};
+    background-color: {{ theme_headbgcolor }};
+    font-weight: normal;
+    color: {{ theme_headtextcolor }};
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: {{ theme_headlinkcolor }};
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: {{ theme_headlinkcolor }};
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.admonition p {
+    margin-bottom: 5px;
+}
+
+div.admonition pre {
+    margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+    margin-bottom: 5px;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: {{ theme_codebgcolor }};
+    color: {{ theme_codetextcolor }};
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+th {
+    background-color: #ede;
+}
+
+.warning tt {
+    background: #efc2c2;
+}
+
+.note tt {
+    background: #d6d6d6;
+}
+
+.viewcode-back {
+    font-family: {{ theme_bodyfont }};
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
diff --git a/docs/ns3_html_theme/static/doxygen.css b/docs/ns3_html_theme/static/doxygen.css
new file mode 100644
index 0000000..5cac435
--- /dev/null
+++ b/docs/ns3_html_theme/static/doxygen.css
@@ -0,0 +1,1156 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+	font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+	font-size: 13px;
+	line-height: 1.3;
+}
+
+/* @group Heading Levels */
+
+h1 {
+	font-size: 150%;
+}
+
+.title {
+	font-size: 150%;
+	font-weight: bold;
+	margin: 10px 2px;
+}
+
+h2 {
+	font-size: 120%;
+}
+
+h3 {
+	font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+	-webkit-transition: text-shadow 0.5s linear;
+	-moz-transition: text-shadow 0.5s linear;
+	-ms-transition: text-shadow 0.5s linear;
+	-o-transition: text-shadow 0.5s linear;
+	transition: text-shadow 0.5s linear;
+	margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+	text-shadow: 0 0 15px cyan;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+	margin-top: 2px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EFEFEF;
+	border: 1px solid #B5B5B5;
+	text-align: center;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #585858;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+/*.contents a:visited {
+	color: #686868;
+}*/
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #B0B0B0;
+	color: #ffffff;
+	border: 1px double #9F9F9F;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+	color: #4665A2; 
+}
+
+a.codeRef, a.codeRef:visited {
+	color: #4665A2; 
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+pre.fragment {
+        border: 1px solid #C4CFE5;
+        background-color: #FBFCFD;
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  9pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 105%;
+}
+
+div.fragment {
+        padding: 4px;
+        margin: 4px;
+	background-color: #FCFCFC;
+	border: 1px solid #D0D0D0;
+}
+
+div.line {
+	font-family: monospace, fixed;
+        font-size: 13px;
+	min-height: 13px;
+	line-height: 1.0;
+	text-wrap: unrestricted;
+	white-space: -moz-pre-wrap; /* Moz */
+	white-space: -pre-wrap;     /* Opera 4-6 */
+	white-space: -o-pre-wrap;   /* Opera 7 */
+	white-space: pre-wrap;      /* CSS3  */
+	word-wrap: break-word;      /* IE 5.5+ */
+	text-indent: -53px;
+	padding-left: 53px;
+	padding-bottom: 0px;
+	margin: 0px;
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+div.line.glow {
+	background-color: cyan;
+	box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+	padding-right: 4px;
+	text-align: right;
+	border-right: 2px solid #0F0;
+	background-color: #E8E8E8;
+        white-space: pre;
+}
+span.lineno a {
+	background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+	background-color: #C8C8C8;
+}
+
+div.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	box-shadow: 2px 2px 3px #999;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background-color: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 12px;
+	margin-right: 8px;
+}
+
+td.indexkey {
+	background-color: #EFEFEF;
+	font-weight: bold;
+	border: 1px solid #D0D0D0;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+	background-color: #EFEFEF;
+	border: 1px solid #D0D0D0;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #F1F1F1;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+blockquote {
+        background-color: #F8F8F8;
+        border-left: 2px solid #B0B0B0;
+        margin: 0 24px 0 4px;
+        padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #B5B5B5;
+}
+
+th.dirtab {
+	background: #EFEFEF;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #6E6E6E;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.memberdecls td {
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+.memberdecls td.glow {
+	background-color: cyan;
+	box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #FAFAFA;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+	border-top: 1px solid #D0D0D0;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memItemRight {
+	width: 100%;
+}
+
+.memTemplParams {
+	color: #686868;
+        white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+	font-size: 80%;
+	color: #686868;
+	font-weight: normal;
+	margin-left: 9px;
+}
+
+.memnav {
+	background-color: #EFEFEF;
+	border: 1px solid #B5B5B5;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.mempage {
+	width: 100%;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+	margin-right: 5px;
+        -webkit-transition: box-shadow 0.5s linear;
+        -moz-transition: box-shadow 0.5s linear;
+        -ms-transition: box-shadow 0.5s linear;
+        -o-transition: box-shadow 0.5s linear;
+        transition: box-shadow 0.5s linear;
+        display: table !important;
+        width: 100%;
+}
+
+.memitem.glow {
+         box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memname td {
+	vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+        border-top: 1px solid #B9B9B9;
+        border-left: 1px solid #B9B9B9;
+        border-right: 1px solid #B9B9B9;
+        padding: 6px 0px 6px 0px;
+        color: #323232;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E8E8E8;
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 4px;
+        -moz-border-radius-topleft: 4px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 4px;
+        -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+        border-bottom: 1px solid #B9B9B9;      
+        border-left: 1px solid #B9B9B9;      
+        border-right: 1px solid #B9B9B9; 
+        padding: 6px 10px 2px 10px;
+        background-color: #FCFCFC;
+        border-top-width: 0;
+        background-image:url('nav_g.png');
+        background-repeat:repeat-x;
+        background-color: #FFFFFF;
+        /* opera specific markup */
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 4px;
+        -moz-border-radius-bottomright: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 4px;
+        -webkit-border-bottom-right-radius: 4px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+        padding: 5px;
+}
+
+dl.reflist dd {
+        margin: 0px 0px 10px 0px;
+        padding: 5px;
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+.paramname code {
+        line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+        margin-left: 0px;
+        padding-left: 0px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+table.mlabels {
+	border-spacing: 0px;
+}
+
+td.mlabels-left {
+	width: 100%;
+	padding: 0px;
+}
+
+td.mlabels-right {
+	vertical-align: bottom;
+	padding: 0px;
+	white-space: nowrap;
+}
+
+span.mlabels {
+        margin-left: 8px;
+}
+
+span.mlabel {
+        background-color: #8F8F8F;
+        border-top:1px solid #787878;
+        border-left:1px solid #787878;
+        border-right:1px solid #D0D0D0;
+        border-bottom:1px solid #D0D0D0;
+	text-shadow: none;
+        color: white;
+        margin-right: 4px;
+        padding: 2px 3px;
+        border-radius: 3px;
+        font-size: 7pt;
+	white-space: nowrap;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+        margin: 10px 0px;
+        border-top: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        width: 100%;
+}
+
+.directory table {
+        border-collapse:collapse;
+}
+
+.directory td {
+        margin: 0px;
+        padding: 0px;
+	vertical-align: top;
+}
+
+.directory td.entry {
+        white-space: nowrap;
+        padding-right: 6px;
+}
+
+.directory td.entry a {
+        outline:none;
+}
+
+.directory td.entry a img {
+        border: none;
+}
+
+.directory td.desc {
+        width: 100%;
+        padding-left: 6px;
+	padding-right: 6px;
+	border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+	padding-left: 6px;
+	background-color: #F8F8F8;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+.directory .levels {
+        white-space: nowrap;
+        width: 100%;
+        text-align: right;
+        font-size: 9pt;
+}
+
+.directory .levels span {
+        cursor: pointer;
+        padding-left: 2px;
+        padding-right: 2px;
+	color: #585858;
+}
+
+div.dynheader {
+        margin-top: 8px;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+address {
+	font-style: normal;
+	color: #3A3A3A;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #3F3F3F;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #4F4F4F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+table.fieldtable {
+        width: 100%;
+        margin-bottom: 10px;
+        border: 1px solid #B9B9B9;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid #B9B9B9;
+        border-bottom: 1px solid #B9B9B9;
+        vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid #B9B9B9;
+        width: 100%;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E8E8E8;
+        font-size: 90%;
+        color: #323232;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid #B9B9B9;
+}
+
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	height:30px;
+	line-height:30px;
+	color:#A2A2A2;
+	border:solid 1px #CECECE;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right:15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#4D4D4D;
+}
+
+.navpath li.navelem a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+}
+
+.navpath li.navelem a:hover
+{
+	color:#888888;
+}
+
+.navpath li.footer
+{
+        list-style-type:none;
+        float:right;
+        padding-left:10px;
+        padding-right:15px;
+        background-image:none;
+        background-repeat:no-repeat;
+        background-position:right;
+        color:#4D4D4D;
+        font-size: 8pt;
+}
+
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+div.ingroups
+{
+	font-size: 8pt;
+	width: 50%;
+	text-align: left;
+}
+
+div.ingroups a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #FAFAFA;
+	margin:  0px;
+	border-bottom: 1px solid #D0D0D0;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 7px;
+}
+
+dl
+{
+        padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+	margin-left: 0px;
+	padding-left: 0px;
+}
+
+dl.note
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00D000;
+}
+
+dl.deprecated
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #505050;
+}
+
+dl.todo
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00C0E0;
+}
+
+dl.test
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #3030E0;
+}
+
+dl.bug
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #C08050;
+}
+
+dl.section dd {
+	margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+	text-align: center;
+	vertical-align: bottom;
+	border-collapse: separate;
+}
+ 
+#projectlogo img
+{ 
+	border: 0px none;
+}
+ 
+#projectname
+{
+	font: 300% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 2px 0px;
+}
+    
+#projectbrief
+{
+	font: 120% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#projectnumber
+{
+	font: 50% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#titlearea
+{
+	padding: 0px;
+	margin: 0px;
+	width: 100%;
+	border-bottom: 1px solid #787878;
+}
+
+.image
+{
+        text-align: center;
+}
+
+.dotgraph
+{
+        text-align: center;
+}
+
+.mscgraph
+{
+        text-align: center;
+}
+
+.caption
+{
+	font-weight: bold;
+}
+
+div.zoom
+{
+	border: 1px solid #A6A6A6;
+}
+
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:#484848;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
+div.toc {
+        padding: 14px 25px;
+        background-color: #F6F6F6;
+        border: 1px solid #DFDFDF;
+        border-radius: 7px 7px 7px 7px;
+        float: right;
+        height: auto;
+        margin: 0 20px 10px 10px;
+        width: 200px;
+}
+
+div.toc li {
+        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+        margin-top: 5px;
+        padding-left: 10px;
+        padding-top: 2px;
+}
+
+div.toc h3 {
+        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+	color: #686868;
+        border-bottom: 0 none;
+        margin: 0;
+}
+
+div.toc ul {
+        list-style: none outside none;
+        border: medium none;
+        padding: 0px;
+}       
+
+div.toc li.level1 {
+        margin-left: 0px;
+}
+
+div.toc li.level2 {
+        margin-left: 15px;
+}
+
+div.toc li.level3 {
+        margin-left: 30px;
+}
+
+div.toc li.level4 {
+        margin-left: 45px;
+}
+
+.inherit_header {
+        font-weight: bold;
+        color: gray;
+        cursor: pointer;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+.inherit_header td {
+        padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+        display: none;
+}
+
+tr.heading h2 {
+        margin-top: 12px;
+        margin-bottom: 4px;
+}
+
+@media print
+{
+  #top { display: none; }
+  #side-nav { display: none; }
+  #nav-path { display: none; }
+  body { overflow:visible; }
+  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+  .summary { display: none; }
+  .memitem { page-break-inside: avoid; }
+  #doc-content
+  {
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
+  }
+}
+
diff --git a/docs/ns3_html_theme/static/favicon.ico b/docs/ns3_html_theme/static/favicon.ico
new file mode 100644
index 0000000..ae2eabc
--- /dev/null
+++ b/docs/ns3_html_theme/static/favicon.ico
Binary files differ
diff --git a/docs/ns3_html_theme/static/irl-logo.png b/docs/ns3_html_theme/static/irl-logo.png
new file mode 100644
index 0000000..9e6f87f
--- /dev/null
+++ b/docs/ns3_html_theme/static/irl-logo.png
Binary files differ
diff --git a/docs/named_data_theme/static/nav_f.png b/docs/ns3_html_theme/static/nav_f.png
similarity index 100%
copy from docs/named_data_theme/static/nav_f.png
copy to docs/ns3_html_theme/static/nav_f.png
Binary files differ
diff --git a/docs/ns3_html_theme/static/ndn-logo.png b/docs/ns3_html_theme/static/ndn-logo.png
new file mode 100644
index 0000000..1ccee4a
--- /dev/null
+++ b/docs/ns3_html_theme/static/ndn-logo.png
Binary files differ
diff --git a/docs/ns3_html_theme/static/ns-3-inverted-notext-small.png b/docs/ns3_html_theme/static/ns-3-inverted-notext-small.png
new file mode 100644
index 0000000..06ac9e5
--- /dev/null
+++ b/docs/ns3_html_theme/static/ns-3-inverted-notext-small.png
Binary files differ
diff --git a/docs/ns3_html_theme/static/ns-3-small.png b/docs/ns3_html_theme/static/ns-3-small.png
new file mode 100644
index 0000000..06ac9e5
--- /dev/null
+++ b/docs/ns3_html_theme/static/ns-3-small.png
Binary files differ
diff --git a/docs/ns3_html_theme/static/ns3_stylesheet.css b/docs/ns3_html_theme/static/ns3_stylesheet.css
new file mode 100644
index 0000000..0ab405d
--- /dev/null
+++ b/docs/ns3_html_theme/static/ns3_stylesheet.css
@@ -0,0 +1,143 @@
+/* ns-3 changes to the default CSS from Doxygen and Sphinx */
+
+body {
+    font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+    font-size: 11pt;
+    color: black;
+}
+
+table, div, p, dl {
+}
+
+a {
+    color: #91A501;
+    font-weight: bold;
+}
+
+a:visited {
+    color: #91A501;
+    font-weight: bold;
+}
+
+/* Sphinx headings */
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    background-image: url('nav_f.png');
+}
+
+/* Doxygen side bar */
+#nav-tree {
+    font-size: 10pt;
+}
+
+#nav-tree a {
+    font-weight: normal;
+}
+
+/* Sphinx nav links bar (relbar) */
+div.related {
+    background-image:url('tab_b.png')
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related a {
+    color: #91A501;
+    font-size: 13pt;
+    font-weight: bold;
+}
+
+div.related li {
+    background-image: url('bc_s.png');
+    background-position: 100% 40%;
+    background-repeat: no-repeat;
+    padding-left: 10px;
+    padding-right: 15px;
+}
+
+div.related li.right {
+    background-image: none;
+    padding-left: 0px;
+    padding-right: 0px;
+}
+
+/* Sphinx side bar */
+div.sphinxsidebar {
+    font-size: 10pt;
+}
+
+div.sphinxsidebar a {
+    font-weight: normal;
+}
+
+
+/* Title bar elements */
+
+#titlearea
+{
+    background-image:url('bar-top.png');
+    background-repeat:repeat;
+    border-bottom: 1px solid #5B5B5B;
+    color: white;
+}
+
+#projectlogo
+{
+    text-align: center;
+    margin: 10px;
+    vertical-align: middle;
+    width: 220px;
+    color: white;
+}
+
+#projecttext
+{
+        align: left;
+        padding-left: 2em;
+        font-color:white;
+}
+
+#projectbrief
+{
+    font: 120% Tahoma, Arial,sans-serif;
+    margin: 0px;
+    padding: 0px;
+    color: white;
+}
+
+#projectnumber
+{
+    font: 100% Tahoma, Arial,sans-serif;
+    margin: 0px;
+    padding: 0px;
+    color: white;
+}
+
+#projectsection
+{
+    text-align: right;
+    font: 24pt  Aldo, Tahoma, Arial,sans-serif;
+    margin: 10px;
+    margin-right: 10px;
+    vertical-align: middle;
+    color: white;
+}
+
+.highlight .hll {
+	background-color: #FFFF88;
+}
+
+.highlighttable {
+    font-size: 9pt;
+}
+
+.red {
+    color: red;
+    font-weight: bold;
+}
diff --git a/docs/ns3_html_theme/static/sidebar.js b/docs/ns3_html_theme/static/sidebar.js
new file mode 100644
index 0000000..a45e192
--- /dev/null
+++ b/docs/ns3_html_theme/static/sidebar.js
@@ -0,0 +1,151 @@
+/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+$(function() {
+  // global elements used by the functions.
+  // the 'sidebarbutton' element is defined as global after its
+  // creation, in the add_sidebar_button function
+  var bodywrapper = $('.bodywrapper');
+  var sidebar = $('.sphinxsidebar');
+  var sidebarwrapper = $('.sphinxsidebarwrapper');
+
+  // for some reason, the document has no sidebar; do not run into errors
+  if (!sidebar.length) return;
+
+  // original margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar expanded
+  var bw_margin_expanded = bodywrapper.css('margin-left');
+  var ssb_width_expanded = sidebar.width();
+
+  // margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar collapsed
+  var bw_margin_collapsed = '.8em';
+  var ssb_width_collapsed = '.8em';
+
+  // colors used by the current theme
+  var dark_color = $('.related').css('background-color');
+  var light_color = $('.document').css('background-color');
+
+  function sidebar_is_collapsed() {
+    return sidebarwrapper.is(':not(:visible)');
+  }
+
+  function toggle_sidebar() {
+    if (sidebar_is_collapsed())
+      expand_sidebar();
+    else
+      collapse_sidebar();
+  }
+
+  function collapse_sidebar() {
+    sidebarwrapper.hide();
+    sidebar.css('width', ssb_width_collapsed);
+    bodywrapper.css('margin-left', bw_margin_collapsed);
+    sidebarbutton.css({
+        'margin-left': '0',
+        'height': bodywrapper.height()
+    });
+    sidebarbutton.find('span').text('»');
+    sidebarbutton.attr('title', _('Expand sidebar'));
+    document.cookie = 'sidebar=collapsed';
+  }
+
+  function expand_sidebar() {
+    bodywrapper.css('margin-left', bw_margin_expanded);
+    sidebar.css('width', ssb_width_expanded);
+    sidebarwrapper.show();
+    sidebarbutton.css({
+        'margin-left': ssb_width_expanded-12,
+        'height': bodywrapper.height()
+    });
+    sidebarbutton.find('span').text('«');
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    document.cookie = 'sidebar=expanded';
+  }
+
+  function add_sidebar_button() {
+    sidebarwrapper.css({
+        'float': 'left',
+        'margin-right': '0',
+        'width': ssb_width_expanded - 28
+    });
+    // create the button
+    sidebar.append(
+        '<div id="sidebarbutton"><span>&laquo;</span></div>'
+    );
+    var sidebarbutton = $('#sidebarbutton');
+    light_color = sidebarbutton.css('background-color');
+    // find the height of the viewport to center the '<<' in the page
+    var viewport_height;
+    if (window.innerHeight)
+ 	  viewport_height = window.innerHeight;
+    else
+	  viewport_height = $(window).height();
+    sidebarbutton.find('span').css({
+        'display': 'block',
+        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
+    });
+
+    sidebarbutton.click(toggle_sidebar);
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    sidebarbutton.css({
+        'color': '#FFFFFF',
+        'border-left': '1px solid ' + dark_color,
+        'font-size': '1.2em',
+        'cursor': 'pointer',
+        'height': bodywrapper.height(),
+        'padding-top': '1px',
+        'margin-left': ssb_width_expanded - 12
+    });
+
+    sidebarbutton.hover(
+      function () {
+          $(this).css('background-color', dark_color);
+      },
+      function () {
+          $(this).css('background-color', light_color);
+      }
+    );
+  }
+
+  function set_position_from_cookie() {
+    if (!document.cookie)
+      return;
+    var items = document.cookie.split(';');
+    for(var k=0; k<items.length; k++) {
+      var key_val = items[k].split('=');
+      var key = key_val[0];
+      if (key == 'sidebar') {
+        var value = key_val[1];
+        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
+          collapse_sidebar();
+        else if ((value == 'expanded') && (sidebar_is_collapsed()))
+          expand_sidebar();
+      }
+    }
+  }
+
+  add_sidebar_button();
+  var sidebarbutton = $('#sidebarbutton');
+  set_position_from_cookie();
+});
diff --git a/docs/named_data_theme/static/tab_b.png b/docs/ns3_html_theme/static/tab_b.png
similarity index 100%
copy from docs/named_data_theme/static/tab_b.png
copy to docs/ns3_html_theme/static/tab_b.png
Binary files differ
diff --git a/docs/ns3_html_theme/theme.conf b/docs/ns3_html_theme/theme.conf
new file mode 100644
index 0000000..f733deb
--- /dev/null
+++ b/docs/ns3_html_theme/theme.conf
@@ -0,0 +1,54 @@
+[theme]
+inherit = basic
+stylesheet = default.css
+pygments_style = sphinx
+
+[options]
+projectname = ndnSIM
+homepage = http://ndnSIM.net/
+homepage2 = http://irl.cs.ucla.edu/
+apidocs = ndnSIM API
+apidocsurl = http://ndnSIM.net/doxygen/annotated.html
+customstylesheet = ns3_stylesheet.css
+logo = ndn-logo.png
+logo2 = irl-logo.png
+# logo = ns-3-inverted-notext-small.png
+logoalt = ns-3 Logo
+projectbrief = NS-3 based Named Data Networking (NDN) simulator
+projectnumber = ndnSIM: NDN, CCN, CCNx, content centric networks
+
+favicon = favicon.ico
+docstitle = Documentation
+
+rightsidebar = false
+stickysidebar = false
+collapsiblesidebar = true
+externalrefs = true
+
+bgcolor          = white
+textcolor	 = black
+linkcolor        = #91A501
+visitedlinkcolor = #91A501
+
+headbgcolor      = #E3E3E3
+headtextcolor 	 = #373737
+headlinkcolor 	 = #91A501
+
+relbarbgcolor 	 = #D5D5D5
+relbarlinkcolor  = #373737
+relbartextcolor  = #373737
+
+sidebarbgcolor 	 = #FAFAFA
+sidebartextcolor = #373737
+sidebarlinkcolor = #91A501
+sidebarbtncolor  = #D5D5D5
+
+footerbgcolor    = #D5D5D5
+footertextcolor	 = #364D7C
+
+codebgcolor      = ##FBFCFD
+codetextcolor    = black
+
+bodyfont = 'Lucida Grande', Verdana, Geneva, Arial, sans-serif
+headfont = 'Lucida Grande', Verdana, Geneva, Arial, sans-serif
+
diff --git a/docs/source/_static/apps/zipf-n100-frq100-duration10.png b/docs/source/_static/apps/zipf-n100-frq100-duration10.png
new file mode 100644
index 0000000..b9918f3
--- /dev/null
+++ b/docs/source/_static/apps/zipf-n100-frq100-duration10.png
Binary files differ
diff --git a/docs/source/_static/apps/zipf-n100-frq100-duration100.png b/docs/source/_static/apps/zipf-n100-frq100-duration100.png
new file mode 100644
index 0000000..c560df5
--- /dev/null
+++ b/docs/source/_static/apps/zipf-n100-frq100-duration100.png
Binary files differ
diff --git a/docs/source/_static/apps/zipf-n100-frq100-duration1000.png b/docs/source/_static/apps/zipf-n100-frq100-duration1000.png
new file mode 100644
index 0000000..2e4df17
--- /dev/null
+++ b/docs/source/_static/apps/zipf-n100-frq100-duration1000.png
Binary files differ
diff --git a/docs/source/_static/apps/zipf-n100-frq100-duration50.png b/docs/source/_static/apps/zipf-n100-frq100-duration50.png
new file mode 100644
index 0000000..ecc4291
--- /dev/null
+++ b/docs/source/_static/apps/zipf-n100-frq100-duration50.png
Binary files differ
diff --git a/docs/source/_static/l2-rate-tracer.png b/docs/source/_static/l2-rate-tracer.png
new file mode 100644
index 0000000..c930bd4
--- /dev/null
+++ b/docs/source/_static/l2-rate-tracer.png
Binary files differ
diff --git a/docs/source/_static/ndnsim-components.pdf b/docs/source/_static/ndnsim-components.pdf
new file mode 100644
index 0000000..d940bf9
--- /dev/null
+++ b/docs/source/_static/ndnsim-components.pdf
Binary files differ
diff --git a/docs/source/_static/ndnsim-components.png b/docs/source/_static/ndnsim-components.png
new file mode 100644
index 0000000..1601f19
--- /dev/null
+++ b/docs/source/_static/ndnsim-components.png
Binary files differ
diff --git a/docs/source/_static/root-5sec-counts.png b/docs/source/_static/root-5sec-counts.png
new file mode 100644
index 0000000..5257f1d
--- /dev/null
+++ b/docs/source/_static/root-5sec-counts.png
Binary files differ
diff --git a/docs/source/_static/root-rates.png b/docs/source/_static/root-rates.png
new file mode 100644
index 0000000..bc0df92
--- /dev/null
+++ b/docs/source/_static/root-rates.png
Binary files differ
diff --git a/docs/source/_static/topo-tree-25-node.png b/docs/source/_static/topo-tree-25-node.png
new file mode 100644
index 0000000..ba39687
--- /dev/null
+++ b/docs/source/_static/topo-tree-25-node.png
Binary files differ
diff --git a/docs/source/_templates/indexcontent.html b/docs/source/_templates/indexcontent.html
new file mode 100644
index 0000000..a536a8d
--- /dev/null
+++ b/docs/source/_templates/indexcontent.html
@@ -0,0 +1,72 @@
+{% extends "layout.html" %}
+{% set title = _('ndnSIM documentation') %}
+
+{% block body %}
+    <h1>{{ docstitle|e }}</h1>
+    <p>
+The ndnSIM is NS-3 module that implements Named Data Networking (NDN) communication model, the clean slate Internet design. ndnSIM is specially optimized for simulation purposes and has a cleaner and more extensible internal structure comparing to the existing NDN implementation (NDNx).
+    </p>
+
+    <p>
+We invite you to <a href="http://www.lists.cs.ucla.edu/mailman/listinfo/ndnsim" target="_blank">join our mailing list</a> to see and participate in discussions about ndnSIM implementation and simulations in general (<a href="http://www.lists.cs.ucla.edu/pipermail/ndnsim/" target="_blank">mailing list archives</a>).
+    </p>
+
+  {% block tables %}
+  <p><strong>Parts of the documentation:</strong></p>
+  <table class="contentstable" align="center"><tr>
+    <td width="50%" valign="top">
+      <p class="biglink"><a class="biglink" href="{{ pathto("tutorial") }}">ndnSIM tutorial</a><br/>
+         <div class="linkdescr" style="margin-left: 20px">
+           <p class="biglink"><a class="biglink" href="{{ pathto("intro") }}">Introduction</a><br/>
+             <span class="linkdescr">what is ndnSIM, how to get support, and what is in the package</span></p>
+           <p class="biglink"><a class="biglink" href="{{ pathto("getting-started") }}">Getting started</a><br/>
+             <span class="linkdescr">portability, requirements, downloading, compiling, simulating</span></p>
+           <p class="biglink"><a class="biglink" href="{{ pathto("helpers") }}">ndnSIM helpers</a><br/>
+             <span class="linkdescr">very important components of ndnSIM for writing simulation scenarios</span></p>
+           <p class="biglink"><a class="biglink" href="{{ pathto("cs") }}">Content Store</a><br/>
+             <span class="linkdescr">several different build-in content store implementations: LRU, LFU, and others</span></p>
+           <p class="biglink"><a class="biglink" href="{{ pathto("fw") }}">Forwarding Strategies</a><br/>
+             <span class="linkdescr">experimenting with differnet build-in and custom Interest/Data forwarding strategies</span></p>
+           <p class="biglink"><a class="biglink" href="{{ pathto("applications") }}">ndnSIM applications</a><br/>
+             <span class="linkdescr">reference applications for network-leverl evaluations</span></p>
+           <p class="biglink"><a class="biglink" href="{{ pathto("metric") }}">Obtaining metrics</a><br/>
+             <span class="linkdescr">obtaining and visualizing metrics from simulation runs</span></p>
+         </div>
+      </p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("examples") }}">Simulation examples</a><br/>
+          <span class="linkdescr">basic tutorial examples</span></p>
+
+    </td>
+    <td width="50%" valign="top">
+      <p class="biglink"><a class="biglink" href="doxygen/annotated.html">ndnSIM API documentation</a><br/>
+         <span class="linkdescr">doxygen-generated API documentation</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("faq") }}">FAQs</a><br/>
+         <span class="linkdescr">frequently asked questions (with answers!)</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("ndnsim-packet-formats") }}">ndnSIM packet format</a><br/>
+         <span class="linkdescr">definition of the optimized default packet format</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("ndnsim-research-papers") }}">ndnSIM research papers</a><br/>
+         <span class="linkdescr">list of ndnSIM-related papers</span></p>
+    </td></tr>
+  </table>
+
+  <p><strong>Meta information:</strong></p>
+  <table class="contentstable" align="center"><tr>
+    <td width="50%" valign="top">
+      <p class="biglink"><a class="biglink" href="{{ pathto("meta/bugs") }}">Reporting bugs</a></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("meta/about") }}">About the documentation</a></p>
+    </td><td width="50%" valign="top">
+      <p class="biglink"><a class="biglink" href="{{ pathto("meta/license") }}">ndnSIM license</a></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("meta/copyright") }}">Copyright</a></p>
+    </td></tr>
+  </table>
+  {% endblock %}
+
+  <p>
+<hr class="docutils" />
+<dl class="docutils">
+<dt>If you refer to ndnSIM in a published work, please cite the following paper, not just the ndnSIM website. Thank you!</dt>
+<dd><strong>A. Afanasyev, I. Moiseenko, and L. Zhang, &#8220;ndnSIM: NDN simulator for NS-3,&#8221; NDN, Technical Report NDN-0005, 2012</strong> (<a class="reference external" href="http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/367">BibTex</a>)</dd>
+</dl>
+  </p>
+
+{% endblock %}
diff --git a/docs/source/applications.rst b/docs/source/applications.rst
new file mode 100644
index 0000000..c62722c
--- /dev/null
+++ b/docs/source/applications.rst
@@ -0,0 +1,269 @@
+.. _applications:
+
+ndnSIM applications
+===================
+
+ndnSIM includes a few reference applications that can be used as a base for NDN simulations.
+
+Reference applications
+++++++++++++++++++++++
+
+ConsumerCbr
+^^^^^^^^^^^^^^^
+
+:ndnsim:`ConsumerCbr` an application that generates Interest traffic with predefined pattern (constant frequency, constant average rate with inter-Interest gap distributed uniformly at random, exponentially at random, etc.).
+
+.. code-block:: c++
+
+   // Create application using the app helper
+   ndn::AppHelper helper ("ns3::ndn::ConsumerCbr");
+
+This applications has the following attributes:
+
+* ``Frequency``
+
+  .. note::
+     default: ``1.0`` (1 per second)
+
+  Either exact (for contant version) or expected (for randomized version) frequency with which Interests are generated
+
+  .. code-block:: c++
+
+     // Set attribute using the app helper
+     helper.SetAttribute ("Frequency", DoubleValue (1.0));
+
+* ``Randomize``
+
+  .. note::
+     default: ``"none"``
+
+  Specify whether to do randomization for inter-Interest gap or not.  The following variants are currently supported:
+
+  - ``"none"``: no randomization
+
+  - ``"uniform"``: uniform distribution in range (0, 1/Frequency)
+
+  - ``"exponential"``: exponential distribution with mean 1/Frequency
+
+  .. code-block:: c++
+
+     // Set attribute using the app helper
+     helper.SetAttribute ("Randomize", StringValue ("uniform"));
+
+ConsumerZipfMandelbrot
+^^^^^^^^^^^^^^^^^^^^^^
+
+.. note::
+    Author: Xiaoke Jiang
+
+An app that requests contents (names in the requests) following Zipf-Mandelbrot distribution (number of Content frequency Distribution).
+This class is a subclass of :ndnsim:`ConsumerCbr`.
+
+.. code-block:: c++
+
+   // Create application using the app helper
+   ndn::AppHelper helper ("ns3::ndn::ConsumerZipfMandelbrot");
+
+``Frequency`` and ``Randomize`` attributes can be used in the same way as in the base :ndnsim:`ConsumerCbr` applications.
+
+Additional attributes:
+
+* ``NumberOfContents``
+
+    .. note::
+        default: 100
+
+    Number of different content (sequence numbers) that will be requested by the applications
+
+
+THE following pictures show basic comparison of the generated stream of Interests versus theoretical `Zipf-Mandelbrot <http://en.wikipedia.org/wiki/Zipf%E2%80%93Mandelbrot_law>`_ function (``NumberOfContents`` set to 100 and ``Frequency`` set to 100)
+
+.. image:: _static/apps/zipf-n100-frq100-duration10.png
+   :alt: Comparsion between simulation and theory with simulation duration 10 seconds
+
+.. image:: _static/apps/zipf-n100-frq100-duration50.png
+   :alt: Comparsion between simulation and theory with simulation duration 50 seconds
+
+.. image:: _static/apps/zipf-n100-frq100-duration100.png
+   :alt: Comparsion between simulation and theory with simulation duration 100 seconds
+
+.. image:: _static/apps/zipf-n100-frq100-duration1000.png
+   :alt: Comparsion between simulation and theory with simulation duration 1000 seconds
+
+
+ConsumerBatches
+^^^^^^^^^^^^^^^^^^^
+
+:ndnsim:`ConsumerBatches` is an on-off-style application gen- erating a specified number of Interests at specified points of simulation.
+
+.. code-block:: c++
+
+   // Create application using the app helper
+   ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerBatches");
+
+This applications has the following attributes:
+
+* ``Batches``
+
+  .. note::
+     default: Empty
+
+  Specify exact pattern of Interest packets, specifying when and how many Interest packets should be sent.
+  The following example defines that 1 Interest should be requested at time 1s, 5 Interests at time 5s, and 2 Interests at time 10s.:
+
+  .. code-block:: c++
+
+     // Set attribute using the app helper
+     helper.SetAttribute ("Batches", StringValue ("1s 1 2s 5 10s 2"));
+
+
+ConsumerWindow
+^^^^^^^^^^^^^^^^^^
+
+:ndnsim:`ConsumerWindow` is an application generating a variable rate Interest traffic. It relies on an optional NACK-Interest feature and implements a simple sliding-window-based Interest generation mechanism.
+
+.. code-block:: c++
+
+   // Create application using the app helper
+   ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerWindow");
+
+
+This applications has the following attributes:
+
+* ``Window``
+
+  .. note::
+     default: ``1``
+
+  Initial number of Interests that will be send out without waiting for the data (number of outstanding Interests)
+
+* ``PayloadSize``
+
+  .. note::
+     default: ``1040``
+
+  Expected size of the Data payload (necessary only when Size is specified)
+
+* ``Size``
+
+  .. note::
+     default: ``-1``
+
+  Amount of data to be requested (will stop issuing Interests after ``Size`` data is received)
+
+  If ``Size`` is set to -1, Interests will be requested till the end of the simulation.
+
+Producer
+^^^^^^^^^^^^
+
+:ndnsim:`Producer` a simple Interest-sink application, which replying every incoming Interest with Data packet with a specified size and name same as in Interest.
+
+.. code-block:: c++
+
+   // Create application using the app helper
+   ndn::AppHelper consumerHelper ("ns3::ndn::Producer");
+
+.. _Custom applications:
+
+Custom applications
++++++++++++++++++++
+
+Applications interact with the core of the system using :ndnsim:`AppFace` realization of Face abstraction.
+To simplify implementation of specific NDN application, ndnSIM provides a base :ndnsim:`App` class that takes care of creating :ndnsim:`AppFace` and registering it inside the NDN protocol stack, as well as provides default processing for incoming Interest and Data packets.
+
+.. Base App class
+.. ^^^^^^^^^^^^^^^^^^
+
+
+Customer example
+^^^^^^^^^^^^^^^^
+
+The following code shows how a simple ndnSIM application can be created, and how an application can send Interests and respond with ContentObjects to incoming interests.
+
+When this application starts it sets "interest filter" (install FIB entry) for /prefix/sub, as well as sends Interest for this prefix.
+When an Interest is received, it is replied with a ContentObject with 1024-byte fake payload.
+
+For more details refer ``examples/custom-apps/custom-app.h``, ``examples/custom-apps/custom-app.cc`` and API documentation of ndnSIM and NS-3.
+
+Header file ``examples/custom-apps/custom-app.h``:
+
+.. literalinclude:: ../../examples/custom-apps/custom-app.h
+    :language: c++
+    :linenos:
+    :lines: 21-29,40-
+
+Source file ``examples/custom-apps/custom-app.cc``:
+
+.. literalinclude:: ../../examples/custom-apps/custom-app.cc
+    :language: c++
+    :linenos:
+    :lines: 21-
+
+Example how to use custom app in a scenario (``ndn-simple-with-custom-app.cc``):
+
+ .. *      +------+ <-----> (CustomApp1)
+ .. *      | Node |
+ .. *      +------+ <-----> (CustomApp2)
+ .. *
+
+.. literalinclude:: ../../examples/ndn-simple-with-custom-app.cc
+    :language: c++
+    :linenos:
+    :lines: 21-28,39-
+    :emphasize-lines: 26-31
+
+
+To run this scenario, use the following command::
+
+        NS_LOG=CustomApp ./waf --run=ndn-simple-with-custom-app
+
+
+Producer example (Interest hijacker)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following code demonstrates how to implement a basic producer application that "hijacks" all incoming Interests.
+
+Header file ``examples/custom-apps/hijacker.h``:
+
+.. literalinclude:: ../../examples/custom-apps/hijacker.h
+    :language: c++
+    :linenos:
+    :lines: 21-
+
+Source file ``examples/custom-apps/hijacker.cc``:
+
+.. literalinclude:: ../../examples/custom-apps/hijacker.cc
+    :language: c++
+    :linenos:
+    :lines: 21-
+
+
+After defining this class, you can use it with :ndnsim:`ndn::AppHelper`. For example:
+
+.. code-block:: c++
+
+    ...
+    ndn::AppHelper producerHelper ("Hijacker");
+    producerHelper.Install (producerNode);
+    ...
+
+Dumb requester
+^^^^^^^^^^^^^^
+
+This application continually requests the same Data packet.
+
+Header file ``examples/custom-apps/dumb-requester.h``:
+
+.. literalinclude:: ../../examples/custom-apps/dumb-requester.h
+    :language: c++
+    :linenos:
+    :lines: 21-
+
+Source file ``examples/custom-apps/dumb-requester.cc``:
+
+.. literalinclude:: ../../examples/custom-apps/dumb-requester.cc
+    :language: c++
+    :linenos:
+    :lines: 21-
+
+
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..1d60617
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# ndnSIM: NS-3 based NDN simulator documentation build configuration file, created by
+# sphinx-quickstart on Thu May 31 18:21:13 2012.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [ "sphinx.ext.autodoc", "sphinx.ext.mathjax", "sphinxcontrib.doxylink", "sphinxcontrib.aafig", "sphinxcontrib.googleanalytics", "sphinxcontrib.bibtex" ]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'tutorial'
+
+# General information about the project.
+project = u''
+copyright = u'2011-2013 (c) Alexander Afanasyev, Ilya Moiseenko, and Lixia Zhang'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.5'
+# The full version, including alpha/beta/rc tags.
+release = 'Overall ndnSIM'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'ns3_html_theme'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+html_theme_path = ["../"]
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+html_additional_pages = {
+   'index': 'indexcontent.html',
+}
+
+# If false, no module index is generated.
+html_domain_indices = False
+
+# If false, no index is generated.
+html_use_index = False
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'ndnSIMNS-3basedNDNsimulatordoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('tutorial', 'ndnSIM-tutorial.tex', u'ndnSIM: NS-3 based Named Data Networking (NDN) simulator documentation',
+   u'Alexander Afanasyev, Ilya Moiseenko, and Lixia Zhang', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+latex_domain_indices = False
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'ndnSIM', u'ndnSIM: NS-3 based Named Data Networking (NDN) simulator documentation',
+     [u'Alexander Afanasyev, Ilya Moiseenko, and Lixia Zhang'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  ('index', 'ndnSIM', u'ndnSIM: NS-3 based Named Data Networking (NDN) simulator documentation',
+   u'Alexander Afanasyev, Ilya Moiseenko, and Lixia Zhang', 'ndnSIM', 'One line description of project.',
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+texinfo_domain_indices = False
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+doxylink = {
+  'ndnsim' : ('ndnSIM.tag', 'doxygen/'),
+}
+
+googleanalytics_id = "UA-21372502-8"
+
+googleanalytics_enabled = True
+
+aafig_format = dict(latex='pdf', html='svg', text=None)
+
+# aafig_default_options = dict(Fixed=True)
diff --git a/docs/source/cs.rst b/docs/source/cs.rst
new file mode 100644
index 0000000..6098337
--- /dev/null
+++ b/docs/source/cs.rst
@@ -0,0 +1,242 @@
+.. _content store:
+
+Content Store
++++++++++++++
+
+ndnSIM comes with several different in-memory :ndnsim:`content store <ndn::ContentStore>` implementations, featuring different cache replacement policies.
+
+.. note:
+
+    The default content store uses LRU replacement policity and constrained with 100 cached ContentObjects.
+
+To select a particular content store and configure its capacity, use :ndnsim:`SetContentStore <ndn::StackHelper::SetContentStore>` helper method
+
+Simple content stores
+^^^^^^^^^^^^^^^^^^^^^
+
+Least Recently Used (LRU) (default)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Lru`.
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Lru",
+                                    "MaxSize", "10000");
+	 ...
+	 ndnHelper.Install (nodes);
+
+First-In-First-Out (FIFO)
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Fifo`
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Fifo",
+                                    "MaxSize", "10000");
+	 ...
+	 ndnHelper.Install (nodes);
+
+Random
+~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Random`
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Random",
+                                    "MaxSize", "10000");
+	 ...
+	 ndnHelper.Install (nodes);
+
+.. note::
+
+    If ``MaxSize`` parameter is omitted, then will be used a default value (100).
+
+.. note::
+
+    If ``MaxSize`` is set to 0, then no limit on ContentStore will be enforced
+
+Nocache
+~~~~~~~
+
+:ndnsim:`Trivial implementation <ndn::cs::Nocache>` of the ContentStore that does not really do any caching.
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Nocache");
+	 ...
+	 ndnHelper.Install (nodes);
+
+Content stores with entry lifetime tracking
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In order to evaluate lifetime of the content store entries, the special versions of the content store need to be used:
+
+Least Recently Used (LRU)
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Stats::Lru`.
+
+Usage example:
+
+      .. code-block:: c++
+
+         void
+         CacheEntryRemoved (std::string context, Ptr<const ndn::cs::Entry> entry, Time lifetime)
+         {
+             std::cout << entry->GetName () << " " << lifetime.ToDouble (Time::S) << "s" << std::endl;
+         }
+
+         ...
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Stats::Lru",
+                                    "MaxSize", "10000");
+	 ...
+	 ndnHelper.Install (nodes);
+
+         // connect to lifetime trace
+         Config::Connect ("/NodeList/*/$ns3::ndn::cs::Stats::Lru/WillRemoveEntry", MakeCallback (CacheEntryRemoved));
+
+
+First-In-First-Out (FIFO)
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Stats::Fifo`.
+
+Usage example:
+
+      .. code-block:: c++
+
+         void
+         CacheEntryRemoved (std::string context, Ptr<const ndn::cs::Entry> entry, Time lifetime)
+         {
+             std::cout << entry->GetName () << " " << lifetime.ToDouble (Time::S) << "s" << std::endl;
+         }
+
+         ...
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Stats::Fifo",
+                                    "MaxSize", "10000");
+	 ...
+	 ndnHelper.Install (nodes);
+
+         // connect to lifetime trace
+         Config::Connect ("/NodeList/*/$ns3::ndn::cs::Stats::Fifo/WillRemoveEntry", MakeCallback (CacheEntryRemoved));
+
+Random
+~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Stats::Random`
+
+Usage example:
+
+      .. code-block:: c++
+
+         void
+         CacheEntryRemoved (std::string context, Ptr<const ndn::cs::Entry> entry, Time lifetime)
+         {
+             std::cout << entry->GetName () << " " << lifetime.ToDouble (Time::S) << "s" << std::endl;
+         }
+
+         ...
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Stats::Random",
+                                    "MaxSize", "10000");
+	 ...
+	 ndnHelper.Install (nodes);
+
+         // connect to lifetime trace
+         Config::Connect ("/NodeList/*/$ns3::ndn::cs::Stats::Random/WillRemoveEntry", MakeCallback (CacheEntryRemoved));
+
+.. _Content Store respecting freshness field of ContentObjects:
+
+Content stores respecting freshness field of ContentObjects
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If simulations need Content Store which respects freshness of ContentObjects, the following versions of content store should be used:
+
+.. note:
+
+    Please note that currently, Freshness granularity is 1 second and maximum value is 65535 second. Value means infinity.
+
+Least Recently Used (LRU)
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Freshness::Lru`.
+
+Usage example:
+
+      .. code-block:: c++
+
+         ...
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Freshness::Lru",
+                                    "MaxSize", "10000");
+	 ...
+
+First-In-First-Out (FIFO)
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Freshness::Fifo`
+
+Usage example:
+
+      .. code-block:: c++
+
+         ...
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Freshness::Fifo",
+                                    "MaxSize", "10000");
+	 ...
+
+Random
+~~~~~~
+
+Implementation name: :ndnsim:`ndn::cs::Freshness::Random`
+
+Usage example:
+
+      .. code-block:: c++
+
+         ...
+
+         ndnHelper.SetContentStore ("ns3::ndn::cs::Freshness::Random",
+                                    "MaxSize", "10000");
+	 ...
+
+Example
+~~~~~~~
+
+The following example demonstrates a basic usage of a customized content store (``ndn-simple-with-content-freshness.cc``).
+In this scenario two simple consumers (both installed on a consumer node) continually request the same data packet.
+When Data producer specify unlimited freshness, Content keeps getting satisfied from local caches, while if freshness is specified, Interests periodically are getting through to the Data producer.
+
+.. aafig::
+    :aspect: 60
+    :scale: 120
+
+      +----------+                +--------+                +----------+
+      |          |     1Mbps      |        |      1Mbps     |          |
+      | Consumer |<-------------->| Router |<-------------->| Producer |
+      |          |         10ms   |        |         10ms   |          |
+      +----------+                +--------+                +----------+
+
+
+.. literalinclude:: ../../examples/ndn-simple-with-content-freshness.cc
+    :language: c++
+    :linenos:
+    :lines: 20-27,43-
+
+To run this scenario, use the following command::
+
+        NS_LOG=DumbRequester:ndn.cs.Freshness.Lru ./waf --run=ndn-simple-with-content-freshness
diff --git a/docs/source/examples.rst b/docs/source/examples.rst
new file mode 100644
index 0000000..4fb13d0
--- /dev/null
+++ b/docs/source/examples.rst
@@ -0,0 +1,374 @@
+Examples
+========
+
+.. role:: red
+
+.. note::
+   :red:`!!! This page only shows up examples of how to config topology and perform basic operations in ndnSIM (an example equivalent to "Hello, world1") !!!  These are **NOT** examples of real experimentations (just like "Hello, world!" is not a real program).`
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+.. _simple-scenario:
+
+Simple scenario
+---------------
+
+.. sidebar:: Topology
+
+    .. aafig::
+        :aspect: 60
+        :scale: 90
+
+          +----------+                +--------+                +----------+
+          |          |     1Mbps      |        |      1Mbps     |          |
+          | Consumer |<-------------->| Router |<-------------->| Producer |
+          |          |         10ms   |        |         10ms   |          |
+          +----------+                +--------+                +----------+
+
+The first example (``ndn-simple.cc``) shows very basics of ndnSIM.  In the simulated
+topology there are 3 nodes, connected with point-to-point links, one
+NDN consumer, and one NDN producer:
+
+Consumer is simulated using :ndnsim:`ConsumerCbr` reference application and generates Interests towards the producer
+with frequency of 10 Interests per second (see :doc:`applications`).
+
+Producer is simulated using :ndnsim:`Producer` class, which is used to satisfy all incoming Interests with virtual payload data (1024 bytes).
+
+FIB on every node is populated using default routes (see :doc:`helpers`).
+
+The following code represents all that is necessary to run such a
+simple scenario
+
+.. literalinclude:: ../../examples/ndn-simple.cc
+   :language: c++
+   :linenos:
+   :lines: 20-27,48-
+   :emphasize-lines: 30-33,37-49
+
+If this code is placed into ``scratch/ndn-simple.cc`` and NS-3 is compiled in debug mode, you can run and see progress of the
+simulation using the following command (in optimized mode nothing will be printed out)::
+
+     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+.. _9-node-grid-example:
+
+9-node grid example
+-------------------
+
+.. sidebar:: Topology
+
+    .. aafig::
+        :aspect: 60
+        :scale: 120
+
+        /--------\      /-\         /-\
+        |Consumer|<---->| |<------->| |
+        \--------/      \-/         \-/
+            ^            ^           ^
+            |            |           |   1Mbps/10ms delay
+            v            v           v
+           /-\          /-\         /-\
+           | |<-------->| |<------->| |
+           \-/          \-/         \-/
+            ^            ^           ^
+            |            |           |
+            v            v           v
+           /-\          /-\      /--------\
+           | |<-------->| |<---->|Producer|
+           \-/          \-/      \--------/
+
+This scenario (``ndn-grid.cc``) simulates a grid topology, which is constructed using PointToPointLayout NS-3 module
+
+FIB is populated using :ndnsim:`GlobalRoutingHelper` (see :doc:`helpers`).
+
+Consumer is simulated using :ndnsim:`ConsumerCbr` reference application and generates Interests towards the producer
+with frequency of 100 interests per second (see :doc:`applications`).
+
+Producer is simulated using :ndnsim:`Producer` class, which is used to satisfy all incoming Interests with virtual payload data (1024 bytes).
+
+The following code represents all that is necessary to run such a simple scenario
+
+.. literalinclude:: ../../examples/ndn-grid.cc
+   :language: c++
+   :linenos:
+   :lines: 20-27,53-
+   :emphasize-lines: 28,31-33,35-38,53-57
+
+
+If this code is placed into ``scratch/ndn-grid.cc`` and NS-3 is compiled in debug mode, you can run and see progress of the
+simulation using the following command (in optimized mode nothing will be printed out)::
+
+    NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+.. _9-node-grid-example-using-topology-plugin:
+
+9-node grid example using topology plugin
+-----------------------------------------
+
+.. sidebar:: Topology
+
+    .. aafig::
+        :aspect: 60
+        :scale: 120
+
+        /--------\      /-\         /-\
+        |Consumer|<---->| |<------->| |
+        \--------/      \-/         \-/
+            ^            ^           ^
+            |            |           |   1Mbps/10ms delay
+            v            v           v
+           /-\          /-\         /-\
+           | |<-------->| |<------->| |
+           \-/          \-/         \-/
+            ^            ^           ^
+            |            |           |
+            v            v           v
+           /-\          /-\      /--------\
+           | |<-------->| |<---->|Producer|
+           \-/          \-/      \--------/
+
+Instead of defining topology directly as in :ref:`simple-scenario` or using specialized helpers as in :ref:`9-node-grid-example`, ndnSIM provides experimental extended versions of TopologyReader classes: :ndnsim:`AnnotatedTopologyReader` and :ndnsim:`RocketfuelWeightsReader`.
+
+While :ndnsim:`RocketfuelWeightsReader` is a specialized version intended to be used with `Rocketfuel <http://www.cs.washington.edu/research/networking/rocketfuel/>`_ topology and link weights files (examples will be provided later), :ndnsim:`AnnotatedTopologyReader` is a more general-use class that uses simple user-readable format.
+
+:ndnsim:`AnnotatedTopologyReader` expects the following format:
+
+.. literalinclude:: ../../examples/topologies/topo-grid-3x3.txt
+   :language: bash
+   :linenos:
+   :lines: 1-2,19-
+   :emphasize-lines: 8,24
+
+
+This scenario (``ndn-grid-topo-plugin.cc``) duplicates the functionality of :ref:`9-node-grid-example` but with the use of :ndnsim:`AnnotatedTopologyReader`.
+
+.. literalinclude:: ../../examples/ndn-grid-topo-plugin.cc
+   :language: c++
+   :linenos:
+   :lines: 20-26,51-
+   :emphasize-lines: 14-16,20,27-30
+
+As you can see, scenario code became more compact and more readable.
+
+:ndnsim:`AnnotatedTopologyReader` provides two ways to access topology nodes.
+First, you can use the method :ndnsim:`AnnotatedTopologyReader::GetNodes` which returns NodeContainer.
+
+Alternatively, nodes can be accessed by name using `Names::Find<Node> ("nodename")` call, as in the above example.
+For this purpose,:ndnsim:`AnnotatedTopologyReader` automatically registers all created nodes with names specified in topology file.
+For more information about `Names` class, please refer to `NS-3 documentation <.. http://www.nsnam.org/doxygen/classns3_1_1_names.html>`_
+.
+
+If the topology file is placed into ``src/ndnSIM/examples/topologies/topo-grid-3x3.txt`` and the code is placed into ``scratch/ndn-grid-topo-plugin.cc``, you can run and see progress of the simulation using the following command (in optimized mode nothing will be printed out)::
+
+    NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-topo-plugin
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+6-node bottleneck topology
+--------------------------
+
+.. sidebar:: Topology
+
+    .. aafig::
+        :aspect: 60
+        :scale: 90
+
+        /------\                                                    /------\
+        | Src1 |<--+                                            +-->| Dst1 |
+        \------/    \                                          /    \------/
+                     \                                        /
+                      +-->/------\   "bottleneck"  /------\<-+
+                          | Rtr1 |<===============>| Rtr2 |
+                      +-->\------/                 \------/<-+
+                     /                                        \
+        /------\    /                                          \    /------\
+        | Src2 |<--+                                            +-->| Dst2 |
+        \------/                                                    \------/
+
+This scenario (``ndn-congestion-topo-plugin.cc``) can be used for congestion-related scenarios
+
+.. literalinclude:: ../../examples/topologies/topo-6-node.txt
+    :language: bash
+    :linenos:
+    :lines: 1-2,15-
+    :emphasize-lines: 3,13
+
+.. literalinclude:: ../../examples/ndn-congestion-topo-plugin.cc
+   :language: c++
+   :linenos:
+   :lines: 20-26,47-
+   :emphasize-lines: 15,21-22,29-34,41-47,52-62
+
+.. :lines: 20-25,53-
+
+To run this scenario and see what is happening, use the following command::
+
+        NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-congestion-topo-plugin
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+.. _11-node 2-bottleneck topology with custom forwarding strategy:
+
+11-node 2-bottleneck topology with custom forwarding strategy
+-------------------------------------------------------------
+
+.. sidebar:: Topology
+
+    .. aafig::
+        :aspect: 60
+        :scale: 90
+
+         /------\ 0                                                 0 /------\
+         |  c1  |<-----+                                       +----->|  p1  |
+         \------/       \                                     /       \------/
+                         \              /-----\              /
+         /------\ 0       \         +==>| r12 |<==+         /       0 /------\
+         |  c2  |<--+      \       /    \-----/    \       /      +-->|  p2  |
+         \------/    \      \     |                 |     /      /    \------/
+                      \      |    |   1Mbps links   |    |      /
+                       \  1  v0   v5               1v   2v  3  /
+                        +->/------\                 /------\<-+
+                          2|  r1  |<===============>|  r2  |4
+                        +->\------/4               0\------/<-+
+                       /    3^                           ^5    \
+                      /      |                           |      \
+         /------\ 0  /      /                             \      \  0 /------\
+         |  c3  |<--+      /                               \      +-->|  p3  |
+         \------/         /                                 \         \------/
+                         /     "All consumer-router and"     \
+         /------\ 0     /      "router-producer links are"    \    0 /------\
+         |  c4  |<-----+       "10Mbps"                        +---->|  p4  |
+         \------/                                                    \------/
+
+         "Numbers near nodes denote face IDs. Face ID is assigned based on the order of link"
+         "definitions in the topology file"
+
+To effectively use the example :ref:`custom strategy <Writing your own custom strategy>`, we need to make sure that FIB entries contain at least two entries.
+In the current version of ndnSIM, this can be accomplished using manual route configuration.
+
+The following example illustrates how the strategy can be used in simulation scenario.
+
+Let us first define a meaningful topology:
+
+
+The corresponding topology file (``topo-11-node-two-bottlenecks.txt``):
+
+.. literalinclude:: ../../examples/topologies/topo-11-node-two-bottlenecks.txt
+    :language: bash
+    :linenos:
+    :lines: 1-2,28-
+
+Example simulation (``ndn-congestion-alt-topo-plugin.cc``) scenario that utilizes CustomStrategy forwarding strategy:
+
+.. literalinclude:: ../../examples/ndn-congestion-alt-topo-plugin.cc
+    :language: c++
+    :linenos:
+    :lines: 21-28,61-
+    :emphasize-lines: 16,21,49-50,65-79
+
+
+To run this scenario and see what is happening, use the following command::
+
+        NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-congestion-alt-topo-plugin
+
+You can also run using visualizer module to verify that both bottleneck links are utilized::
+
+        ./waf --run=ndn-congestion-alt-topo-plugin --visualize
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+3-level binary tree with packet-level trace helpers
+---------------------------------------------------
+
+:ref:`packet trace helper example`
+
+
+3-level binary tree with content store trace helper
+---------------------------------------------------
+
+:ref:`cs trace helper example`
+
+
+3-level binary tree with  application-level Interest-Data delay tracer
+----------------------------------------------------------------------
+
+:ref:`app delay trace helper example`
+
+
+3-node topology with Content Store respecting freshness field of ContentObjects
+-------------------------------------------------------------------------------
+
+:ref:`Content Store respecting freshness field of ContentObjects`
+
+1-node topology with custom application
+---------------------------------------
+
+:ref:`Custom applications`
+
+Simple scenario with pcap dump
+------------------------------
+
+The following example (``ndn-simple-with-pcap.cc``) demonstrates how to dump all simulated traffic
+in pcap-formatted data, which can be used for later analysis by conventional tools, like tcpdump and wireshark.
+
+.. literalinclude:: ../../examples/ndn-simple-with-pcap.cc
+   :language: c++
+   :linenos:
+   :lines: 20-
+   :emphasize-lines: 7-29,70-72
+
+If this code is placed into ``scratch/ndn-simple-with-pcap.cc`` and NS-3 is compiled in debug mode, you can run and see progress of the
+simulation using the following command (in optimized mode nothing will be printed out)::
+
+     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple-with-pcap
+
+This will generate ``ndn-simple-trace.pcap``, which can be fed to tcpdump::
+
+     tcpdump -r ndn-simple-trace.pcap
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+.. _Simple scenario with link failures:
+
+Simple scenario with link failures
+----------------------------------
+
+The following example (``ndn-simple-with-link-failure.cc``) shows how to "fail" links in ndnSIM simulation.
+The basic idea is to set ndn::Faces that correspond to the failed link to DOWN state.
+ndnSIM now includes a simple helper that simplifies this process.
+
+.. literalinclude:: ../../examples/ndn-simple-with-link-failure.cc
+   :language: c++
+   :linenos:
+   :lines: 21-31,52-
+   :emphasize-lines: 54-56
+
+If this code is placed into ``scratch/ndn-simple-with-link-failure.cc`` and NS-3 is compiled in debug mode, you can run and see progress of the
+simulation using the following command (in optimized mode nothing will be printed out)::
+
+     NS_LOG=ndn.Consumer:ndn.Producer:ndn.LinkControlHelper ./waf --run=ndn-simple-with-link-failure
+
+.. note::
+   If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can directly run the example without putting scenario into ``scratch/`` folder.
+
+
+25-node tree topology with L2Tracer
+-----------------------------------
+
+:ref:`Example of packet drop tracer (L2Tracer)`
+
+3-node topology with periodic tracing of PIT
+--------------------------------------------
+
+:ref:`periodic tracing of Pending Interest Table (PIT) size`
diff --git a/docs/source/faq.rst b/docs/source/faq.rst
new file mode 100644
index 0000000..a7ce4bd
--- /dev/null
+++ b/docs/source/faq.rst
@@ -0,0 +1,145 @@
+FAQ
+===
+
+Boost libraries
+---------------
+
+.. note::
+    **My ubuntu/redhat/freebsd have an old version of boost libraries.  How can I get the latest one?**
+
+.. _Installing boost libraries:
+
+Installing boost libraries to ``/usr/local``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. role:: red
+
+.. note::
+    **The following instructions are for those who want to install latest version of boost libraries** :red:`and has root access`.
+
+The following commands would install the latest version of boost libraries (at the time of writing, version 1.53) ot ``/usr/local``, assuming you have a root access to your machine.
+If you don't have root access, please refer to section :ref:`Installing boost libraries to a non-privileged location`.
+
+.. note::
+    If you are using Ubuntyu, make sure that you have installed ``libbz2-dev``, otherwise not all libraries required by ndnSIM will be installed (see :ref:`Common pitfalls`)
+
+.. code-block:: bash
+   :linenos:
+
+    wget http://downloads.sourceforge.net/project/boost/boost/1.53.0/boost_1_53_0.tar.bz2
+    tar jxf boost_1_53_0.tar.bz2
+    cd boost_1_53_0
+    ./bootstrap.sh
+    sudo ./b2 --prefix=/usr/local install
+
+
+The following commands should allow compilation and run of NS-3 simulations with custom install of boost libraries:
+
+.. code-block:: bash
+   :linenos:
+
+    cd <ns-3>
+    ./waf configure --boost-includes=/usr/local/include --boost-libs=/usr/local/lib --enable-examples
+    ./waf
+    LD_LIBRARY_PATH=/usr/local/lib NS_LOG=ndn.Face:ndn.Consumer ./waf --run=ndn-simple
+
+.. note::
+    `LD_LIBRARY_PATH=/usr/local/lib` is necessary on Linux platform in order for the dynamic linker to find libraries installed in a location different from one of the folders specified in /etc/ld.so.conf.
+
+.. _Installing boost libraries to a non-privileged location:
+
+Installing boost libraries to a non-privileged location
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. note::
+    **Follow these general instructions if you are trying to installboost libraries to a non-privileged location** :red:`(i.e., you do not have root access),` **but something is going wrong.**
+
+Normally, to compile and install boost libraries in non-privileged mode, you would need to issue following commands (e.g., for boost version 1.53.0):
+
+.. code-block:: bash
+   :linenos:
+
+    export BOOSTDIR=/home/non-privileged-user/boost
+    wget http://downloads.sourceforge.net/project/boost/boost/1.53.0/boost_1_53_0.tar.bz2
+    tar jxf boost_1_53_0.tar.bz2
+    cd boost_1_53_0
+    ./bootstrap.sh
+    ./b2 --prefix=$BOOSTDIR install
+
+However, after the following steps you may still not able to use ndnSIM.
+
+.. _Common pitfalls:
+
+Common pitfalls
+^^^^^^^^^^^^^^^
+
+The common pitfalls is with the **boost iostreams** library, which is required by ndnSIM, but failed to build because of the missing bzip2 library.
+This problem can be easily fixed by downloading and installing bzip2 library, e.g., using the following steps:
+
+.. code-block:: bash
+   :linenos:
+
+    wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
+    tar zxf bzip2-1.0.6.tar.gz
+    cd bzip2-1.0.6
+    make PREFIX=$BOOSTDIR CFLAGS="-fPIC -O2 -g" install
+
+Afte bzip2 library is installed, you may recompile and reinstall boost libraries using custom compilation flags::
+
+    ./b2 --prefix=$BOOSTDIR cxxflags=-I$BOOSTDIR/include linkflags=-L$BOOSTDIR/lib install
+
+Alternatively, you can solve this particular problem by installing development package for bzip2 library (:red:`if you have root access`).  For example, on Ubuntu 12.04 it would be the following command::
+
+    sudo apt-get install libbz2-dev
+
+And then compiling and installing boost without custom compilation flags::
+
+    ./b2 --prefix=$BOOSTDIR
+
+
+The following commands should allow compilation and run of NS-3 simulations with custom install of boost libraries::
+
+    cd <ns-3>
+    ./waf configure --boost-includes=$BOOSTDIR/include --boost-libs=$BOOSTDIR/lib --enable-examples --enable-ndn-plugins=topology,mobility
+    ./waf
+    LD_LIBRARY_PATH=$BOOSTDIR/lib NS_LOG=ndn.Face:ndn.Consumer ./waf --run=ndn-simple
+
+.. note::
+    `LD_LIBRARY_PATH=$BOOSTDIR/lib` is necessary on Linux platform in order for the dynamic linker to find libraries installed in a location different from one of the folders specified in /etc/ld.so.conf.
+
+
+
+Visualizer problems
+-------------------
+
+.. topic:: Visualizer module is not working
+
+    Every time I'm trying to run visualizer, I get the following error::
+
+        Waf: Entering directory `/ndnSIM/ns-3/build'
+        Could not find a task generator for the name 'ns3-visualizer'..
+
+Something is wrong with your python bindings and python bindings dependencies.
+Please follow the :ref:`requirements` section that lists what should be installed in order to run visualizer.
+
+Code questions
+--------------
+
+.. topic:: Failing a link between nodes
+
+    How can I fail a link between to NDN nodes?
+
+
+Right now, NS-3 does not provide ability to actually "break" the link between nodes in NS-3.
+However, exactly the same effect can be achieved by making an interface (:ndnsim:`ndn::Face`) up or down (:ndnsim:`ndn::Face::SetUp(true)` or :ndnsim:`ndn::Face::SetUp(false)`).
+
+You can use :ndnsim:`ndn::LinkControlHelper` to schedule failing links.  For example, refer to :ref:`Simple scenario with link failures` example.
+
+General questions
+-----------------
+
+.. topic:: Errors/bugs reporting
+
+    I found an error in the documentation / bug in the code. What should I do?
+
+Please create an issue for the documentation error or code bug on `github <http://github.com/NDN-Routing/ndnSIM>`_, or tell us about the error on `our mailing list <http://www.lists.cs.ucla.edu/mailman/listinfo/ndnsim>`_ .
diff --git a/docs/source/fw.rst b/docs/source/fw.rst
new file mode 100644
index 0000000..45d4f2b
--- /dev/null
+++ b/docs/source/fw.rst
@@ -0,0 +1,300 @@
+.. _forwarding strategies:
+
+Forwarding Strategies
+=====================
+
+ndnSIM provides simple ways to experiment with custom Interest/Data forwarding strategies.
+A new forwarding strategy can be implement completely different processing or override just specific actions/events of the :ndnsim:`forwarding strategy interface <ndn::ForwardingStrategy>`.
+Please refer to :ndnsim:`API documentation <ndn::ForwardingStrategy>` of the forwarding strategy interface, which lists all default actions/events.
+
+Available forwarding strategies
++++++++++++++++++++++++++++++++
+
+Basic forwarding strategies
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Flooding
+########
+
+Interests will be forwarded to all available faces available for a route (FIB entry).
+If there are no available GREEN or YELLOW faces, interests is dropped.
+
+Implementation name: :ndnsim:`ns3::ndn::fw::Flooding` (default)
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding");
+	 ...
+	 ndnHelper.Install (nodes);
+
+SmartFlooding
+#############
+
+If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
+If not, Interest will be forwarded to all available faces available for a route (FIB entry)/
+If there are no available GREEN or YELLOW faces, interests is dropped.
+
+Implementation name :ndnsim:`ns3::ndn::fw::SmartFlooding`
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding");
+	 ...
+	 ndnHelper.Install (nodes);
+
+BestRoute
+#########
+
+If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
+If not, Interest will be forwarded to the highest-ranked YELLOW face.
+If there are no available GREEN or YELLOW faces, interests is dropped.
+
+Implementation name: :ndnsim:`ns3::ndn::fw::BestRoute`
+
+Usage example:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
+	 ...
+	 ndnHelper.Install (nodes);
+
+Strategies with Interest limits
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following strategies enforce different granularities of Interest limits.  Each strategy is an extension of the basic one (custom strategies can also be extended with limits, refer to the source code).
+
+Currently, ndnSIM implements two types of Interest limit enforcements, both based on a Token Bucket approach:
+
+   - :ndnsim:`ns3::ndn::Limits::Window` (default)
+
+        Interest token is borrowed when Interest is send out.  The token is returned only when Interest is satisfied or times out.
+
+   - :ndnsim:`ns3::ndn::Limits::Rate`
+
+        Interest token is borrowed when Interest is send out.  The token is returned periodically based on link capacity.
+
+In both cases, limit is set according to the following equation:
+
+.. math::
+
+    \mathrm{Interest\ Limit} = Delay\ [s] \cdot
+       \frac{\mathrm{Bandwidth\ [Bytes/s]}}
+       {\mathrm{Data\ packet\ size\ [Bytes]} + \mathrm{Interest\ packet\ size\ [Bytes]}}
+
+To configure packet sizes and delay parameters, use the following :ndnsim:`ndn::StackHelper` method:
+
+      .. code-block:: c++
+
+         // ndnHelper.EnableLimits (true, <delay>, <average interest packet size>, <average data packet size>);
+         ndnHelper.EnableLimits (true, Seconds (0.2), 40, 1100);
+	 ...
+	 ndnHelper.Install (nodes);
+
+Usage examples
+##############
+
+Per outgoing Face limits
+%%%%%%%%%%%%%%%%%%%%%%%%
+
+- :ndnsim:`ns3::ndn::fw::Flooding::PerOutFaceLimits`
+
+    With :ndnsim:`Limits::Window`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding::PerOutFaceLimits"
+                                          "Limit", "ns3::ndn::Limits::Window");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+    With :ndnsim:`Limits::Rate`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding::PerOutFaceLimits"
+                                          "Limit", "ns3::ndn::Limits::Rate");
+	 ...
+	 ndnHelper.Install (nodes);
+
+- :ndnsim:`ns3::ndn::fw::SmartFlooding::PerOutFaceLimits`
+
+    With :ndnsim:`Limits::Window`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding::PerOutFaceLimits"
+                                          "Limit", "ns3::ndn::Limits::Window");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+    With :ndnsim:`Limits::Rate`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding::PerOutFaceLimits"
+                                          "Limit", "ns3::ndn::Limits::Rate");
+	 ...
+	 ndnHelper.Install (nodes);
+
+- :ndnsim:`ns3::ndn::fw::BestRoute::PerOutFaceLimits`
+
+    With :ndnsim:`Limits::Window`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute::PerOutFaceLimits"
+                                          "Limit", "ns3::ndn::Limits::Window");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+    With :ndnsim:`Limits::Rate`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute::PerOutFaceLimits"
+                                          "Limit", "ns3::ndn::Limits::Rate");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+Per FIB entry, per outgoing face limits
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+- :ndnsim:`ns3::ndn::fw::Flooding::PerOutFaceLimits::PerFibLimits`
+
+    With :ndnsim:`Limits::Window`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding::PerOutFaceLimits::PerFibLimits"
+                                          "Limit", "ns3::ndn::Limits::Window");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+    With :ndnsim:`Limits::Rate`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding::PerOutFaceLimits::PerFibLimits"
+                                          "Limit", "ns3::ndn::Limits::Rate");
+	 ...
+	 ndnHelper.Install (nodes);
+
+- :ndnsim:`ns3::ndn::fw::SmartFlooding::PerOutFaceLimits::PerFibLimits`
+
+    With :ndnsim:`Limits::Window`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding::PerOutFaceLimits::PerFibLimits"
+                                          "Limit", "ns3::ndn::Limits::Window");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+    With :ndnsim:`Limits::Rate`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding::PerOutFaceLimits::PerFibLimits"
+                                          "Limit", "ns3::ndn::Limits::Rate");
+	 ...
+	 ndnHelper.Install (nodes);
+
+- :ndnsim:`ns3::ndn::fw::BestRoute::PerOutFaceLimits::PerFibLimits`
+
+    With :ndnsim:`Limits::Window`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute::PerOutFaceLimits::PerFibLimits"
+                                          "Limit", "ns3::ndn::Limits::Window");
+	 ...
+	 ndnHelper.Install (nodes);
+
+
+    With :ndnsim:`Limits::Rate`:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute::PerOutFaceLimits::PerFibLimits"
+                                          "Limit", "ns3::ndn::Limits::Rate");
+	 ...
+	 ndnHelper.Install (nodes);
+
+.. _Writing your own custom strategy:
+
+Writing your own custom strategy
+++++++++++++++++++++++++++++++++
+
+First step in creating your own strategy is to decide which existing strategy you want to extend.  You can either use realize :ndnsim:`forwarding strategy interface <ndn::ForwardingStrategy>` (:ndnsim:`ndn::ForwardingStrategy::DoPropagateInterest` call must be implemented) or extended one of the available forwarding strategies (:ndnsim:`fw::BestRoute` or :ndnsim:`fw::Flooding`).
+The following example assumes that we are realizing :ndnsim:`forwarding strategy interface <ndn::ForwardingStrategy>`.
+
+The follwoing are template strategy h/cc files:
+
+.. literalinclude:: ../../examples/custom-strategies/custom-strategy.h
+   :language: c++
+   :linenos:
+   :lines: 1-36,51-55,59-
+
+.. literalinclude:: ../../examples/custom-strategies/custom-strategy.cc
+   :language: c++
+   :linenos:
+   :lines: 1-40,42-50,75-76,115-
+   :emphasize-lines: 21,27
+
+After having the template, we can fill the necesasry functionality.
+
+Let us say, that we want Interest be forwarded to first two best-metric faces specified by FIB.
+That is, if node has two or more alternative paths to forward the Interests, this Interest will be forwarded to the best two neighbors.
+The following implementation of CustomStrategy::DoPropagateInterest accomplishes the task:
+
+.. literalinclude:: ../../examples/custom-strategies/custom-strategy.cc
+   :language: c++
+   :linenos:
+   :lines: 45-75
+   :emphasize-lines: 7-30
+
+After the compilation, you can use ``"ns3::ndn::fw::CustomStrategy"`` as a parameter to :ndnsim:`ndn::StackHelper::SetForwardingStrategy` helper method.
+
+ .. as well as NS_LOG=ndn.fw.CustomStrategy when running in a debug mode
+
+Extending strategy
+++++++++++++++++++
+
+If you need more customization for the forwarding strategy, there are many forwarding strategy events that can be overriden.
+For example, if we want to perform special logging of all forwarded, timed out, and satisfied Intersts, we can override the following events (for more events, refer to :ndnsim:`ForwardingStrategy API documentation <ForwardingStrategy>`):
+
+- :ndnsim:`DidSendOutInterest <ForwardingStrategy::DidSendOutInterest>`, which fired just after forwarding the Interest
+
+- :ndnsim:`WillEraseTimedOutPendingInterest <ForwardingStrategy::WillEraseTimedOutPendingInterest>`, which fired just before PIT entry is removed by timeout
+
+- :ndnsim:`WillSatisfyPendingInterest <ForwardingStrategy::WillSatisfyPendingInterest>`, which fired just before Interest will be satisfied.
+
+The highlighted ares of the following code demonstrates how it can be impelmented:
+
+.. literalinclude:: ../../examples/custom-strategies/custom-strategy.h
+   :language: c++
+   :linenos:
+   :emphasize-lines: 37-50,56-58
+
+.. literalinclude:: ../../examples/custom-strategies/custom-strategy.cc
+   :language: c++
+   :linenos:
+   :emphasize-lines: 41,77-114
+
+
+Example of using custom strategy
+++++++++++++++++++++++++++++++++
+
+Please refer to :ref:`this example <11-node 2-bottleneck topology with custom forwarding strategy>`.
+
diff --git a/docs/source/getting-started.rst b/docs/source/getting-started.rst
new file mode 100644
index 0000000..77c89e2
--- /dev/null
+++ b/docs/source/getting-started.rst
@@ -0,0 +1,225 @@
+Getting Started
+===============
+
+Portability
+------------
+
+ndnSIM has been successfully compiled and used under Ubuntu Linux 12.04 (boost libraries **1.48**, with default version 1.46 compilation will probably fail), 12.10 (default version of boost 1.49), 13.04 (default version of boost 1.49), Fedora 18, Mac OS 10.7 and 10.8 (gcc-4.2 apple/llvm, macports gcc 4.7, boost 1.49-1.54).
+
+.. _requirements:
+
+Requirements
+-------------
+
+1. ndnSIM requires the customized version of NS-3 simulator (a number of patches required to make ndnSIM work with the latest development branch of NS-3).
+
+2. Boost libraries should be installed on the system:
+
+    * For Ubuntu
+
+        * 12.04
+
+            .. code-block:: bash
+
+                sudo aptitude install libboost1.48-all-dev
+
+        * 12.10, 13.04, and newer versions
+
+            .. code-block:: bash
+
+                sudo aptitude install libboost-all-dev
+
+    * For Fedora (for Fedora 18 and later only):
+
+        .. code-block:: bash
+
+            sudo yum install boost-devel
+
+    * For MacOS (macports):
+
+        .. code-block:: bash
+
+            sudo port instal boost
+
+.. role:: red
+
+.. note::
+   :red:`!!! ndnSIM requires boost version at least 1.48.`   Many linux distribution (Fedora 16, 17 at the time of this writing) ship an old version of boost, making it impossible to compile ndnSIM out-of-the-box.  Please install the latest version, following :ref:`these simple instructions <Installing boost libraries>`.
+
+.. note::
+   :red:`For Ubuntu 12.04`  Ubuntu 12.04 ships with two versions of boost libraries and it is known that if both are installed, then compilation of ndnSIM will most likely fail.  Please install ``libboost1.48-dev-all`` package and uninstall ``libboost-dev-all``.  If you want to install the latest version of boost libraries, then uninstall both ``libboost1.48-dev-all`` and ``libboost-dev-all``, so the libraries do not interfere with each other.
+
+.. note::
+   !!! If you do not have root permissions to install boost, you can install it in your home folder.  However, you need to be make sure that `libboost_iostreams` library is successfully compiled and is installed.  Please refer to :ref:`the following example <Installing boost libraries>` for the hints how to successfully compile and install boost libraries on Ubuntu Linux.
+
+
+3. If you are planning to use other modules, like visualizer, a number of additional dependencies should be installed.  For example, in
+order to run `visualizer`_ module, the following should be installed:
+
+   * For Ubuntu (tested on Ubuntu 12.04, 12.10, 13.04, should work on later versions as well):
+
+       .. code-block:: bash
+
+           sudo apt-get install python-dev python-pygraphviz python-kiwi
+           sudo apt-get install python-pygoocanvas python-gnome2
+           sudo apt-get install python-gnomedesktop python-rsvg ipython
+
+   * For Fedora (tested on Fedora 16):
+
+       .. code-block:: bash
+
+           sudo yum install pygoocanvas python-kiwi graphviz-python
+
+           # easy_install method, since pygraphviz is not (yet?) packaged into Fedora (https://bugzilla.redhat.com/show_bug.cgi?id=740687)
+           sudo yum install graphviz-devel
+           sudo yum install python-pip
+           sudo easy_install pygraphviz
+
+   * For MacOS (macports):
+
+       .. code-block:: bash
+
+           sudo port install  py27-pygraphviz py27-goocanvas
+
+.. py27-kiwi
+
+.. _visualizer: http://www.nsnam.org/wiki/index.php/PyViz
+
+Downloading ndnSIM source
+-------------------------
+
+Download a custom branch of NS-3 that contains all necessary patches, python binding generation library (optional), and clone actual ndnSIM code and place it in src/ folder:
+
+.. code-block:: bash
+
+	mkdir ndnSIM
+	cd ndnSIM
+	git clone git://github.com/cawka/ns-3-dev-ndnSIM.git ns-3
+	git clone git://github.com/cawka/pybindgen.git pybindgen
+	git clone git://github.com/NDN-Routing/ndnSIM.git ns-3/src/ndnSIM
+
+There are quite a few modification to the base NS-3 code that are necessary to run ndnSIM, and the code is periodically synchronized with the official developer branch.  Eventually, all the changes will be merged to the official branch, but for the time being, it is necessary to use the customized branch.
+
+If you have problems connecting to github, you can try to clone from google servers:
+
+.. code-block:: bash
+
+        mkdir ndnSIM
+        cd ndnSIM
+        git clone https://code.google.com/p/ndnsim.ns3-base/ ns-3
+        git clone https://code.google.com/p/ndnsim.pybindgen/ pybindgen
+        git clone https://code.google.com/p/ndnsim/ ns-3/src/ndnSIM
+
+Compiling and running ndnSIM
+----------------------------
+
+ndnSIM uses standard NS-3 compilation procedure.  Normally the following commands should be sufficient to configure and build ndnSIM with python bindings enabled:
+
+.. code-block:: bash
+
+	cd <ns-3-folder>
+	./waf configure --enable-examples
+	./waf
+
+On MacOS (with macports), you may need to modify the configure command to use macports version of python:
+
+.. code-block:: bash
+
+	cd <ns-3-folder>
+	./waf configure --with-python=/opt/local/bin/python2.7 --enable-examples
+	./waf
+
+Python bindings is an optional and not very stable feature of NS-3 simulator.  It is possible to disable python bindings compilation either to speed up compilation or to avoid certain compilation errors (e.g., "Could not find a task generator for the name 'ns3-visualizer'"):
+
+.. code-block:: bash
+
+	cd <ns-3-folder>
+	./waf configure --disable-python --enable-examples
+	./waf
+
+For more configuration options, please refer to ``./waf --help``.
+
+To run :doc:`sample ndnSIM simulations <examples>`:
+
+.. code-block:: bash
+
+	./waf --run=ndn-simple
+
+or:
+
+.. code-block:: bash
+
+	./waf --run=ndn-grid
+
+If you have compiled with python bindings, then you can try to run these simulations with visualizer:
+
+.. code-block:: bash
+
+	./waf --run=ndn-simple --vis
+
+or:
+
+.. code-block:: bash
+
+	./waf --run=ndn-grid --vis
+
+.. note::
+   Do not forget to configure and compile NS-3 in optimized mode (``./waf configure -d optimized``) in order to run actual simulations.
+
+
+Simulating using ndnSIM
+-----------------------
+
+While it is possible to write simulations directly inside NS-3 (in ``scratch/`` folder) or ndnSIM (in ``examples/``), the recommended way is to write your simulation scenarios, as well as any custom extensions, separately from the NS-3 or ndnSIM core.
+
+For example, you can use the following template to write your extensions, simulation scenarios, and metric processing scripts: `<http://github.com/cawka/ndnSIM-scenario-template>`_:
+
+.. code-block:: bash
+
+	mkdir ndnSIM
+	cd ndnSIM
+	git clone git://github.com/cawka/ns-3-dev-ndnSIM.git ns-3
+	git clone git://github.com/cawka/pybindgen.git pybindgen
+	git clone git://github.com/NDN-Routing/ndnSIM.git ns-3/src/ndnSIM
+
+        # Build and install NS-3 and ndnSIM
+        cd ns-3
+        ./waf configure -d optimized
+        ./waf
+
+        sudo ./waf install
+        cd ..
+
+        git clone git://github.com/cawka/ndnSIM-scenario-template.git scenario
+        cd scenario
+        export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
+        export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+
+        ./waf configure
+
+        ./waf --run <scenario>
+
+For more detailed information, refer to `README file <https://github.com/cawka/ndnSIM-scenario-template/blob/master/README.md>`_.
+
+Examples of template-based simulations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. ndnSIM examples from `<http://ndnsim.net>`_ website and more:
+
+- `<http://github.com/cawka/ndnSIM-examples>`_, or
+- `<http://code.google.com/p/ndnsim.ndnsim-examples/>`_
+
+2. Script scenarios and graph processing scripts for simulations used in "A Case for Stateful Forwarding Plane" paper by Yi et al. (`<http://dx.doi.org/10.1016/j.comcom.2013.01.005>`_):
+
+- `<http://github.com/cawka/ndnSIM-comcom-stateful-fw>`_, or
+- `<http://code.google.com/p/ndnsim.ndnsim-comcom/>`_
+
+3. Script scenarios and graph processing scripts for simulations used in "Rapid Traffic Information Dissemination Using Named Data" paper by Wang et al. (`<http://dx.doi.org/10.1145/2248361.2248365>`_):
+
+- `<http://github.com/cawka/ndnSIM-nom-rapid-car2car>`_, or
+- `<http://code.google.com/p/ndnsim.ndnsim-nom-rapid/>`_
+
+- Rocketfuel-based topology generator for ndnSIM preferred format (randomly assigned link delays and bandwidth, based on estimated types of connections between nodes):
+
+- `<http://github.com/cawka/ndnSIM-sample-topologies>`_, or
+- `<http://code.google.com/p/ndnsim.ndnsim-sample-topo/>`_
diff --git a/docs/source/helpers.rst b/docs/source/helpers.rst
new file mode 100644
index 0000000..a1f88f8
--- /dev/null
+++ b/docs/source/helpers.rst
@@ -0,0 +1,247 @@
+ndnSIM helpers
+==============
+
+Helpers are very important components of ndnSIM, especially for writing simulation scenarios.
+The following summarizes helpers and their basic usage.
+
+StackHelper
+---------------
+
+:ndnsim:`StackHelper` is used to install ndnSIM network stack on requested nodes, as well to provide a simple way configure several important parameters of NDN simulation.
+
+Example:
+
+.. code-block:: c++
+
+        ndn::StackHelper ndnHelper;
+        NodeContainer nodes;
+        ...
+        ndnHelper.Install (nodes);
+
+Routing
++++++++
+
+All forwarding strategies require knowledge of where Interests can be forwarded (Forwarding Information Base).
+Unlike IP routing, this knowledge may be imprecise, but without such knowledge forwarding strategies will not be able to make any decision and will drop any Interests.
+
+.. note::
+   By default, all nodes have empty FIB.  You need either to manually configure routes, use global routing controller, or (not recommended) enable default routes.
+
+Manually routes
+^^^^^^^^^^^^^^^
+
+Routes can be configured manually using :ndnsim:`StackHelper::AddRoute` static methods of :ndnsim:`StackHelper`.
+
+These routes **should** be created **after** installing NDN stack on a node:
+
+  .. code-block:: c++
+
+     ndnHelper.Install (nodes);
+     ...
+     Ptr<Node> node = ...     // FIB entry will be added to FIB on this node
+     std::string prefix = ... // some prefix
+     Ptr<ndn::Face> face = ... // NDN face that belongs to the node and through which prefix is accessible
+     int32_t metric = ...     // some routing metric
+     ndn::StackHelper::AddRoute (node, prefix, face, metric);
+
+Global routing controller
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To simplify FIB management in large topologies, ndnSIM contains a global routing controller (:ndnsim:`helper <GlobalRoutingHelper>` and :ndnsim:`special interface <GlobalRouter>`), similar in spirit to ``Ipv4GlobalRoutingHelper``.
+
+There are several necessary steps, in order to take advantage of the global routing controller:
+
+* install :ndnsim:`special interfaces <GlobalRouter>` on nodes
+
+   .. code-block:: c++
+
+     NodeContainer nodes;
+     ...
+     ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
+     ndnGlobalRoutingHelper.Install (nodes);
+
+* specify which node exports which prefix using :ndnsim:`GlobalRoutingHelper::AddOrigins`
+
+   .. code-block:: c++
+
+     Ptr<Node> producer; // producer node that exports prefix
+     std::string prefix; // exported prefix
+     ...
+     ndnGlobalRoutingHelper.AddOrigins (prefix, producer);
+
+* calculate and install FIBs on every node using :ndnsim:`GlobalRoutingHelper::CalculateRoutes`
+
+   .. code-block:: c++
+
+     cdnGlobalRoutingHelper.CalculateRoutes ();
+
+Default routes
+^^^^^^^^^^^^^^
+
+In simple topologies, like in :doc:`examples <examples>`, or when
+simulating broadcast environment, it is possible to set up *default*
+FIB entries using :ndnsim:`StackHelper::SetDefaultRoutes` call.
+More specifically, every installed NDN stack will have a FIB entry to ``/`` prefix, containing all available faces.
+
+The following should be done before installing stack on a node:
+
+  .. code-block:: c++
+
+     ndnHelper.SetDefaultRoutes (true);
+     ...
+     ndnHelper.Install (nodes);
+
+
+Content Store
++++++++++++++
+
+ndnSIM comes with several different in-memory :ndnsim:`content store <ndn::ContentStore>` implementations, featuring different cache replacement policies.
+
+To select a particular content store and configure its capacity, use :ndnsim:`SetContentStore <ndn::StackHelper::SetContentStore>` helper method:
+
+      .. code-block:: c++
+
+         ndnHelper.SetContentStore ("<content store implementation>",
+                                    ["<optional parameter>", "<optional parameter's value>" [, ...]]);
+	 ...
+	 ndnHelper.Install (nodes);
+
+In simulation scenarios it is possible to select one of :ref:`the existing implementations of the content store or implement your own <content store>`.
+
+
+Pending Interest Table
+++++++++++++++++++++++
+
+The current version of ndnSIM provides :ndnsim:`templated realizations <ndn::pit::PitImpl>` of :ndnsim:`PIT abstraction <ndn::Pit>`, allowing optional bounding the number of PIT entries and different replacement policies (i.e., perform different actions when limit on number of PIT entries is reached).
+
+To select a particular PIT implementation and configure its policies, use :ndnsim:`SetPit <ndn::StackHelper::SetPit>` helper method:
+
+- :ndnsim:`persistent <ndn::pit::Persistent>` (default):
+
+    New entries will be rejected if PIT size reached its limit
+
+      .. code-block:: c++
+
+         ndnHelper.SetPit ("ns3::ndn::pit::Persistent",
+                           "MaxSize", "0");
+	 ...
+	 ndnHelper.Install (nodes);
+
+- :ndnsim:`random <ndn::pit::Random>`:
+
+    when PIT reaches its limit, random entry (could be the newly created one) will be removed from PIT;
+
+      .. code-block:: c++
+
+         ndnHelper.SetPit ("ns3::ndn::pit::Random",
+                           "MaxSize", "0");
+	 ...
+	 ndnHelper.Install (nodes);
+
+- :ndnsim:`least-recently-used <ndn::pit::Lru>`:
+
+    the least recently used entry (the oldest entry with minimum number of incoming faces) will be removed when PIT size reached its limit.
+
+      .. code-block:: c++
+
+         ndnHelper.SetPit ("ns3::ndn::pit::Lru",
+                           "MaxSize", "0");
+	 ...
+	 ndnHelper.Install (nodes);
+
+Forwarding strategy
++++++++++++++++++++
+
+A desired :ndnsim:`forwarding strategy <ForwardingStrategy>` parameter need to be set before installing stack on a node.
+
+To select a particular forwarding strategy implementation and configure its parameters, use :ndnsim:`SetForwardingStrategy <ndn::StackHelper::SetForwardingStrategy>` helper method:
+
+      .. code-block:: c++
+
+         ndnHelper.SetForwardingStrategy ("<forwarding strategy implementation>",
+                                          ["<optional parameter>", "<optional parameter's value>" [, ...]]);
+	 ...
+	 ndnHelper.Install (nodes);
+
+In simulation scenarios it is possible to select one of :ref:`the existing implementations of the forwarding strategy or implement your own <forwarding strategies>`.
+
+
+.. Currently, there are following forwarding strategies that can be used in simulations:
+
+..   - :ndnsim:`Flooding` (default)
+
+..       Interests will be forwarded to all available faces available for a route (FIB entry).
+..       If there are no available GREEN or YELLOW faces, interests is dropped.
+
+..       .. code-block:: c++
+
+..          ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding");
+.. 	 ...
+.. 	 ndnHelper.Install (nodes);
+
+
+..   - :ndnsim:`SmartFlooding`
+
+..       If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
+..       If not, Interest will be forwarded to all available faces available for a route (FIB entry)/
+..       If there are no available GREEN or YELLOW faces, interests is dropped.
+
+..       .. code-block:: c++
+
+..          ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding");
+.. 	 ...
+.. 	 ndnHelper.Install (nodes);
+
+..   - :ndnsim:`BestRoute`
+
+..       If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
+..       If not, Interest will be forwarded to the highest-ranked YELLOW face.
+..       If there are no available GREEN or YELLOW faces, interests is dropped.
+
+..       .. code-block:: c++
+
+..          ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
+.. 	 ...
+.. 	 ndnHelper.Install (nodes);
+
+
+
+
+AppHelper
+---------------
+
+:ndnsim:`AppHelper` simplifies task of creating, configuring, and installing ndnSIM applications.
+
+
+The basic usage of the :ndnsim:`AppHelper`:
+
+* Create helper for specific applications class:
+
+   .. code-block:: c++
+
+      // Create helper for the consumer generating Interests with constant rate
+      ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
+
+* Assign prefix on which application operates (either generating Interests using this name or satisfying Interests for this name) using :ndnsim:`AppHelper::SetPrefix`:
+
+   .. code-block:: c++
+
+      consumerHelper.SetPrefix (prefix);
+
+* Assign application-specific attributes using :ndnsim:`AppHelper::SetAttribute`:
+
+   .. code-block:: c++
+
+      // Set frequency parameter
+      consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
+
+* Install application on one or more nodes:
+
+   .. code-block:: c++
+
+      NodeContainer nodes;
+      ...
+      consumerHelper.Install (nodes)
+
+
+In simulation scenarios it is possible to select one of :ref:`the existing applications or implement your own <applications>`.
diff --git a/docs/source/intro.rst b/docs/source/intro.rst
new file mode 100644
index 0000000..eb001fa
--- /dev/null
+++ b/docs/source/intro.rst
@@ -0,0 +1,93 @@
+.. ndnSIM: NS-3 based NDN simulator
+.. ============================================================
+
+============
+Introduction
+============
+
+.. sidebar:: ndnSIM components
+
+    .. image:: _static/ndnsim-components.*
+        :width: 100%
+
+The ndnSIM is NS-3 module that implements Named Data Networking (NDN) communication model, the clean slate Internet design. ndnSIM is specially optimized for simulation purposes and has a cleaner and more extensible internal structure comparing to the existing NDN implementation (NDNx).
+
+Following the NDN architecture, ndnSIM is implemented as a new network-layer protocol model, which can run on top of any available link-layer protocol model (point-to-point, CSMA, wireless, etc.).
+
+.. note::
+    It will also be possible to run ndnSIM on top of network-layer (IPv4, IPv6) and transport-layer (TCP, UDP) protocols.
+    However, it is not yet implemented and patches are welcome.
+
+.. This flexibility allows ndnSIM to simulate scenarios of various homogeneous and heterogeneous networks (e.g., NDN-only, NDN-over-IP, etc.).
+
+The simulator is implemented in a modular fashion, using separate C++ classes to model behavior of each network-layer entity in NDN: :ndnsim:`pending Interest table (PIT) <Pit>`, :ndnsim:`forwarding information base (FIB) <Fib>`, :ndnsim:`content store <ContentStore>`, :ndnsim:`network <NetDeviceFace>` and :ndnsim:`application <AppFace>` interfaces, :ndnsim:`Interest forwarding strategies <ForwardingStrategy>`, etc.
+This modular structure allows any component to be easily modified or replaced with no or minimal impact on other components.
+In addition, the simulator provides an extensive collection of interfaces and helpers to perform detailed tracing behavior of every component, as well as NDN traffic flow.
+
+The current wire format for the Interest and Data packets used by ndnSIM is defined in :ref:`ndnSIM packet format`.
+ndnSIM also has an option to be compatible to wire format used by `NDNx implementation <http://named-data.net/>`_ (NDNx binary XML encoding).  However currently, this option is deprecated, but can be reintroduced in the future as an optional wire format.
+
+More documentation
+------------------
+
+Overall structure of ndnSIM is described in our `technical report <http://lasr.cs.ucla.edu/afanasyev/data/files/Afanasyev/ndnSIM-TR.pdf>`_.
+
+`ndnSIM API documentation <doxygen/index.html>`_
+
+Also, you can `join our mailing list <http://www.lists.cs.ucla.edu/mailman/listinfo/ndnsim>`_ to see and participate in discussions about ndnSIM implementation and simulations in general.   
+Do not forget to check mailling list `archives <http://www.lists.cs.ucla.edu/pipermail/ndnsim/>`_.  
+
+
+Support
+-------
+
+The code of ndnSIM is in active development.  Bug reports (issues) as well as new feature implementation are always welcome. 
+
+To file a bug report, please use `GitHub Issues <https://github.com/NDN-Routing/ndnSIM/issues>`_.
+
+To create new feature, please fork the code and submit Pull Request on GitHub.
+
+And of course, `our mailing list <http://www.lists.cs.ucla.edu/mailman/listinfo/ndnsim>`_ is the best way to communicate with and get support from ndnSIM team and other users of ndnSIM.
+
+A very short guide to the code
+------------------------------
+
+All the NDN related code is in ``ns-3/src/ndnSIM``
+
++-----------------+---------------------------------------------------------------------+
+| Folder          | Description                                                         |
++=================+=====================================================================+
+| ``model/``      | implementation of NDN base: :ndnsim:`L3Protocol`, faces             |
+|                 | (:ndnsim:`Face`, :ndnsim:`NetDeviceFace`, forwarding                |
+|                 | :ndnsim:`AppFace`),                                                 |
+|                 | strategies (:ndnsim:`ForwardingStrategy`,                           |
+|                 | :ndnsim:`Flooding`, :ndnsim:`SmartFlooding`, :ndnsim:`BestRoute`),  |
+|                 | etc.                                                                |
++-----------------+---------------------------------------------------------------------+
+| ``apps/``       | applications (in NS-3 sense) that can be installed on the nodes.    |
+|                 | Right now we have one producer (:ndnsim:`Producer`) and a           |
+|                 | collection  of consumer (:ndnsim:`ConsumerCbr`,                     |
+|                 | :ndnsim:`ConsumerWindow`,                                           |
+|                 | :ndnsim:`ConsumerBatches`).  See doxygen documentation or           |
+|                 | source  code for details                                            |
++-----------------+---------------------------------------------------------------------+
+| ``helper/``     | a number of :doc:`useful helpers <helpers>`                         |
++-----------------+---------------------------------------------------------------------+
+| ``examples/``   | contain :doc:`several example scenarios <examples>`                 |
++-----------------+---------------------------------------------------------------------+
+| ``utils/``      | helper classes, including implementation of generalized data        |
+|                 | structures                                                          |
++-----------------+---------------------------------------------------------------------+
+| ``plugins/``    | a number of plugins that may be helpful to run simulation scenarios |
++-----------------+---------------------------------------------------------------------+
+
+Logging
+-------
+
+Almost every component in ndnSIM exports logging interface, so in debug compilation it is possible to track many internal details. 
+For example, logging of :ndnsim:`Face` and :ndnsim:`Consumer` shows everything what happens in :ndnsim:`Face` and :ndnsim:`Consumer` classes::
+
+    NS_LOG=ndn.Face:ndn.Consumer ./waf --run=ndn-simple
+
+Refer to the source code and NS-3 documentation to see what logging interfaces are available and about details how enable one or more logging interfaces.
+
diff --git a/docs/source/meta/about.rst b/docs/source/meta/about.rst
new file mode 100644
index 0000000..93518a1
--- /dev/null
+++ b/docs/source/meta/about.rst
@@ -0,0 +1,17 @@
+=====================
+About these documents
+=====================
+
+These documents are generated from `reStructuredText`_ sources by `Sphinx`_, a
+document processor specifically written for the Python documentation.
+
+.. _reStructuredText: http://docutils.sf.net/rst.html
+.. _Sphinx: http://sphinx.pocoo.org/
+
+.. In the online version of these documents, you can submit comments and suggest
+   changes directly on the documentation pages.
+
+We are always welcome for your comments about the documentation, catched typos, and
+other contributions.
+
+See :ref:`reporting-bugs` for information how to report bugs in this documentation, or ndnSIM itself.
diff --git a/docs/source/meta/bugs.rst b/docs/source/meta/bugs.rst
new file mode 100644
index 0000000..0b50a4c
--- /dev/null
+++ b/docs/source/meta/bugs.rst
@@ -0,0 +1,9 @@
+.. _reporting-bugs:
+
+==============
+Reporting bugs
+==============
+
+To file a bug report, please use `GitHub Issues <https://github.com/NDN-Routing/ndnSIM/issues>`_ or `NDN Redmine <http://redmine.named-data.net/projects/ndnsim>`_.
+
+To create new feature, please fork the code and submit Pull Request on GitHub.
diff --git a/docs/source/meta/copyright.rst b/docs/source/meta/copyright.rst
new file mode 100644
index 0000000..20429d5
--- /dev/null
+++ b/docs/source/meta/copyright.rst
@@ -0,0 +1,13 @@
+=========
+Copyright
+=========
+
+ndnSIM and this documentation is:
+
+Copyright © 2011-2013 University of California, Los Angeles
+
+Copyright © 2011-2013 Alexander Afanasyev
+
+-------
+
+See :ref:`license` for complete license and permissions information.
diff --git a/docs/source/meta/license.rst b/docs/source/meta/license.rst
new file mode 100644
index 0000000..5f1087d
--- /dev/null
+++ b/docs/source/meta/license.rst
@@ -0,0 +1,361 @@
+.. _license:
+
+===================
+License information
+===================
+
+Most parts of ndnSIM code are licensed under GNU GPL License 2.0.
+
+GNU GENERAL PUBLIC LICENSE
+--------------------------
+
+Version 2, June 1991
+
+::
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+^^^^^^^^
+
+The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
++++++++++++
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+How to Apply These Terms to Your New Programs
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+::
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+::
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands ``show w`` and ``show c`` should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than ``show w`` and ``show c``; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+::
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/docs/source/metric.rst b/docs/source/metric.rst
new file mode 100644
index 0000000..a5b2667
--- /dev/null
+++ b/docs/source/metric.rst
@@ -0,0 +1,440 @@
+
+Obtaining metrics
+=================
+
+To obtain simulation results, you would need to connect to one or more `trace sources <doxygen/group___trace_source_list.html>`_ provided by ndnSIM classes.
+
+It is also possible to use existing trace helpers, which collects and aggregates requested statistical information in text files.
+
+.. _trace classes:
+
+Packet-level trace helpers
+--------------------------
+
+- :ndnsim:`ndn::L3AggregateTracer`
+
+    Tracing the aggregate number of Interests/Data packets forwarded by an NDN node
+
+    The following example enables tracing on all simulation nodes:
+
+    .. code-block:: c++
+
+        // the following should be put just before calling Simulator::Run in the scenario
+
+        ndn::L3AggregateTracer::InstallAll ("aggregate-trace.txt", Seconds (1.0));
+
+        Simulator::Run ();
+
+        ...
+
+
+    Output file format is tab-separated values, with first row specifying names of the columns.  Refer to the following table for the description of the columns:
+
+    +------------------+---------------------------------------------------------------------+
+    | Column           | Description                                                         |
+    +==================+=====================================================================+
+    | ``Time``         | simulation time                                                     |
+    +------------------+---------------------------------------------------------------------+
+    | ``Node``         | node id, globally unique                                            |
+    +------------------+---------------------------------------------------------------------+
+    | ``FaceId``       | interface ID (-1 for combined metric)                               |
+    +------------------+---------------------------------------------------------------------+
+    | ``Type``         | Type of measurements:                                               |
+    |                  |                                                                     |
+    |                  | - ``InInterests``  measurements of incoming Interests               |
+    |                  | - ``OutInterests``  measurements of outgoing Interests              |
+    |                  | - ``DropInterests``  measurements of dropped Interests              |
+    |                  | - ``InData``  measurements of incoming Data                         |
+    |                  | - ``OutData``  measurements of outgoing Data                        |
+    |                  | - ``DropData``  measurements of dropped Data                        |
+    |                  | - ``InNacks``  measurements of incoming NACKs                       |
+    |                  | - ``OutNacks``  measurements of outgoing NACKs                      |
+    |                  | - ``DropNacks``  measurements of dropped NACKs                      |
+    |                  | - ``SatisfiedInterests`` measurements of satisfied Interests        |
+    |                  | - ``TimedOutInterests`` measurements of timed out Interests         |
+    +------------------+---------------------------------------------------------------------+
+    | ``Packets``      | absolute number of packets within last averaging period             |
+    |                  | (number of packets).                                                |
+    +------------------+---------------------------------------------------------------------+
+    | ``Kilobytes``    | absolute number of kilobytes transferred within the last averaging  |
+    |                  | period  (number of packets).                                        |
+    +------------------+---------------------------------------------------------------------+
+
+- :ndnsim:`ndn::L3RateTracer`
+
+    Tracing the rate in bytes and in number of packets of Interest/Data packets forwarded by an NDN node
+
+    The following example enables tracing on all simulation nodes:
+
+    .. code-block:: c++
+
+        // the following should be put just before calling Simulator::Run in the scenario
+
+        ndn::L3RateTracer::InstallAll ("rate-trace.txt", Seconds (1.0));
+
+        Simulator::Run ();
+
+        ...
+
+    Output file format is tab-separated values, with first row specifying names of the columns.  Refer to the following table for the description of the columns:
+
+    +------------------+---------------------------------------------------------------------+
+    | Column           | Description                                                         |
+    +==================+=====================================================================+
+    | ``Time``         | simulation time                                                     |
+    +------------------+---------------------------------------------------------------------+
+    | ``Node``         | node id, globally unique                                            |
+    +------------------+---------------------------------------------------------------------+
+    | ``FaceId``       | interface ID (-1 for combined metric)                               |
+    +------------------+---------------------------------------------------------------------+
+    | ``Type``         | Type of measurements:                                               |
+    |                  |                                                                     |
+    |                  | - ``InInterests``  measurements of incoming Interests               |
+    |                  | - ``OutInterests``  measurements of outgoing Interests              |
+    |                  | - ``DropInterests``  measurements of dropped Interests              |
+    |                  | - ``InData``  measurements of incoming Data                         |
+    |                  | - ``OutData``  measurements of outgoing Data                        |
+    |                  | - ``DropData``  measurements of dropped Data                        |
+    |                  | - ``InNacks``  measurements of incoming NACKs                       |
+    |                  | - ``OutNacks``  measurements of outgoing NACKs                      |
+    |                  | - ``DropNacks``  measurements of dropped NACKs                      |
+    |                  | - ``InSatisfiedInterests`` measurements of incoming satisfied       |
+    |                  |   Interests                                                         |
+    |                  | - ``InTimedOutInterests`` measurements of incoming timed out        |
+    |                  |   Interests                                                         |
+    |                  | - ``OutSatisfiedInterests`` measurements of outgoing satisfied      |
+    |                  |   Interests                                                         |
+    |                  | - ``OutTimedOutInterests`` measurements of outgoing satisfied       |
+    |                  |   Interests                                                         |
+    +------------------+---------------------------------------------------------------------+
+    | ``Packets``      | estimated rate (EWMA average) of packets within the last averaging  |
+    |                  | period (number of packets/s).                                       |
+    +------------------+---------------------------------------------------------------------+
+    | ``Kilobytes``    | estimated rate (EWMA average) within last averaging                 |
+    |                  | period (kilobytes/s)                                                |
+    +------------------+---------------------------------------------------------------------+
+    | ``PacketsRaw``   | absolute number of packets within last averaging period             |
+    |                  | (number of packets).                                                |
+    +------------------+---------------------------------------------------------------------+
+    | ``KilobytesRaw`` | absolute number of kilobytes transferred within the last averaging  |
+    |                  | period  (number of packets).                                        |
+    +------------------+---------------------------------------------------------------------+
+
+- :ndnsim:`L2Tracer`
+
+    This tracer is similar in spirit to :ndnsim:`ndn::L3RateTracer`, but it currently traces only packet drop on layer 2 (e.g.,
+    due to transmission queue overflow).
+
+    The following example enables tracing on all simulation nodes:
+
+    .. code-block:: c++
+
+        // the following should be put just before calling Simulator::Run in the scenario
+
+        L2RateTracer::InstallAll ("drop-trace.txt", Seconds (0.5));
+
+        Simulator::Run ();
+
+        ...
+
+    Output file format is tab-separated values, with first row specifying names of the columns.  Refer to the following table for the description of the columns:
+
+    +------------------+---------------------------------------------------------------------+
+    | Column           | Description                                                         |
+    +==================+=====================================================================+
+    | ``Time``         | simulation time                                                     |
+    +------------------+---------------------------------------------------------------------+
+    | ``Node``         | node id, globally unique                                            |
+    +------------------+---------------------------------------------------------------------+
+    | ``Interface``    | interface name (currently only "combined")                          |
+    +------------------+---------------------------------------------------------------------+
+    | ``Type``         | Type of measurements:                                               |
+    |                  |                                                                     |
+    |                  | - ``Drop``  measurements of dropped packets                         |
+    +------------------+---------------------------------------------------------------------+
+    | ``Packets``      | estimated rate (EWMA average) of packets within the last averaging  |
+    |                  | period (number of packets/s).                                       |
+    +------------------+---------------------------------------------------------------------+
+    | ``Kilobytes``    | estimated rate (EWMA average) within last averaging                 |
+    |                  | period (kilobytes/s)                                                |
+    +------------------+---------------------------------------------------------------------+
+    | ``PacketsRaw``   | absolute number of packets within last averaging period             |
+    |                  | (number of packets).                                                |
+    +------------------+---------------------------------------------------------------------+
+    | ``KilobytesRaw`` | absolute number of kilobytes transferred within the last averaging  |
+    |                  | period  (number of packets).                                        |
+    +------------------+---------------------------------------------------------------------+
+
+.. note::
+
+    A number of other tracers are available in ``plugins/tracers-broken`` folder, but they do not yet work with the current code.
+    Eventually, we will port most of them to the current code, but it is not our main priority at the moment and would really appreciate help with writing new tracers and porting the old ones.
+
+.. _packet trace helper example:
+
+Example of packet-level trace helpers
++++++++++++++++++++++++++++++++++++++
+
+This example (``ndn-tree-tracers.cc``) demonstrates basic usage of :ref:`trace classes`.
+
+In this scenario we will use a tree-like topology, where consumers are installed on leaf nodes and producer is in the root of the tree:
+
+.. sidebar:: Topology
+
+    .. aafig::
+        :aspect: 60
+        :scale: 100
+
+         /--------\    /--------\    /--------\    /--------\
+         |"leaf-1"|    |"leaf-2"|    |"leaf-3"|    |"leaf-4"|
+         \--------/    \--------/    \--------/    \--------/
+               ^          ^                ^           ^
+               |          |                |           |
+                \        /                  \         /
+                 \      /                    \       /    10Mbps / 1ms
+                  \    /                      \     /
+                   |  |                        |   |
+                   v  v                        v   v
+                /-------\                    /-------\
+                |"rtr-1"|                    |"rtr-2"|
+                \-------/                    \-------/
+                      ^                        ^
+                      |                        |
+                       \                      /  10 Mpbs / 1ms
+                        +--------\  /--------+
+                                 |  |
+                                 v  v
+                              /--------\
+                              | "root" |
+                              \--------/
+
+The corresponding topology file (``topo-tree.txt``):
+
+.. literalinclude:: ../../examples/topologies/topo-tree.txt
+    :language: bash
+    :linenos:
+    :lines: 1-2,27-
+
+Example simulation (``ndn-tree-tracers.cc``) scenario that utilizes trace helpers:
+
+.. literalinclude:: ../../examples/ndn-tree-tracers.cc
+    :language: c++
+    :linenos:
+    :lines: 21-28,61-
+    :emphasize-lines: 57-58
+
+To run this scenario, use the following command::
+
+        ./waf --run=ndn-tree-tracers
+
+The successful run will create ``rate-trace.txt`` and ``aggregate-trace.txt`` files in the current directly, which can be analyzed manually or used as input to some graph/stats packages.
+
+.. sidebar:: Graph build using the `R script <http://www.r-project.org/>`_
+
+    .. image:: _static/root-rates.png
+        :alt: Interest/Data packet rates at the root node
+
+    .. image:: _static/root-5sec-counts.png
+        :alt: Interest/Data packet counts at the root node in 5-second intervals
+
+.. literalinclude:: ../../examples/graphs/rate-graph.R
+    :language: r
+    :linenos:
+
+For more information about R and ggplot2, please refer to `R language manual <http://cran.r-project.org/manuals.html>`_, `ggplot2 module manual <http://docs.ggplot2.org/current/>`_.
+
+.. _Example of packet drop tracer (L2Tracer):
+
+Example of packet drop tracer (L2Tracer)
+----------------------------------------
+
+.. sidebar:: Topology
+
+    .. image:: _static/topo-tree-25-node.png
+        :alt: 25-node tree topology
+        :width: 550px
+
+This example (``ndn-tree-with-l2tracer.cc``) demonstrates basic usage of :ref:`trace classes`.
+
+The corresponding topology file (``topo-tree-25-node.txt``):
+
+.. literalinclude:: ../../examples/topologies/topo-tree-25-node.txt
+    :language: bash
+    :linenos:
+    :lines: 2-
+
+Example simulation (``ndn-tree-with-l2tracer.cc``) scenario that utilizes trace helpers:
+
+.. literalinclude:: ../../examples/ndn-tree-with-l2tracer.cc
+    :language: c++
+    :linenos:
+    :lines: 1-
+    :emphasize-lines: 16,135
+
+To run this scenario, use the following command::
+
+        ./waf --run=ndn-tree-with-l2tracer
+
+The successful run will create ``drop-trace.txt`` file in the current directly, which can be analyzed manually or used as input to some graph/stats packages.
+
+For example, the following `R script <http://www.r-project.org/>`_ will build a number of nice graphs:
+
+.. literalinclude:: ../../examples/graphs/drop-graph.R
+    :language: r
+    :linenos:
+
+.. image:: _static/l2-rate-tracer.png
+   :alt: Packet drop rates on routers
+
+.. _cs trace helper:
+
+Content store trace helper
+--------------------------
+
+- :ndnsim:`ndn::CsTracer`
+
+    With the use of :ndnsim:`ndn::CsTracer` it is possible to obtain statistics of cache hits/cache misses on simulation nodes.
+
+    The following code enables content store tracing:
+
+    .. code-block:: c++
+
+        // the following should be put just before calling Simulator::Run in the scenario
+
+        ndn::CsTracer::InstallAll ("cs-trace.txt", Seconds (1));
+
+        Simulator::Run ();
+
+        ...
+
+.. - Tracing lifetime of content store entries
+
+..     Evaluate lifetime of the content store entries can be accomplished using modified version of the content stores.
+..     In particular,
+
+.. _cs trace helper example:
+
+Example of content store trace helper
++++++++++++++++++++++++++++++++++++++
+
+This example (``ndn-tree-cs-tracers.cc``) demonstrates basic usage of content store tracer.
+
+In this scenario we will use the same tree-like topology as in :ref:`previous example <packet trace helper example>`, where consumers are installed on leaf nodes and producer is in the root of the tree.
+The main difference is that each client request data from the same namespace: /root/1, /root/2, ...  Another small difference is that in this scenario we start our application not at the same time, but 10 ms apart.
+
+Example simulation (``ndn-tree-cs-tracers.cc``) scenario that utilizes trace helpers:
+
+.. literalinclude:: ../../examples/ndn-tree-cs-tracers.cc
+    :language: c++
+    :linenos:
+    :lines: 21-28,61-
+    :emphasize-lines: 59
+
+
+To run this scenario, use the following command::
+
+        ./waf --run=ndn-tree-cs-tracers
+
+The successful run will create ``cs-trace.txt``, which similarly to trace file from the :ref:`tracing example <packet trace helper example>` can be analyzed manually or used as input to some graph/stats packages.
+
+
+Application-level trace helper
+------------------------------
+
+- :ndnsim:`ndn::AppDelayTracer`
+
+    With the use of :ndnsim:`ndn::AppDelayTracer` it is possible to obtain data about for delays between issuing Interest and receiving corresponding Data packet.
+
+    The following code enables application-level Interest-Data delay tracing:
+
+    .. code-block:: c++
+
+        // the following should be put just before calling Simulator::Run in the scenario
+
+        ndn::AppDelayTracer::InstallAll ("app-delays-trace.txt");
+
+        Simulator::Run ();
+
+        ...
+
+    Output file format is tab-separated values, with first row specifying names of the columns.  Refer to the following table for the description of the columns:
+
+    +-----------------+---------------------------------------------------------------------+
+    | Column          | Description                                                         |
+    +=================+=====================================================================+
+    | ``Time``        | simulation time when SeqNo was receivied                            |
+    +-----------------+---------------------------------------------------------------------+
+    | ``Node``        | node id, global unique                                              |
+    +-----------------+---------------------------------------------------------------------+
+    | ``AppId``       | app id, local unique on the node, not global                        |
+    +-----------------+---------------------------------------------------------------------+
+    | ``SeqNo``       | seq number of the Interest-Data                                     |
+    +-----------------+---------------------------------------------------------------------+
+    | ``Type``        | Type of delay:                                                      |
+    |                 |                                                                     |
+    |                 | - ``LastDelay`` means that ``DelayS`` and ``DelayUS`` represent     |
+    |                 |   delay between last Interest sent and Data packet received         |
+    |                 | - ``FullDelay`` means that ``DelayS`` and ``DelayUS`` represent     |
+    |                 |   delay between first Interest sent and Data packet received        |
+    |                 |   (i.e., includes time of Interest retransmissions)                 |
+    +-----------------+---------------------------------------------------------------------+
+    | ``DelayS``      | delay value, specified in seconds                                   |
+    +-----------------+---------------------------------------------------------------------+
+    | ``DelayUS``     | delay value, specified in microseconds (10^-6)                      |
+    +-----------------+---------------------------------------------------------------------+
+    | ``RetxCount``   | number of Interest retransmissions (for LastDelay always equal to 1)|
+    +-----------------+---------------------------------------------------------------------+
+    | ``HopCount``    | combined number of number of hops for Interest and Data packet.     |
+    |                 | Note that HopCount is increased anytime somebody calls Send method  |
+    |                 | on a face, including delivery of Interest/Data to application via   |
+    |                 | an AppFace (but not from application to ndn::L3Protocol!).          |
+    |                 |                                                                     |
+    |                 | One consequence is that Interests satisfied by an app will have     |
+    |                 | even hop count (min hop count = 2), and Interests satisfied from    |
+    |                 | caches will have odd hop count (min hop count = 1)                  |
+    +-----------------+---------------------------------------------------------------------+
+
+.. _app delay trace helper example:
+
+Example of application-level trace helper
++++++++++++++++++++++++++++++++++++++++++
+
+This example (``ndn-tree-app-delay-tracer.cc``) demonstrates basic usage of application-level Interest-Data delay tracer.
+
+In this scenario we will use the same tree-like topology as in :ref:`packet trace helper example <packet trace helper example>`, where consumers are installed on leaf nodes and producer is in the root of the tree and clients request data from the same namespace: /root/1, /root/2, ...
+
+Example simulation (``ndn-tree-app-delay-tracer.cc``) scenario that utilizes trace helpers:
+
+.. literalinclude:: ../../examples/ndn-tree-app-delay-tracer.cc
+    :language: c++
+    :linenos:
+    :lines: 21-28,61-
+    :emphasize-lines: 59
+
+
+To run this scenario, use the following command::
+
+        ./waf --run=ndn-tree-app-delay-tracer
+
+The successful run will create ``app-delays-trace.txt``, which similarly to trace file from the :ref:`packet trace helper example <packet trace helper example>` can be analyzed manually or used as input to some graph/stats packages.
+
+
+Other types of stats
+--------------------
+
+.. _periodic tracing of Pending Interest Table (PIT) size:
+
+Periodic tracing of Pending Interest Table (PIT) size
++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+This example (``ndn-simple-with-pit-count-stats.cc``) shows how you can periodically print out current size of PIT on the selected nodes.
+
+.. literalinclude:: ../../examples/ndn-simple-with-pit-count-stats.cc
+    :language: c++
+    :linenos:
+    :lines: 20-26,47-
+    :emphasize-lines: 9-20,43-46,59-61
+
+To run this scenario, use the following command::
+
+        ./waf --run=ndn-simple-with-pit-count-stats
diff --git a/docs/source/ndnsim-packet-formats.rst b/docs/source/ndnsim-packet-formats.rst
new file mode 100644
index 0000000..666eca0
--- /dev/null
+++ b/docs/source/ndnsim-packet-formats.rst
@@ -0,0 +1,389 @@
+.. _ndnSIM packet format:
+
+ndnSIM packet format
+====================
+
+Basic field types
++++++++++++++++++
+
+::
+
+	uint8_t ::= 8-bit unsigned integer
+
+	uint16_t ::= 16-bit unsigned integer
+
+	uint32_t ::= 32-bit unsigned integer
+
+	CHAR ::= 8-bit binary data
+
+	Blob ::= Length CHAR{Length}
+
+	Length ::= uint16_t
+
+NDN Packet Type
++++++++++++++++
+
+::
+
+	Packet ::= Version 
+		   PacketType
+                   Length
+		   (Interest | ContentObject)
+
+        0                   1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |    Version    |   PacketType  |            Length             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+For ccnb-encoding compatibility, ``Version`` / ``PacketType`` has two reserved values to denote ccnb-encoded packet:
+
+Version 0x01, PacketType 0xD2 --- ccnb-encoded ``Interest`` packet
+Version 0x04, PacketType 0x82 --- ccnb-encoded ``ContentObject`` packet
+
+
+Version
+~~~~~~~
+
+::
+
+	Version ::= uint8_t 
+
+The current version of the packet format.  Right only value 0x80 is allowed.
+
+PacketType
+~~~~~~~~~~
+
+::
+
+	PacketType ::= uint8_t  
+
+In the current version, two packet types are defined:
+
+- ``Interest`` (``PacketType`` = 0)
+- ``ContentObject`` (``PacketType`` = 1)
+
+Any other value of PacketType is invalid and such a packet should be discarded.
+
+Interest
+++++++++
+
+The objective of the new format is to optimize encoding/decoding operations.
+
+::
+
+	Interest ::= Nonce 
+	     	     Scope
+                     NackType
+		     InterestLifetime 
+	     	     Name 
+	     	     Selectors 
+	     	     Options
+
+Minumum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 0) + (2 + 0) + (2 + 0) = 14
+
+Maximum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 65535) + (2 + 65535) + (2 + 65535) = 196619
+
+::
+
+        0                   1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Nonce                                |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |     Scope     |   NackType    |      InterestLifetime         |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+        ~                                                               ~
+        ~                            Name                               ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+        ~                                                               ~
+        ~                          Selectors                            ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+        ~                                                               ~
+        ~                          Options                              ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+Nonce
+~~~~~
+
+::
+
+	Nonce ::= uint32_t
+
+NackType
+~~~~~~~~
+
+::
+
+	NackType := uint8_t
+
+Currently, ndnSIM defines following NackTypes:
+
+- 0: NORMAL_INTEREST
+- 10: NACK_LOOP
+- 11: NACK_CONGESTION
+- 12: NACK_GIVEUP_PIT
+
+Values 128-255 are reserved for any application-specific and experimental purposes.
+
+
+InterestLifetime
+~~~~~~~~~~~~~~~~
+
+::
+
+	InterestLifetime := uint16_t 
+
+Interest lifetime is specified in seconds.  Max value is about 18 hours.
+
+Scope
+~~~~~
+
+::
+
+	Scope ::= uint8_t 
+
+Scope 0 prevents propagation beyond the local ccnd (even to other applications on the same host). Scope 1 limits propagation to the applications on the originating host. Scope 2 limits propagation to no further than the next host.
+
+Name
+~~~~
+
+::
+
+	Name ::= Length (NameComponent)*
+
+	NameComponent ::= Blob
+
+
+Selectors
+~~~~~~~~~
+
+::
+
+	Selectors ::= Length (SelectorType Selector)*
+
+        SelectorType ::= uint8_t
+
+	Selector ::= MinSuffixComponents | MaxSuffixComponents | Publisher | Exclude | ChildSelector | AnswerOriginKind
+
+Currently, ndnSIM defines following SelectorTypes:
+
+- 0x01: Exclude
+
+Other types are currently undefined
+
+Exclude
+~~~~~~~
+
+::
+
+	Exclude ::= Length (ExcludeComponent)*
+
+        ExcludeComponent ::= ExcludeNameType NameComponent ExcludeAnyType? |
+                             ExcludeAnyType
+
+        ExcludeNameType ::= uint8_t  (==0x01)
+
+        ExcludeAnyType ::= uint8_t   (==0x02)
+
+Options
+~~~~~~~
+
+::
+
+	Options ::= Length (Option)*
+
+
+.. .................................................................................................. ..
+.. .................................................................................................. ..
+.. .................................................................................................. ..
+.. .................................................................................................. ..
+
+
+ContentObject
++++++++++++++
+
+::
+
+	ContentObject ::= Name
+                   	  Content
+                          Signature
+
+::
+
+        0                   1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+        ~                                                               ~
+        ~                             Name                              ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+        ~                                                               ~
+        ~                           Content                             ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+        ~                                                               ~
+        ~                           Signature                           ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+Signature
+~~~~~~~~~
+
+::
+
+	Signature ::= Length 
+		      SignatureType
+		      <type-dependeds signature data>
+
+Length specifies cumulative size of SignatureInfo and SignatureBits.  If SignatureType is not recognized, the received can either discard the packet or ignore the signature using Length field, specified combined length of SignatureType and SignatureType-dependent fields.
+
+::
+
+        0                   1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |           Length              |         SignatureType         |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        ~                                                               ~
+        ~               <type-dependeds signature data>                 ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+SignatureType
+^^^^^^^^^^^^^
+
+::
+
+	SignatureType ::= uint16_t
+
+The current version specifies three type of signatures:
+
+- 0x0000: empty signature
+- 0x0001: SHA256 (not a real signature, but just a digest of the content)
+- 0x0002: SHA256withRSA (real public-key signature based on SHA-256 digest)
+
+Other values may be defined in future.
+
+- Values greater or equal to 0xFF00 are for experimental purposes (e.g., for simulations)
+
+<type-dependeds signature data>
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
++-------------------+---------------------------+
+| SignatureType     |  SignatureData definition |
++===================+===========================+
+| 0 (empty)         |  empty sequence           |
++-------------------+---------------------------+
+| 1 (sha256)        |  CHAR{32}                 |
++-------------------+---------------------------+
+| 2 (SHA256withRSA) |  CHAR{32} KeyLocator      |
++-------------------+---------------------------+
+
+KeyLocator
+^^^^^^^^^^
+
+::
+
+	KeyLocator ::= CertName
+		       
+	CertName ::= Name
+
+
+Content
+^^^^^^^
+
+::
+
+	Content ::= Length
+		    ContentInfo
+		    ContentData
+
+Content length can be computed as:  Length - (1 - ContentInfo.Length)
+
+::
+
+        0                   1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |            Length             |       Length (content Info)   |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           Timestamp                           |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |           Freshness           |           Reserved            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |  Length (ContentInfoOptions)  |                               |
+	|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+        ~                                                               ~
+        ~                       ContentInfoOptions                      ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        ~                                                               ~
+        ~                         ContentData                           ~
+        |							        |	
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+ContentInfo
+^^^^^^^^^^^
+
+::
+
+	ContentInfo ::= Length 
+			Timestamp
+			Freshness
+			ContentOptions
+
+Timestamp
+~~~~~~~~~
+
+::
+
+	Timestamp ::= uint32_t
+
+Timestamp specifies content generation time as Unix time timestamp (number of seconds since midnight 1/1/1970).
+
+Freshness
+~~~~~~~~~
+
+::
+
+	Freshness ::= uint16_t
+
+Freshness specifies time in seconds (since Timestamp) for which the content is considered valid.  
+
+Value 0xFFFF means that content is always valid.
+
+
+ContentOptions
+~~~~~~~~~~~~~~
+
+::
+
+	ContentOptions ::= Length
+			   ContentOption*
+
+	ContentOption ::= Type |
+			  FinalBlockID
+
+
+Not currently defined
+
diff --git a/docs/source/ndnsim-research-papers.rst b/docs/source/ndnsim-research-papers.rst
new file mode 100644
index 0000000..1ef0965
--- /dev/null
+++ b/docs/source/ndnsim-research-papers.rst
@@ -0,0 +1,201 @@
+ndnSIM research papers
+======================
+
+Here is a list of ndnSIM-related papers.  If you want your paper to appear in this list, please send an email to our mailing list or to us directly.
+
+General papers about ndnSIM
+---------------------------
+
+.. note::
+    if you refer to ndnSIM in a published work, please cite this paper, not just the ndnSIM website
+
+- **A. Afanasyev, I. Moiseenko, and L. Zhang, "ndnSIM: NDN simulator for NS-3," NDN, Technical Report NDN-0005, 2012** (`PDF <http://named-data.net/techreport/TR005-ndnsim.pdf>`_, `BibTex <http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/367>`_)
+
+    Named Data Networking (NDN) is a newly proposed Internet architecture.
+    NDN retains the Internet's hourglass architecture but evolves the thin waist.
+    Instead of pushing data to specific locations, NDN retrieves data by name.
+    On one hand, this simple change allows NDN networks to use almost all of the Internet's well tested engineering properties to solve not only IP's communication problems but also digital distribution and control problems.
+    On the other hand, a distribution architecture differs in fundamental ways from a point-to-point communication architecture of today's Internet and raises many new research challenges.
+    Simulation can serve as a flexible tool to examine and evaluate various aspects of this new architecture.
+    To provide the research community at large with a common simulation platform, we have developed an open source NS-3 based simulator, ndnSIM, which faithfully implemented the basic components of a NDN network in a  modular way.
+    This paper provides an overview of ndnSIM.
+
+
+Research papers that use ndnSIM
+-------------------------------
+
+#. **L. Wang, A. Afanasyev, R. Kuntz, R. Vuyyuru, R. Wakikawa, and L. Zhang, "Rapid Traffic Information Dissemination Using Named Data," in Proceedings of the 1st ACM workshop on Emerging Name-Oriented Mobile Networking Design - Architecture, Algorithms, and Applications (NoM'12), Hilton Head Island, South Carolina, June 2012, pp. 7–12.** (`PDF <http://lasr.cs.ucla.edu/afanasyev/data/files/Wang/nom.pdf>`_, `BibTex <http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/365>`_, `simulation code <https://github.com/cawka/ndnSIM-nom-rapid-car2car>`_)
+
+    Our previous work applied the Named Data Networking approach to vehicle-to-vehicle (V2V) communications and developed a simple design for traffic information dissemination applications. This paper uses simulations to evaluate the feasibility of the design as described in [1].
+    Our results show that data names can greatly facilitate the forwarding process for Interest and data packets.
+    With adequate vehicle density, data can propagate over long distances robustly at tens of kilometers per second and a requester can retrieve the desired traffic information 10km away in a matter of seconds.
+
+#. **Z. Zhu, C. Bian, A. Afanasyev, V. Jacobson, and L. Zhang, "Chronos: Serverless Multi-User Chat Over NDN," NDN, Technical Report NDN-0008, 2012.** (`PDF <http://named-data.net/techreport/TR008-chronos.pdf>`_, `BibTex <http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/371>`_)
+
+    Multi-user applications are commonly implemented using a centralized server.
+    This paper presents a new design for multi-user chat applications (Chronos) that works in a distributed, serverless fashion over Named Data Networking.
+    In Chronos, all participants share their views by exchanging the cryptographic digests of the chat room data set.
+    A newly generated message causes a change of the digest at the message originator, which leads to retrieving the new data by all other participants in an efficient way and resynchronization of chat room views.
+    Chronos does not have a single point of failure and eliminates traffic concentration problem of server-based implementations.
+    We use simulations to evaluate and compare Chronos with a traditional server-based chat room implementation.
+    Our results demonstrate Chronos' robustness and efficiency in data dissemination.
+    Chronos' approach of replacing centralized servers by distributed data synchronization can be applied to a variety of distributed applications to simplify design and ease deployment.
+
+#. **M. Vahlenkamp, "Threats on Information-Centric Networking", Hamburg University of Applied Sciences, Technical Report, 2012.** (`PDF <http://inet.cpt.haw-hamburg.de/teaching/ws-2012-13/master-projekt/markus-vahlenkamp_seminar.pdf>`_)
+
+    The ICN approach aims for reflecting these changes in usage of the Internet and is thus dragging content awareness into the network, for instance to let the network itself decide where to acquire requested data from and thereby utilize content caches to increase the data dissemination efficiency. All this is backed by the use of the publish/subscribe paradigm that is utilised to announce content availability and request its delivery. Since the ICN paradigm is entirely different from todays Internet, new challenges arise within the area of network security. NDN/CCNx, as the most popular ICN approach, claims to solve a couple of different security flaws which the actual Internet is suffering from. This raises the questions of which vulnerabilities still exist and if maybe new issues arise.
+
+#. **C. Yi, A. Afanasyev, I. Moiseenko, L. Wang, B. Zhang, and L. Zhang, "A Case for Stateful Forwarding Plane," Computer Communications, vol. 36, no. 7, pp. 779–791, 2013. ISSN 0140-3664** (`PDF <http://lasr.cs.ucla.edu/afanasyev/data/files/Yi/comcom-stateful-forwarding.pdf>`_, `BibTex <http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/380>`_, `simulation code <https://github.com/cawka/ndnSIM-comcom-stateful-fw>`_)
+
+    In Named Data Networking (NDN), packets carry data names instead of source and destination addresses.
+    This paradigm shift leads to a new network forwarding plane: data consumers send *Interest* packets to request desired data, routers forward Interest packets and maintain the state of all pending Interests, which is then used to guide *Data* packets back to the consumers.
+    Maintaining the pending Interest state, together with the two-way Interest and Data exchange, enables NDN routers' *forwarding* process to measure performance of different paths, quickly detect failures and retry alternative paths.
+    In this paper we describe an initial design of NDN's forwarding plane and evaluate its data delivery performance under adverse conditions.
+    Our results show that this stateful forwarding plane can successfully circumvent prefix hijackers, avoid failed links, and utilize multiple paths to mitigate congestion.
+    We also compare NDN's performance with that of IP-based solutions to highlight the advantages of a stateful forwarding plane.
+
+#. **A. Afanasyev, P. Mahadevan, I. Moiseenko, E. Uzun, and L. Zhang, "Interest Flooding Attack and Countermeasures in Named Data Networking," in Proc. of IFIP Networking 2013, May 2013.** (`PDF <http://lasr.cs.ucla.edu/afanasyev/data/files/Afanasyev/ifip-interest-flooding-ndn.pdf>`_, `BibTex <http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/381>`_, `simulation code <https://github.com/cawka/ndnSIM-ddos-interest-flooding>`_)
+
+    Distributed Denial of Service (DDoS) attacks are an ongoing problem in today's Internet, where packets from a large number of compromised hosts thwart the paths to the victim site and/or overload the victim machines.
+    In a newly proposed future Internet architecture, Named Data Networking (NDN), end users request desired data by sending Interest packets, and the network delivers Data packets upon request only, effectively eliminating many existing DDoS attacks.
+    However, an NDN network can be subject to a new type of DDoS attack, namely Interest packet flooding.
+    In this paper we investigate effective solutions to mitigate Interest flooding.
+    We show that NDN's inherent properties of storing per packet state on each router and maintaining flow balance (i.e., one Interest packet retrieves at most one Data packet) provides the  basis for effective DDoS mitigation algorithms.
+    Our evaluation through simulations shows that the solution can quickly and effectively respond and mitigate Interest flooding.
+
+#. **B. Zhou, C. Wu, X. Hong, and M. Jiang, "Algorithms for Distributed Programmable Controllers", Technical Report, March 2013.** (`PDF <http://hong.cs.ua.edu/DCP-techReport-March2013.pdf>`_)
+
+    A few works on SDN (Software-Defined Networking) like those in Onix improve programmability of the distributed network control.
+    The asynchronism and Byzantine issues of the control challenge the re-configurability of the service that is to safely program the control in atomic so as to avoid the transient control issues like the routing loops and black holes.
+    We propose two important algorithms of the distributed control to enable the programmability: (1) the reconfiguration primitive allows the network control of the services being able to safely react to an external event; and (2) the reuse primitive allows the control states of a service being accessible for all services. We give concepts and algorithms of two primitives.
+    In addition, we provide the concrete cases of the current approaches for ICN (Information-Centric Networking) and CDN (Content Distribution Networks) for quests of the reconfigurability and programmability.
+    Then, we evaluate the performance of ICN in both simulation and the PlanetLab testbed.
+    The evaluation results show that the layer improves the lowers 19.6% of the Interest delays in the ICN that is heavily congested and lowers 97% delays in the PlanetLab with 9 nodes on usual case.
+    In addition, the evaluation of CDN on the PlanetLab shows that it reduces 81% request delay on usual case.
+
+#. **M. Tortelli, L. A. Grieco, and G. Boggia, "Performance Assessment of Routing Strategies in Named Data Networking", in Proc. of GTTI 2013 Session on Telecommunication Networks, 2013** (`PDF <http://www.gtti.it/GTTI13/papers/Tortelli_et_al_GTTI2013.pdf>`_)
+
+    Information Centric Networking (ICN) architectures are currently being investigated to orient the Future Internet towards a content centric paradigm, thus allowing the provisioning of more secure, efficient, and scalable services.
+    In this work, we focus on the Named Data Networking (NDN) proposal to analyze the impact of several routing and forwarding strategies, which play a fundamental role in ICN.
+    In particular, thanks to the recently devised ns-3 based NDN simulator, namely ndnSIM, we conduce an extensive simulation campaign using the GEANT topology as a core network.
+    We monitor different distinctive metrics, such as file download time, server load reduction, hit ratio, hit distance, and communication overhead, in different topologies and traffic conditions.
+    Simulation results show that the election of a single best forwarding strategy is a difficult task.
+    Indeed, the pros and cons of each strategy are heavily influenced by the popularity distribution of contents, which, in turn, affects the effectiveness of the distributed caching mechanisms typically used in the NDN architecture.
+
+#. **S. Seo, J.-M. Kang, A. Leon-Garcia, Y. Han, and J. W.-K. Hong, "Secure and Efficient Context Data Collection using Content-Centric Networking", in Proc. of International Workshop on Smart Communication Protocols and Algorithms (SCPA), 2013** (`PDF <http://dpnm.postech.ac.kr/papers/SCPA/13/sesise/scpa13.pdf>`_)
+
+    Context data collection is a fundamental and important process for realizing context-aware recommender or personalization systems.
+    The existing context data collection approaches are based-on traditional TCP/IP that has several disadvantages such as lack of mobility and security.
+    On the other hand, Content-Centric Networking (CCN) provides advantages in terms of mobility, security, and bandwidth efficiency compared to TCP/IP.
+    In this paper, we propose a secure and efficient context data collection and provision approach based on CCN.
+    Simulation results show that this approach can reduce bandwidth consumption by 52.7%–98.9% in comparison to a TCP/IP-based one.
+
+#. **J. Ran, N. Lv, D. Zhang, Y. Ma, and Z. Xie, "On Performance of Cache Policies in Named Data Networking", in International Conference on Advanced Computer Science and Electronics Information (ICACSEI 2013), 2013** (`PDF <http://www.atlantis-press.com/php/download_paper.php?id=7640>`_)
+
+    Named Data Network (NDN) is gaining increasingly concerns, as an important direction of the future Internet architecture research centered on content.
+    Content caching has played a key role in NDN.
+    Existing cache replacement policies like Least Frequently Used (LFU) and Least Recently Used (LRU) have failed to make full use of the popularity of contents, which leads to a low cache efficiency in the dynamic network.
+    In order to make the best use of content popularity in the cache strategy, this paper has proposed a cache replacement policy based on content popularity (CCP), and designed the data structure format and replacement algorithm.
+    For fully studying and analyzing the performance of different cache policies in NDN in terms of network throughput, server load and cache hit ratio, we have done a lot of simulations to show how they will improve the network.
+    The simulation results show that our proposed CCP can significantly decrease the server load with a higher cache hit ratio and increase the network capacity at the same time compared with LRU and LFU.
+    And the average throughput is reduced significantly by nearly 47% in comparison to that of the case without in-networking caching.
+    Moreover, it also shows the performance under different sizes of content store.
+    The effectiveness of the CCP strategy is proved during the simulation.
+
+#. **M. Wahlisch, T.C. Schmidt, and M. Vahlenkamp, "Backscatter from the Data Plane--Threats to Stability and Security in Information-Centric Network Infrastructure", in Computer Networks, 2013** (`DOI 10.1016/j.comnet.2013.07.009 <http://dx.doi.org/10.1016/j.comnet.2013.07.009>`_)
+
+    Information-centric networking (ICN) raises data objects to first class routable entities in the network and changes the Internet paradigm from host-centric connectivity to data-oriented delivery.
+    However, current approaches to content routing heavily rely on data-driven protocol events and thereby introduce a strong coupling of the control to the data plane in the underlying routing infrastructure.
+    In this paper, threats to the stability and security of the content distribution system are analyzed in theory, simulations, and practical experiments.
+    We derive relations between state resources and the performance of routers, and demonstrate how this coupling can be misused in practice.
+    We further show how state-based forwarding tends to degrade by decorrelating resources.
+    We identify intrinsic attack vectors present in current content-centric routing, as well as possibilities and limitations to mitigate them.
+    Our overall findings suggest that major architectural refinements are required prior to global ICN deployment in the real world.
+
+#. **Xiaoke Jiang and Jun Bi, "Technical Report: Named Content Delivery Network", 2013** (`PDF <http://netarchlab.tsinghua.edu.cn/~shock/THU-NetArchLab-ICN-TR-nCDN-20130730.pdf>`_)
+
+    CDN (Content Delivery Network) focuses on delivering requested data to users, no matter where the data comes from; but the fundamental goal of IP is to connect hosts.
+    The essential mismatching leads to complexity and inefficiency.
+    More specifically,
+    1) CDN has to build components to map what to where, which is resource consuming;
+    2) CDN has to monitor real-time network state on the application layer, which is complex and not accurate.
+    In contrast, NDN (Named Data Networking), provides the information and function that traditional CDN devotes a great deal of effort to achieve, since NDN routes by name, its routing plane holds the "what", information of content distribution, and its stateful forwarding plane can detect and adapt to dynamic of the Internet.
+    Thus this work enhances current CDN with NDN, here dubbed Named Content Delivery Network, or nCDN.
+    In nCDN, CDN itself focuses on services such as accounting, data analysis etc; NDN runs over IP and takes charge of content routing and delivery.
+    nCDN is more adaptive to the dynamic of the Internet and improves the performance, especially in a scenario where content copies are hosted in several hosts.
+    nCDN makes it easier to implement optimization solutions and CDN Interconnecting. Our simulations demonstrate that nCDN is better than traditional CDN on almost all aspects, including the scalability, reliability, and QoS.
+
+#. **Xiaoke Jiang, Jun Bi, Youchao Wang, and You Wang, "Interest Set Mechanism to Improve the Transport of Named Data Networking", in proceedings of ACM SIGCOMM13 (poster), Hongkong, China, 2013** (`PDF <http://netarchlab.tsinghua.edu.cn/~junbi/SIGCOMM2013-1.pdf>`_)
+
+    Named Data Networking (NDN) is currently a hot research topic promising to be one of the most advanced developments in future Internet architectures.
+    Researches have built real software systems over NDN which work on specified scenarios.
+    In this paper, we proposal an new mechanism which aggregate similar Interest packets to improve the efficient of transport of NDN.
+    Firstly we prove the optimal chunk size which simultaneously minimize the latency and maximize the valid payload ratio during a complete data acquiring process.
+    That's why we aggregate the Interest packet but not increase the size of Data packet.
+    Secondly we introduce the Interest Set mechanism that which is able to maintain a conversational "channel" between the data consumer and provider to cover the space and time uncertainty of data packet generating and at the same time reduces the number of FIB lookups and compresses the PIT.
+
+#. **Z. Zhu and A. Afanasyev, "Let's ChronoSync: Decentralized Dataset State Synchronization in Named Data Networking," in Proceedings of the 21st IEEE International Conference on Network Protocols (ICNP 2013), Goettingen, Germany, October 2013** (`PDF <http://lasr.cs.ucla.edu/afanasyev/data/files/Zhu/chronosync-icnp2013.pdf>`_)
+
+    In supporting many distributed applications, such as group text messaging, file sharing, and joint editing, a basic requirement is the efficient and robust synchronization of knowledge about the dataset such as text messages, changes to the shared folder, or document edits.
+    We propose ChronoSync protocol, which exploits the features of the Named Data Networking architecture to efficiently synchronize the state of a dataset among a distributed group of users.
+    Using appropriate naming rules, ChronoSync summarizes the state of a dataset in a condensed cryptographic digest form and exchange it among the distributed parties.
+    Differences of the dataset can be inferred from the digests and disseminated efficiently to all parties.
+    With the complete and up-to-date knowledge of the dataset changes, applications can decide whether or when to fetch which pieces of the data.
+    We implemented ChronoSync as a C++ library and developed two distributed application prototypes based on it.
+    We show through simulations that ChronoSync is effective and efficient in synchronization dataset state, and is robust against packet losses and network partitions.
+
+#. **Y. Wang, N. Rozhnova, A. Narayanan, D. Oran, and I. Rhee, "An improved hop-by-hop interest shaper for congestion control in named data networking". In Proceedings of the 3rd ACM SIGCOMM workshop on Information-centric networking, 2013** (`PDF <http://conferences.sigcomm.org/sigcomm/2013/papers/icn/p55.pdf>`_)
+
+    Hop-by-hop interest shaping has been proposed as a viable congestion control mechanism in Named Data Networking (NDN).
+    Interest shaping exploits the strict receiver-driven traffc pattern and the symmetric bidirectional forwarding in NDN to control the returning data rate.
+    In this paper, we point out that both interests and contents contribute to congestion and their interdependence must be considered in any interest shaping algorithm.
+    We first analyze this issue mathematically by formulating it as an optimization problem to obtain the optimal shaping rate.
+    Then a practical interest shaping algorithm is proposed to achieve high link utilization without congestive data loss.
+    We further note that flow differentiation in NDN is complicated and design our scheme independently of traffc flows.
+    We demonstrate our hopby-hop interest shaper in conjunction with simple AdditiveIncrease-Multiplicative-Decrease (AIMD) clients using the ns3-based NDN simulator (ndnSIM).
+    Our results show that the proposed shaping algorithm can effectively control congestion and achieve near-optimal throughput.
+
+#. **S. Arianfar, P. Sarolahti, and J. Ott, "Deadline-based Resource Management for Information-Centric Networks". In Proceedings of the 3rd ACM SIGCOMM workshop on Information-centric networking, 2013** (`doi 10.1145/2491224.2491226 <http://dx.doi.org/10.1145/2491224.2491226>`_)
+
+    Unlike in traditional IP-based end-to-end network sessions, in information-centric networks the data source may change during a communication session.
+    Therefore the response time to subsequent data requests may vary significantly depending on whether data comes from nearby cache, or a distant source.
+    This is a complication for designing resource management, reliability and other algorithms, that traditionally use RTT measurements for determining when data is considered lost and should be retransmitted (along with related congestion control adjustments).
+    This paper discusses a different approach for designing resource management in information-centric networks: data packets are assigned with a lifetime, that is used as a basis for scheduling and resource management in the network, and for congestion control and retransmission logic at the end hosts.
+    We demonstrate an initial evaluation of this approach based on ns-3 simulations on CCN framework
+
+#. **M. Conti, P. Gasti, M. Teoli, "A lightweight mechanism for detection of cache pollution attacks in Named Data Networking". Computer Networks, 2013** (`doi 10.1016/j.comnet.2013.07.034 <http://dx.doi.org/10.1016/j.comnet.2013.07.034>`_)
+
+    Content-Centric Networking (CCN) is an emerging paradigm being considered as a possible replacement for the current IP-based host-centric Internet infrastructure.
+    In CCN, named content---rather than addressable hosts---becomes a first-class entity.
+    Content is therefore decoupled from its location.
+    This allows, among other things, the implementation of ubiquitous caching.
+
+    Named-Data Networking (NDN) is a prominent example of CCN.
+    In NDN, all nodes (i.e., hosts, routers) are allowed to have a local cache, used to satisfy incoming requests for content.
+    This makes NDN a good architecture for efficient large scale content distribution.
+    However, reliance on caching allows an adversary to perform attacks that are very effective and relatively easy to implement.
+    Such attacks include cache poisoning (i.e., introducing malicious content into caches) and cache pollution (i.e., disrupting cache locality).
+
+    This paper focuses on cache pollution attacks, where the adversary’s goal is to disrupt cache locality to increase link utilization and cache misses for honest consumers.
+    We show, via simulations, that such attacks can be implemented in NDN using limited resources, and that their effectiveness is not limited to small topologies.
+    We then illustrate that existing proactive countermeasures are ineffective against realistic adversaries. Finally, we introduce a new technique for detecting pollution attacks.
+    Our technique detects high and low rate attacks on different topologies with high accuracy.
+
+#. **G. Mauri and G. Verticale, "Distributing key revocation status in Named Data Networking". Advances in Communication Networking, pages 310–313. Springer, 2013** (`doi 10.1007/978-3-642-40552-5_31 <http://dx.doi.org/10.1007/978-3-642-40552-5_31>`_)
+
+    Content Centric Networking (CCN) is a new network paradigm designed to satisfy user needs considering the growth of data demand.
+    Named Data Networking (NDN) is a research project that is developing the future Internet architecture using the principles behind CCN.
+    In this novel architecture, the contents are addressed by their name and not by their location.
+    Thus, the attention is shifted from user to content, resulting in a caching network that is more efficient and flexible than an IP network for content distribution and management with beneficial effects on timely delivery.
+    In NDN, the content objects are divided into chunks, each digitally signed by its producer, and most papers assume that verification is made only by the content consumer.
+    In order to perform signature verification, a node needs the signer’s key, which can be easily retrieved by issuing a standard interest message.
+    Although content verification at the end node prevents disruptive attacks in which false data is delivered to applications, the verification of key validity is also necessary.
+    Otherwise, false data would be cached and forwarded instead of correct data resulting in a denial of service and paving the way for more sophisticated attacks.
+
+#. **W. Drira and F. Filali, "A Pub/Sub extension to NDN for efficient data collection and dissemination in V2X networks". In First International Workshop on Smart Vehicles: Connectivity Technologies and ITS Applications (2014) (SmartVehicles'14), Sydney, Australia, June 2014.** (`PDF <https://drive.google.com/file/d/0B-Qgl9lKNlsXLWRvWllGdElHMTQ>`_)
+
+    Named Data Networking Networking (NDN) gives more importance to content instead of its location. On the other hand, V2X networks carry a wide variety of content such as events, traffic information and infotainment content. Therefore, NDN native capabilities in terms of caching and multicast can reduce traffic load in V2X networks and consequently decrease congestion risk. However, the communication in NDN is based on a request-response pattern while it is event based in V2X. Thus, this paper extends NDN with a Pub/Sub capability in order to provide an efficient data collection and dissemination in V2X networks. In this paper, we study the limitations of using NDN and the challenges of extending it with Pub/Sub and propose a new protocol that handles V2X characteristics. Simulation results of data dissemination shows that the number of Subscribe messages generated in vehicles present at most the one tenth of the total received Publish messages (TPub) while, in NDN, the number of Interests will be equal to the number of Data messages without considering message losses.
+
+#. **W. Drira and F. Filali, "NDN-Q: an NDN query mechanism for efficient V2X data collection in smart cities". In Self-Organizing Wireless Access Networks for Smart City (SWANSITY) part of SECON 2014 (SWANSITY 2014), Singapore, Singapore, June 2014.** (`PDF <https://drive.google.com/file/d/0B-Qgl9lKNlsXZWhwVmtxdUVUNXc>`_)
+
+    Collecting data from V2X networks is important to monitor, control and manage road traffic. However, efficient collection of the needed data is quite challenging due to vehicles mobility and the tremendous amount of events and data generated. Named Data Networking (NDN), a future internet architecture, gives more importance to content instead of its location. It has some inner capabilities of caching and multicast that can reduce traffic load in V2X networks and consequently decrease congestion risk. The communication in NDN is based on a request-response pattern where a consumer requests a specific content using its associated name. In this paper, an NDN query mechanism is proposed to use dynamic names to collect dynamic data built on the fly in one or many nodes. Then, it is merged and aggregated hop by hop to provide the response cooperatively to the consumer.
diff --git a/docs/source/new-packet-formats.rst b/docs/source/new-packet-formats.rst
new file mode 100644
index 0000000..52bb816
--- /dev/null
+++ b/docs/source/new-packet-formats.rst
@@ -0,0 +1,4 @@
+.. toctree::
+   :maxdepth: 4
+
+   ndnsim-packet-formats
diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst
new file mode 100644
index 0000000..088f15d
--- /dev/null
+++ b/docs/source/tutorial.rst
@@ -0,0 +1,44 @@
+.. ndnSIM: NS-3 based NDN simulator documentation master file
+
+Welcome
+=======
+
+The ndnSIM is NS-3 module that implements Named Data Networking (NDN) communication model, the clean slate Internet design. ndnSIM is specially optimized for simulation purposes and has a cleaner and more extensible internal structure comparing to the existing NDN implementation (NDNx).
+
+We invite you to `join our mailing list <http://www.lists.cs.ucla.edu/mailman/listinfo/ndnsim>`_ to see and participate in discussions about ndnSIM implementation and simulations in general (`mailing list archives <http://www.lists.cs.ucla.edu/pipermail/ndnsim/>`_).
+
+Contents:
+
+.. toctree::
+    :maxdepth: 4
+
+    intro
+    getting-started
+    helpers
+    cs
+    fw
+    applications
+
+.. toctree::
+    :maxdepth: 2
+
+    examples
+    metric
+    ndnsim-packet-formats
+    faq
+    ndnsim-research-papers
+
+.. toctree::
+    :hidden:
+    :glob:
+
+    new-packet-formats
+    meta/*
+
+
+-------
+
+If you refer to ndnSIM in a published work, please cite the following paper, not just the ndnSIM website. Thank you!
+    **A. Afanasyev, I. Moiseenko, and L. Zhang, "ndnSIM: NDN simulator for NS-3," NDN, Technical Report NDN-0005, 2012** (`BibTex <http://lasr.cs.ucla.edu/afanasyev/bibwiki/bibtex/367>`_)
+
+.. * :ref:`search`
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 0000000..7654ac2
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,3 @@
+Please refer to http://ndnsim.net/examples.html (../docs/source/examples.rst) 
+for detailed information about the examples.
+
diff --git a/examples/custom-apps/custom-app.cpp b/examples/custom-apps/custom-app.cpp
new file mode 100644
index 0000000..62cacc4
--- /dev/null
+++ b/examples/custom-apps/custom-app.cpp
@@ -0,0 +1,140 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// custom-app.cc
+
+#include "custom-app.h"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+
+#include "ns3/ndn-app-face.hpp"
+
+#include "ns3/ndn-fib.hpp"
+#include "ns3/random-variable.h"
+
+NS_LOG_COMPONENT_DEFINE("CustomApp");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED(CustomApp);
+
+// register NS-3 type
+TypeId
+CustomApp::GetTypeId()
+{
+  static TypeId tid = TypeId("CustomApp").SetParent<ndn::App>().AddConstructor<CustomApp>();
+  return tid;
+}
+
+// Processing upon start of the application
+void
+CustomApp::StartApplication()
+{
+  // initialize ndn::App
+  ndn::App::StartApplication();
+
+  // Create a name components object for name ``/prefix/sub``
+  Ptr<ndn::Name> prefix = Create<ndn::Name>(); // now prefix contains ``/``
+  prefix->append("prefix");                    // now prefix contains ``/prefix``
+  prefix->append("sub");                       // now prefix contains ``/prefix/sub``
+
+  /////////////////////////////////////////////////////////////////////////////
+  // Creating FIB entry that ensures that we will receive incoming Interests //
+  /////////////////////////////////////////////////////////////////////////////
+
+  // Get FIB object
+  Ptr<ndn::Fib> fib = GetNode()->GetObject<ndn::Fib>();
+
+  // Add entry to FIB
+  // Note that ``m_face`` is cretaed by ndn::App
+  Ptr<ndn::fib::Entry> fibEntry = fib->Add(*prefix, m_face, 0);
+
+  Simulator::Schedule(Seconds(1.0), &CustomApp::SendInterest, this);
+}
+
+// Processing when application is stopped
+void
+CustomApp::StopApplication()
+{
+  // cleanup ndn::App
+  ndn::App::StopApplication();
+}
+
+void
+CustomApp::SendInterest()
+{
+  /////////////////////////////////////
+  // Sending one Interest packet out //
+  /////////////////////////////////////
+
+  Ptr<ndn::Name> prefix = Create<ndn::Name>("/prefix/sub"); // another way to create name
+
+  // Create and configure ndn::Interest
+  Ptr<ndn::Interest> interest = Create<ndn::Interest>();
+  UniformVariable rand(0, std::numeric_limits<uint32_t>::max());
+  interest->SetNonce(rand.GetValue());
+  interest->SetName(prefix);
+  interest->SetInterestLifetime(Seconds(1.0));
+
+  NS_LOG_DEBUG("Sending Interest packet for " << *prefix);
+
+  // Call trace (for logging purposes)
+  m_transmittedInterests(interest, this, m_face);
+
+  m_face->ReceiveInterest(interest);
+}
+
+// Callback that will be called when Interest arrives
+void
+CustomApp::OnInterest(Ptr<const ndn::Interest> interest)
+{
+  ndn::App::OnInterest(interest);
+
+  NS_LOG_DEBUG("Received Interest packet for " << interest->GetName());
+
+  // Create and configure ndn::Data and ndn::DataTail
+  // (header is added in front of the packet, tail is added at the end of the packet)
+
+  // Note that Interests send out by the app will not be sent back to the app !
+
+  Ptr<ndn::Data> data = Create<ndn::Data>(Create<Packet>(1024));
+  data->SetName(
+    Create<ndn::Name>(interest->GetName())); // data will have the same name as Interests
+
+  NS_LOG_DEBUG("Sending Data packet for " << data->GetName());
+
+  // Call trace (for logging purposes)
+  m_transmittedDatas(data, this, m_face);
+
+  m_face->ReceiveData(data);
+}
+
+// Callback that will be called when Data arrives
+void
+CustomApp::OnData(Ptr<const ndn::Data> contentObject)
+{
+  NS_LOG_DEBUG("Receiving Data packet for " << contentObject->GetName());
+
+  std::cout << "DATA received for name " << contentObject->GetName() << std::endl;
+}
+
+} // namespace ns3
diff --git a/examples/custom-apps/custom-app.hpp b/examples/custom-apps/custom-app.hpp
new file mode 100644
index 0000000..7dca200
--- /dev/null
+++ b/examples/custom-apps/custom-app.hpp
@@ -0,0 +1,71 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// custom-app.h
+
+#ifndef CUSTOM_APP_H_
+#define CUSTOM_APP_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ndn-app.hpp"
+
+namespace ns3 {
+
+/**
+ * @brief A simple custom application
+ *
+ * This applications demonstrates how to send Interests and respond with Datas to incoming interests
+ *
+ * When application starts it "sets interest filter" (install FIB entry) for /prefix/sub, as well as
+ * sends Interest for this prefix
+ *
+ * When an Interest is received, it is replied with a Data with 1024-byte fake payload
+ */
+class CustomApp : public ndn::App {
+public:
+  // register NS-3 type "CustomApp"
+  static TypeId
+  GetTypeId();
+
+  // (overridden from ndn::App) Processing upon start of the application
+  virtual void
+  StartApplication();
+
+  // (overridden from ndn::App) Processing when application is stopped
+  virtual void
+  StopApplication();
+
+  // (overridden from ndn::App) Callback that will be called when Interest arrives
+  virtual void
+  OnInterest(Ptr<const ndn::Interest> interest);
+
+  // (overridden from ndn::App) Callback that will be called when Data arrives
+  virtual void
+  OnData(Ptr<const ndn::Data> contentObject);
+
+private:
+  void
+  SendInterest();
+};
+
+} // namespace ns3
+
+#endif // CUSTOM_APP_H_
diff --git a/examples/custom-apps/dumb-requester.cpp b/examples/custom-apps/dumb-requester.cpp
new file mode 100644
index 0000000..8850e18
--- /dev/null
+++ b/examples/custom-apps/dumb-requester.cpp
@@ -0,0 +1,114 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// dumb-requester.cc
+
+#include "dumb-requester.hpp"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/random-variable.h"
+#include "ns3/string.h"
+
+#include "ns3/ndn-app-face.hpp"
+
+NS_LOG_COMPONENT_DEFINE("DumbRequester");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED(DumbRequester);
+
+// register NS-3 type
+TypeId
+DumbRequester::GetTypeId()
+{
+  static TypeId tid =
+    TypeId("DumbRequester")
+      .SetParent<ndn::App>()
+      .AddConstructor<DumbRequester>()
+
+      .AddAttribute("Prefix", "Requested name", StringValue("/dumb-interest"),
+                    ndn::MakeNameAccessor(&DumbRequester::m_name), ndn::MakeNameChecker());
+  return tid;
+}
+
+DumbRequester::DumbRequester()
+  : m_isRunning(false)
+{
+}
+
+// Processing upon start of the application
+void
+DumbRequester::StartApplication()
+{
+  // initialize ndn::App
+  ndn::App::StartApplication();
+
+  m_isRunning = true;
+  Simulator::ScheduleNow(&DumbRequester::SendInterest, this);
+}
+
+// Processing when application is stopped
+void
+DumbRequester::StopApplication()
+{
+  m_isRunning = false;
+  // cleanup ndn::App
+  ndn::App::StopApplication();
+}
+
+void
+DumbRequester::SendInterest()
+{
+  if (!m_isRunning)
+    return;
+
+  /////////////////////////////////////
+  // Sending one Interest packet out //
+  /////////////////////////////////////
+
+  Ptr<ndn::Name> prefix = Create<ndn::Name>(m_name); // another way to create name
+
+  // Create and configure ndn::Interest
+  Ptr<ndn::Interest> interest = Create<ndn::Interest>();
+  UniformVariable rand(0, std::numeric_limits<uint32_t>::max());
+  interest->SetNonce(rand.GetValue());
+  interest->SetName(prefix);
+  interest->SetInterestLifetime(Seconds(1.0));
+
+  NS_LOG_DEBUG("Sending Interest packet for " << *prefix);
+
+  // Call trace (for logging purposes)
+  m_transmittedInterests(interest, this, m_face);
+
+  // Forward packet to lower (network) layer
+  m_face->ReceiveInterest(interest);
+
+  Simulator::Schedule(Seconds(1.0), &DumbRequester::SendInterest, this);
+}
+
+void
+DumbRequester::OnData(Ptr<const ndn::Data> contentObject)
+{
+  NS_LOG_DEBUG("Receiving Data packet for " << contentObject->GetName());
+}
+
+} // namespace ns3
diff --git a/examples/custom-apps/dumb-requester.hpp b/examples/custom-apps/dumb-requester.hpp
new file mode 100644
index 0000000..0091c25
--- /dev/null
+++ b/examples/custom-apps/dumb-requester.hpp
@@ -0,0 +1,68 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// dumb-requester.h
+
+#ifndef DUMB_REQUESTER_H_
+#define DUMB_REQUESTER_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ndn-app.hpp"
+
+namespace ns3 {
+
+/**
+ * @brief A dumb requester application
+ *
+ * This app keeps requesting every second the same content object
+ */
+class DumbRequester : public ndn::App {
+public:
+  // register NS-3 type "DumbRequester"
+  static TypeId
+  GetTypeId();
+
+  DumbRequester();
+
+  // (overridden from ndn::App) Processing upon start of the application
+  virtual void
+  StartApplication();
+
+  // (overridden from ndn::App) Processing when application is stopped
+  virtual void
+  StopApplication();
+
+  // (overridden from ndn::App) Callback that will be called when Data arrives
+  virtual void
+  OnData(Ptr<const ndn::Data> contentObject);
+
+private:
+  void
+  SendInterest();
+
+private:
+  bool m_isRunning;
+  ndn::Name m_name;
+};
+
+} // namespace ns3
+
+#endif // DUMB_REQUESTER_H_
diff --git a/examples/custom-apps/hijacker.cpp b/examples/custom-apps/hijacker.cpp
new file mode 100644
index 0000000..70e2d9e
--- /dev/null
+++ b/examples/custom-apps/hijacker.cpp
@@ -0,0 +1,70 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// hijacker.cc
+
+#include "hijacker.hpp"
+
+NS_LOG_COMPONENT_DEFINE("Hijacker");
+
+namespace ns3 {
+
+// Necessary if you are planning to use ndn::AppHelper
+NS_OBJECT_ENSURE_REGISTERED(Hijacker);
+
+TypeId
+Hijacker::GetTypeId()
+{
+  static TypeId tid = TypeId("Hijacker").SetParent<ndn::App>().AddConstructor<Hijacker>();
+
+  return tid;
+}
+
+Hijacker::Hijacker()
+{
+}
+
+void
+Hijacker::OnInterest(Ptr<const ndn::Interest> interest)
+{
+  ndn::App::OnInterest(interest); // forward call to perform app-level tracing
+  // do nothing else (hijack interest)
+
+  NS_LOG_DEBUG("Do nothing for incoming interest for" << interest->GetName());
+}
+
+void
+Hijacker::StartApplication()
+{
+  App::StartApplication();
+
+  // equivalent to setting interest filter for "/" prefix
+  Ptr<ndn::Fib> fib = GetNode()->GetObject<ndn::Fib>();
+  Ptr<ndn::fib::Entry> fibEntry = fib->Add(ndn::Name("/"), m_face, 0);
+  fibEntry->UpdateStatus(m_face, ndn::fib::FaceMetric::NDN_FIB_GREEN);
+}
+
+void
+Hijacker::StopApplication()
+{
+  App::StopApplication();
+}
+
+} // namespace ns3
diff --git a/examples/custom-apps/hijacker.hpp b/examples/custom-apps/hijacker.hpp
new file mode 100644
index 0000000..a794f12
--- /dev/null
+++ b/examples/custom-apps/hijacker.hpp
@@ -0,0 +1,54 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// hijacker.h
+
+#ifndef HIJACKER_H_
+#define HIJACKER_H_
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+namespace ns3 {
+
+class Hijacker : public ndn::App {
+public:
+  static TypeId
+  GetTypeId();
+
+  Hijacker();
+
+  // Receive all Interests but do nothing in response
+  void
+  OnInterest(Ptr<const ndn::Interest> interest);
+
+protected:
+  // inherited from Application base class.
+  virtual void
+  StartApplication();
+
+  virtual void
+  StopApplication();
+};
+
+} // namespace ns3
+
+#endif // HIJACKER_H_
diff --git a/examples/graphs/drop-graph.R b/examples/graphs/drop-graph.R
new file mode 100755
index 0000000..0f28f6e
--- /dev/null
+++ b/examples/graphs/drop-graph.R
@@ -0,0 +1,30 @@
+#!/usr/bin/env Rscript
+# Copyright (c) 2012-2013  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+
+
+# install.packages ('ggplot2')
+library (ggplot2)
+## # install.packages ('scales')
+## library (scales)
+
+#########################
+# Rate trace processing #
+#########################
+data = read.table ("drop-trace.txt", header=T)
+data$Node = factor (data$Node)
+data$Kilobits <- data$Kilobytes * 8
+data$Type = factor (data$Type)
+
+## data.rtr = data[grep("Rtr", data$Node),]
+
+# graph rates on all nodes in Kilobits
+g.all <- ggplot (data, aes (x=Time, y=Kilobits, color=Type)) +
+  geom_point (size=2) +
+  geom_line () +
+  ylab ("Packet drop rate [Kbits/s]") +
+  facet_wrap (~ Node) +
+  theme_bw ()
+
+png ("drop-trace-all-nodes.png", width=800, height=500)
+print (g.all)
+x = dev.off ()
diff --git a/examples/graphs/rate-graph.R b/examples/graphs/rate-graph.R
new file mode 100755
index 0000000..6d63298
--- /dev/null
+++ b/examples/graphs/rate-graph.R
@@ -0,0 +1,88 @@
+# Copyright (c) 2012  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+
+# install.packages ('ggplot2')  
+library (ggplot2)
+# install.packages ('scales')  
+library (scales)
+
+# install.packages ('doBy')
+library (doBy)
+
+#########################
+# Rate trace processing #
+#########################
+data = read.table ("rate-trace.txt", header=T)
+data$Node = factor (data$Node)
+data$FaceId <- factor(data$FaceId)
+data$Kilobits <- data$Kilobytes * 8
+data$Type = factor (data$Type)
+
+# exlude irrelevant types
+data = subset (data, Type %in% c("InInterests", "OutInterests", "InData", "OutData"))
+
+# combine stats from all faces
+data.combined = summaryBy (. ~ Time + Node + Type, data=data, FUN=sum)
+  
+data.root = subset (data.combined, Node == "root")
+data.leaves = subset (data.combined, Node %in% c("leaf-1", "leaf-2", "leaf-3", "leaf-4"))
+
+# graph rates on all nodes in Kilobits
+g.all <- ggplot (data.combined) +
+  geom_point (aes (x=Time, y=Kilobits.sum, color=Type), size=1) +
+  ylab ("Rate [Kbits/s]") +
+  facet_wrap (~ Node)
+
+print (g.all)
+  
+# graph rates on the root nodes in Packets
+g.root <- ggplot (data.root) +
+  geom_point (aes (x=Time, y=Kilobits.sum, color=Type), size=2) +
+  geom_line (aes (x=Time, y=Kilobits.sum, color=Type), size=0.5) +
+  ylab ("Rate [Kbits/s]")
+
+print (g.root)
+
+png ("root-rates.png", width=500, height=250)
+print (g.root)
+dev.off ()
+
+###############################
+# Aggreagate trace processing #
+###############################
+
+data = read.table ("aggregate-trace.txt", header=T)
+data$Node = factor (data$Node)
+data$FaceId <- factor(data$FaceId)
+data$Type = factor (data$Type)
+
+# exlude irrelevant types
+data = subset (data, Type %in% c("InInterests", "OutInterests", "InData", "OutData"))
+
+# Aggregate packet stats in 5-second intervals
+data$Time5Sec = 5 * ceiling (data$Time / 5)
+data.combined = summaryBy (. ~ Time5Sec + Node + Type, data=data, FUN=sum)
+
+data.root = subset (data.combined, Node == "root")
+data.leaves = subset (data.combined, Node %in% c("leaf-1", "leaf-2", "leaf-3", "leaf-4"))
+
+# graph rates on all nodes in Packets
+g.all <- ggplot (data.combined) +
+  geom_point (aes (x=Time5Sec, y=Packets.sum, color=Type), size=2) +
+  geom_line (aes (x=Time5Sec, y=Packets.sum, color=Type), size=0.5) +
+  ylab ("Number of transitted packets in 5 secon intervals") +
+  facet_wrap (~ Node)
+
+print (g.all)
+  
+# graph rates on the root nodes in Packets
+g.root <- ggplot (data.root) +
+  geom_point (aes (x=Time5Sec, y=Packets.sum, color=Type), size=2) +
+  geom_line (aes (x=Time5Sec, y=Packets.sum, color=Type), size=0.5) +
+  ylab ("Number of transitted packets in 5 secon intervals") +
+  ylim (c(0,2000))
+
+print (g.root)
+
+png ("root-5sec-counts.png", width=500, height=250)
+print (g.root)
+dev.off ()
diff --git a/examples/ndn-congestion-alt-topo-plugin.cpp b/examples/ndn-congestion-alt-topo-plugin.cpp
new file mode 100644
index 0000000..9491be4
--- /dev/null
+++ b/examples/ndn-congestion-alt-topo-plugin.cpp
@@ -0,0 +1,139 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// ndn-congestion-alt-topo-plugin.cc
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ *
+ *   /------\ 0                                                 0 /------\
+ *   |  c1  |<-----+                                       +----->|  p1  |
+ *   \------/       \                                     /       \------/
+ *                   \              /-----\              /
+ *   /------\ 0       \         +==>| r12 |<==+         /       0 /------\
+ *   |  c2  |<--+      \       /    \-----/    \       /      +-->|  p2  |
+ *   \------/    \      \     |                 |     /      /    \------/
+ *                \      |    |   1Mbps links   |    |      /
+ *                 \  1  v0   v5               1v   2v  3  /
+ *                  +->/------\                 /------\<-+
+ *                    2|  r1  |<===============>|  r2  |4
+ *                  +->\------/4               0\------/<-+
+ *                 /    3^                           ^5    \
+ *                /      |                           |      \
+ *   /------\ 0  /      /                             \      \  0 /------\
+ *   |  c3  |<--+      /                               \      +-->|  p3  |
+ *   \------/         /                                 \         \------/
+ *                   /     "All consumer-router and"     \
+ *   /------\ 0     /      "router-producer links are"    \    0 /------\
+ *   |  c4  |<-----+       "10Mbps"                        +---->|  p4  |
+ *   \------/                                                    \------/
+ *
+ *   "Numbers near nodes denote face IDs. Face ID is assigned based on the order of link"
+ *   "definitions in the topology file"
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-congestion-alt-topo-plugin
+ */
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 1);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-11-node-two-bottlenecks.txt");
+  topologyReader.Read();
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::CustomStrategy");
+  ndnHelper.SetContentStore("ns3::ndn::cs::Lru", "MaxSize",
+                            "1"); // ! Attention ! If set to 0, then MaxSize is infinite
+  ndnHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> consumers[4] = {Names::Find<Node>("c1"), Names::Find<Node>("c2"),
+                            Names::Find<Node>("c3"), Names::Find<Node>("c4")};
+  Ptr<Node> producers[4] = {Names::Find<Node>("p1"), Names::Find<Node>("p2"),
+                            Names::Find<Node>("p3"), Names::Find<Node>("p4")};
+
+  if (consumers[0] == 0 || consumers[1] == 0 || consumers[2] == 0 || consumers[3] == 0
+      || producers[0] == 0 || producers[1] == 0 || producers[2] == 0 || producers[3] == 0) {
+    NS_FATAL_ERROR("Error in topology: one nodes c1, c2, c3, c4, p1, p2, p3, or p4 is missing");
+  }
+
+  for (int i = 0; i < 4; i++) {
+    std::string prefix = "/data/" + Names::FindName(producers[i]);
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // install consumer app on consumer node c_i to request data from producer p_i //
+    /////////////////////////////////////////////////////////////////////////////////
+
+    ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+    consumerHelper.SetAttribute("Frequency", StringValue("10")); // 100 interests a second
+
+    consumerHelper.SetPrefix(prefix);
+    ApplicationContainer consumer = consumerHelper.Install(consumers[i]);
+    consumer.Start(Seconds(i));     // start consumers at 0s, 1s, 2s, 3s
+    consumer.Stop(Seconds(19 - i)); // stop consumers at 19s, 18s, 17s, 16s
+
+    ///////////////////////////////////////////////
+    // install producer app on producer node p_i //
+    ///////////////////////////////////////////////
+
+    ndn::AppHelper producerHelper("ns3::ndn::Producer");
+    producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+
+    // install producer that will satisfy Interests in /dst1 namespace
+    producerHelper.SetPrefix(prefix);
+    ApplicationContainer producer = producerHelper.Install(producers[i]);
+    // when Start/Stop time is not specified, the application is running throughout the simulation
+  }
+
+  // Manually configure FIB routes
+  ndn::StackHelper::AddRoute("c1", "/data", "n1", 1); // link to n1
+  ndn::StackHelper::AddRoute("c2", "/data", "n1", 1); // link to n1
+  ndn::StackHelper::AddRoute("c3", "/data", "n1", 1); // link to n1
+  ndn::StackHelper::AddRoute("c4", "/data", "n1", 1); // link to n1
+
+  ndn::StackHelper::AddRoute("n1", "/data", "n2", 1);  // link to n2
+  ndn::StackHelper::AddRoute("n1", "/data", "n12", 2); // link to n12
+
+  ndn::StackHelper::AddRoute("n12", "/data", "n2", 1); // link to n2
+
+  ndn::StackHelper::AddRoute("n2", "/data/p1", "p1", 1); // link to p1
+  ndn::StackHelper::AddRoute("n2", "/data/p2", "p2", 1); // link to p2
+  ndn::StackHelper::AddRoute("n2", "/data/p3", "p3", 1); // link to p3
+  ndn::StackHelper::AddRoute("n2", "/data/p4", "p4", 1); // link to p4
+
+  // Schedule simulation time and run the simulation
+  Simulator::Stop(Seconds(20.0));
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-congestion-topo-plugin.cpp b/examples/ndn-congestion-topo-plugin.cpp
new file mode 100644
index 0000000..0a6a58b
--- /dev/null
+++ b/examples/ndn-congestion-topo-plugin.cpp
@@ -0,0 +1,111 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-congestion-topo-plugin.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a grid topology (using topology reader module)
+ *
+ *   /------\	                                                 /------\
+ *   | Src1 |<--+                                            +-->| Dst1 |
+ *   \------/    \                                          /    \------/
+ *            	 \                                        /
+ *                 +-->/------\   "bottleneck"  /------\<-+
+ *                     | Rtr1 |<===============>| Rtr2 |
+ *                 +-->\------/                 \------/<-+
+ *                /                                        \
+ *   /------\    /                                          \    /------\
+ *   | Src2 |<--+                                            +-->| Dst2 |
+ *   \------/                                                    \------/
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-congestion-topo-plugin
+ */
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 25);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-6-node.txt");
+  topologyReader.Read();
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ndnHelper.SetContentStore("ns3::ndn::cs::Lru", "MaxSize", "10000");
+  ndnHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
+  ndnGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> consumer1 = Names::Find<Node>("Src1");
+  Ptr<Node> consumer2 = Names::Find<Node>("Src2");
+
+  Ptr<Node> producer1 = Names::Find<Node>("Dst1");
+  Ptr<Node> producer2 = Names::Find<Node>("Dst2");
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second
+
+  // on the first consumer node install a Consumer application
+  // that will express interests in /dst1 namespace
+  consumerHelper.SetPrefix("/dst1");
+  consumerHelper.Install(consumer1);
+
+  // on the second consumer node install a Consumer application
+  // that will express interests in /dst2 namespace
+  consumerHelper.SetPrefix("/dst2");
+  consumerHelper.Install(consumer2);
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+
+  // Register /dst1 prefix with global routing controller and
+  // install producer that will satisfy Interests in /dst1 namespace
+  ndnGlobalRoutingHelper.AddOrigins("/dst1", producer1);
+  producerHelper.SetPrefix("/dst1");
+  producerHelper.Install(producer1);
+
+  // Register /dst2 prefix with global routing controller and
+  // install producer that will satisfy Interests in /dst2 namespace
+  ndnGlobalRoutingHelper.AddOrigins("/dst2", producer2);
+  producerHelper.SetPrefix("/dst2");
+  producerHelper.Install(producer2);
+
+  // Calculate and install FIBs
+  ndn::GlobalRoutingHelper::CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-csma.cpp b/examples/ndn-csma.cpp
new file mode 100644
index 0000000..71d1cfb
--- /dev/null
+++ b/examples/ndn-csma.cpp
@@ -0,0 +1,98 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-csma.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/csma-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a very simple network topology:
+ *
+ *                            CSMA bus (1Mbps, 10ms)
+ *           +--------------------------+--------------------------+
+ *           |                          |                          |
+ *
+ *      +----------+                +--------+                +----------+
+ *      | consumer |                | router |                | producer |
+ *      +----------+                +--------+                +----------+
+ *
+ *
+ * Consumer requests data from producer with frequency 10 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-csma
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::CsmaChannel::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::CsmaChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating nodes
+  NodeContainer nodes;
+  nodes.Create(3);
+
+  // Connecting nodes using two links
+  CsmaHelper csma;
+  csma.Install(nodes);
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetDefaultRoutes(true);
+  ndnHelper.InstallAll();
+
+  // Installing applications
+
+  // Consumer
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  // Consumer will request /prefix/0, /prefix/1, ...
+  consumerHelper.SetPrefix("/prefix");
+  consumerHelper.SetAttribute("Frequency", StringValue("10")); // 10 interests a second
+  consumerHelper.Install(nodes.Get(0));                        // first node
+
+  // Producer
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  // Producer will reply to all requests starting with /prefix
+  producerHelper.SetPrefix("/prefix");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(nodes.Get(2)); // last node
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-grid-topo-plugin.cpp b/examples/ndn-grid-topo-plugin.cpp
new file mode 100644
index 0000000..84f5f17
--- /dev/null
+++ b/examples/ndn-grid-topo-plugin.cpp
@@ -0,0 +1,100 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-grid-topo-plugin.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a grid topology (using topology reader module)
+ *
+ * (consumer) -- ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) -- (producer)
+ *
+ * All links are 1Mbps with propagation 10ms delay.
+ *
+ * FIB is populated using NdnGlobalRoutingHelper.
+ *
+ * Consumer requests data from producer with frequency 10 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-topo-plugin
+ */
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 25);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-grid-3x3.txt");
+  topologyReader.Read();
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ndnHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
+  ndnGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> producer = Names::Find<Node>("Node8");
+  NodeContainer consumerNodes;
+  consumerNodes.Add(Names::Find<Node>("Node0"));
+
+  // Install NDN applications
+  std::string prefix = "/prefix";
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetPrefix(prefix);
+  consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second
+  consumerHelper.Install(consumerNodes);
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetPrefix(prefix);
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(producer);
+
+  // Add /prefix origins to ndn::GlobalRouter
+  ndnGlobalRoutingHelper.AddOrigins(prefix, producer);
+
+  // Calculate and install FIBs
+  ndn::GlobalRoutingHelper::CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-grid.cpp b/examples/ndn-grid.cpp
new file mode 100644
index 0000000..d475dfd
--- /dev/null
+++ b/examples/ndn-grid.cpp
@@ -0,0 +1,109 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-grid.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/point-to-point-layout-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a grid topology (using PointToPointGrid module)
+ *
+ * (consumer) -- ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) -- (producer)
+ *
+ * All links are 1Mbps with propagation 10ms delay.
+ *
+ * FIB is populated using NdnGlobalRoutingHelper.
+ *
+ * Consumer requests data from producer with frequency 100 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // Setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("10"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating 3x3 topology
+  PointToPointHelper p2p;
+  PointToPointGridHelper grid(3, 3, p2p);
+  grid.BoundingBox(100, 100, 200, 200);
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ndnHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
+  ndnGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> producer = grid.GetNode(2, 2);
+  NodeContainer consumerNodes;
+  consumerNodes.Add(grid.GetNode(0, 0));
+
+  // Install NDN applications
+  std::string prefix = "/prefix";
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetPrefix(prefix);
+  consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second
+  consumerHelper.Install(consumerNodes);
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetPrefix(prefix);
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(producer);
+
+  // Add /prefix origins to ndn::GlobalRouter
+  ndnGlobalRoutingHelper.AddOrigins(prefix, producer);
+
+  // Calculate and install FIBs
+  ndn::GlobalRoutingHelper::CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-simple-wifi.cpp b/examples/ndn-simple-wifi.cpp
new file mode 100644
index 0000000..a2b083f
--- /dev/null
+++ b/examples/ndn-simple-wifi.cpp
@@ -0,0 +1,136 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#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/internet-module.h"
+
+#include "ns3/ndnSIM-module.h"
+
+using namespace std;
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE("ndn.WifiExample");
+
+//
+// DISCLAIMER:  Note that this is an extremely simple example, containing just 2 wifi nodes
+// communicating
+//              directly over AdHoc channel.
+//
+
+// Ptr<ndn::NetDeviceFace>
+// MyNetDeviceFaceCallback (Ptr<Node> node, Ptr<ndn::L3Protocol> ndn, Ptr<NetDevice> device)
+// {
+//   // NS_LOG_DEBUG ("Create custom network device " << node->GetId ());
+//   Ptr<ndn::NetDeviceFace> face = CreateObject<ndn::MyNetDeviceFace> (node, device);
+//   ndn->AddFace (face);
+//   return face;
+// }
+
+int
+main(int argc, char* argv[])
+{
+  // disable fragmentation
+  Config::SetDefault("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue("2200"));
+  Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue("2200"));
+  Config::SetDefault("ns3::WifiRemoteStationManager::NonUnicastMode",
+                     StringValue("OfdmRate24Mbps"));
+
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  //////////////////////
+  //////////////////////
+  //////////////////////
+  WifiHelper wifi = WifiHelper::Default();
+  // wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
+  wifi.SetStandard(WIFI_PHY_STANDARD_80211a);
+  wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager", "DataMode",
+                               StringValue("OfdmRate24Mbps"));
+
+  YansWifiChannelHelper wifiChannel; // = YansWifiChannelHelper::Default ();
+  wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
+  wifiChannel.AddPropagationLoss("ns3::ThreeLogDistancePropagationLossModel");
+  wifiChannel.AddPropagationLoss("ns3::NakagamiPropagationLossModel");
+
+  // YansWifiPhy wifiPhy = YansWifiPhy::Default();
+  YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default();
+  wifiPhyHelper.SetChannel(wifiChannel.Create());
+  wifiPhyHelper.Set("TxPowerStart", DoubleValue(5));
+  wifiPhyHelper.Set("TxPowerEnd", DoubleValue(5));
+
+  NqosWifiMacHelper wifiMacHelper = NqosWifiMacHelper::Default();
+  wifiMacHelper.SetType("ns3::AdhocWifiMac");
+
+  Ptr<UniformRandomVariable> randomizer = CreateObject<UniformRandomVariable>();
+  randomizer->SetAttribute("Min", DoubleValue(10));
+  randomizer->SetAttribute("Max", DoubleValue(100));
+
+  MobilityHelper mobility;
+  mobility.SetPositionAllocator("ns3::RandomBoxPositionAllocator", "X", PointerValue(randomizer),
+                                "Y", PointerValue(randomizer), "Z", PointerValue(randomizer));
+
+  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+
+  NodeContainer nodes;
+  nodes.Create(2);
+
+  ////////////////
+  // 1. Install Wifi
+  NetDeviceContainer wifiNetDevices = wifi.Install(wifiPhyHelper, wifiMacHelper, nodes);
+
+  // 2. Install Mobility model
+  mobility.Install(nodes);
+
+  // 3. Install NDN stack
+  NS_LOG_INFO("Installing NDN stack");
+  ndn::StackHelper ndnHelper;
+  // ndnHelper.AddNetDeviceFaceCreateCallback (WifiNetDevice::GetTypeId (), MakeCallback
+  // (MyNetDeviceFaceCallback));
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ndnHelper.SetContentStore("ns3::ndn::cs::Lru", "MaxSize", "1000");
+  ndnHelper.SetDefaultRoutes(true);
+  ndnHelper.Install(nodes);
+
+  // 4. Set up applications
+  NS_LOG_INFO("Installing Applications");
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetPrefix("/test/prefix");
+  consumerHelper.SetAttribute("Frequency", DoubleValue(10.0));
+  consumerHelper.Install(nodes.Get(0));
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetPrefix("/");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1200"));
+  producerHelper.Install(nodes.Get(1));
+
+  ////////////////
+
+  Simulator::Stop(Seconds(30.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-simple-with-cs-lfu.cpp b/examples/ndn-simple-with-cs-lfu.cpp
new file mode 100644
index 0000000..d22a549
--- /dev/null
+++ b/examples/ndn-simple-with-cs-lfu.cpp
@@ -0,0 +1,166 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-simple-with-cs-lfu.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/ndnSIM-module.h"
+
+#include <sys/time.h>
+#include "ns3/ndnSIM/utils/mem-usage.hpp"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a very simple network topology:
+ *
+ *
+ *      +----------+     1Mbps      +--------+     1Mbps      +----------+
+ *      | consumer | <------------> | router | <------------> | producer |
+ *      +----------+         10ms   +--------+          10ms  +----------+
+ *
+ * This scenario demonstrates how to use content store that responds to Freshness parameter set in
+ *Datas.
+ * That is, if producer set Freshness field to 2 seconds, the corresponding content object will not
+ *be cached
+ * more than 2 seconds (can be cached for a shorter time, if entry is evicted earlier)
+ *
+ *     NS_LOG=ndn.Consumer ./waf --run ndn-simple-with-cs-lfu
+ */
+
+void
+PrintCsMemStatsHeader(std::ostream& os)
+{
+  os << "SimulationTime"
+     << "\t"
+     << "RealTime"
+     << "\t"
+     // << "NumberOfProcessedData" << "\t"
+     // << "NumberOfProcessedInterests" << "\t"
+     << "NumberPitEntries"
+     << "\t"
+     << "NumberCsEntries"
+     << "\t"
+     << "MemUsage"
+     << "\n";
+}
+
+void
+PrintCsMemStats(std::ostream& os, Time nextPrintTime, double beginRealTime)
+{
+  ::timeval t;
+  gettimeofday(&t, NULL);
+  double realTime = t.tv_sec + (0.000001 * (unsigned)t.tv_usec) - beginRealTime;
+
+  os << Simulator::Now().ToDouble(Time::S) << "\t";
+  os << realTime << "\t";
+
+  // os << ndn::L3Protocol::GetDataCounter () << "\t";
+  // os << ndn::L3Protocol::GetInterestCounter () << "\t";
+
+  uint64_t pitCount = 0;
+  uint64_t csCount = 0;
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<ndn::Pit> pit = (*node)->GetObject<ndn::Pit>();
+    Ptr<ndn::ContentStore> cs = (*node)->GetObject<ndn::ContentStore>();
+
+    if (pit != 0)
+      pitCount += pit->GetSize();
+
+    if (cs != 0)
+      csCount += cs->GetSize();
+  }
+
+  os << pitCount << "\t";
+  os << csCount << "\t";
+  os << MemUsage::Get() / 1024.0 / 1024.0 << "\n";
+
+  Simulator::Schedule(nextPrintTime, PrintCsMemStats, boost::ref(os), nextPrintTime, beginRealTime);
+}
+
+int
+main(int argc, char* argv[])
+{
+  // setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating nodes
+  NodeContainer nodes;
+  nodes.Create(3);
+
+  // Connecting nodes using two links
+  PointToPointHelper p2p;
+  p2p.Install(nodes.Get(0), nodes.Get(1));
+  p2p.Install(nodes.Get(1), nodes.Get(2));
+
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ccnxHelper;
+  ccnxHelper.SetDefaultRoutes(true);
+
+  // node 0: disable cache completely
+  ccnxHelper.SetContentStore("ns3::ndn::cs::Nocache"); // disable cache
+  ccnxHelper.Install(nodes.Get(0));
+
+  // node 1 and 2: set cache with Lfu policy
+  ccnxHelper.SetContentStore("ns3::ndn::cs::Freshness::Lfu", "MaxSize",
+                             "2"); // can set cache size this way
+  ccnxHelper.Install(nodes.Get(1));
+  ccnxHelper.Install(nodes.Get(2));
+
+  // alternative way to configure cache size
+  // [number after nodeList is global ID of the node (= node->GetId ())]
+  Config::Set("/NodeList/2/$ns3::ndn::ContentStore/MaxSize", UintegerValue(100000));
+
+  // Installing applications
+
+  // Consumer
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  // Consumer will request /prefix/0, /prefix/1, ...
+  consumerHelper.SetPrefix("/prefix");
+  consumerHelper.SetAttribute("Frequency", StringValue("10")); // 10 interests a second
+  consumerHelper.Install(nodes.Get(0));                        // first node
+
+  // Producer
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  // Producer will reply to all requests starting with /prefix
+  producerHelper.SetPrefix("/prefix");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(nodes.Get(2)); // last node
+
+  Simulator::Stop(Seconds(200000.0));
+
+  struct ::timeval t;
+  gettimeofday(&t, NULL);
+  double beginRealTime = t.tv_sec + (0.000001 * (unsigned)t.tv_usec);
+  Simulator::Schedule(Seconds(0), PrintCsMemStatsHeader, boost::ref(std::cout));
+  Simulator::Schedule(Seconds(100), PrintCsMemStats, boost::ref(std::cout), Seconds(100),
+                      beginRealTime);
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-simple-with-custom-app.cpp b/examples/ndn-simple-with-custom-app.cpp
new file mode 100644
index 0000000..c10ceaa
--- /dev/null
+++ b/examples/ndn-simple-with-custom-app.cpp
@@ -0,0 +1,71 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// ndn-simple-with-custom-app.cc
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a one-node two-app scenario:
+ *
+ *      +------+ <-----> (CustomApp1)
+ *      | Node |
+ *      +------+ <-----> (CustomApp2)
+ *
+ *     NS_LOG=CustomApp ./waf --run=ndn-simple-with-custom-app
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating nodes
+  Ptr<Node> node = CreateObject<Node>();
+
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ccnxHelper;
+  ccnxHelper.InstallAll();
+
+  // Installing applications
+
+  // Consumer
+  ndn::AppHelper consumerHelper("CustomApp");
+  ApplicationContainer app1 = consumerHelper.Install(node);
+  ApplicationContainer app2 = consumerHelper.Install(node);
+
+  app1.Start(Seconds(1.0)); // will send out Interest, which nobody will receive (Interests
+                            // generated by an app will not got back to the app)
+  app2.Start(
+    Seconds(2.0)); // will send out an Interests, which will be received and satisfied by app1
+
+  Simulator::Stop(Seconds(3.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-simple-with-link-failure.cpp b/examples/ndn-simple-with-link-failure.cpp
new file mode 100644
index 0000000..c020a36
--- /dev/null
+++ b/examples/ndn-simple-with-link-failure.cpp
@@ -0,0 +1,104 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *       : Saran Tarnoi <saran.tarnoi@gmail.com>
+ */
+// ndn-simple-with-link-failure.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/ndnSIM-module.h"
+
+// for LinkStatusControl::FailLinks and LinkStatusControl::UpLinks
+#include "ns3/ndn-link-control-helper.hpp"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a very simple network topology:
+ *
+ *
+ *      +----------+     1Mbps      +--------+     1Mbps      +----------+
+ *      | consumer | <------------> | router | <------------> | producer |
+ *      +----------+         10ms   +--------+          10ms  +----------+
+ *
+ *
+ * Consumer requests data from producer with frequency 10 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating nodes
+  NodeContainer nodes;
+  nodes.Create(3);
+
+  // Connecting nodes using two links
+  PointToPointHelper p2p;
+  p2p.Install(nodes.Get(0), nodes.Get(1));
+  p2p.Install(nodes.Get(1), nodes.Get(2));
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetDefaultRoutes(true);
+  ndnHelper.InstallAll();
+
+  // Installing applications
+
+  // Consumer
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  // Consumer will request /prefix/0, /prefix/1, ...
+  consumerHelper.SetPrefix("/prefix");
+  consumerHelper.SetAttribute("Frequency", StringValue("10")); // 10 interests a second
+  consumerHelper.Install(nodes.Get(0));                        // first node
+
+  // Producer
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  // Producer will reply to all requests starting with /prefix
+  producerHelper.SetPrefix("/prefix");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(nodes.Get(2)); // last node
+
+  // The failure of the link connecting consumer and router will start from seconds 10.0 to 15.0
+  Simulator::Schedule(Seconds(10.0), ndn::LinkControlHelper::FailLink, nodes.Get(0), nodes.Get(1));
+  Simulator::Schedule(Seconds(15.0), ndn::LinkControlHelper::UpLink, nodes.Get(0), nodes.Get(1));
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-simple-with-pcap.cpp b/examples/ndn-simple-with-pcap.cpp
new file mode 100644
index 0000000..ecbc8eb
--- /dev/null
+++ b/examples/ndn-simple-with-pcap.cpp
@@ -0,0 +1,105 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-simple-with-pcap.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+class PcapWriter {
+public:
+  PcapWriter(const std::string& file)
+  {
+    PcapHelper helper;
+    m_pcap = helper.CreateFile(file, std::ios::out, PcapHelper::DLT_PPP);
+  }
+
+  void
+  TracePacket(Ptr<const Packet> packet)
+  {
+    static PppHeader pppHeader;
+    pppHeader.SetProtocol(0x0077);
+
+    m_pcap->Write(Simulator::Now(), pppHeader, packet);
+  }
+
+private:
+  Ptr<PcapFileWrapper> m_pcap;
+};
+
+int
+main(int argc, char* argv[])
+{
+  // setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
+
+  Config::SetGlobal("ndn::WireFormat", StringValue("1"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating nodes
+  NodeContainer nodes;
+  nodes.Create(3);
+
+  // Connecting nodes using two links
+  PointToPointHelper p2p;
+  p2p.Install(nodes.Get(0), nodes.Get(1));
+  p2p.Install(nodes.Get(1), nodes.Get(2));
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetDefaultRoutes(true);
+  ndnHelper.InstallAll();
+
+  // Installing applications
+
+  // Consumer
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  // Consumer will request /prefix/0, /prefix/1, ...
+  consumerHelper.SetPrefix("/prefix");
+  consumerHelper.SetAttribute("Frequency", StringValue("10")); // 10 interests a second
+  consumerHelper.Install(nodes.Get(0));                        // first node
+
+  // Producer
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  // Producer will reply to all requests starting with /prefix
+  producerHelper.SetPrefix("/prefix");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.SetAttribute("Signature", UintegerValue(100));
+  producerHelper.SetAttribute("KeyLocator", StringValue("/unique/key/locator"));
+  producerHelper.Install(nodes.Get(2)); // last node
+
+  PcapWriter trace("ndn-simple-trace.pcap");
+  Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/$ns3::PointToPointNetDevice/MacTx",
+                                MakeCallback(&PcapWriter::TracePacket, &trace));
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-simple.cpp b/examples/ndn-simple.cpp
new file mode 100644
index 0000000..b7755e8
--- /dev/null
+++ b/examples/ndn-simple.cpp
@@ -0,0 +1,96 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-simple.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a very simple network topology:
+ *
+ *
+ *      +----------+     1Mbps      +--------+     1Mbps      +----------+
+ *      | consumer | <------------> | router | <------------> | producer |
+ *      +----------+         10ms   +--------+          10ms  +----------+
+ *
+ *
+ * Consumer requests data from producer with frequency 10 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating nodes
+  NodeContainer nodes;
+  nodes.Create(3);
+
+  // Connecting nodes using two links
+  PointToPointHelper p2p;
+  p2p.Install(nodes.Get(0), nodes.Get(1));
+  p2p.Install(nodes.Get(1), nodes.Get(2));
+
+  // Install NDN stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetDefaultRoutes(true);
+  ndnHelper.InstallAll();
+
+  // Installing applications
+
+  // Consumer
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  // Consumer will request /prefix/0, /prefix/1, ...
+  consumerHelper.SetPrefix("/prefix");
+  consumerHelper.SetAttribute("Frequency", StringValue("10")); // 10 interests a second
+  consumerHelper.Install(nodes.Get(0));                        // first node
+
+  // Producer
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  // Producer will reply to all requests starting with /prefix
+  producerHelper.SetPrefix("/prefix");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(nodes.Get(2)); // last node
+
+  Simulator::Stop(Seconds(20.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-tree-app-delay-tracer.cpp b/examples/ndn-tree-app-delay-tracer.cpp
new file mode 100644
index 0000000..b503843
--- /dev/null
+++ b/examples/ndn-tree-app-delay-tracer.cpp
@@ -0,0 +1,116 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// ndn-tree-app-delay-tracer.cc
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a tree topology (using topology reader module)
+ *
+ *    /------\      /------\      /------\      /------\
+ *    |leaf-1|      |leaf-2|      |leaf-3|      |leaf-4|
+ *    \------/      \------/      \------/      \------/
+ *         ^          ^                ^           ^
+ *         |          |                |           |
+ *    	    \        /                  \         /
+ *           \      /  			 \  	 /    10Mbps / 1ms
+ *            \    /  			  \ 	/
+ *             |  |  			   |   |
+ *    	       v  v                        v   v
+ *          /-------\                    /-------\
+ *          | rtr-1 |                    | rtr-2 |
+ *          \-------/                    \-------/
+ *                ^                        ^
+ *      	  |	 		   |
+ *      	   \			  /  10 Mpbs / 1ms
+ *      	    +--------+  +--------+
+ *      		     |  |
+ *                           v  v
+ *      		  /--------\
+ *      		  |  root  |
+ *                        \--------/
+ *
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     ./waf --run=ndn-tree-app-delay-tracer
+ */
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 1);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-tree.txt");
+  topologyReader.Read();
+
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ndnHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ccnxGlobalRoutingHelper;
+  ccnxGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> consumers[4] = {Names::Find<Node>("leaf-1"), Names::Find<Node>("leaf-2"),
+                            Names::Find<Node>("leaf-3"), Names::Find<Node>("leaf-4")};
+  Ptr<Node> producer = Names::Find<Node>("root");
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerBatches");
+  consumerHelper.SetPrefix("/root");
+  consumerHelper.SetAttribute("Batches", StringValue("1s 1 10s 1"));
+  consumerHelper.Install(consumers[0]);
+
+  consumerHelper.SetAttribute("Batches", StringValue("11s 1"));
+  consumerHelper.Install(consumers[1]);
+
+  consumerHelper.SetAttribute("Batches", StringValue("11s 1"));
+  consumerHelper.Install(consumers[2]);
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+
+  // Register /root prefix with global routing controller and
+  // install producer that will satisfy Interests in /root namespace
+  ccnxGlobalRoutingHelper.AddOrigins("/root", producer);
+  producerHelper.SetPrefix("/root");
+  producerHelper.Install(producer).Start(Seconds(9));
+
+  // Calculate and install FIBs
+  ccnxGlobalRoutingHelper.CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+
+  ndn::AppDelayTracer::InstallAll("app-delays-trace.txt");
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-tree-cs-tracers.cpp b/examples/ndn-tree-cs-tracers.cpp
new file mode 100644
index 0000000..ce27888
--- /dev/null
+++ b/examples/ndn-tree-cs-tracers.cpp
@@ -0,0 +1,117 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// ndn-tree-cs-tracers.cc
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a tree topology (using topology reader module)
+ *
+ *    /------\      /------\      /------\      /------\
+ *    |leaf-1|      |leaf-2|      |leaf-3|      |leaf-4|
+ *    \------/      \------/      \------/      \------/
+ *         ^          ^                ^           ^
+ *         |          |                |           |
+ *    	    \        /                  \         /
+ *           \      /  			 \  	 /    10Mbps / 1ms
+ *            \    /  			  \ 	/
+ *             |  |  			   |   |
+ *    	       v  v                        v   v
+ *          /-------\                    /-------\
+ *          | rtr-1 |                    | rtr-2 |
+ *          \-------/                    \-------/
+ *                ^                        ^
+ *      	  |	 		   |
+ *      	   \			  /  10 Mpbs / 1ms
+ *      	    +--------+  +--------+
+ *      		     |  |
+ *                           v  v
+ *      		  /--------\
+ *      		  |  root  |
+ *                        \--------/
+ *
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     ./waf --run=ndn-tree-cs-tracers
+ */
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 1);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-tree.txt");
+  topologyReader.Read();
+
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ndnHelper;
+  ndnHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ndnHelper.SetContentStore("ns3::ndn::cs::Lru", "MaxSize",
+                            "100"); // default ContentStore parameters
+  ndnHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ccnxGlobalRoutingHelper;
+  ccnxGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> consumers[4] = {Names::Find<Node>("leaf-1"), Names::Find<Node>("leaf-2"),
+                            Names::Find<Node>("leaf-3"), Names::Find<Node>("leaf-4")};
+  Ptr<Node> producer = Names::Find<Node>("root");
+
+  for (int i = 0; i < 4; i++) {
+    ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+    consumerHelper.SetAttribute("Frequency", StringValue("10")); // 100 interests a second
+
+    // Each consumer will express the same data /root/<seq-no>
+    consumerHelper.SetPrefix("/root");
+    ApplicationContainer app = consumerHelper.Install(consumers[i]);
+    app.Start(Seconds(0.01 * i));
+  }
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+
+  // Register /root prefix with global routing controller and
+  // install producer that will satisfy Interests in /root namespace
+  ccnxGlobalRoutingHelper.AddOrigins("/root", producer);
+  producerHelper.SetPrefix("/root");
+  producerHelper.Install(producer);
+
+  // Calculate and install FIBs
+  ccnxGlobalRoutingHelper.CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+
+  ndn::CsTracer::InstallAll("cs-trace.txt", Seconds(1));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-tree-tracers.cpp b/examples/ndn-tree-tracers.cpp
new file mode 100644
index 0000000..29772f7
--- /dev/null
+++ b/examples/ndn-tree-tracers.cpp
@@ -0,0 +1,115 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+// ndn-tree-tracers.cc
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a tree topology (using topology reader module)
+ *
+ *    /------\      /------\      /------\      /------\
+ *    |leaf-1|      |leaf-2|      |leaf-3|      |leaf-4|
+ *    \------/      \------/      \------/      \------/
+ *         ^          ^                ^           ^
+ *         |          |                |           |
+ *    	    \        /                  \         /
+ *           \      /  			 \  	 /    10Mbps / 1ms
+ *            \    /  			  \ 	/
+ *             |  |  			   |   |
+ *    	       v  v                        v   v
+ *          /-------\                    /-------\
+ *          | rtr-1 |                    | rtr-2 |
+ *          \-------/                    \-------/
+ *                ^                        ^
+ *      	  |	 		   |
+ *      	   \			  /  10 Mpbs / 1ms
+ *      	    +--------+  +--------+
+ *      		     |  |
+ *                           v  v
+ *      		  /--------\
+ *      		  |  root  |
+ *                        \--------/
+ *
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     ./waf --run=ndn-tree-tracers
+ */
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 1);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-tree.txt");
+  topologyReader.Read();
+
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ccnxHelper;
+  ccnxHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ccnxHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ccnxGlobalRoutingHelper;
+  ccnxGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> consumers[4] = {Names::Find<Node>("leaf-1"), Names::Find<Node>("leaf-2"),
+                            Names::Find<Node>("leaf-3"), Names::Find<Node>("leaf-4")};
+  Ptr<Node> producer = Names::Find<Node>("root");
+
+  for (int i = 0; i < 4; i++) {
+    ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+    consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second
+
+    // Each consumer will express unique interests /root/<leaf-name>/<seq-no>
+    consumerHelper.SetPrefix("/root/" + Names::FindName(consumers[i]));
+    consumerHelper.Install(consumers[i]);
+  }
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+
+  // Register /root prefix with global routing controller and
+  // install producer that will satisfy Interests in /root namespace
+  ccnxGlobalRoutingHelper.AddOrigins("/root", producer);
+  producerHelper.SetPrefix("/root");
+  producerHelper.Install(producer);
+
+  // Calculate and install FIBs
+  ccnxGlobalRoutingHelper.CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+
+  ndn::L3AggregateTracer::InstallAll("aggregate-trace.txt", Seconds(0.5));
+  ndn::L3RateTracer::InstallAll("rate-trace.txt", Seconds(0.5));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-tree-with-l2tracer.cpp b/examples/ndn-tree-with-l2tracer.cpp
new file mode 100644
index 0000000..8d5e3e0
--- /dev/null
+++ b/examples/ndn-tree-with-l2tracer.cpp
@@ -0,0 +1,141 @@
+// ndn-simple-withl2tracer.cc
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+int
+main(int argc, char* argv[])
+{
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  AnnotatedTopologyReader topologyReader("", 10);
+  topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-tree-25-node.txt");
+  topologyReader.Read();
+
+  /****************************************************************************/
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ccnxHelper;
+  ccnxHelper.SetContentStore("ns3::ndn::cs::Lru", "MaxSize", "1000");
+  ccnxHelper.SetForwardingStrategy("ns3::ndn::fw::BestRoute");
+  ccnxHelper.InstallAll();
+  /****************************************************************************/
+  // Installing global routing interface on all nodes
+  ndn::GlobalRoutingHelper ccnxGlobalRoutingHelper;
+  ccnxGlobalRoutingHelper.InstallAll();
+  /****************************************************************************/
+  // Getting containers for the consumer/producer
+  Ptr<Node> consumer1 = Names::Find<Node>("Src1");
+  Ptr<Node> consumer2 = Names::Find<Node>("Src2");
+  Ptr<Node> consumer3 = Names::Find<Node>("Src3");
+  Ptr<Node> consumer4 = Names::Find<Node>("Src4");
+  Ptr<Node> consumer5 = Names::Find<Node>("Src5");
+  Ptr<Node> consumer6 = Names::Find<Node>("Src6");
+  Ptr<Node> consumer7 = Names::Find<Node>("Src7");
+  Ptr<Node> consumer8 = Names::Find<Node>("Src8");
+  Ptr<Node> consumer9 = Names::Find<Node>("Src9");
+
+  Ptr<Node> producer1 = Names::Find<Node>("Dst1");
+  Ptr<Node> producer2 = Names::Find<Node>("Dst2");
+  Ptr<Node> producer3 = Names::Find<Node>("Dst3");
+  Ptr<Node> producer4 = Names::Find<Node>("Dst4");
+  Ptr<Node> producer5 = Names::Find<Node>("Dst5");
+  Ptr<Node> producer6 = Names::Find<Node>("Dst6");
+  Ptr<Node> producer7 = Names::Find<Node>("Dst7");
+  Ptr<Node> producer8 = Names::Find<Node>("Dst8");
+  Ptr<Node> producer9 = Names::Find<Node>("Dst9");
+  /****************************************************************************/
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetAttribute("Frequency", StringValue("1000")); // interests per Second
+  consumerHelper.SetAttribute("Randomize", StringValue("uniform"));
+  /****************************************************************************/
+  // on the first to ninth consumer node install a Consumer application
+  // that will express interests in /dst1 to /dst9 namespace
+  consumerHelper.SetPrefix("/dst9");
+  consumerHelper.Install(consumer1);
+
+  consumerHelper.SetPrefix("/dst8");
+  consumerHelper.Install(consumer2);
+
+  consumerHelper.SetPrefix("/dst7");
+  consumerHelper.Install(consumer3);
+
+  consumerHelper.SetPrefix("/dst6");
+  consumerHelper.Install(consumer4);
+
+  consumerHelper.SetPrefix("/dst5");
+  consumerHelper.Install(consumer5);
+
+  consumerHelper.SetPrefix("/dst4");
+  consumerHelper.Install(consumer6);
+
+  consumerHelper.SetPrefix("/dst3");
+  consumerHelper.Install(consumer7);
+
+  consumerHelper.SetPrefix("/dst2");
+  consumerHelper.Install(consumer8);
+
+  consumerHelper.SetPrefix("/dst1");
+  consumerHelper.Install(consumer9);
+
+  /****************************************************************************/
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  /****************************************************************************/
+  // Register /dst1 to /dst9 prefix with global routing controller and
+  // install producer that will satisfy Interests in /dst1 to /dst9 namespace
+  ccnxGlobalRoutingHelper.AddOrigins("/dst1", producer1);
+  producerHelper.SetPrefix("/dst1");
+  producerHelper.Install(producer1);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst2", producer2);
+  producerHelper.SetPrefix("/dst2");
+  producerHelper.Install(producer2);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst3", producer3);
+  producerHelper.SetPrefix("/dst3");
+  producerHelper.Install(producer3);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst4", producer4);
+  producerHelper.SetPrefix("/dst4");
+  producerHelper.Install(producer4);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst5", producer5);
+  producerHelper.SetPrefix("/dst5");
+  producerHelper.Install(producer5);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst6", producer6);
+  producerHelper.SetPrefix("/dst6");
+  producerHelper.Install(producer6);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst7", producer7);
+  producerHelper.SetPrefix("/dst7");
+  producerHelper.Install(producer7);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst8", producer8);
+  producerHelper.SetPrefix("/dst8");
+  producerHelper.Install(producer8);
+
+  ccnxGlobalRoutingHelper.AddOrigins("/dst9", producer9);
+  producerHelper.SetPrefix("/dst9");
+  producerHelper.Install(producer9);
+
+  /*****************************************************************************/
+  // Calculate and install FIBs
+  ccnxGlobalRoutingHelper.CalculateRoutes();
+
+  Simulator::Stop(Seconds(10.0));
+
+  /****************************************************************************/
+  // Tracer:
+
+  L2RateTracer::InstallAll("drop-trace.txt", Seconds(0.5));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/ndn-zipf-mandelbrot.cpp b/examples/ndn-zipf-mandelbrot.cpp
new file mode 100644
index 0000000..4bec18e
--- /dev/null
+++ b/examples/ndn-zipf-mandelbrot.cpp
@@ -0,0 +1,113 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+// ndn-grid.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/point-to-point-layout-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+
+/**
+ * This scenario simulates a grid topology (using PointToPointGrid module)
+ *
+ * (consumer) -- ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) -- (producer)(2,2)
+ *
+ * All links are 1Mbps with propagation 10ms delay.
+ *
+ * FIB is populated using NdnGlobalRoutingHelper.
+ *
+ * Consumer requests data from producer with frequency 100 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.ConsumerZipfMandelbrot:ndn.Producer ./waf --run=ndn-zipf-mandelbrot
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // LogComponentEnable("ndn.CbisGlobalRoutingHelper", LOG_LEVEL_INFO);
+  // Setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("1ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("10"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating 3x3 topology
+  PointToPointHelper p2p;
+  PointToPointGridHelper grid(3, 3, p2p);
+  grid.BoundingBox(100, 100, 200, 200);
+
+  // Install CCNx stack on all nodes
+  ndn::StackHelper ccnxHelper;
+  ccnxHelper.SetForwardingStrategy("ns3::ndn::fw::SmartFlooding");
+  ccnxHelper.SetContentStore("ns3::ndn::cs::Lru", "MaxSize", "10");
+  ccnxHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  // ndn::CbisGlobalRoutingHelper ccnxGlobalRoutingHelper;
+  ndn::GlobalRoutingHelper ccnxGlobalRoutingHelper;
+  ccnxGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> producer = grid.GetNode(2, 2);
+  NodeContainer consumerNodes;
+  consumerNodes.Add(grid.GetNode(0, 0));
+
+  // Install CCNx applications
+  std::string prefix = "/prefix";
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerZipfMandelbrot");
+  // ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetPrefix(prefix);
+  consumerHelper.SetAttribute("Frequency", StringValue("100"));        // 100 interests a second
+  consumerHelper.SetAttribute("NumberOfContents", StringValue("100")); // 10 different contents
+  // consumerHelper.SetAttribute ("Randomize", StringValue ("uniform")); // 100 interests a second
+  consumerHelper.Install(consumerNodes);
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetPrefix(prefix);
+  producerHelper.SetAttribute("PayloadSize", StringValue("100"));
+  producerHelper.Install(producer);
+  ccnxGlobalRoutingHelper.AddOrigins(prefix, producer);
+
+  // Calculate and install FIBs
+  ccnxGlobalRoutingHelper.CalculateRoutes();
+
+  Simulator::Stop(Seconds(10.0));
+
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
diff --git a/examples/topologies/topo-11-node-two-bottlenecks.txt b/examples/topologies/topo-11-node-two-bottlenecks.txt
new file mode 100644
index 0000000..699a1a0
--- /dev/null
+++ b/examples/topologies/topo-11-node-two-bottlenecks.txt
@@ -0,0 +1,56 @@
+# topo-11-node-two-bottlenecks.txt
+
+#    /------\ 0                                                 0 /------\
+#    |  c1  |<-----+                                       +----->|  p1  |
+#    \------/       \                                     /       \------/
+#                    \              /-----\              /        
+#    /------\ 0       \         +==>| r12 |<==+         /       0 /------\
+#    |  c2  |<--+      \       /    \-----/    \       /      +-->|  p2  |
+#    \------/    \      \     |                 |     /      /    \------/
+#                 \      |    |   1Mbps links   |    |      /     
+#                  \  1  v0   v5               1v   2v  3  /      
+#                   +->/------\                 /------\<-+       
+#                     2|  r1  |<===============>|  r2  |4         
+#                   +->\------/4               0\------/<-+       
+#                  /    3^                           ^5    \      
+#                 /      |                           |      \     
+#    /------\ 0  /      /                             \      \  0 /------\
+#    |  c3  |<--+      /                               \      +-->|  p3  |
+#    \------/         /                                 \         \------/
+#                    /     "All consumer-router and"     \        
+#    /------\ 0     /      "router-producer links are"    \    0 /------\
+#    |  c4  |<-----+       "10Mbps"                        +---->|  p4  |
+#    \------/                                                    \------/
+#                                                                
+#    "Numbers near nodes denote face IDs. Face ID is assigned based on the order of link"
+#    "definitions in the topology file"
+
+router
+
+#name   city    latitude  longitude
+c1      NA      50        30
+c2      NA    	30        30
+c3      NA    	10        30
+c4      NA    	10        40
+n1      NA    	40        40
+n12     NA    	30        60
+n2      NA    	40        80
+p1      NA    	50        90
+p2      NA    	30        90
+p3      NA    	10        90
+p4      NA    	10        80
+
+link
+
+#x      y       capacity(kbps)  OSPF    Delay   MaxPackets
+c1      n1      10Mbps          1       50ms    200
+c2      n1      10Mbps          1       10ms    200
+c3      n1      10Mbps          1       100ms   200
+c4      n1      10Mbps          1       1ms     200
+n1      n2      1Mbps           1176    20ms    20 
+n1      n12     1Mbps           587     1ms     20
+n12     n2      1Mbps           846     1ms     20
+n2      p1      10Mbps          260     1ms     200
+n2      p2      10Mbps          700     1ms     200
+n2      p3      10Mbps          1       1ms     200
+n2      p4      10Mbps          1       1ms     200
diff --git a/examples/topologies/topo-6-node.txt b/examples/topologies/topo-6-node.txt
new file mode 100644
index 0000000..d944fef
--- /dev/null
+++ b/examples/topologies/topo-6-node.txt
@@ -0,0 +1,33 @@
+# topo-6-node.txt
+
+#   /------\	                                                /------\
+#   | Src1 |<--+                                            +-->| Dst1 |
+#   \------/    \                                          /    \------/
+#            	 \                                        /     
+#                 +-->/------\   "bottleneck"  /------\<-+      
+#                     | Rtr1 |<===============>| Rtr2 |         
+#                 +-->\------/                 \------/<-+      
+#                /                                        \
+#   /------\    /                                          \    /------\
+#   | Src2 |<--+                                            +-->| Dst2 |
+#   \------/                                                    \------/
+
+router
+
+# node  comment     yPos    xPos
+Src1   NA        1       3
+Src2   NA        3       3
+Rtr1   NA        2       5
+Rtr2   NA        2       7
+Dst1   NA        1       9
+Dst2   NA        3       9
+
+link
+
+# srcNode   dstNode     bandwidth   metric  delay   queue
+Src1        Rtr1        10Mbps      1        10ms    20
+Src2        Rtr1        10Mbps      1        10ms    20
+Rtr1        Rtr2        1Mbps       1        10ms    20
+Dst1        Rtr2        10Mbps      1        10ms    20
+Dst2        Rtr2        10Mbps      1        10ms    20
+
diff --git a/examples/topologies/topo-grid-3x3-loss.txt b/examples/topologies/topo-grid-3x3-loss.txt
new file mode 100644
index 0000000..922bcef
--- /dev/null
+++ b/examples/topologies/topo-grid-3x3-loss.txt
@@ -0,0 +1,61 @@
+# topo-grid-3x3.txt
+
+#   /--------\	    /-\	        /-\
+#   |Consumer|<---->| |<------->| |
+#   \--------/	    \-/	        \-/
+#       ^   	     ^ 	         ^
+#       |            |           |   1Mbps/10ms delay
+#       v            v           v
+#      /-\          /-\         /-\
+#      | |<-------->| |<------->| |
+#      \-/          \-/         \-/
+#       ^   	     ^ 	         ^
+#       |            |           |
+#       v            v           v
+#      /-\	    /-\	     /--------\
+#      | |<-------->| |<---->|Producer|
+#      \-/          \-/      \--------/
+
+# any empty lines and lines starting with '#' symbol is ignored
+#
+# The file should contain exactly two sections: router and link, each starting with the corresponding keyword
+#
+# router section defines topology nodes and their relative positions (e.g., to use in visualizer)
+router
+
+# each line in this section represents one router and should have the following data
+# node  comment     yPos    xPos
+Node0   NA          3       1
+Node1   NA          3       2
+Node2   NA          3       3
+Node3   NA          2       1
+Node4   NA          2       2
+Node5   NA          2       3
+Node6   NA          1       1
+Node7   NA          1       2
+Node8   NA          1       3
+# Note that `node` can be any string. It is possible to access to the node by name using Names::Find, see examples.
+
+# link section defines point-to-point links between nodes and characteristics of these links
+link
+
+# Each line should be in the following format (only first two are required, the rest can be omitted)
+# srcNode   dstNode     bandwidth   metric  delay   queue
+# bandwidth: link bandwidth
+# metric: routing metric
+# delay:  link delay
+# queue:  MaxPackets for transmission queue on the link (both directions)
+# error:  comma-separated list, specifying class for ErrorModel and necessary attributes
+Node0       Node1       1Mbps       1       10ms    10      ns3::RateErrorModel,ErrorUnit=ERROR_UNIT_PACKET,ErrorRate=0.9
+Node0       Node3       1Mbps       1       10ms    10
+Node1       Node2       1Mbps       1       10ms    10
+Node1       Node4       1Mbps       1       10ms    10
+Node2       Node5       1Mbps       1       10ms    10
+Node3       Node4       1Mbps       1       10ms    10
+Node3       Node6       1Mbps       1       10ms    10
+Node4       Node5       1Mbps       1       10ms    10
+Node4       Node7       1Mbps       1       10ms    10
+Node5       Node8       1Mbps       1       10ms    10
+Node6       Node7       1Mbps       1       10ms    10
+Node7       Node8       1Mbps       1       10ms    10
+
diff --git a/examples/topologies/topo-grid-3x3.txt b/examples/topologies/topo-grid-3x3.txt
new file mode 100644
index 0000000..749778d
--- /dev/null
+++ b/examples/topologies/topo-grid-3x3.txt
@@ -0,0 +1,60 @@
+# topo-grid-3x3.txt
+
+#   /--------\	    /-\	        /-\
+#   |Consumer|<---->| |<------->| |
+#   \--------/	    \-/	        \-/
+#       ^   	     ^ 	         ^
+#       |            |           |   1Mbps/10ms delay
+#       v            v           v
+#      /-\          /-\         /-\
+#      | |<-------->| |<------->| |
+#      \-/          \-/         \-/
+#       ^   	     ^ 	         ^
+#       |            |           |
+#       v            v           v
+#      /-\	    /-\	     /--------\
+#      | |<-------->| |<---->|Producer|
+#      \-/          \-/      \--------/
+
+# any empty lines and lines starting with '#' symbol is ignored
+#
+# The file should contain exactly two sections: router and link, each starting with the corresponding keyword
+#
+# router section defines topology nodes and their relative positions (e.g., to use in visualizer)
+router
+
+# each line in this section represents one router and should have the following data
+# node  comment     yPos    xPos
+Node0   NA          3       1
+Node1   NA          3       2
+Node2   NA          3       3
+Node3   NA          2       1
+Node4   NA          2       2
+Node5   NA          2       3
+Node6   NA          1       1
+Node7   NA          1       2
+Node8   NA          1       3
+# Note that `node` can be any string. It is possible to access to the node by name using Names::Find, see examples.
+
+# link section defines point-to-point links between nodes and characteristics of these links
+link
+
+# Each line should be in the following format (only first two are required, the rest can be omitted)
+# srcNode   dstNode     bandwidth   metric  delay   queue
+# bandwidth: link bandwidth
+# metric: routing metric
+# delay:  link delay
+# queue:  MaxPackets for transmission queue on the link (both directions)
+Node0       Node1       1Mbps       1       10ms    10
+Node0       Node3       1Mbps       1       10ms    10
+Node1       Node2       1Mbps       1       10ms    10
+Node1       Node4       1Mbps       1       10ms    10
+Node2       Node5       1Mbps       1       10ms    10
+Node3       Node4       1Mbps       1       10ms    10
+Node3       Node6       1Mbps       1       10ms    10
+Node4       Node5       1Mbps       1       10ms    10
+Node4       Node7       1Mbps       1       10ms    10
+Node5       Node8       1Mbps       1       10ms    10
+Node6       Node7       1Mbps       1       10ms    10
+Node7       Node8       1Mbps       1       10ms    10
+
diff --git a/examples/topologies/topo-tree-25-node.txt b/examples/topologies/topo-tree-25-node.txt
new file mode 100644
index 0000000..7b328f4
--- /dev/null
+++ b/examples/topologies/topo-tree-25-node.txt
@@ -0,0 +1,58 @@
+#Topology.Scenario3.txt
+
+router
+
+# node   comment  yPos    xPos
+Rtr1     NA        3        9
+Rtr2     NA        9        9
+Rtr3     NA        15       9
+Rtr7     NA        9        15
+Rtr4     NA        3        21
+Rtr5     NA        9        21
+Rtr6     NA        15       21
+Src1     NA        1        3
+Src2     NA        3        3
+Src3     NA        5        3
+Src4     NA        7        3
+Src5     NA        9        3
+Src6     NA        11       3
+Src7     NA        13       3
+Src8     NA        15       3
+Src9     NA        17       3
+Dst1     NA        1        27
+Dst2     NA        3        27
+Dst3     NA        5        27
+Dst4     NA        7        27
+Dst5     NA        9        27
+Dst6     NA        11       27
+Dst7     NA        13       27
+Dst8     NA        15       27
+Dst9     NA        17       27
+
+link
+# srcNode   dstNode     bandwidth   metric    delay   queue
+Src1        Rtr1        100Mbps      1        10ms     10
+Src2        Rtr1        100Mbps      1        10ms     10
+Src3        Rtr1        100Mbps      1        10ms     10
+Src4        Rtr2        100Mbps      1        10ms     10
+Src5        Rtr2        100Mbps      1        10ms     10
+Src6        Rtr2        100Mbps      1        10ms     10
+Src7        Rtr3        100Mbps      1        10ms     10
+Src8        Rtr3        100Mbps      1        10ms     10
+Src9        Rtr3        100Mbps      1        10ms     10
+Rtr1        Rtr7        10Mbps       1        10ms     10
+Rtr2        Rtr7        10Mbps       1        10ms     10
+Rtr3        Rtr7        10Mbps       1        10ms     10
+Rtr4        Rtr7        10Mbps       1        10ms     10
+Rtr5        Rtr7        10Mbps       1        10ms     10
+Rtr6        Rtr7        10Mbps       1        10ms     10
+Dst1        Rtr4        100Mbps      1        10ms     10
+Dst2        Rtr4        100Mbps      1        10ms     10
+Dst3        Rtr4        100Mbps      1        10ms     10
+Dst4        Rtr5        100Mbps      1        10ms     10
+Dst5        Rtr5        100Mbps      1        10ms     10
+Dst6        Rtr5        100Mbps      1        10ms     10
+Dst7        Rtr6        100Mbps      1        10ms     10
+Dst8        Rtr6        100Mbps      1        10ms     10
+Dst9        Rtr6        100Mbps      1        10ms     10
+
diff --git a/examples/topologies/topo-tree.txt b/examples/topologies/topo-tree.txt
new file mode 100644
index 0000000..6682dce
--- /dev/null
+++ b/examples/topologies/topo-tree.txt
@@ -0,0 +1,46 @@
+# topo-tree.txt
+
+#     /------\      /------\      /------\      /------\
+#     |leaf-1|      |leaf-2|      |leaf-3|      |leaf-4|
+#     \------/      \------/      \------/      \------/
+#          ^          ^                ^           ^	
+#          |          |                |           |
+#     	    \        /                  \         / 
+#            \      /  			 \  	 /    10Mbps / 1ms
+#             \    /  			  \ 	/
+#              |  |  			   |   | 
+#     	       v  v                        v   v     
+#	    /-------\                    /-------\
+#	    | rtr-1 |                    | rtr-2 |
+#           \-------/                    \-------/
+#                 ^                        ^                      
+#		  |	 		   |
+#		   \			  /  10 Mpbs / 1ms 
+#		    +--------+  +--------+ 
+#			     |  |      
+#                            v  v
+#			  /--------\
+#			  |  root  |
+#                         \--------/
+#
+
+router
+
+#node	city	y	x	mpi-partition
+leaf-1	NA	80	40	1
+leaf-2	NA	80	20	3
+leaf-3	NA	80	0	2
+leaf-4	NA	80	-20	4
+rtr-1	NA	60	20	1
+rtr-2	NA	60	0	2
+root	NA	40	10	0
+
+link
+
+# from	    to		capacity	metric	delay	queue
+leaf-1	    rtr-1	10Mbps		1	1ms	100
+leaf-2	    rtr-1	10Mbps		1	1ms	100
+leaf-3	    rtr-2	10Mbps		1	1ms	100
+leaf-4	    rtr-2	10Mbps		1	1ms	100
+rtr-1	    root	10Mbps		1	1ms	100
+rtr-2	    root	10Mbps		1	1ms	100
diff --git a/examples/wscript b/examples/wscript
new file mode 100644
index 0000000..e2386ee
--- /dev/null
+++ b/examples/wscript
@@ -0,0 +1,14 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import Utils, Logs
+
+def build(bld):
+    # This may be necessary for visualizer to work
+    all_modules = [mod[len("ns3-"):] for mod in bld.env['NS3_ENABLED_MODULES']]
+
+    for i in bld.path.ant_glob(['*.cpp']):
+        name = str(i)[:-len(".cpp")]
+        obj = bld.create_ns3_program(name, all_modules)
+        obj.source = [i] + bld.path.ant_glob(['%s/**/*.cpp' % name])
+        obj.includes += " .. ../NFD"
+
diff --git a/helper/boost-graph-ndn-global-routing-helper.hpp b/helper/boost-graph-ndn-global-routing-helper.hpp
new file mode 100644
index 0000000..87d02f5
--- /dev/null
+++ b/helper/boost-graph-ndn-global-routing-helper.hpp
@@ -0,0 +1,326 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef BOOST_GRAPH_NDN_GLOBAL_ROUTING_HELPER_H
+#define BOOST_GRAPH_NDN_GLOBAL_ROUTING_HELPER_H
+
+/// @cond include_hidden
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/ref.hpp>
+
+#include "ns3/ndn-face.hpp"
+#include "ns3/ndn-limits.hpp"
+#include "ns3/node-list.h"
+#include "ns3/channel-list.h"
+#include "../model/ndn-global-router.hpp"
+#include <list>
+#include <map>
+
+namespace boost {
+
+class NdnGlobalRouterGraph {
+public:
+  typedef ns3::Ptr<ns3::ndn::GlobalRouter> Vertice;
+  typedef uint16_t edge_property_type;
+  typedef uint32_t vertex_property_type;
+
+  NdnGlobalRouterGraph()
+  {
+    for (ns3::NodeList::Iterator node = ns3::NodeList::Begin(); node != ns3::NodeList::End();
+         node++) {
+      ns3::Ptr<ns3::ndn::GlobalRouter> gr = (*node)->GetObject<ns3::ndn::GlobalRouter>();
+      if (gr != 0)
+        m_vertices.push_back(gr);
+    }
+
+    for (ns3::ChannelList::Iterator channel = ns3::ChannelList::Begin();
+         channel != ns3::ChannelList::End(); channel++) {
+      ns3::Ptr<ns3::ndn::GlobalRouter> gr = (*channel)->GetObject<ns3::ndn::GlobalRouter>();
+      if (gr != 0)
+        m_vertices.push_back(gr);
+    }
+  }
+
+  const std::list<Vertice>&
+  GetVertices() const
+  {
+    return m_vertices;
+  }
+
+public:
+  std::list<Vertice> m_vertices;
+};
+
+class ndn_global_router_graph_category : public virtual vertex_list_graph_tag,
+                                         public virtual incidence_graph_tag {
+};
+
+template<>
+struct graph_traits<NdnGlobalRouterGraph> {
+  // Graph concept
+  typedef NdnGlobalRouterGraph::Vertice vertex_descriptor;
+  typedef ns3::ndn::GlobalRouter::Incidency edge_descriptor;
+  typedef directed_tag directed_category;
+  typedef disallow_parallel_edge_tag edge_parallel_category;
+  typedef ndn_global_router_graph_category traversal_category;
+
+  // VertexList concept
+  typedef std::list<vertex_descriptor>::const_iterator vertex_iterator;
+  typedef size_t vertices_size_type;
+
+  // AdjacencyGraph concept
+  typedef ns3::ndn::GlobalRouter::IncidencyList::iterator out_edge_iterator;
+  typedef size_t degree_size_type;
+
+  // typedef size_t edges_size_type;
+};
+
+} // namespace boost
+
+namespace boost {
+
+inline graph_traits<NdnGlobalRouterGraph>::vertex_descriptor
+source(graph_traits<NdnGlobalRouterGraph>::edge_descriptor e, const NdnGlobalRouterGraph& g)
+{
+  return e.get<0>();
+}
+
+inline graph_traits<NdnGlobalRouterGraph>::vertex_descriptor
+target(graph_traits<NdnGlobalRouterGraph>::edge_descriptor e, const NdnGlobalRouterGraph& g)
+{
+  return e.get<2>();
+}
+
+inline std::pair<graph_traits<NdnGlobalRouterGraph>::vertex_iterator,
+                 graph_traits<NdnGlobalRouterGraph>::vertex_iterator>
+vertices(const NdnGlobalRouterGraph& g)
+{
+  return make_pair(g.GetVertices().begin(), g.GetVertices().end());
+}
+
+inline graph_traits<NdnGlobalRouterGraph>::vertices_size_type
+num_vertices(const NdnGlobalRouterGraph& g)
+{
+  return g.GetVertices().size();
+}
+
+inline std::pair<graph_traits<NdnGlobalRouterGraph>::out_edge_iterator,
+                 graph_traits<NdnGlobalRouterGraph>::out_edge_iterator>
+out_edges(graph_traits<NdnGlobalRouterGraph>::vertex_descriptor u, const NdnGlobalRouterGraph& g)
+{
+  return std::make_pair(u->GetIncidencies().begin(), u->GetIncidencies().end());
+}
+
+inline graph_traits<NdnGlobalRouterGraph>::degree_size_type
+out_degree(graph_traits<NdnGlobalRouterGraph>::vertex_descriptor u, const NdnGlobalRouterGraph& g)
+{
+  return u->GetIncidencies().size();
+}
+
+//////////////////////////////////////////////////////////////
+// Property maps
+
+struct EdgeWeights {
+  EdgeWeights(const NdnGlobalRouterGraph& graph)
+    : m_graph(graph)
+  {
+  }
+
+private:
+  const NdnGlobalRouterGraph& m_graph;
+};
+
+struct VertexIds {
+  VertexIds(const NdnGlobalRouterGraph& graph)
+    : m_graph(graph)
+  {
+  }
+
+private:
+  const NdnGlobalRouterGraph& m_graph;
+};
+
+template<>
+struct property_map<NdnGlobalRouterGraph, edge_weight_t> {
+  typedef const EdgeWeights const_type;
+  typedef EdgeWeights type;
+};
+
+template<>
+struct property_map<NdnGlobalRouterGraph, vertex_index_t> {
+  typedef const VertexIds const_type;
+  typedef VertexIds type;
+};
+
+template<>
+struct property_traits<EdgeWeights> {
+  // Metric property map
+  typedef tuple<ns3::Ptr<ns3::ndn::Face>, uint16_t, double> value_type;
+  typedef tuple<ns3::Ptr<ns3::ndn::Face>, uint16_t, double> reference;
+  typedef ns3::ndn::GlobalRouter::Incidency key_type;
+  typedef readable_property_map_tag category;
+};
+
+const property_traits<EdgeWeights>::value_type WeightZero(0, 0, 0.0);
+const property_traits<EdgeWeights>::value_type
+  WeightInf(0, std::numeric_limits<uint16_t>::max(), 0.0);
+
+struct WeightCompare : public std::binary_function<property_traits<EdgeWeights>::reference,
+                                                   property_traits<EdgeWeights>::reference, bool> {
+  bool
+  operator()(tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double> a,
+             tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double> b) const
+  {
+    return a.get<1>() < b.get<1>();
+  }
+
+  bool
+  operator()(property_traits<EdgeWeights>::reference a, uint32_t b) const
+  {
+    return a.get<1>() < b;
+  }
+
+  bool
+  operator()(uint32_t a, uint32_t b) const
+  {
+    return a < b;
+  }
+};
+
+struct WeightCombine
+  : public std::binary_function<uint32_t, property_traits<EdgeWeights>::reference, uint32_t> {
+  uint32_t
+  operator()(uint32_t a, property_traits<EdgeWeights>::reference b) const
+  {
+    return a + b.get<1>();
+  }
+
+  tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double>
+  operator()(tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double> a,
+             property_traits<EdgeWeights>::reference b) const
+  {
+    if (a.get<0>() == 0)
+      return make_tuple(b.get<0>(), a.get<1>() + b.get<1>(), a.get<2>() + b.get<2>());
+    else
+      return make_tuple(a.get<0>(), a.get<1>() + b.get<1>(), a.get<2>() + b.get<2>());
+  }
+};
+
+template<>
+struct property_traits<VertexIds> {
+  // Metric property map
+  typedef uint32_t value_type;
+  typedef uint32_t reference;
+  typedef ns3::Ptr<ns3::ndn::GlobalRouter> key_type;
+  typedef readable_property_map_tag category;
+};
+
+inline EdgeWeights
+get(edge_weight_t, const NdnGlobalRouterGraph& g)
+{
+  return EdgeWeights(g);
+}
+
+inline VertexIds
+get(vertex_index_t, const NdnGlobalRouterGraph& g)
+{
+  return VertexIds(g);
+}
+
+template<class M, class K, class V>
+inline void
+put(reference_wrapper<M> mapp, K a, V p)
+{
+  mapp.get()[a] = p;
+}
+
+// void
+// put (cref< std::map< ns3::Ptr<ns3::ndn::GlobalRouter>, ns3::Ptr<ns3::ndn::GlobalRouter> > > map,
+
+inline uint32_t
+get(const boost::VertexIds&, ns3::Ptr<ns3::ndn::GlobalRouter>& gr)
+{
+  return gr->GetId();
+}
+
+inline property_traits<EdgeWeights>::reference
+get(const boost::EdgeWeights&, ns3::ndn::GlobalRouter::Incidency& edge)
+{
+  if (edge.get<1>() == 0)
+    return property_traits<EdgeWeights>::reference(0, 0, 0.0);
+  else {
+    ns3::Ptr<ns3::ndn::Limits> limits = edge.get<1>()->GetObject<ns3::ndn::Limits>();
+    double delay = 0.0;
+    if (limits != 0) // valid limits object
+    {
+      delay = limits->GetLinkDelay();
+    }
+    return property_traits<EdgeWeights>::reference(edge.get<1>(), edge.get<1>()->GetMetric(),
+                                                   delay);
+  }
+}
+
+struct PredecessorsMap
+  : public std::map<ns3::Ptr<ns3::ndn::GlobalRouter>, ns3::Ptr<ns3::ndn::GlobalRouter>> {
+};
+
+template<>
+struct property_traits<reference_wrapper<PredecessorsMap>> {
+  // Metric property map
+  typedef ns3::Ptr<ns3::ndn::GlobalRouter> value_type;
+  typedef ns3::Ptr<ns3::ndn::GlobalRouter> reference;
+  typedef ns3::Ptr<ns3::ndn::GlobalRouter> key_type;
+  typedef read_write_property_map_tag category;
+};
+
+struct DistancesMap : public std::map<ns3::Ptr<ns3::ndn::GlobalRouter>,
+                                      tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double>> {
+};
+
+template<>
+struct property_traits<reference_wrapper<DistancesMap>> {
+  // Metric property map
+  typedef tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double> value_type;
+  typedef tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double> reference;
+  typedef ns3::Ptr<ns3::ndn::GlobalRouter> key_type;
+  typedef read_write_property_map_tag category;
+};
+
+inline tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double>
+get(DistancesMap& map, ns3::Ptr<ns3::ndn::GlobalRouter> key)
+{
+  boost::DistancesMap::iterator i = map.find(key);
+  if (i == map.end())
+    return tuple<ns3::Ptr<ns3::ndn::Face>, uint32_t, double>(0,
+                                                             std::numeric_limits<uint32_t>::max(),
+                                                             0.0);
+  else
+    return i->second;
+}
+
+} // namespace boost
+
+/// @endcond
+
+#endif // BOOST_GRAPH_NDN_GLOBAL_ROUTING_HELPER_H
diff --git a/helper/ndn-app-helper.cpp b/helper/ndn-app-helper.cpp
new file mode 100644
index 0000000..f1f4381
--- /dev/null
+++ b/helper/ndn-app-helper.cpp
@@ -0,0 +1,101 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ndn-app-helper.hpp"
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/names.h"
+#include "ns3/ndn-app.hpp"
+
+#ifdef NS3_MPI
+#include "ns3/mpi-interface.h"
+#endif
+
+NS_LOG_COMPONENT_DEFINE("ndn.AppHelper");
+
+namespace ns3 {
+namespace ndn {
+
+AppHelper::AppHelper(const std::string& app)
+{
+  m_factory.SetTypeId(app);
+}
+
+void
+AppHelper::SetPrefix(const std::string& prefix)
+{
+  m_factory.Set("Prefix", StringValue(prefix));
+}
+
+void
+AppHelper::SetAttribute(std::string name, const AttributeValue& value)
+{
+  m_factory.Set(name, value);
+}
+
+ApplicationContainer
+AppHelper::Install(Ptr<Node> node)
+{
+  ApplicationContainer apps;
+  Ptr<Application> app = InstallPriv(node);
+  if (app != 0)
+    apps.Add(app);
+
+  return apps;
+}
+
+ApplicationContainer
+AppHelper::Install(std::string nodeName)
+{
+  Ptr<Node> node = Names::Find<Node>(nodeName);
+  return Install(node);
+}
+
+ApplicationContainer
+AppHelper::Install(NodeContainer c)
+{
+  ApplicationContainer apps;
+  for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
+    Ptr<Application> app = InstallPriv(*i);
+    if (app != 0)
+      apps.Add(app);
+  }
+
+  return apps;
+}
+
+Ptr<Application>
+AppHelper::InstallPriv(Ptr<Node> node)
+{
+#ifdef NS3_MPI
+  if (MpiInterface::IsEnabled() && node->GetSystemId() != MpiInterface::GetSystemId()) {
+    // don't create an app if MPI is enabled and node is not in the correct partition
+    return 0;
+  }
+#endif
+
+  Ptr<Application> app = m_factory.Create<Application>();
+  node->AddApplication(app);
+
+  return app;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/helper/ndn-app-helper.hpp b/helper/ndn-app-helper.hpp
new file mode 100644
index 0000000..fab41ad
--- /dev/null
+++ b/helper/ndn-app-helper.hpp
@@ -0,0 +1,112 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef NDN_APP_HELPER_H
+#define NDN_APP_HELPER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/object-factory.h"
+#include "ns3/attribute.h"
+#include "ns3/node-container.h"
+#include "ns3/application-container.h"
+#include "ns3/ptr.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-helpers
+ * \brief A helper to make it easier to instantiate an ns3::NdnConsumer Application
+ * on a set of nodes.
+ */
+class AppHelper {
+public:
+  /**
+   * \brief Create an NdnAppHelper to make it easier to work with Ndn apps
+   *
+   * \param app Class of the application
+   */
+  AppHelper(const std::string& prefix);
+
+  /**
+   * @brief Set the prefix consumer will be requesting
+   */
+  void
+  SetPrefix(const std::string& prefix);
+
+  /**
+   * \brief Helper function used to set the underlying application attributes.
+   *
+   * \param name the name of the application attribute to set
+   * \param value the value of the application attribute to set
+   */
+  void
+  SetAttribute(std::string name, const AttributeValue& value);
+
+  /**
+   * Install an ns3::NdnConsumer on each node of the input container
+   * configured with all the attributes set with SetAttribute.
+   *
+   * \param c NodeContainer of the set of nodes on which an NdnConsumer
+   * will be installed.
+   * \returns Container of Ptr to the applications installed.
+   */
+  ApplicationContainer
+  Install(NodeContainer c);
+
+  /**
+   * Install an ns3::NdnConsumer on the node configured with all the
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an NdnConsumer will be installed.
+   * \returns Container of Ptr to the applications installed.
+   */
+  ApplicationContainer
+  Install(Ptr<Node> node);
+
+  /**
+   * Install an ns3::NdnConsumer on the node configured with all the
+   * attributes set with SetAttribute.
+   *
+   * \param nodeName The node on which an NdnConsumer will be installed.
+   * \returns Container of Ptr to the applications installed.
+   */
+  ApplicationContainer
+  Install(std::string nodeName);
+
+private:
+  /**
+   * \internal
+   * Install an ns3::NdnConsumer on the node configured with all the
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an NdnConsumer will be installed.
+   * \returns Ptr to the application installed.
+   */
+  Ptr<Application>
+  InstallPriv(Ptr<Node> node);
+  ObjectFactory m_factory;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_APP_HELPER_H
diff --git a/helper/ndn-face-container.cpp b/helper/ndn-face-container.cpp
new file mode 100644
index 0000000..bd03ed0
--- /dev/null
+++ b/helper/ndn-face-container.cpp
@@ -0,0 +1,102 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-face-container.hpp"
+
+#include <algorithm>
+
+#include "ns3/ndn-face.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+FaceContainer::FaceContainer()
+{
+}
+
+FaceContainer::FaceContainer(const FaceContainer& other)
+{
+  AddAll(other);
+}
+
+FaceContainer&
+FaceContainer::operator= (const FaceContainer &other)
+{
+  m_faces.clear();
+  AddAll(other);
+
+  return *this;
+}
+
+void
+FaceContainer::AddAll(Ptr<FaceContainer> other)
+{
+  AddAll(*other);
+}
+
+void
+FaceContainer::AddAll(const FaceContainer& other)
+{
+  m_faces.insert(m_faces.end(), other.m_faces.begin(), other.m_faces.end());
+}
+
+FaceContainer::Iterator
+FaceContainer::Begin(void) const
+{
+  return m_faces.begin();
+}
+
+FaceContainer::Iterator
+FaceContainer::End(void) const
+{
+  return m_faces.end();
+}
+
+uint32_t
+FaceContainer::GetN(void) const
+{
+  return m_faces.size();
+}
+
+// void
+// FaceContainer::SetMetricToAll (uint16_t metric)
+// {
+//   for (FaceContainer::iterator it=m_faces.begin ();
+//        it != m_faces.end ();
+//        it++)
+//     {
+//       (*it)->SetMetric (metric);
+//     }
+// }
+
+void
+FaceContainer::Add(const shared_ptr<Face>& face)
+{
+  m_faces.push_back(face);
+}
+
+shared_ptr<Face>
+FaceContainer::Get(FaceContainer::Iterator i) const
+{
+  return *i;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/helper/ndn-face-container.hpp b/helper/ndn-face-container.hpp
new file mode 100644
index 0000000..fc90ad6
--- /dev/null
+++ b/helper/ndn-face-container.hpp
@@ -0,0 +1,152 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_FACE_CONTAINER_H
+#define NDN_FACE_CONTAINER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include <stdint.h>
+#include <vector>
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ndn-face.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-helpers
+ * \brief A pool for Ndn faces
+ *
+ * Provides tools to perform basic manipulation on faces, such as
+ * setting metrics and states on faces
+ *
+ * \see NdnStackHelper
+ */
+class FaceContainer : public SimpleRefCount<FaceContainer> {
+private:
+  typedef std::vector<shared_ptr<Face>> Container;
+
+public:
+  typedef Container::const_iterator Iterator; ///< \brief Iterator over FaceContainer
+
+  /**
+   * \brief Create an empty FaceContainer.
+   */
+  FaceContainer();
+
+  /**
+   * \brief Copy constructor for FaceContainer. Calls AddAll method
+   *
+   * \see FaceContainer::AddAll
+   */
+  FaceContainer(const FaceContainer& other);
+
+  /**
+   * \brief Copy operator for FaceContainer. Empties vector and calls AddAll method
+   *
+   * All previously obtained iterators (Begin() and End()) will be invalidated
+   *
+   * \see FaceContainer::AddAll
+   */
+  FaceContainer&
+  operator=(const FaceContainer& other);
+
+  /**
+   * \brief Add all entries from other container
+   *
+   * \param other smart pointer to a container
+   */
+  void
+  AddAll(Ptr<FaceContainer> other);
+
+  /**
+   * \brief Add all entries from other container
+   *
+   * \param other container
+   */
+  void
+  AddAll(const FaceContainer& other);
+
+  /**
+   * \brief Get an iterator which refers to the first pair in the
+   * container.
+   *
+   * \returns an iterator which refers to the first pair in the container.
+   */
+  Iterator
+  Begin() const;
+
+  /**
+   * \brief Get an iterator which indicates past-the-last Node in the
+   * container.
+   *
+   * \returns an iterator which indicates an ending condition for a loop.
+   */
+  Iterator
+  End() const;
+
+  /**
+   * \brief Get the number of faces stored in this container
+   *
+   * \returns the number of faces stored in this container
+   */
+  uint32_t
+  GetN() const;
+
+  // /**
+  //  * \brief Set a metric for all faces in the container
+  //  *
+  //  * \param metric value of metric to assign to all faces in the container
+  //  */
+  // void SetMetricToAll (uint16_t metric);
+
+  /**
+   * Add an entry to the container
+   *
+   * \param face a smart pointer to a Face-derived object
+   *
+   * @see Face
+   */
+  void
+  Add(const shared_ptr<Face>& face);
+
+  /**
+   * Get a smart pointer to Face-derived object stored in the container
+   *
+   * \param i the iterator corresponding to the requested object
+   *
+   * This method is redundant and simple dereferencing of the iterator should be used instead
+   *
+   * @see Face
+   */
+  shared_ptr<Face>
+  Get(Iterator i) const;
+
+private:
+  Container m_faces;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif /* NDN_FACE_CONTAINER_H */
diff --git a/helper/ndn-global-routing-helper.cpp b/helper/ndn-global-routing-helper.cpp
new file mode 100644
index 0000000..54b032b
--- /dev/null
+++ b/helper/ndn-global-routing-helper.cpp
@@ -0,0 +1,416 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#if __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-variable"
+#pragma clang diagnostic ignored "-Wunneeded-internal-declaration"
+#endif
+
+#include "ndn-global-routing-helper.hpp"
+
+#include "ns3/ndn-l3-protocol.hpp"
+#include "../model/ndn-net-device-face.hpp"
+#include "../model/ndn-global-router.hpp"
+
+#include "ns3/node.h"
+#include "ns3/node-container.h"
+#include "ns3/net-device.h"
+#include "ns3/channel.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/names.h"
+#include "ns3/node-list.h"
+#include "ns3/channel-list.h"
+#include "ns3/object-factory.h"
+
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+#include <boost/concept/assert.hpp>
+// #include <boost/graph/graph_concepts.hpp>
+// #include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+
+#include "boost-graph-ndn-global-routing-helper.hpp"
+
+#include <math.h>
+
+NS_LOG_COMPONENT_DEFINE("ndn.GlobalRoutingHelper");
+
+using namespace std;
+using namespace boost;
+
+namespace ns3 {
+namespace ndn {
+
+void
+GlobalRoutingHelper::Install(Ptr<Node> node)
+{
+  NS_LOG_LOGIC("Node: " << node->GetId());
+
+  Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
+  NS_ASSERT_MSG(ndn != 0, "Cannot install GlobalRoutingHelper before Ndn is installed on a node");
+
+  Ptr<GlobalRouter> gr = node->GetObject<GlobalRouter>();
+  if (gr != 0) {
+    NS_LOG_DEBUG("GlobalRouter is already installed: " << gr);
+    return; // already installed
+  }
+
+  gr = CreateObject<GlobalRouter>();
+  node->AggregateObject(gr);
+
+  for (uint32_t faceId = 0; faceId < ndn->GetNFaces(); faceId++) {
+    shared_ptr<NetDeviceFace> face = DynamicCast<NetDeviceFace>(ndn->GetFace(faceId));
+    if (face == 0) {
+      NS_LOG_DEBUG("Skipping non-netdevice face");
+      continue;
+    }
+
+    Ptr<NetDevice> nd = face->GetNetDevice();
+    if (nd == 0) {
+      NS_LOG_DEBUG("Not a NetDevice associated with NetDeviceFace");
+      continue;
+    }
+
+    Ptr<Channel> ch = nd->GetChannel();
+
+    if (ch == 0) {
+      NS_LOG_DEBUG("Channel is not associated with NetDevice");
+      continue;
+    }
+
+    if (ch->GetNDevices() == 2) // e.g., point-to-point channel
+    {
+      for (uint32_t deviceId = 0; deviceId < ch->GetNDevices(); deviceId++) {
+        Ptr<NetDevice> otherSide = ch->GetDevice(deviceId);
+        if (nd == otherSide)
+          continue;
+
+        Ptr<Node> otherNode = otherSide->GetNode();
+        NS_ASSERT(otherNode != 0);
+
+        Ptr<GlobalRouter> otherGr = otherNode->GetObject<GlobalRouter>();
+        if (otherGr == 0) {
+          Install(otherNode);
+        }
+        otherGr = otherNode->GetObject<GlobalRouter>();
+        NS_ASSERT(otherGr != 0);
+        gr->AddIncidency(face, otherGr);
+      }
+    }
+    else {
+      Ptr<GlobalRouter> grChannel = ch->GetObject<GlobalRouter>();
+      if (grChannel == 0) {
+        Install(ch);
+      }
+      grChannel = ch->GetObject<GlobalRouter>();
+
+      gr->AddIncidency(face, grChannel);
+    }
+  }
+}
+
+void
+GlobalRoutingHelper::Install(Ptr<Channel> channel)
+{
+  NS_LOG_LOGIC("Channel: " << channel->GetId());
+
+  Ptr<GlobalRouter> gr = channel->GetObject<GlobalRouter>();
+  if (gr != 0)
+    return;
+
+  gr = CreateObject<GlobalRouter>();
+  channel->AggregateObject(gr);
+
+  for (uint32_t deviceId = 0; deviceId < channel->GetNDevices(); deviceId++) {
+    Ptr<NetDevice> dev = channel->GetDevice(deviceId);
+
+    Ptr<Node> node = dev->GetNode();
+    NS_ASSERT(node != 0);
+
+    Ptr<GlobalRouter> grOther = node->GetObject<GlobalRouter>();
+    if (grOther == 0) {
+      Install(node);
+    }
+    grOther = node->GetObject<GlobalRouter>();
+    NS_ASSERT(grOther != 0);
+
+    gr->AddIncidency(0, grOther);
+  }
+}
+
+void
+GlobalRoutingHelper::Install(const NodeContainer& nodes)
+{
+  for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
+    Install(*node);
+  }
+}
+
+void
+GlobalRoutingHelper::InstallAll()
+{
+  Install(NodeContainer::GetGlobal());
+}
+
+void
+GlobalRoutingHelper::AddOrigin(const std::string& prefix, Ptr<Node> node)
+{
+  Ptr<GlobalRouter> gr = node->GetObject<GlobalRouter>();
+  NS_ASSERT_MSG(gr != 0, "GlobalRouter is not installed on the node");
+
+  auto name = make_shared<Name>(prefix);
+  gr->AddLocalPrefix(name);
+}
+
+void
+GlobalRoutingHelper::AddOrigins(const std::string& prefix, const NodeContainer& nodes)
+{
+  for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
+    AddOrigin(prefix, *node);
+  }
+}
+
+void
+GlobalRoutingHelper::AddOrigin(const std::string& prefix, const std::string& nodeName)
+{
+  Ptr<Node> node = Names::Find<Node>(nodeName);
+  NS_ASSERT_MSG(node != 0, nodeName << "is not a Node");
+
+  AddOrigin(prefix, node);
+}
+
+void
+GlobalRoutingHelper::AddOriginsForAll()
+{
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<GlobalRouter> gr = (*node)->GetObject<GlobalRouter>();
+    string name = Names::FindName(*node);
+
+    if (gr != 0 && !name.empty()) {
+      AddOrigin("/" + name, *node);
+    }
+  }
+}
+
+void
+GlobalRoutingHelper::CalculateRoutes(bool invalidatedRoutes /* = true*/)
+{
+  /**
+   * Implementation of route calculation is heavily based on Boost Graph Library
+   * See http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/table_of_contents.html for more details
+   */
+
+  BOOST_CONCEPT_ASSERT((VertexListGraphConcept<NdnGlobalRouterGraph>));
+  BOOST_CONCEPT_ASSERT((IncidenceGraphConcept<NdnGlobalRouterGraph>));
+
+  NdnGlobalRouterGraph graph;
+  // typedef graph_traits < NdnGlobalRouterGraph >::vertex_descriptor vertex_descriptor;
+
+  // For now we doing Dijkstra for every node.  Can be replaced with Bellman-Ford or Floyd-Warshall.
+  // Other algorithms should be faster, but they need additional EdgeListGraph concept provided by
+  // the graph, which
+  // is not obviously how implement in an efficient manner
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<GlobalRouter> source = (*node)->GetObject<GlobalRouter>();
+    if (source == 0) {
+      NS_LOG_DEBUG("Node " << (*node)->GetId() << " does not export GlobalRouter interface");
+      continue;
+    }
+
+    DistancesMap distances;
+
+    dijkstra_shortest_paths(graph, source,
+                            // predecessor_map (boost::ref(predecessors))
+                            // .
+                            distance_map(boost::ref(distances))
+                              .distance_inf(WeightInf)
+                              .distance_zero(WeightZero)
+                              .distance_compare(boost::WeightCompare())
+                              .distance_combine(boost::WeightCombine()));
+
+    // NS_LOG_DEBUG (predecessors.size () << ", " << distances.size ());
+    /*
+    Ptr<Fib>  fib  = source->GetObject<Fib> ();
+    if (invalidatedRoutes)
+      {
+        fib->InvalidateAll ();
+      }
+    NS_ASSERT (fib != 0);
+*/
+    NS_LOG_DEBUG("Reachability from Node: " << source->GetObject<Node>()->GetId());
+    for (DistancesMap::iterator i = distances.begin(); i != distances.end(); i++) {
+      if (i->first == source)
+        continue;
+      else {
+        // cout << "  Node " << i->first->GetObject<Node> ()->GetId ();
+        if (i->second.get<0>() == 0) {
+          // cout << " is unreachable" << endl;
+        }
+        else {
+          BOOST_FOREACH (const std::shared_ptr<const Name>& prefix, i->first->GetLocalPrefixes()) {
+            NS_LOG_DEBUG(" prefix " << prefix << " reachable via face " << *i->second.get<0>()
+                                    << " with distance " << i->second.get<1>() << " with delay "
+                                    << i->second.get<2>());
+
+            // Ptr<fib::Entry> entry = fib->Add (prefix, i->second.get<0> (), i->second.get<1> ());
+            // entry->SetRealDelayToProducer (i->second.get<0> (), Seconds (i->second.get<2> ()));
+
+            // Ptr<Limits> faceLimits = i->second.get<0> ()->GetObject<Limits> ();
+
+            // Ptr<Limits> fibLimits = entry->GetObject<Limits> ();
+            // if (fibLimits != 0)
+            //{
+            // if it was created by the forwarding strategy via DidAddFibEntry event
+            // fibLimits->SetLimits (faceLimits->GetMaxRate (), 2 * i->second.get<2> () /*exact
+            // RTT*/);
+            // NS_LOG_DEBUG ("Set limit for prefix " << *prefix << " " << faceLimits->GetMaxRate ()
+            // << " / " << 2*i->second.get<2> () << "s (" << faceLimits->GetMaxRate () * 2 *
+            // i->second.get<2> () << ")");
+            //}
+          }
+        }
+      }
+    }
+  }
+}
+
+void
+GlobalRoutingHelper::CalculateAllPossibleRoutes(bool invalidatedRoutes /* = true*/)
+{
+  /**
+   * Implementation of route calculation is heavily based on Boost Graph Library
+   * See http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/table_of_contents.html for more details
+   */
+
+  BOOST_CONCEPT_ASSERT((VertexListGraphConcept<NdnGlobalRouterGraph>));
+  BOOST_CONCEPT_ASSERT((IncidenceGraphConcept<NdnGlobalRouterGraph>));
+
+  NdnGlobalRouterGraph graph;
+  // typedef graph_traits < NdnGlobalRouterGraph >::vertex_descriptor vertex_descriptor;
+
+  // For now we doing Dijkstra for every node.  Can be replaced with Bellman-Ford or Floyd-Warshall.
+  // Other algorithms should be faster, but they need additional EdgeListGraph concept provided by
+  // the graph, which
+  // is not obviously how implement in an efficient manner
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<GlobalRouter> source = (*node)->GetObject<GlobalRouter>();
+    if (source == 0) {
+      NS_LOG_DEBUG("Node " << (*node)->GetId() << " does not export GlobalRouter interface");
+      continue;
+    }
+
+    // Ptr<Fib>  fib  = source->GetObject<Fib> ();
+    if (invalidatedRoutes) {
+      // fib->InvalidateAll ();
+    }
+    // NS_ASSERT (fib != 0);
+
+    NS_LOG_DEBUG("===========");
+    NS_LOG_DEBUG("Reachability from Node: " << source->GetObject<Node>()->GetId() << " ("
+                                            << Names::FindName(source->GetObject<Node>()) << ")");
+
+    Ptr<L3Protocol> l3 = source->GetObject<L3Protocol>();
+    NS_ASSERT(l3 != 0);
+
+    // remember interface statuses
+    std::vector<uint16_t> originalMetric(l3->GetNFaces());
+    for (uint32_t faceId = 0; faceId < l3->GetNFaces(); faceId++) {
+      originalMetric[faceId] = l3->GetFace(faceId)->GetMetric();
+      l3->GetFace(faceId)
+        ->SetMetric(std::numeric_limits<uint16_t>::max()
+                    - 1); // value std::numeric_limits<uint16_t>::max () MUST NOT be used (reserved)
+    }
+
+    for (uint32_t enabledFaceId = 0; enabledFaceId < l3->GetNFaces(); enabledFaceId++) {
+      if (DynamicCast<ndn::NetDeviceFace>(l3->GetFace(enabledFaceId)) == 0)
+        continue;
+
+      // enabling only faceId
+      l3->GetFace(enabledFaceId)->SetMetric(originalMetric[enabledFaceId]);
+
+      DistancesMap distances;
+
+      NS_LOG_DEBUG("-----------");
+
+      dijkstra_shortest_paths(graph, source,
+                              // predecessor_map (boost::ref(predecessors))
+                              // .
+                              distance_map(boost::ref(distances))
+                                .distance_inf(WeightInf)
+                                .distance_zero(WeightZero)
+                                .distance_compare(boost::WeightCompare())
+                                .distance_combine(boost::WeightCombine()));
+
+      // NS_LOG_DEBUG (predecessors.size () << ", " << distances.size ());
+
+      for (DistancesMap::iterator i = distances.begin(); i != distances.end(); i++) {
+        if (i->first == source)
+          continue;
+        else {
+          // cout << "  Node " << i->first->GetObject<Node> ()->GetId ();
+          if (i->second.get<0>() == 0) {
+            // cout << " is unreachable" << endl;
+          }
+          else {
+            BOOST_FOREACH (const std::shared_ptr<const Name>& prefix,
+                           i->first->GetLocalPrefixes()) {
+              NS_LOG_DEBUG(" prefix " << *prefix << " reachable via face " << *i->second.get<0>()
+                                      << " with distance " << i->second.get<1>() << " with delay "
+                                      << i->second.get<2>());
+
+              if (i->second.get<0>()->GetMetric() == std::numeric_limits<uint16_t>::max() - 1)
+                continue;
+
+              // Ptr<fib::Entry> entry = fib->Add (prefix, i->second.get<0> (), i->second.get<1>
+              // ());
+              // entry->SetRealDelayToProducer (i->second.get<0> (), Seconds (i->second.get<2> ()));
+
+              // Ptr<Limits> faceLimits = i->second.get<0> ()->GetObject<Limits> ();
+
+              // Ptr<Limits> fibLimits = entry->GetObject<Limits> ();
+              // if (fibLimits != 0)
+              //{
+              // if it was created by the forwarding strategy via DidAddFibEntry event
+              // fibLimits->SetLimits (faceLimits->GetMaxRate (), 2 * i->second.get<2> () /*exact
+              // RTT*/);
+              // NS_LOG_DEBUG ("Set limit for prefix " << *prefix << " " << faceLimits->GetMaxRate
+              // () << " / " << 2*i->second.get<2> () << "s (" << faceLimits->GetMaxRate () * 2 *
+              // i->second.get<2> () << ")");
+              //}
+            }
+          }
+        }
+      }
+
+      // disabling the face again
+      l3->GetFace(enabledFaceId)->SetMetric(std::numeric_limits<uint16_t>::max() - 1);
+    }
+
+    // recover original interface statuses
+    for (uint32_t faceId = 0; faceId < l3->GetNFaces(); faceId++) {
+      l3->GetFace(faceId)->SetMetric(originalMetric[faceId]);
+    }
+  }
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/helper/ndn-global-routing-helper.hpp b/helper/ndn-global-routing-helper.hpp
new file mode 100644
index 0000000..b3dffa4
--- /dev/null
+++ b/helper/ndn-global-routing-helper.hpp
@@ -0,0 +1,129 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_GLOBAL_ROUTING_HELPER_H
+#define NDN_GLOBAL_ROUTING_HELPER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+
+namespace ns3 {
+
+class Node;
+class NodeContainer;
+class Channel;
+
+namespace ndn {
+
+/**
+ * @ingroup ndn-helpers
+ * @brief Helper for GlobalRouter interface
+ */
+class GlobalRoutingHelper {
+public:
+  /**
+   * @brief Install GlobalRouter interface on a node
+   *
+   * Note that GlobalRouter will also be installed on all connected nodes and channels
+   *
+   * @param node Node to install GlobalRouter interface
+   */
+  void
+  Install(Ptr<Node> node);
+
+  /**
+   * @brief Install GlobalRouter interface on nodes
+   *
+   * Note that GlobalRouter will also be installed on all connected nodes and channels
+   *
+   * @param nodes NodeContainer to install GlobalRouter interface
+   */
+  void
+  Install(const NodeContainer& nodes);
+
+  /**
+   * @brief Install GlobalRouter interface on all nodes
+   */
+  void
+  InstallAll();
+
+  /**
+   * @brief Add `prefix' as origin on `node'
+   * @param prefix Prefix that is originated by node, e.g., node is a producer for this prefix
+   * @param node   Pointer to a node
+   */
+  void
+  AddOrigin(const std::string& prefix, Ptr<Node> node);
+
+  /**
+   * @brief Add `prefix' as origin on all `nodes'
+   * @param prefix Prefix that is originated by nodes
+   * @param nodes NodeContainer
+   */
+  void
+  AddOrigins(const std::string& prefix, const NodeContainer& nodes);
+
+  /**
+   * @brief Add `prefix' as origin on node `nodeName'
+   * @param prefix     Prefix that is originated by node, e.g., node is a producer for this prefix
+   * @param nodeName   Name of the node that is associated with Ptr<Node> using ns3::Names
+   */
+  void
+  AddOrigin(const std::string& prefix, const std::string& nodeName);
+
+  /**
+   * @brief Add origin to each node based on the node's name (using Names class)
+   */
+  void
+  AddOriginsForAll();
+
+  /**
+   * @brief Calculate for every node shortest path trees and install routes to all prefix origins
+   *
+   * @param invalidatedRoutes flag indicating whether existing routes should be invalidated or keps
+   *as is
+   */
+  static void
+  CalculateRoutes(bool invalidatedRoutes = true);
+
+  /**
+   * @brief Calculate all possible next-hop independent alternative routes
+   *
+   * @param invalidatedRoutes flag indicating whether existing routes should be invalidated or keps
+   *as is
+   *
+   * Refer to the implementation for more details.
+   *
+   * Note that this method is highly experimental and should be used with caution (very time
+   *consuming).
+   */
+  static void
+  CalculateAllPossibleRoutes(bool invalidatedRoutes = true);
+
+private:
+  void
+  Install(Ptr<Channel> channel);
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_GLOBAL_ROUTING_HELPER_H
diff --git a/helper/ndn-link-control-helper.cpp b/helper/ndn-link-control-helper.cpp
new file mode 100644
index 0000000..524ba46
--- /dev/null
+++ b/helper/ndn-link-control-helper.cpp
@@ -0,0 +1,140 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *       : Saran Tarnoi <saran.tarnoi@gmail.com>
+ */
+
+#include "ndn-link-control-helper.hpp"
+
+#include "ns3/assert.h"
+#include "ns3/names.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/point-to-point-channel.h"
+#include "ns3/channel.h"
+#include "ns3/log.h"
+
+#include "ns3/ndn-l3-protocol.hpp"
+#include "ns3/ndn-net-device-face.hpp"
+
+NS_LOG_COMPONENT_DEFINE("ndn.LinkControlHelper");
+
+namespace ns3 {
+namespace ndn {
+
+void
+LinkControlHelper::FailLink(Ptr<Node> node1, Ptr<Node> node2)
+{
+  NS_LOG_FUNCTION(node1 << node2);
+
+  NS_ASSERT(node1 != 0);
+  NS_ASSERT(node2 != 0);
+
+  Ptr<ndn::L3Protocol> ndn1 = node1->GetObject<ndn::L3Protocol>();
+  Ptr<ndn::L3Protocol> ndn2 = node2->GetObject<ndn::L3Protocol>();
+
+  NS_ASSERT(ndn1 != 0);
+  NS_ASSERT(ndn2 != 0);
+
+  // iterate over all faces to find the right one
+  for (uint32_t faceId = 0; faceId < ndn1->GetNFaces(); faceId++) {
+    Ptr<ndn::NetDeviceFace> ndFace = ndn1->GetFace(faceId)->GetObject<ndn::NetDeviceFace>();
+    if (ndFace == 0)
+      continue;
+
+    Ptr<PointToPointNetDevice> nd1 = ndFace->GetNetDevice()->GetObject<PointToPointNetDevice>();
+    if (nd1 == 0)
+      continue;
+
+    Ptr<Channel> channel = nd1->GetChannel();
+    if (channel == 0)
+      continue;
+
+    Ptr<PointToPointChannel> ppChannel = DynamicCast<PointToPointChannel>(channel);
+
+    Ptr<NetDevice> nd2 = ppChannel->GetDevice(0);
+    if (nd2->GetNode() == node1)
+      nd2 = ppChannel->GetDevice(1);
+
+    if (nd2->GetNode() == node2) {
+      Ptr<ndn::Face> face1 = ndn1->GetFaceByNetDevice(nd1);
+      Ptr<ndn::Face> face2 = ndn2->GetFaceByNetDevice(nd2);
+
+      face1->SetUp(false);
+      face2->SetUp(false);
+      break;
+    }
+  }
+}
+void
+LinkControlHelper::FailLinkByName(const std::string& node1, const std::string& node2)
+{
+  FailLink(Names::Find<Node>(node1), Names::Find<Node>(node2));
+}
+
+void
+LinkControlHelper::UpLink(Ptr<Node> node1, Ptr<Node> node2)
+{
+  NS_LOG_FUNCTION(node1 << node2);
+
+  NS_ASSERT(node1 != 0);
+  NS_ASSERT(node2 != 0);
+
+  Ptr<ndn::L3Protocol> ndn1 = node1->GetObject<ndn::L3Protocol>();
+  Ptr<ndn::L3Protocol> ndn2 = node2->GetObject<ndn::L3Protocol>();
+
+  NS_ASSERT(ndn1 != 0);
+  NS_ASSERT(ndn2 != 0);
+
+  // iterate over all faces to find the right one
+  for (uint32_t faceId = 0; faceId < ndn1->GetNFaces(); faceId++) {
+    Ptr<ndn::NetDeviceFace> ndFace = ndn1->GetFace(faceId)->GetObject<ndn::NetDeviceFace>();
+    if (ndFace == 0)
+      continue;
+
+    Ptr<PointToPointNetDevice> nd1 = ndFace->GetNetDevice()->GetObject<PointToPointNetDevice>();
+    if (nd1 == 0)
+      continue;
+
+    Ptr<Channel> channel = nd1->GetChannel();
+    if (channel == 0)
+      continue;
+
+    Ptr<PointToPointChannel> ppChannel = DynamicCast<PointToPointChannel>(channel);
+
+    Ptr<NetDevice> nd2 = ppChannel->GetDevice(0);
+    if (nd2->GetNode() == node1)
+      nd2 = ppChannel->GetDevice(1);
+
+    if (nd2->GetNode() == node2) {
+      Ptr<ndn::Face> face1 = ndn1->GetFaceByNetDevice(nd1);
+      Ptr<ndn::Face> face2 = ndn2->GetFaceByNetDevice(nd2);
+
+      face1->SetUp(true);
+      face2->SetUp(true);
+      break;
+    }
+  }
+}
+
+void
+LinkControlHelper::UpLinkByName(const std::string& node1, const std::string& node2)
+{
+  UpLink(Names::Find<Node>(node1), Names::Find<Node>(node2));
+}
+}
+}
diff --git a/helper/ndn-link-control-helper.hpp b/helper/ndn-link-control-helper.hpp
new file mode 100644
index 0000000..c210834
--- /dev/null
+++ b/helper/ndn-link-control-helper.hpp
@@ -0,0 +1,104 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *       : Saran Tarnoi <saran.tarnoi@gmail.com>
+ */
+
+#ifndef NDN_LINK_CONTROL_HELPER_H
+#define NDN_LINK_CONTROL_HELPER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+#include "ns3/node.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-helpers
+ * @brief Helper class to control the up or down statuss of an NDN link connecting two specific
+ * nodes
+ */
+class LinkControlHelper {
+public:
+  /**
+   * @brief Fail NDN link between two nodes
+   *
+   * The helper will attempt to find NDN link between node1 and
+   * node2 and set NDN face to DOWN state
+   *
+   * Note that only PointToPointChannels are supported by this helper method
+   *
+   * @param node1 one node
+   * @param node2 another node
+   */
+  static void
+  FailLink(Ptr<Node> node1, Ptr<Node> node2);
+
+  /**
+   * @brief Fail NDN link between two nodes
+   *
+   * The helper will attempt to find NDN link between node1 and
+   * node2 and set NDN face to DOWN state
+   *
+   * Note that only PointToPointChannels are supported by this helper method
+   *
+   * This variant uses node names registered by Names class
+   *
+   * @param node1 one node's name
+   * @param node2 another node's name
+   */
+  static void
+  FailLinkByName(const std::string& node1, const std::string& node2);
+
+  /**
+   * @brief Re-enable NDN link between two nodes
+   *
+   * The helper will attempt to find NDN link between node1 and
+   * node2 and set NDN face to UP state
+   *
+   * Note that only PointToPointChannels are supported by this helper method
+   *
+   * @param node1 one node
+   * @param node2 another node
+   */
+  static void
+  UpLink(Ptr<Node> node1, Ptr<Node> node2);
+
+  /**
+   * @brief Re-enable NDN link between two nodes
+   *
+   * The helper will attempt to find NDN link between node1 and
+   * node2 and set NDN face to UP state
+   *
+   * Note that only PointToPointChannels are supported by this helper method
+   *
+   * This variant uses node names registered by Names class
+   *
+   * @param node1 one node's name
+   * @param node2 another node's name
+   */
+  static void
+  UpLinkByName(const std::string& node1, const std::string& node2);
+}; // end: LinkControlHelper
+
+} // ndn
+} // ns3
+
+#endif // NDN_LINK_CONTROL_HELPER_H
diff --git a/helper/ndn-stack-helper.cpp b/helper/ndn-stack-helper.cpp
new file mode 100644
index 0000000..b548844
--- /dev/null
+++ b/helper/ndn-stack-helper.cpp
@@ -0,0 +1,460 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *          Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/object.h"
+#include "ns3/names.h"
+#include "ns3/packet-socket-factory.h"
+#include "ns3/config.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
+#include "ns3/net-device.h"
+#include "ns3/channel.h"
+#include "ns3/callback.h"
+#include "ns3/node.h"
+#include "ns3/core-config.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/callback.h"
+
+#include "../model/ndn-net-device-face.hpp"
+#include "../model/ndn-l3-protocol.hpp"
+
+#include "ns3/node-list.h"
+
+#include "ns3/data-rate.h"
+
+#include "ndn-face-container.hpp"
+#include "ndn-stack-helper.hpp"
+
+#include <limits>
+#include <map>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+NS_LOG_COMPONENT_DEFINE("ndn.StackHelper");
+
+namespace ns3 {
+namespace ndn {
+
+StackHelper::StackHelper()
+  : m_limitsEnabled(false)
+  , m_needSetDefaultRoutes(false)
+{
+  m_ndnFactory.SetTypeId("ns3::ndn::L3Protocol");
+  m_strategyFactory.SetTypeId("ns3::ndn::fw::Flooding");
+  m_contentStoreFactory.SetTypeId("ns3::ndn::cs::Lru");
+  m_fibFactory.SetTypeId("ns3::ndn::fib::Default");
+  m_pitFactory.SetTypeId("ns3::ndn::pit::Persistent");
+
+  m_netDeviceCallbacks.push_back(
+    std::make_pair(PointToPointNetDevice::GetTypeId(),
+                   MakeCallback(&StackHelper::PointToPointNetDeviceCallback, this)));
+  // default callback will be fired if non of others callbacks fit or did the job
+}
+
+StackHelper::~StackHelper()
+{
+}
+
+void
+StackHelper::SetStackAttributes(const std::string& attr1, const std::string& value1,
+                                const std::string& attr2, const std::string& value2,
+                                const std::string& attr3, const std::string& value3,
+                                const std::string& attr4, const std::string& value4)
+{
+  if (attr1 != "")
+    m_ndnFactory.Set(attr1, StringValue(value1));
+  if (attr2 != "")
+    m_ndnFactory.Set(attr2, StringValue(value2));
+  if (attr3 != "")
+    m_ndnFactory.Set(attr3, StringValue(value3));
+  if (attr4 != "")
+    m_ndnFactory.Set(attr4, StringValue(value4));
+}
+
+void
+StackHelper::SetForwardingStrategy(const std::string& strategy, const std::string& attr1,
+                                   const std::string& value1, const std::string& attr2,
+                                   const std::string& value2, const std::string& attr3,
+                                   const std::string& value3, const std::string& attr4,
+                                   const std::string& value4)
+{
+  m_strategyFactory.SetTypeId(strategy);
+  if (attr1 != "")
+    m_strategyFactory.Set(attr1, StringValue(value1));
+  if (attr2 != "")
+    m_strategyFactory.Set(attr2, StringValue(value2));
+  if (attr3 != "")
+    m_strategyFactory.Set(attr3, StringValue(value3));
+  if (attr4 != "")
+    m_strategyFactory.Set(attr4, StringValue(value4));
+}
+
+void
+StackHelper::SetContentStore(const std::string& contentStore, const std::string& attr1,
+                             const std::string& value1, const std::string& attr2,
+                             const std::string& value2, const std::string& attr3,
+                             const std::string& value3, const std::string& attr4,
+                             const std::string& value4)
+{
+  m_contentStoreFactory.SetTypeId(contentStore);
+  if (attr1 != "")
+    m_contentStoreFactory.Set(attr1, StringValue(value1));
+  if (attr2 != "")
+    m_contentStoreFactory.Set(attr2, StringValue(value2));
+  if (attr3 != "")
+    m_contentStoreFactory.Set(attr3, StringValue(value3));
+  if (attr4 != "")
+    m_contentStoreFactory.Set(attr4, StringValue(value4));
+}
+
+void
+StackHelper::SetPit(const std::string& pitClass, const std::string& attr1,
+                    const std::string& value1, const std::string& attr2, const std::string& value2,
+                    const std::string& attr3, const std::string& value3, const std::string& attr4,
+                    const std::string& value4)
+{
+  m_pitFactory.SetTypeId(pitClass);
+  if (attr1 != "")
+    m_pitFactory.Set(attr1, StringValue(value1));
+  if (attr2 != "")
+    m_pitFactory.Set(attr2, StringValue(value2));
+  if (attr3 != "")
+    m_pitFactory.Set(attr3, StringValue(value3));
+  if (attr4 != "")
+    m_pitFactory.Set(attr4, StringValue(value4));
+}
+
+void
+StackHelper::SetFib(const std::string& fibClass, const std::string& attr1,
+                    const std::string& value1, const std::string& attr2, const std::string& value2,
+                    const std::string& attr3, const std::string& value3, const std::string& attr4,
+                    const std::string& value4)
+{
+  m_fibFactory.SetTypeId(fibClass);
+  if (attr1 != "")
+    m_fibFactory.Set(attr1, StringValue(value1));
+  if (attr2 != "")
+    m_fibFactory.Set(attr2, StringValue(value2));
+  if (attr3 != "")
+    m_fibFactory.Set(attr3, StringValue(value3));
+  if (attr4 != "")
+    m_fibFactory.Set(attr4, StringValue(value4));
+}
+
+void
+StackHelper::SetDefaultRoutes(bool needSet)
+{
+  NS_LOG_FUNCTION(this << needSet);
+  m_needSetDefaultRoutes = needSet;
+}
+
+void
+StackHelper::EnableLimits(bool enable /* = true*/, Time avgRtt /*=Seconds(0.1)*/,
+                          uint32_t avgData /*=1100*/, uint32_t avgInterest /*=40*/)
+{
+  NS_LOG_INFO("EnableLimits: " << enable);
+  m_limitsEnabled = enable;
+  m_avgRtt = avgRtt;
+  m_avgDataSize = avgData;
+  m_avgInterestSize = avgInterest;
+}
+
+Ptr<FaceContainer>
+StackHelper::Install(const NodeContainer& c) const
+{
+  Ptr<FaceContainer> faces = Create<FaceContainer>();
+  for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
+    faces->AddAll(Install(*i));
+  }
+  return faces;
+}
+
+Ptr<FaceContainer>
+StackHelper::InstallAll() const
+{
+  return Install(NodeContainer::GetGlobal());
+}
+
+Ptr<FaceContainer>
+StackHelper::Install(Ptr<Node> node) const
+{
+  // NS_ASSERT_MSG (m_forwarding, "SetForwardingHelper() should be set prior calling Install()
+  // method");
+  Ptr<FaceContainer> faces = Create<FaceContainer>();
+
+  if (node->GetObject<L3Protocol>() != 0) {
+    NS_FATAL_ERROR("StackHelper::Install (): Installing "
+                   "a NdnStack to a node with an existing Ndn object");
+    return 0;
+  }
+
+  // Create L3Protocol
+  Ptr<L3Protocol> ndn = m_ndnFactory.Create<L3Protocol>();
+
+  // Create and aggregate FIB
+  // Ptr<Fib> fib = m_fibFactory.Create<Fib> ();
+  // ndn->AggregateObject (fib);
+
+  // Create and aggregate PIT
+  // ndn->AggregateObject (m_pitFactory.Create<Pit> ());
+
+  // Create and aggregate forwarding strategy
+  // ndn->AggregateObject (m_strategyFactory.Create<ForwardingStrategy> ());
+
+  // Create and aggregate content store
+  // ndn->AggregateObject (m_contentStoreFactory.Create<ContentStore> ());
+
+  // Aggregate L3Protocol on node
+  node->AggregateObject(ndn);
+
+  for (uint32_t index = 0; index < node->GetNDevices(); index++) {
+    Ptr<NetDevice> device = node->GetDevice(index);
+    // This check does not make sense: LoopbackNetDevice is installed only if IP stack is installed,
+    // Normally, ndnSIM works without IP stack, so no reason to check
+    // if (DynamicCast<LoopbackNetDevice> (device) != 0)
+    //   continue; // don't create face for a LoopbackNetDevice
+
+    shared_ptr<NetDeviceFace> face;
+
+    for (std::list<std::pair<TypeId, NetDeviceFaceCreateCallback>>::const_iterator item =
+           m_netDeviceCallbacks.begin();
+         item != m_netDeviceCallbacks.end(); item++) {
+      if (device->GetInstanceTypeId() == item->first
+          || device->GetInstanceTypeId().IsChildOf(item->first)) {
+        face = item->second(node, ndn, device);
+        if (face != 0)
+          break;
+      }
+    }
+    if (face == 0) {
+      face = DefaultNetDeviceCallback(node, ndn, device);
+    }
+
+    if (m_needSetDefaultRoutes) {
+      // default route with lowest priority possible
+      AddRoute(node, "/", StaticCast<Face>(face), std::numeric_limits<int32_t>::max());
+    }
+
+    face->SetUp();
+    faces->Add(face);
+  }
+
+  return faces;
+}
+
+void
+StackHelper::AddNetDeviceFaceCreateCallback(TypeId netDeviceType,
+                                            StackHelper::NetDeviceFaceCreateCallback callback)
+{
+  m_netDeviceCallbacks.push_back(std::make_pair(netDeviceType, callback));
+}
+
+void
+StackHelper::UpdateNetDeviceFaceCreateCallback(TypeId netDeviceType,
+                                               NetDeviceFaceCreateCallback callback)
+{
+  for (NetDeviceCallbackList::iterator i = m_netDeviceCallbacks.begin();
+       i != m_netDeviceCallbacks.end(); i++) {
+    if (i->first == netDeviceType) {
+      i->second = callback;
+      return;
+    }
+  }
+}
+
+void
+StackHelper::RemoveNetDeviceFaceCreateCallback(TypeId netDeviceType,
+                                               NetDeviceFaceCreateCallback callback)
+{
+  for (NetDeviceCallbackList::iterator i = m_netDeviceCallbacks.begin();
+       i != m_netDeviceCallbacks.end(); i++) {
+    if (i->first == netDeviceType) {
+      m_netDeviceCallbacks.erase(i);
+      return;
+    }
+  }
+}
+
+shared_ptr<NetDeviceFace>
+StackHelper::DefaultNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
+                                      Ptr<NetDevice> netDevice) const
+{
+  NS_LOG_DEBUG("Creating default NetDeviceFace on node " << node->GetId());
+
+  shared_ptr<NetDeviceFace> face = CreateObject<NetDeviceFace>(node, netDevice);
+
+  ndn->AddFace(face);
+  NS_LOG_LOGIC("Node " << node->GetId() << ": added NetDeviceFace as face #" << *face);
+
+  return face;
+}
+
+shared_ptr<NetDeviceFace>
+StackHelper::PointToPointNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
+                                           Ptr<NetDevice> device) const
+{
+  NS_LOG_DEBUG("Creating point-to-point NetDeviceFace on node " << node->GetId());
+
+  shared_ptr<NetDeviceFace> face = CreateObject<NetDeviceFace>(node, device);
+
+  ndn->AddFace(face);
+  NS_LOG_LOGIC("Node " << node->GetId() << ": added NetDeviceFace as face #" << *face);
+
+  if (m_limitsEnabled) {
+    // Ptr<Limits> limits = face->GetObject<Limits> ();
+    /*if (limits == 0)
+    {
+        NS_FATAL_ERROR ("Limits are enabled, but the selected forwarding strategy does not support
+    limits. Please revise your scenario");
+        exit (1);
+    }*/
+
+    NS_LOG_INFO("Limits are enabled");
+    Ptr<PointToPointNetDevice> p2p = DynamicCast<PointToPointNetDevice>(device);
+    if (p2p != 0) {
+      // Setup bucket filtering
+      // Assume that we know average data packet size, and this size is equal default size
+      // Set maximum buckets (averaging over 1 second)
+
+      DataRateValue dataRate;
+      device->GetAttribute("DataRate", dataRate);
+      TimeValue linkDelay;
+      device->GetChannel()->GetAttribute("Delay", linkDelay);
+
+      NS_LOG_INFO("DataRate for this link is " << dataRate.Get());
+
+      double maxInterestPackets =
+        1.0 * dataRate.Get().GetBitRate() / 8.0 / (m_avgDataSize + m_avgInterestSize);
+      // NS_LOG_INFO ("Max packets per second: " << maxInterestPackets);
+      // NS_LOG_INFO ("Max burst: " << m_avgRtt.ToDouble (Time::S) * maxInterestPackets);
+      //         NS_LOG_INFO ("MaxLimit: " << (int)(m_avgRtt.ToDouble (Time::S) *
+      //         maxInterestPackets));
+      /*
+      // Set max to BDP
+      limits->SetLimits (maxInterestPackets, m_avgRtt.ToDouble (Time::S));
+      limits->SetLinkDelay (linkDelay.Get ().ToDouble (Time::S)); */
+    }
+  }
+
+  return face;
+}
+
+Ptr<FaceContainer>
+StackHelper::Install(const std::string& nodeName) const
+{
+  Ptr<Node> node = Names::Find<Node>(nodeName);
+  return Install(node);
+}
+
+void
+StackHelper::AddRoute(Ptr<Node> node, const std::string& prefix, shared_ptr<Face> face, int32_t metric)
+{
+  NS_LOG_LOGIC("[" << node->GetId() << "]$ route add " << prefix << " via " << *face << " metric "
+                   << metric);
+
+  // Ptr<Fib>  fib  = node->GetObject<Fib> ();
+
+  // NameValue prefixValue;
+  // prefixValue.DeserializeFromString (prefix, MakeNameChecker ());
+  ::ndn::Name name(prefix);
+  // fib->Add (name, face, metric);
+}
+
+void
+StackHelper::AddRoute(Ptr<Node> node, const std::string& prefix, uint32_t faceId, int32_t metric)
+{
+  Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
+  NS_ASSERT_MSG(ndn != 0, "Ndn stack should be installed on the node");
+
+  shared_ptr<Face> face = ndn->GetFace(faceId);
+  NS_ASSERT_MSG(face != 0, "Face with ID [" << faceId << "] does not exist on node ["
+                                            << node->GetId() << "]");
+
+  AddRoute(node, prefix, face, metric);
+}
+
+void
+StackHelper::AddRoute(const std::string& nodeName, const std::string& prefix, uint32_t faceId,
+                      int32_t metric)
+{
+  Ptr<Node> node = Names::Find<Node>(nodeName);
+  NS_ASSERT_MSG(node != 0, "Node [" << nodeName << "] does not exist");
+
+  Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
+  NS_ASSERT_MSG(ndn != 0, "Ndn stack should be installed on the node");
+
+  shared_ptr<Face> face = ndn->GetFace(faceId);
+  NS_ASSERT_MSG(face != 0, "Face with ID [" << faceId << "] does not exist on node [" << nodeName
+                                            << "]");
+
+  AddRoute(node, prefix, face, metric);
+}
+
+void
+StackHelper::AddRoute(Ptr<Node> node, const std::string& prefix, Ptr<Node> otherNode,
+                      int32_t metric)
+{
+  for (uint32_t deviceId = 0; deviceId < node->GetNDevices(); deviceId++) {
+    Ptr<PointToPointNetDevice> netDevice =
+      DynamicCast<PointToPointNetDevice>(node->GetDevice(deviceId));
+    if (netDevice == 0)
+      continue;
+
+    Ptr<Channel> channel = netDevice->GetChannel();
+    if (channel == 0)
+      continue;
+
+    if (channel->GetDevice(0)->GetNode() == otherNode
+        || channel->GetDevice(1)->GetNode() == otherNode) {
+      Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
+      NS_ASSERT_MSG(ndn != 0, "Ndn stack should be installed on the node");
+
+      shared_ptr<Face> face = ndn->GetFaceByNetDevice(netDevice);
+      NS_ASSERT_MSG(face != 0, "There is no face associated with the p2p link");
+
+      AddRoute(node, prefix, face, metric);
+
+      return;
+    }
+  }
+
+  NS_FATAL_ERROR("Cannot add route: Node# " << node->GetId() << " and Node# " << otherNode->GetId()
+                                            << " are not connected");
+}
+
+void
+StackHelper::AddRoute(const std::string& nodeName, const std::string& prefix,
+                      const std::string& otherNodeName, int32_t metric)
+{
+  Ptr<Node> node = Names::Find<Node>(nodeName);
+  NS_ASSERT_MSG(node != 0, "Node [" << nodeName << "] does not exist");
+
+  Ptr<Node> otherNode = Names::Find<Node>(otherNodeName);
+  NS_ASSERT_MSG(otherNode != 0, "Node [" << otherNodeName << "] does not exist");
+
+  AddRoute(node, prefix, otherNode, metric);
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/helper/ndn-stack-helper.hpp b/helper/ndn-stack-helper.hpp
new file mode 100644
index 0000000..d32769c
--- /dev/null
+++ b/helper/ndn-stack-helper.hpp
@@ -0,0 +1,328 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *          Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef NDN_STACK_HELPER_H
+#define NDN_STACK_HELPER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/object-factory.h"
+#include "ns3/nstime.h"
+
+namespace ns3 {
+
+class Node;
+
+namespace ndn {
+
+class FaceContainer;
+class Face;
+class NetDeviceFace;
+class L3Protocol;
+
+/**
+ * \ingroup ndn
+ * \defgroup ndn-helpers Helpers
+ */
+/**
+ * \ingroup ndn-helpers
+ * \brief Adding Ndn functionality to existing Nodes.
+ *
+ * This helper enables pcap and ascii tracing of events in the ndn stack
+ * associated with a node.  This is substantially similar to the tracing that
+ * happens in device helpers, but the important difference is that, well, there
+ * is no device.  This means that the creation of output file names will change,
+ * and also the user-visible methods will not reference devices and therefore
+ * the number of trace enable methods is reduced.
+ *
+ * Normally we eschew multiple inheritance, however, the classes
+ * PcapUserHelperForNdn and AsciiTraceUserHelperForNdn are treated as
+ * "mixins".  A mixin is a self-contained class that encapsulates a general
+ * attribute or a set of functionality that may be of interest to many other
+ * classes.
+ */
+class StackHelper {
+public:
+  /**
+   * \brief Create a new NdnStackHelper with a default NDN_FLOODING forwarding stategy
+   */
+  StackHelper();
+
+  /**
+   * \brief Destroy the NdnStackHelper
+   */
+  virtual ~StackHelper();
+
+  /**
+   * @brief Set parameters of NdnL3Protocol
+   */
+  void
+  SetStackAttributes(const std::string& attr1 = "", const std::string& value1 = "",
+                     const std::string& attr2 = "", const std::string& value2 = "",
+                     const std::string& attr3 = "", const std::string& value3 = "",
+                     const std::string& attr4 = "", const std::string& value4 = "");
+
+  /**
+   * @brief Set forwarding strategy class and its attributes
+   * @param forwardingStrategyClass string containing name of the forwarding strategy class
+   *
+   * Valid options are "ns3::NdnFloodingStrategy" (default) and "ns3::NdnBestRouteStrategy"
+   *
+   * Other strategies can be implemented, inheriting ns3::NdnForwardingStrategy class
+   */
+  void
+  SetForwardingStrategy(const std::string& forwardingStrategyClass, const std::string& attr1 = "",
+                        const std::string& value1 = "", const std::string& attr2 = "",
+                        const std::string& value2 = "", const std::string& attr3 = "",
+                        const std::string& value3 = "", const std::string& attr4 = "",
+                        const std::string& value4 = "");
+
+  /**
+   * @brief Set content store class and its attributes
+   * @param contentStoreClass string, representing class of the content store
+   */
+  void
+  SetContentStore(const std::string& contentStoreClass, const std::string& attr1 = "",
+                  const std::string& value1 = "", const std::string& attr2 = "",
+                  const std::string& value2 = "", const std::string& attr3 = "",
+                  const std::string& value3 = "", const std::string& attr4 = "",
+                  const std::string& value4 = "");
+
+  /**
+   * @brief Set PIT class and its attributes
+   * @param pitClass string, representing class of PIT
+   */
+  void
+  SetPit(const std::string& pitClass, const std::string& attr1 = "", const std::string& value1 = "",
+         const std::string& attr2 = "", const std::string& value2 = "",
+         const std::string& attr3 = "", const std::string& value3 = "",
+         const std::string& attr4 = "", const std::string& value4 = "");
+
+  /**
+   * @brief Set FIB class and its attributes
+   * @param pitClass string, representing class of FIB
+   */
+  void
+  SetFib(const std::string& fibClass, const std::string& attr1 = "", const std::string& value1 = "",
+         const std::string& attr2 = "", const std::string& value2 = "",
+         const std::string& attr3 = "", const std::string& value3 = "",
+         const std::string& attr4 = "", const std::string& value4 = "");
+
+  typedef Callback<shared_ptr<NetDeviceFace>, Ptr<Node>, Ptr<L3Protocol>, Ptr<NetDevice>>
+    NetDeviceFaceCreateCallback;
+
+  /**
+   * @brief Add callback to create and configure instance of the face, based on supplied Ptr<Node>
+   *and Ptr<NetDevice>
+   *
+   * It is possible to set up several callbacks for different NetDevice types.
+   *
+   * Currently, there is only one specialized callback for PointToPointNetDevice, which creates face
+   *and sets limits (if enabled)
+   * based on PointToPoint link parameters
+   *
+   * If none of the callbacks fit the TypeId of NetDevice, a default callback is used
+   *(DefaultNetDeviceCallback)
+   */
+  void
+  AddNetDeviceFaceCreateCallback(TypeId netDeviceType, NetDeviceFaceCreateCallback callback);
+
+  /**
+   * @brief Update callback to create and configure instance of the face, based on supplied
+   *Ptr<Node> and Ptr<NetDevice>
+   *
+   * It is possible to set up several callbacks for different NetDevice types.
+   *
+   * Using this method, it is possible to override Face creation for PointToPointNetDevices
+   */
+  void
+  UpdateNetDeviceFaceCreateCallback(TypeId netDeviceType, NetDeviceFaceCreateCallback callback);
+
+  /**
+   * @brief Remove callback to create and configure instance of the face, based on supplied
+   * Ptr<Node> and Ptr<NetDevice>
+   */
+  void
+  RemoveNetDeviceFaceCreateCallback(TypeId netDeviceType, NetDeviceFaceCreateCallback callback);
+
+  /**
+   * @brief Enable Interest limits (disabled by default)
+   *
+   * @param enable           Enable or disable limits
+   * @param avgRtt           Average RTT
+   * @param avgData Average size of contentObject packets (including all headers)
+   * @param avgInterest      Average size of interest packets (including all headers)
+   */
+  void
+  EnableLimits(bool enable = true, Time avgRtt = Seconds(0.1), uint32_t avgData = 1100,
+               uint32_t avgInterest = 40);
+
+  /**
+   * \brief Install Ndn stack on the node
+   *
+   * This method will assert if called on a node that already has Ndn object
+   * installed on it
+   *
+   * \param nodeName The name of the node on which to install the stack.
+   *
+   * \returns list of installed faces in the form of a smart pointer
+   * to NdnFaceContainer object
+   */
+  Ptr<FaceContainer>
+  Install(const std::string& nodeName) const;
+
+  /**
+   * \brief Install Ndn stack on the node
+   *
+   * This method will assert if called on a node that already has Ndn object
+   * installed on it
+   *
+   * \param node The node on which to install the stack.
+   *
+   * \returns list of installed faces in the form of a smart pointer
+   * to FaceContainer object
+   */
+  Ptr<FaceContainer>
+  Install(Ptr<Node> node) const;
+
+  /**
+   * \brief Install Ndn stack on each node in the input container
+   *
+   * The program will assert if this method is called on a container with a node
+   * that already has an ndn object aggregated to it.
+   *
+   * \param c NodeContainer that holds the set of nodes on which to install the
+   * new stacks.
+   *
+   * \returns list of installed faces in the form of a smart pointer
+   * to FaceContainer object
+   */
+  Ptr<FaceContainer>
+  Install(const NodeContainer& c) const;
+
+  /**
+   * \brief Install Ndn stack on all nodes in the simulation
+   *
+   * \returns list of installed faces in the form of a smart pointer
+   * to FaceContainer object
+   */
+  Ptr<FaceContainer>
+  InstallAll() const;
+
+  /**
+   * \brief Add forwarding entry to FIB
+   *
+   * \param nodeName Node name
+   * \param prefix Routing prefix
+   * \param faceId Face index
+   * \param metric Routing metric
+   */
+  static void
+  AddRoute(const std::string& nodeName, const std::string& prefix, uint32_t faceId, int32_t metric);
+
+  /**
+   * \brief Add forwarding entry to FIB
+   *
+   * \param nodeName Node
+   * \param prefix Routing prefix
+   * \param faceId Face index
+   * \param metric Routing metric
+   */
+  static void
+  AddRoute(Ptr<Node> node, const std::string& prefix, uint32_t faceId, int32_t metric);
+
+  /**
+   * \brief Add forwarding entry to FIB
+   *
+   * \param node   Node
+   * \param prefix Routing prefix
+   * \param face   Face
+   * \param metric Routing metric
+   */
+  static void
+  AddRoute(Ptr<Node> node, const std::string& prefix, shared_ptr<Face> face, int32_t metric);
+
+  /**
+   * @brief Add forwarding entry to FIB (work only with point-to-point links)
+   *
+   * \param node Node
+   * \param prefix Routing prefix
+   * \param otherNode The other node, to which interests (will be used to infer face id
+   * \param metric Routing metric
+   */
+  static void
+  AddRoute(Ptr<Node> node, const std::string& prefix, Ptr<Node> otherNode, int32_t metric);
+
+  /**
+   * @brief Add forwarding entry to FIB (work only with point-to-point links)
+   *
+   * \param nodeName Node name (refer to ns3::Names)
+   * \param prefix Routing prefix
+   * \param otherNode The other node name, to which interests (will be used to infer face id (refer
+   *to ns3::Names)
+   * \param metric Routing metric
+   */
+  static void
+  AddRoute(const std::string& nodeName, const std::string& prefix, const std::string& otherNodeName,
+           int32_t metric);
+
+  /**
+   * \brief Set flag indicating necessity to install default routes in FIB
+   */
+  void
+  SetDefaultRoutes(bool needSet);
+
+private:
+  shared_ptr<NetDeviceFace>
+  DefaultNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn, Ptr<NetDevice> netDevice) const;
+
+  shared_ptr<NetDeviceFace>
+  PointToPointNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
+                                Ptr<NetDevice> netDevice) const;
+
+private:
+  StackHelper(const StackHelper&);
+  StackHelper&
+  operator=(const StackHelper& o);
+
+private:
+  ObjectFactory m_ndnFactory;
+  ObjectFactory m_strategyFactory;
+  ObjectFactory m_contentStoreFactory;
+  ObjectFactory m_pitFactory;
+  ObjectFactory m_fibFactory;
+
+  bool m_limitsEnabled;
+  Time m_avgRtt;
+  uint32_t m_avgDataSize;
+  uint32_t m_avgInterestSize;
+  bool m_needSetDefaultRoutes;
+
+  typedef std::list<std::pair<TypeId, NetDeviceFaceCreateCallback>> NetDeviceCallbackList;
+  NetDeviceCallbackList m_netDeviceCallbacks;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif /* NDN_STACK_HELPER_H */
diff --git a/model/cs/content-store-impl.cpp b/model/cs/content-store-impl.cpp
new file mode 100644
index 0000000..b4d2eae
--- /dev/null
+++ b/model/cs/content-store-impl.cpp
@@ -0,0 +1,122 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "content-store-impl.hpp"
+
+#include "../../utils/trie/random-policy.hpp"
+#include "../../utils/trie/lru-policy.hpp"
+#include "../../utils/trie/fifo-policy.hpp"
+#include "../../utils/trie/lfu-policy.hpp"
+#include "../../utils/trie/multi-policy.hpp"
+#include "../../utils/trie/aggregate-stats-policy.hpp"
+
+#define NS_OBJECT_ENSURE_REGISTERED_TEMPL(type, templ)                                             \
+  static struct X##type##templ##RegistrationClass {                                                \
+    X##type##templ##RegistrationClass()                                                            \
+    {                                                                                              \
+      ns3::TypeId tid = type<templ>::GetTypeId();                                                  \
+      tid.GetParent();                                                                             \
+    }                                                                                              \
+  } x_##type##templ##RegistrationVariable
+
+namespace ns3 {
+namespace ndn {
+
+using namespace ndnSIM;
+
+namespace cs {
+
+// explicit instantiation and registering
+/**
+ * @brief ContentStore with LRU cache replacement policy
+ **/
+template class ContentStoreImpl<lru_policy_traits>;
+
+/**
+ * @brief ContentStore with random cache replacement policy
+ **/
+template class ContentStoreImpl<random_policy_traits>;
+
+/**
+ * @brief ContentStore with FIFO cache replacement policy
+ **/
+template class ContentStoreImpl<fifo_policy_traits>;
+
+/**
+ * @brief ContentStore with Least Frequently Used (LFU) cache replacement policy
+ **/
+template class ContentStoreImpl<lfu_policy_traits>;
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, lru_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, random_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, fifo_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, lfu_policy_traits);
+
+typedef multi_policy_traits<boost::mpl::vector2<lru_policy_traits, aggregate_stats_policy_traits>>
+  LruWithCountsTraits;
+typedef multi_policy_traits<boost::mpl::vector2<random_policy_traits,
+                                                aggregate_stats_policy_traits>>
+  RandomWithCountsTraits;
+typedef multi_policy_traits<boost::mpl::vector2<fifo_policy_traits, aggregate_stats_policy_traits>>
+  FifoWithCountsTraits;
+typedef multi_policy_traits<boost::mpl::vector2<lfu_policy_traits, aggregate_stats_policy_traits>>
+  LfuWithCountsTraits;
+
+template class ContentStoreImpl<LruWithCountsTraits>;
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, LruWithCountsTraits);
+
+template class ContentStoreImpl<RandomWithCountsTraits>;
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, RandomWithCountsTraits);
+
+template class ContentStoreImpl<FifoWithCountsTraits>;
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, FifoWithCountsTraits);
+
+template class ContentStoreImpl<LfuWithCountsTraits>;
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreImpl, LfuWithCountsTraits);
+
+#ifdef DOXYGEN
+// /**
+//  * \brief Content Store implementing LRU cache replacement policy
+//  */
+class Lru : public ContentStoreImpl<lru_policy_traits> {
+};
+
+/**
+ * \brief Content Store implementing FIFO cache replacement policy
+ */
+class Fifo : public ContentStoreImpl<fifo_policy_traits> {
+};
+
+/**
+ * \brief Content Store implementing Random cache replacement policy
+ */
+class Random : public ContentStoreImpl<random_policy_traits> {
+};
+
+/**
+ * \brief Content Store implementing Least Frequently Used cache replacement policy
+ */
+class Lfu : public ContentStoreImpl<lfu_policy_traits> {
+};
+#endif
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/content-store-impl.hpp b/model/cs/content-store-impl.hpp
new file mode 100644
index 0000000..ddcb8ed
--- /dev/null
+++ b/model/cs/content-store-impl.hpp
@@ -0,0 +1,336 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_IMPL_H_
+#define NDN_CONTENT_STORE_IMPL_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-content-store.hpp"
+
+#include "ns3/packet.h"
+#include <boost/foreach.hpp>
+
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+#include "ns3/string.h"
+
+#include "../../utils/trie/trie-with-policy.hpp"
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+/**
+ * @ingroup ndn-cs
+ * @brief Cache entry implementation with additional references to the base container
+ */
+template<class CS>
+class EntryImpl : public Entry {
+public:
+  typedef Entry base_type;
+
+public:
+  EntryImpl(Ptr<ContentStore> cs, shared_ptr<const Data> data)
+    : Entry(cs, data)
+    , item_(0)
+  {
+  }
+
+  void
+  SetTrie(typename CS::super::iterator item)
+  {
+    item_ = item;
+  }
+
+  typename CS::super::iterator
+  to_iterator()
+  {
+    return item_;
+  }
+  typename CS::super::const_iterator
+  to_iterator() const
+  {
+    return item_;
+  }
+
+private:
+  typename CS::super::iterator item_;
+};
+
+/**
+ * @ingroup ndn-cs
+ * @brief Base implementation of NDN content store
+ */
+template<class Policy>
+class ContentStoreImpl
+  : public ContentStore,
+    protected ndnSIM::
+      trie_with_policy<Name,
+                       ndnSIM::smart_pointer_payload_traits<EntryImpl<ContentStoreImpl<Policy>>,
+                                                            Entry>,
+                       Policy> {
+public:
+  typedef ndnSIM::
+    trie_with_policy<Name, ndnSIM::smart_pointer_payload_traits<EntryImpl<ContentStoreImpl<Policy>>,
+                                                                Entry>,
+                     Policy> super;
+
+  typedef EntryImpl<ContentStoreImpl<Policy>> entry;
+
+  static TypeId
+  GetTypeId();
+
+  ContentStoreImpl(){};
+  virtual ~ContentStoreImpl(){};
+
+  // from ContentStore
+
+  virtual inline shared_ptr<Data>
+  Lookup(shared_ptr<const Interest> interest);
+
+  virtual inline bool
+  Add(shared_ptr<const Data> data);
+
+  // virtual bool
+  // Remove (shared_ptr<Interest> header);
+
+  virtual inline void
+  Print(std::ostream& os) const;
+
+  virtual uint32_t
+  GetSize() const;
+
+  virtual Ptr<Entry>
+  Begin();
+
+  virtual Ptr<Entry>
+  End();
+
+  virtual Ptr<Entry> Next(Ptr<Entry>);
+
+  const typename super::policy_container&
+  GetPolicy() const
+  {
+    return super::getPolicy();
+  }
+
+  typename super::policy_container&
+  GetPolicy()
+  {
+    return super::getPolicy();
+  }
+
+private:
+  void
+  SetMaxSize(uint32_t maxSize);
+
+  uint32_t
+  GetMaxSize() const;
+
+private:
+  static LogComponent g_log; ///< @brief Logging variable
+
+  /// @brief trace of for entry additions (fired every time entry is successfully added to the
+  /// cache): first parameter is pointer to the CS entry
+  TracedCallback<Ptr<const Entry>> m_didAddEntry;
+};
+
+//////////////////////////////////////////
+////////// Implementation ////////////////
+//////////////////////////////////////////
+
+template<class Policy>
+LogComponent
+  ContentStoreImpl<Policy>::g_log = LogComponent(("ndn.cs." + Policy::GetName()).c_str());
+
+template<class Policy>
+TypeId
+ContentStoreImpl<Policy>::GetTypeId()
+{
+  static TypeId tid =
+    TypeId(("ns3::ndn::cs::" + Policy::GetName()).c_str())
+      .SetGroupName("Ndn")
+      .SetParent<ContentStore>()
+      .AddConstructor<ContentStoreImpl<Policy>>()
+      .AddAttribute("MaxSize",
+                    "Set maximum number of entries in ContentStore. If 0, limit is not enforced",
+                    StringValue("100"), MakeUintegerAccessor(&ContentStoreImpl<Policy>::GetMaxSize,
+                                                             &ContentStoreImpl<Policy>::SetMaxSize),
+                    MakeUintegerChecker<uint32_t>())
+
+      .AddTraceSource("DidAddEntry",
+                      "Trace fired every time entry is successfully added to the cache",
+                      MakeTraceSourceAccessor(&ContentStoreImpl<Policy>::m_didAddEntry));
+
+  return tid;
+}
+
+struct isNotExcluded {
+  inline isNotExcluded(const Exclude& exclude)
+    : m_exclude(exclude)
+  {
+  }
+
+  bool
+  operator()(const name::Component& comp) const
+  {
+    return !m_exclude.isExcluded(comp);
+  }
+
+private:
+  const Exclude& m_exclude;
+};
+
+template<class Policy>
+shared_ptr<Data>
+ContentStoreImpl<Policy>::Lookup(shared_ptr<const Interest> interest)
+{
+  NS_LOG_FUNCTION(this << interest->getName());
+
+  typename super::const_iterator node;
+  if (interest->getExclude().empty()) {
+    node = this->deepest_prefix_match(interest->getName());
+  }
+  else {
+    node = this->deepest_prefix_match_if_next_level(interest->getName(),
+                                                    isNotExcluded(interest->getExclude()));
+  }
+
+  if (node != this->end()) {
+    this->m_cacheHitsTrace(interest, node->payload()->GetData());
+
+    shared_ptr<Data> copy = make_shared<Data>(*node->payload()->GetData());
+    return copy;
+  }
+  else {
+    this->m_cacheMissesTrace(interest);
+    return 0;
+  }
+}
+
+template<class Policy>
+bool
+ContentStoreImpl<Policy>::Add(shared_ptr<const Data> data)
+{
+  NS_LOG_FUNCTION(this << data->getName());
+
+  Ptr<entry> newEntry = Create<entry>(this, data);
+  std::pair<typename super::iterator, bool> result = super::insert(data->getName(), newEntry);
+
+  if (result.first != super::end()) {
+    if (result.second) {
+      newEntry->SetTrie(result.first);
+
+      m_didAddEntry(newEntry);
+      return true;
+    }
+    else {
+      // should we do anything?
+      // update payload? add new payload?
+      return false;
+    }
+  }
+  else
+    return false; // cannot insert entry
+}
+
+template<class Policy>
+void
+ContentStoreImpl<Policy>::Print(std::ostream& os) const
+{
+  for (typename super::policy_container::const_iterator item = this->getPolicy().begin();
+       item != this->getPolicy().end(); item++) {
+    os << item->payload ()->GetName () << std::endl;
+  }
+}
+
+template<class Policy>
+void
+ContentStoreImpl<Policy>::SetMaxSize(uint32_t maxSize)
+{
+  this->getPolicy().set_max_size(maxSize);
+}
+
+template<class Policy>
+uint32_t
+ContentStoreImpl<Policy>::GetMaxSize() const
+{
+  return this->getPolicy().get_max_size();
+}
+
+template<class Policy>
+uint32_t
+ContentStoreImpl<Policy>::GetSize() const
+{
+  return this->getPolicy().size();
+}
+
+template<class Policy>
+Ptr<Entry>
+ContentStoreImpl<Policy>::Begin()
+{
+  typename super::parent_trie::recursive_iterator item(super::getTrie()), end(0);
+  for (; item != end; item++) {
+    if (item->payload() == 0)
+      continue;
+    break;
+  }
+
+  if (item == end)
+    return End();
+  else
+    return item->payload();
+}
+
+template<class Policy>
+Ptr<Entry>
+ContentStoreImpl<Policy>::End()
+{
+  return 0;
+}
+
+template<class Policy>
+Ptr<Entry>
+ContentStoreImpl<Policy>::Next(Ptr<Entry> from)
+{
+  if (from == 0)
+    return 0;
+
+  typename super::parent_trie::recursive_iterator item(*StaticCast<entry>(from)->to_iterator()),
+    end(0);
+
+  for (item++; item != end; item++) {
+    if (item->payload() == 0)
+      continue;
+    break;
+  }
+
+  if (item == end)
+    return End();
+  else
+    return item->payload();
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_CONTENT_STORE_IMPL_H_
diff --git a/model/cs/content-store-nocache.cpp b/model/cs/content-store-nocache.cpp
new file mode 100644
index 0000000..9aef87b
--- /dev/null
+++ b/model/cs/content-store-nocache.cpp
@@ -0,0 +1,98 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011,2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *
+ */
+
+#include "content-store-nocache.hpp"
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+
+NS_LOG_COMPONENT_DEFINE("ndn.cs.Nocache");
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+NS_OBJECT_ENSURE_REGISTERED(Nocache);
+
+TypeId
+Nocache::GetTypeId(void)
+{
+  static TypeId tid = TypeId("ns3::ndn::cs::Nocache")
+                        .SetGroupName("Ndn")
+                        .SetParent<ContentStore>()
+                        .AddConstructor<Nocache>();
+
+  return tid;
+}
+
+Nocache::Nocache()
+{
+}
+
+Nocache::~Nocache()
+{
+}
+
+shared_ptr<Data>
+Nocache::Lookup(shared_ptr<const Interest> interest)
+{
+  this->m_cacheMissesTrace(interest);
+  return 0;
+}
+
+bool
+Nocache::Add(shared_ptr<const Data> data)
+{
+  return false;
+}
+
+void
+Nocache::Print(std::ostream& os) const
+{
+}
+
+uint32_t
+Nocache::GetSize() const
+{
+  return 0;
+}
+
+Ptr<cs::Entry>
+Nocache::Begin()
+{
+  return 0;
+}
+
+Ptr<cs::Entry>
+Nocache::End()
+{
+  return 0;
+}
+
+Ptr<cs::Entry> Nocache::Next(Ptr<cs::Entry>)
+{
+  return 0;
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/content-store-nocache.hpp b/model/cs/content-store-nocache.hpp
new file mode 100644
index 0000000..bf271cb
--- /dev/null
+++ b/model/cs/content-store-nocache.hpp
@@ -0,0 +1,82 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Alexander Afanasyev
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_NOCACHE_H
+#define NDN_CONTENT_STORE_NOCACHE_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ndnSIM/model/cs/ndn-content-store.hpp"
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+/**
+ * @ingroup ndn-cs
+ * @brief Implementation of ContentStore that completely disables caching
+ */
+class Nocache : public ContentStore {
+public:
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static TypeId
+  GetTypeId();
+
+  /**
+   * @brief Default constructor
+   */
+  Nocache();
+
+  /**
+   * @brief Virtual destructor
+   */
+  virtual ~Nocache();
+
+  virtual shared_ptr<Data>
+  Lookup(shared_ptr<const Interest> interest);
+
+  virtual bool
+  Add(shared_ptr<const Data> data);
+
+  virtual void
+  Print(std::ostream& os) const;
+
+  virtual uint32_t
+  GetSize() const;
+
+  virtual Ptr<cs::Entry>
+  Begin();
+
+  virtual Ptr<cs::Entry>
+  End();
+
+  virtual Ptr<cs::Entry> Next(Ptr<cs::Entry>);
+};
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_CONTENT_STORE_NOCACHE_H
diff --git a/model/cs/content-store-with-freshness.cpp b/model/cs/content-store-with-freshness.cpp
new file mode 100644
index 0000000..3fa39b9
--- /dev/null
+++ b/model/cs/content-store-with-freshness.cpp
@@ -0,0 +1,100 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "content-store-with-freshness.hpp"
+
+#include "../../utils/trie/random-policy.hpp"
+#include "../../utils/trie/lru-policy.hpp"
+#include "../../utils/trie/fifo-policy.hpp"
+#include "../../utils/trie/lfu-policy.hpp"
+
+#define NS_OBJECT_ENSURE_REGISTERED_TEMPL(type, templ)                                             \
+  static struct X##type##templ##RegistrationClass {                                                \
+    X##type##templ##RegistrationClass()                                                            \
+    {                                                                                              \
+      ns3::TypeId tid = type<templ>::GetTypeId();                                                  \
+      tid.GetParent();                                                                             \
+    }                                                                                              \
+  } x_##type##templ##RegistrationVariable
+
+namespace ns3 {
+namespace ndn {
+
+using namespace ndnSIM;
+
+namespace cs {
+
+// explicit instantiation and registering
+/**
+ * @brief ContentStore with freshness and LRU cache replacement policy
+ **/
+template class ContentStoreWithFreshness<lru_policy_traits>;
+
+/**
+ * @brief ContentStore with freshness and random cache replacement policy
+ **/
+template class ContentStoreWithFreshness<random_policy_traits>;
+
+/**
+ * @brief ContentStore with freshness and FIFO cache replacement policy
+ **/
+template class ContentStoreWithFreshness<fifo_policy_traits>;
+
+/**
+ * @brief ContentStore with freshness and Least Frequently Used (LFU) cache replacement policy
+ **/
+template class ContentStoreWithFreshness<lfu_policy_traits>;
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithFreshness, lru_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithFreshness, random_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithFreshness, fifo_policy_traits);
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithFreshness, lfu_policy_traits);
+
+#ifdef DOXYGEN
+// /**
+//  * \brief Content Store with freshness implementing LRU cache replacement policy
+//  */
+class Freshness::Lru : public ContentStoreWithFreshness<lru_policy_traits> {
+};
+
+/**
+ * \brief Content Store with freshness implementing FIFO cache replacement policy
+ */
+class Freshness::Fifo : public ContentStoreWithFreshness<fifo_policy_traits> {
+};
+
+/**
+ * \brief Content Store with freshness implementing Random cache replacement policy
+ */
+class Freshness::Random : public ContentStoreWithFreshness<random_policy_traits> {
+};
+
+/**
+ * \brief Content Store with freshness implementing Least Frequently Used cache replacement policy
+ */
+class Freshness::Lfu : public ContentStoreWithFreshness<lfu_policy_traits> {
+};
+
+#endif
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/content-store-with-freshness.hpp b/model/cs/content-store-with-freshness.hpp
new file mode 100644
index 0000000..c69be28
--- /dev/null
+++ b/model/cs/content-store-with-freshness.hpp
@@ -0,0 +1,190 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_WITH_FRESHNESS_H_
+#define NDN_CONTENT_STORE_WITH_FRESHNESS_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "content-store-impl.hpp"
+
+#include "../../utils/trie/multi-policy.hpp"
+#include "custom-policies/freshness-policy.hpp"
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+/**
+ * @ingroup ndn-cs
+ * @brief Special content store realization that honors Freshness parameter in Data packets
+ */
+template<class Policy>
+class ContentStoreWithFreshness
+  : public ContentStoreImpl<ndnSIM::
+                              multi_policy_traits<boost::mpl::
+                                                    vector2<Policy,
+                                                            ndnSIM::freshness_policy_traits>>> {
+public:
+  typedef ContentStoreImpl<ndnSIM::multi_policy_traits<boost::mpl::
+                                                         vector2<Policy,
+                                                                 ndnSIM::freshness_policy_traits>>>
+    super;
+
+  typedef typename super::policy_container::template index<1>::type freshness_policy_container;
+
+  static TypeId
+  GetTypeId();
+
+  virtual inline void
+  Print(std::ostream& os) const;
+
+  virtual inline bool
+  Add(shared_ptr<const Data> data);
+
+private:
+  inline void
+  CleanExpired();
+
+  inline void
+  RescheduleCleaning();
+
+private:
+  static LogComponent g_log; ///< @brief Logging variable
+
+  EventId m_cleanEvent;
+  Time m_scheduledCleaningTime;
+};
+
+//////////////////////////////////////////
+////////// Implementation ////////////////
+//////////////////////////////////////////
+
+template<class Policy>
+LogComponent ContentStoreWithFreshness<Policy>::g_log = LogComponent(("ndn.cs.Freshness."
+                                                                      + Policy::GetName()).c_str());
+
+template<class Policy>
+TypeId
+ContentStoreWithFreshness<Policy>::GetTypeId()
+{
+  static TypeId tid = TypeId(("ns3::ndn::cs::Freshness::" + Policy::GetName()).c_str())
+                        .SetGroupName("Ndn")
+                        .SetParent<super>()
+                        .template AddConstructor<ContentStoreWithFreshness<Policy>>()
+
+    // trace stuff here
+    ;
+
+  return tid;
+}
+
+template<class Policy>
+inline bool
+ContentStoreWithFreshness<Policy>::Add(shared_ptr<const Data> data)
+{
+  bool ok = super::Add(data);
+  if (!ok)
+    return false;
+
+  NS_LOG_DEBUG(data->getName() << " added to cache");
+  RescheduleCleaning();
+  return true;
+}
+
+template<class Policy>
+inline void
+ContentStoreWithFreshness<Policy>::RescheduleCleaning()
+{
+  const freshness_policy_container& freshness =
+    this->getPolicy().template get<freshness_policy_container>();
+
+  if (freshness.size() > 0) {
+    Time nextStateTime =
+      freshness_policy_container::policy_base::get_freshness(&(*freshness.begin()));
+
+    if (m_scheduledCleaningTime.IsZero() ||      // if not yet scheduled
+        m_scheduledCleaningTime > nextStateTime) // if new item expire sooner than already scheduled
+    {
+      if (m_cleanEvent.IsRunning()) {
+        Simulator::Remove(m_cleanEvent); // just canceling would not clean up list of events
+      }
+
+      // NS_LOG_DEBUG ("Next event in: " << (nextStateTime - Now ()).ToDouble (Time::S) << "s");
+      m_cleanEvent = Simulator::Schedule(nextStateTime - Now(),
+                                         &ContentStoreWithFreshness<Policy>::CleanExpired, this);
+      m_scheduledCleaningTime = nextStateTime;
+    }
+  }
+  else {
+    if (m_cleanEvent.IsRunning()) {
+      Simulator::Remove(m_cleanEvent); // just canceling would not clean up list of events
+    }
+  }
+}
+
+template<class Policy>
+inline void
+ContentStoreWithFreshness<Policy>::CleanExpired()
+{
+  freshness_policy_container& freshness =
+    this->getPolicy().template get<freshness_policy_container>();
+
+  // NS_LOG_LOGIC (">> Cleaning: Total number of items:" << this->getPolicy ().size () << ", items
+  // with freshness: " << freshness.size ());
+  Time now = Simulator::Now();
+
+  while (!freshness.empty()) {
+    typename freshness_policy_container::iterator entry = freshness.begin();
+
+    if (freshness_policy_container::policy_base::get_freshness(&(*entry))
+        <= now) // is the record stale?
+    {
+      super::erase(&(*entry));
+    }
+    else
+      break; // nothing else to do. All later records will not be stale
+  }
+  // NS_LOG_LOGIC ("<< Cleaning: Total number of items:" << this->getPolicy ().size () << ", items
+  // with freshness: " << freshness.size ());
+
+  m_scheduledCleaningTime = Time();
+  RescheduleCleaning();
+}
+
+template<class Policy>
+void
+ContentStoreWithFreshness<Policy>::Print(std::ostream& os) const
+{
+  // const freshness_policy_container &freshness = this->getPolicy ().template
+  // get<freshness_policy_container> ();
+
+  for (typename super::policy_container::const_iterator item = this->getPolicy().begin();
+       item != this->getPolicy().end(); item++) {
+    Time ttl = freshness_policy_container::policy_base::get_freshness(&(*item)) - Simulator::Now();
+    os << item->payload()->GetName() << "(left: " << ttl.ToDouble(Time::S) << "s)" << std::endl;
+  }
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_CONTENT_STORE_WITH_FRESHNESS_H_
diff --git a/model/cs/content-store-with-probability.cpp b/model/cs/content-store-with-probability.cpp
new file mode 100644
index 0000000..313cb36
--- /dev/null
+++ b/model/cs/content-store-with-probability.cpp
@@ -0,0 +1,100 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "content-store-with-probability.hpp"
+
+#include "../../utils/trie/random-policy.hpp"
+#include "../../utils/trie/lru-policy.hpp"
+#include "../../utils/trie/fifo-policy.hpp"
+#include "../../utils/trie/lfu-policy.hpp"
+
+#define NS_OBJECT_ENSURE_REGISTERED_TEMPL(type, templ)                                             \
+  static struct X##type##templ##RegistrationClass {                                                \
+    X##type##templ##RegistrationClass()                                                            \
+    {                                                                                              \
+      ns3::TypeId tid = type<templ>::GetTypeId();                                                  \
+      tid.GetParent();                                                                             \
+    }                                                                                              \
+  } x_##type##templ##RegistrationVariable
+
+namespace ns3 {
+namespace ndn {
+
+using namespace ndnSIM;
+
+namespace cs {
+
+// explicit instantiation and registering
+/**
+ * @brief ContentStore with freshness and LRU cache replacement policy
+ **/
+template class ContentStoreWithProbability<lru_policy_traits>;
+
+/**
+ * @brief ContentStore with freshness and random cache replacement policy
+ **/
+template class ContentStoreWithProbability<random_policy_traits>;
+
+/**
+ * @brief ContentStore with freshness and FIFO cache replacement policy
+ **/
+template class ContentStoreWithProbability<fifo_policy_traits>;
+
+/**
+ * @brief ContentStore with freshness and Least Frequently Used (LFU) cache replacement policy
+ **/
+template class ContentStoreWithProbability<lfu_policy_traits>;
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithProbability, lru_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithProbability, random_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithProbability, fifo_policy_traits);
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithProbability, lfu_policy_traits);
+
+#ifdef DOXYGEN
+// /**
+//  * \brief Content Store with freshness implementing LRU cache replacement policy
+//  */
+class Probability::Lru : public ContentStoreWithProbability<lru_policy_traits> {
+};
+
+/**
+ * \brief Content Store with freshness implementing FIFO cache replacement policy
+ */
+class Probability::Fifo : public ContentStoreWithProbability<fifo_policy_traits> {
+};
+
+/**
+ * \brief Content Store with freshness implementing Random cache replacement policy
+ */
+class Probability::Random : public ContentStoreWithProbability<random_policy_traits> {
+};
+
+/**
+ * \brief Content Store with freshness implementing Least Frequently Used cache replacement policy
+ */
+class Probability::Lfu : public ContentStoreWithProbability<lfu_policy_traits> {
+};
+
+#endif
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/content-store-with-probability.hpp b/model/cs/content-store-with-probability.hpp
new file mode 100644
index 0000000..b442e4a
--- /dev/null
+++ b/model/cs/content-store-with-probability.hpp
@@ -0,0 +1,101 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_WITH_PROBABILITY_H_
+#define NDN_CONTENT_STORE_WITH_PROBABILITY_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "content-store-impl.hpp"
+
+#include "../../utils/trie/multi-policy.hpp"
+#include "custom-policies/probability-policy.hpp"
+#include "ns3/double.h"
+#include "ns3/type-id.h"
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+/**
+ * @ingroup ndn-cs
+ * @brief Special content store realization that honors Freshness parameter in Data packets
+ */
+template<class Policy>
+class ContentStoreWithProbability
+  : public ContentStoreImpl<ndnSIM::multi_policy_traits<boost::mpl::
+                                                          vector2<ndnSIM::probability_policy_traits,
+                                                                  Policy>>> {
+public:
+  typedef ContentStoreImpl<ndnSIM::multi_policy_traits<boost::mpl::
+                                                         vector2<ndnSIM::probability_policy_traits,
+                                                                 Policy>>> super;
+
+  typedef typename super::policy_container::template index<0>::type probability_policy_container;
+
+  ContentStoreWithProbability(){};
+
+  static TypeId
+  GetTypeId();
+
+private:
+  void
+  SetCacheProbability(double probability)
+  {
+    this->getPolicy().template get<probability_policy_container>().set_probability(probability);
+  }
+
+  double
+  GetCacheProbability() const
+  {
+    return this->getPolicy().template get<probability_policy_container>().get_probability();
+  }
+};
+
+//////////////////////////////////////////
+////////// Implementation ////////////////
+//////////////////////////////////////////
+
+template<class Policy>
+TypeId
+ContentStoreWithProbability<Policy>::GetTypeId()
+{
+  static TypeId tid =
+    TypeId(("ns3::ndn::cs::Probability::" + Policy::GetName()).c_str())
+      .SetGroupName("Ndn")
+      .SetParent<super>()
+      .template AddConstructor<ContentStoreWithProbability<Policy>>()
+
+      .AddAttribute("CacheProbability",
+                    "Set probability of caching in ContentStore. "
+                    "If 1, every content is cached. If 0, no content is cached.",
+                    DoubleValue(1.0), //(+)
+                    MakeDoubleAccessor(&ContentStoreWithProbability<Policy>::GetCacheProbability,
+                                       &ContentStoreWithProbability<Policy>::SetCacheProbability),
+                    MakeDoubleChecker<double>());
+
+  return tid;
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_CONTENT_STORE_WITH_PROBABILITY_H_
diff --git a/model/cs/content-store-with-stats.cpp b/model/cs/content-store-with-stats.cpp
new file mode 100644
index 0000000..1a44e37
--- /dev/null
+++ b/model/cs/content-store-with-stats.cpp
@@ -0,0 +1,100 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "content-store-with-stats.hpp"
+
+#include "../../utils/trie/random-policy.hpp"
+#include "../../utils/trie/lru-policy.hpp"
+#include "../../utils/trie/fifo-policy.hpp"
+#include "../../utils/trie/lfu-policy.hpp"
+
+#define NS_OBJECT_ENSURE_REGISTERED_TEMPL(type, templ)                                             \
+  static struct X##type##templ##RegistrationClass {                                                \
+    X##type##templ##RegistrationClass()                                                            \
+    {                                                                                              \
+      ns3::TypeId tid = type<templ>::GetTypeId();                                                  \
+      tid.GetParent();                                                                             \
+    }                                                                                              \
+  } x_##type##templ##RegistrationVariable
+
+namespace ns3 {
+namespace ndn {
+
+using namespace ndnSIM;
+
+namespace cs {
+
+// explicit instantiation and registering
+/**
+ * @brief ContentStore with stats and LRU cache replacement policy
+ **/
+template class ContentStoreWithStats<lru_policy_traits>;
+
+/**
+ * @brief ContentStore with stats and random cache replacement policy
+ **/
+template class ContentStoreWithStats<random_policy_traits>;
+
+/**
+ * @brief ContentStore with stats and FIFO cache replacement policy
+ **/
+template class ContentStoreWithStats<fifo_policy_traits>;
+
+/**
+ * @brief ContentStore with stats and Least Frequently Used (LFU) cache replacement policy
+ **/
+template class ContentStoreWithStats<lfu_policy_traits>;
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithStats, lru_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithStats, random_policy_traits);
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithStats, fifo_policy_traits);
+
+NS_OBJECT_ENSURE_REGISTERED_TEMPL(ContentStoreWithStats, lfu_policy_traits);
+
+#ifdef DOXYGEN
+// /**
+//  * \brief Content Store with stats implementing LRU cache replacement policy
+//  */
+class Stats::Lru : public ContentStoreWithStats<lru_policy_traits> {
+};
+
+/**
+ * \brief Content Store with stats implementing FIFO cache replacement policy
+ */
+class Stats::Fifo : public ContentStoreWithStats<fifo_policy_traits> {
+};
+
+/**
+ * \brief Content Store with stats implementing Random cache replacement policy
+ */
+class Stats::Random : public ContentStoreWithStats<random_policy_traits> {
+};
+
+/**
+ * \brief Content Store with stats implementing Least Frequently Used cache replacement policy
+ */
+class Stats::Lfu : public ContentStoreWithStats<lfu_policy_traits> {
+};
+
+#endif
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/content-store-with-stats.hpp b/model/cs/content-store-with-stats.hpp
new file mode 100644
index 0000000..f1ba5b2
--- /dev/null
+++ b/model/cs/content-store-with-stats.hpp
@@ -0,0 +1,121 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_WITH_STATS_H_
+#define NDN_CONTENT_STORE_WITH_STATS_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "content-store-impl.hpp"
+
+#include "../../utils/trie/multi-policy.hpp"
+#include "custom-policies/lifetime-stats-policy.hpp"
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+/**
+ * @ingroup ndn-cs
+ * @brief Special content store realization that provides ability to track stats of CS operations
+ */
+template<class Policy>
+class ContentStoreWithStats
+  : public ContentStoreImpl<ndnSIM::
+                              multi_policy_traits<boost::mpl::
+                                                    vector2<Policy,
+                                                            ndnSIM::
+                                                              lifetime_stats_policy_traits>>> {
+public:
+  typedef ContentStoreImpl<ndnSIM::
+                             multi_policy_traits<boost::mpl::
+                                                   vector2<Policy,
+                                                           ndnSIM::lifetime_stats_policy_traits>>>
+    super;
+
+  typedef typename super::policy_container::template index<1>::type lifetime_stats_container;
+
+  ContentStoreWithStats()
+  {
+    // connect traceback to the policy
+    super::getPolicy().template get<1>().set_traced_callback(&m_willRemoveEntry);
+  }
+
+  static TypeId
+  GetTypeId();
+
+  virtual inline void
+  Print(std::ostream& os) const;
+
+private:
+  static LogComponent g_log; ///< @brief Logging variable
+
+  /// @brief trace of for entry removal: first parameter is pointer to the CS entry, second is how
+  /// long entry was in the cache
+  TracedCallback<Ptr<const Entry>, Time> m_willRemoveEntry;
+};
+
+//////////////////////////////////////////
+////////// Implementation ////////////////
+//////////////////////////////////////////
+
+template<class Policy>
+LogComponent ContentStoreWithStats<Policy>::g_log = LogComponent(("ndn.cs.Stats."
+                                                                  + Policy::GetName()).c_str());
+
+template<class Policy>
+TypeId
+ContentStoreWithStats<Policy>::GetTypeId()
+{
+  static TypeId tid =
+    TypeId(("ns3::ndn::cs::Stats::" + Policy::GetName()).c_str())
+      .SetGroupName("Ndn")
+      .SetParent<super>()
+      .template AddConstructor<ContentStoreWithStats<Policy>>()
+
+      .AddTraceSource("WillRemoveEntry",
+                      "Trace called just before content store entry will be removed",
+                      MakeTraceSourceAccessor(&ContentStoreWithStats<Policy>::m_willRemoveEntry))
+
+    // trace stuff here
+    ;
+
+  return tid;
+}
+
+template<class Policy>
+void
+ContentStoreWithStats<Policy>::Print(std::ostream& os) const
+{
+  // const freshness_policy_container &freshness = this->getPolicy ().template
+  // get<freshness_policy_container> ();
+
+  for (typename super::policy_container::const_iterator item = this->getPolicy().begin();
+       item != this->getPolicy().end(); item++) {
+    Time alive = lifetime_stats_container::policy_base::get_time(&(*item)) - Simulator::Now();
+    os << item->payload()->GetName() << "(alive: " << alive.ToDouble(Time::S) << "s)" << std::endl;
+  }
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_CONTENT_STORE_IMPL_H_
diff --git a/model/cs/custom-policies/freshness-policy.hpp b/model/cs/custom-policies/freshness-policy.hpp
new file mode 100644
index 0000000..ae10862
--- /dev/null
+++ b/model/cs/custom-policies/freshness-policy.hpp
@@ -0,0 +1,170 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef FRESHNESS_POLICY_H_
+#define FRESHNESS_POLICY_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+#include <ns3/nstime.h>
+#include <ns3/simulator.h>
+#include <ns3/traced-callback.h>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for freshness policy
+ */
+struct freshness_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Freshness";
+  }
+
+  struct policy_hook_type : public boost::intrusive::set_member_hook<> {
+    Time timeWhenShouldExpire;
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    static Time&
+    get_freshness(typename Container::iterator item)
+    {
+      return static_cast<typename policy_container::value_traits::hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
+    }
+
+    static const Time&
+    get_freshness(typename Container::const_iterator item)
+    {
+      return static_cast<const typename policy_container::value_traits::hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
+    }
+
+    template<class Key>
+    struct MemberHookLess {
+      bool
+      operator()(const Key& a, const Key& b) const
+      {
+        return get_freshness(&a) < get_freshness(&b);
+      }
+    };
+
+    typedef boost::intrusive::multiset<Container,
+                                       boost::intrusive::compare<MemberHookLess<Container>>,
+                                       Hook> policy_container;
+
+    class type : public policy_container {
+    public:
+      typedef policy policy_base; // to get access to get_freshness methods from outside
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        // get_time (item) = Simulator::Now ();
+        Time freshness = MilliSeconds(item->payload()->GetData()->getFreshnessPeriod().count());
+        if (!freshness.IsZero()) {
+          get_freshness(item) = Simulator::Now() + freshness;
+
+          // push item only if freshness is non zero. otherwise, this payload is not controlled by
+          // the policy
+          // note that .size() on this policy would return only number of items with non-infinite
+          // freshness policy
+          policy_container::insert(*item);
+        }
+
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing. it's random policy
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        if (item->payload()->GetData()->getFreshnessPeriod() != time::milliseconds::zero()) {
+          // erase only if freshness is non zero (otherwise an item is not in the policy
+          policy_container::erase(policy_container::s_iterator_to(*item));
+        }
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // LIFETIME_STATS_POLICY_H
diff --git a/model/cs/custom-policies/lifetime-stats-policy.hpp b/model/cs/custom-policies/lifetime-stats-policy.hpp
new file mode 100644
index 0000000..1abf39d
--- /dev/null
+++ b/model/cs/custom-policies/lifetime-stats-policy.hpp
@@ -0,0 +1,164 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef LIFETIME_STATS_POLICY_H_
+#define LIFETIME_STATS_POLICY_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+#include <ns3/nstime.h>
+#include <ns3/simulator.h>
+#include <ns3/traced-callback.h>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for lifetime stats policy
+ */
+struct lifetime_stats_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "LifetimeStats";
+  }
+
+  struct policy_hook_type : public boost::intrusive::list_member_hook<> {
+    Time timeWhenAdded;
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    static Time&
+    get_time(typename Container::iterator item)
+    {
+      return static_cast<typename policy_container::value_traits::hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->timeWhenAdded;
+    }
+
+    static const Time&
+    get_time(typename Container::const_iterator item)
+    {
+      return static_cast<const typename policy_container::value_traits::hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->timeWhenAdded;
+    }
+
+    class type : public policy_container {
+    public:
+      typedef policy policy_base; // to get access to get_time methods from outside
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+        , m_willRemoveEntry(0)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do nothing. it's random policy
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        get_time(item) = Simulator::Now();
+
+        policy_container::push_back(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing. it's random policy
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        Time lifetime = Simulator::Now() - get_time(item);
+
+        if (m_willRemoveEntry != 0) {
+          (*m_willRemoveEntry)(item->payload(), lifetime);
+        }
+
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+      void
+      set_traced_callback(
+        TracedCallback<typename parent_trie::payload_traits::const_base_type, Time>* callback)
+      {
+        m_willRemoveEntry = callback;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+
+      TracedCallback<typename parent_trie::payload_traits::const_base_type, Time>*
+        m_willRemoveEntry;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // LIFETIME_STATS_POLICY_H
diff --git a/model/cs/custom-policies/probability-policy.hpp b/model/cs/custom-policies/probability-policy.hpp
new file mode 100644
index 0000000..8638c0a
--- /dev/null
+++ b/model/cs/custom-policies/probability-policy.hpp
@@ -0,0 +1,149 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef PROBABILITY_POLICY_H_
+#define PROBABILITY_POLICY_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+#include <ns3/random-variable.h>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for freshness policy
+ */
+struct probability_policy_traits {
+  static std::string
+  GetName()
+  {
+    return "ProbabilityImpl";
+  }
+
+  struct policy_hook_type : public boost::intrusive::list_member_hook<> {
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    class type : public policy_container {
+    public:
+      typedef policy policy_base; // to get access to get_freshness methods from outside
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+        , probability_(1.0)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        if (ns3_rand_.GetValue() < probability_) {
+          policy_container::push_back(*item);
+
+          // allow caching
+          return true;
+        }
+        else {
+          // don't allow caching
+          return false;
+        }
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing. it's random policy
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+      inline void
+      set_probability(double probability)
+      {
+        probability_ = probability;
+      }
+
+      inline double
+      get_probability() const
+      {
+        return probability_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+      double probability_;
+      UniformVariable ns3_rand_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // PROBABILITY_POLICY_H
diff --git a/model/cs/ndn-content-store.cpp b/model/cs/ndn-content-store.cpp
new file mode 100644
index 0000000..9f7af30
--- /dev/null
+++ b/model/cs/ndn-content-store.cpp
@@ -0,0 +1,86 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011,2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *
+ */
+
+#include "ndn-content-store.hpp"
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+
+NS_LOG_COMPONENT_DEFINE("ndn.cs.ContentStore");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(ContentStore);
+
+TypeId
+ContentStore::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::ContentStore")
+      .SetGroupName("Ndn")
+      .SetParent<Object>()
+
+      .AddTraceSource("CacheHits", "Trace called every time there is a cache hit",
+                      MakeTraceSourceAccessor(&ContentStore::m_cacheHitsTrace))
+
+      .AddTraceSource("CacheMisses", "Trace called every time there is a cache miss",
+                      MakeTraceSourceAccessor(&ContentStore::m_cacheMissesTrace));
+
+  return tid;
+}
+
+ContentStore::~ContentStore()
+{
+}
+
+namespace cs {
+
+//////////////////////////////////////////////////////////////////////
+
+Entry::Entry(Ptr<ContentStore> cs, shared_ptr<const Data> data)
+  : m_cs(cs)
+  , m_data(data)
+{
+}
+
+const Name&
+Entry::GetName() const
+{
+  return m_data->getName();
+}
+
+shared_ptr<const Data>
+Entry::GetData() const
+{
+  return m_data;
+}
+
+Ptr<ContentStore>
+Entry::GetContentStore()
+{
+  return m_cs;
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/ndn-content-store.hpp b/model/cs/ndn-content-store.hpp
new file mode 100644
index 0000000..f1e0ef7
--- /dev/null
+++ b/model/cs/ndn-content-store.hpp
@@ -0,0 +1,221 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011,2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_H
+#define NDN_CONTENT_STORE_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/traced-callback.h"
+
+#include <tuple>
+
+namespace ns3 {
+
+class Packet;
+
+namespace ndn {
+
+class ContentStore;
+
+/**
+ * @ingroup ndn
+ * @defgroup ndn-cs Content Store
+ */
+
+/**
+ * @ingroup ndn-cs
+ * @brief Namespace for ContentStore operations
+ */
+namespace cs {
+
+/**
+ * @ingroup ndn-cs
+ * @brief NDN content store entry
+ */
+class Entry : public SimpleRefCount<Entry> {
+public:
+  /**
+   * \brief Construct content store entry
+   *
+   * \param header Parsed Data header
+   * \param packet Original Ndn packet
+   *
+   * The constructor will make a copy of the supplied packet and calls
+   * RemoveHeader and RemoveTail on the copy.
+   */
+  Entry(Ptr<ContentStore> cs, shared_ptr<const Data> data);
+
+  /**
+   * \brief Get prefix of the stored entry
+   * \returns prefix of the stored entry
+   */
+  const Name&
+  GetName() const;
+
+  /**
+   * \brief Get Data of the stored entry
+   * \returns Data of the stored entry
+   */
+  shared_ptr<const Data>
+  GetData() const;
+
+  /**
+   * @brief Get pointer to access store, to which this entry is added
+   */
+  Ptr<ContentStore>
+  GetContentStore();
+
+private:
+  Ptr<ContentStore> m_cs;        ///< \brief content store to which entry is added
+  shared_ptr<const Data> m_data; ///< \brief non-modifiable Data
+};
+
+} // namespace cs
+
+/**
+ * @ingroup ndn-cs
+ * \brief Base class for NDN content store
+ *
+ * Particular implementations should implement Lookup, Add, and Print methods
+ */
+class ContentStore : public Object {
+public:
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static TypeId
+  GetTypeId();
+
+  /**
+   * @brief Virtual destructor
+   */
+  virtual ~ContentStore();
+
+  /**
+   * \brief Find corresponding CS entry for the given interest
+   *
+   * \param interest Interest for which matching content store entry
+   * will be searched
+   *
+   * If an entry is found, it is promoted to the top of most recent
+   * used entries index, \see m_contentStore
+   */
+  virtual shared_ptr<Data>
+  Lookup(shared_ptr<const Interest> interest) = 0;
+
+  /**
+   * \brief Add a new content to the content store.
+   *
+   * \param header Fully parsed Data
+   * \param packet Fully formed Ndn packet to add to content store
+   * (will be copied and stripped down of headers)
+   * @returns true if an existing entry was updated, false otherwise
+   */
+  virtual bool
+  Add(shared_ptr<const Data> data) = 0;
+
+  // /*
+  //  * \brief Add a new content to the content store.
+  //  *
+  //  * \param header Interest header for which an entry should be removed
+  //  * @returns true if an existing entry was removed, false otherwise
+  //  */
+  // virtual bool
+  // Remove (shared_ptr<Interest> header) = 0;
+
+  /**
+   * \brief Print out content store entries
+   */
+  virtual void
+  Print(std::ostream& os) const = 0;
+
+  /**
+   * @brief Get number of entries in content store
+   */
+  virtual uint32_t
+  GetSize() const = 0;
+
+  /**
+   * @brief Return first element of content store (no order guaranteed)
+   */
+  virtual Ptr<cs::Entry>
+  Begin() = 0;
+
+  /**
+   * @brief Return item next after last (no order guaranteed)
+   */
+  virtual Ptr<cs::Entry>
+  End() = 0;
+
+  /**
+   * @brief Advance the iterator
+   */
+  virtual Ptr<cs::Entry> Next(Ptr<cs::Entry>) = 0;
+
+  ////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////
+
+  /**
+   * @brief Static call to cheat python bindings
+   */
+  static inline Ptr<ContentStore>
+  GetContentStore(Ptr<Object> node);
+
+protected:
+  TracedCallback<shared_ptr<const Interest>,
+                 shared_ptr<const Data>> m_cacheHitsTrace; ///< @brief trace of cache hits
+
+  TracedCallback<shared_ptr<const Interest>> m_cacheMissesTrace; ///< @brief trace of cache misses
+};
+
+inline std::ostream&
+operator<<(std::ostream& os, const ContentStore& cs)
+{
+  cs.Print(os);
+  return os;
+}
+
+inline Ptr<ContentStore>
+ContentStore::GetContentStore(Ptr<Object> node)
+{
+  return node->GetObject<ContentStore>();
+}
+
+} // namespace ndn
+} // namespace ns3
+
+#include <boost/functional/hash.hpp>
+namespace boost {
+inline std::size_t
+hash_value(const ::ndn::name::Component component)
+{
+  return boost::hash_range(component.wireEncode().wire(),
+                           component.wireEncode().wire() + component.wireEncode().size());
+}
+}
+
+#endif // NDN_CONTENT_STORE_H
diff --git a/model/ndn-app-face.cpp b/model/ndn-app-face.cpp
new file mode 100644
index 0000000..0af1432
--- /dev/null
+++ b/model/ndn-app-face.cpp
@@ -0,0 +1,67 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *          Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *
+ */
+
+#include "ndn-app-face.hpp"
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/node.h"
+#include "ns3/assert.h"
+#include "ns3/simulator.h"
+
+#include "apps/ndn-app.hpp"
+
+NS_LOG_COMPONENT_DEFINE("ndn.AppFace");
+
+namespace ns3 {
+namespace ndn {
+
+AppFace::AppFace(Ptr<App> app)
+  // : Face(app->GetNode())
+  : m_app(app)
+{
+  NS_LOG_FUNCTION(this << app);
+
+  NS_ASSERT(m_app != 0);
+}
+
+AppFace::~AppFace()
+{
+  NS_LOG_FUNCTION_NOARGS();
+}
+
+bool
+AppFace::SendInterest(shared_ptr<const Interest> interest)
+{
+  NS_LOG_FUNCTION(this << interest);
+  return false;
+}
+
+bool
+AppFace::SendData(shared_ptr<const Data> data)
+{
+  NS_LOG_FUNCTION(this << data);
+  return false;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/model/ndn-app-face.hpp b/model/ndn-app-face.hpp
new file mode 100644
index 0000000..9abc4cf
--- /dev/null
+++ b/model/ndn-app-face.hpp
@@ -0,0 +1,71 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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:     Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+                Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef NDN_APP_FACE_H
+#define NDN_APP_FACE_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-face.hpp"
+#include "ns3/traced-callback.h"
+
+namespace ns3 {
+
+class Packet;
+
+namespace ndn {
+
+class App;
+
+/**
+ * \ingroup ndn-face
+ * \brief Implementation of application Ndn face
+ *
+ * This class defines basic functionality of Ndn face. Face is core
+ * component responsible for actual delivery of data packet to and
+ * from Ndn stack
+ *
+ * \see AppFace, NdnNetDeviceFace, NdnIpv4Face, NdnUdpFace
+ */
+class AppFace : public Face {
+public:
+  /**
+   * \brief Default constructor
+   */
+  AppFace(Ptr<App> app);
+  virtual ~AppFace();
+
+  ////////////////////////////////////////////////////////////////////
+  // methods overloaded from Face
+  virtual bool
+  SendInterest(shared_ptr<const Interest> interest);
+
+  virtual bool
+  SendData(shared_ptr<const Data> data);
+
+private:
+  Ptr<App> m_app;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_APP_FACE_H
diff --git a/model/ndn-common.hpp b/model/ndn-common.hpp
new file mode 100644
index 0000000..97e722a
--- /dev/null
+++ b/model/ndn-common.hpp
@@ -0,0 +1,60 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDN_COMMON_H
+#define NDN_COMMON_H
+
+#include "ns3/nstime.h"
+#include "ns3/simulator.h"
+
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/signature.hpp>
+#include <ndn-cxx/signature-info.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
+
+#include <ndn-cxx/util/time.hpp>
+
+namespace ns3 {
+namespace ndn {
+
+using ::ndn::Name;
+namespace name = ::ndn::name;
+
+namespace time = ::ndn::time;
+
+using ::ndn::Exclude;
+
+using std::shared_ptr;
+using std::make_shared;
+
+using ::ndn::Interest;
+using ::ndn::Data;
+using ::ndn::KeyLocator;
+using ::ndn::Signature;
+using ::ndn::SignatureInfo;
+using ::ndn::Block;
+using ::ndn::KeyChain;
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_COMMON_H
diff --git a/model/ndn-face.hpp b/model/ndn-face.hpp
new file mode 100644
index 0000000..73d4fb3
--- /dev/null
+++ b/model/ndn-face.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDNSIM_NDN_FACE_HPP
+#define NDNSIM_NDN_FACE_HPP
+
+#include <boost/noncopyable.hpp>
+
+namespace ns3 {
+namespace ndn {
+
+class Face : boost::noncopyable {
+};
+
+inline std::ostream&
+operator<<(std::ostream& os, const Face& face)
+{
+  return os;
+}
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDNSIM_NDN_FACE_HPP
diff --git a/model/ndn-global-router.cpp b/model/ndn-global-router.cpp
new file mode 100644
index 0000000..b718689
--- /dev/null
+++ b/model/ndn-global-router.cpp
@@ -0,0 +1,100 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-global-router.hpp"
+
+#include "ndn-l3-protocol.hpp"
+#include "ndn-face.hpp"
+
+#include "ns3/channel.h"
+
+namespace ns3 {
+namespace ndn {
+
+uint32_t GlobalRouter::m_idCounter = 0;
+
+NS_OBJECT_ENSURE_REGISTERED(GlobalRouter);
+
+TypeId
+GlobalRouter::GetTypeId()
+{
+  static TypeId tid = TypeId("ns3::ndn::GlobalRouter").SetGroupName("Ndn").SetParent<Object>();
+  return tid;
+}
+
+GlobalRouter::GlobalRouter()
+{
+  m_id = m_idCounter;
+  m_idCounter++;
+}
+
+void
+GlobalRouter::NotifyNewAggregate()
+{
+  if (m_ndn == 0) {
+    m_ndn = GetObject<L3Protocol>();
+  }
+  Object::NotifyNewAggregate();
+}
+
+uint32_t
+GlobalRouter::GetId() const
+{
+  return m_id;
+}
+
+Ptr<L3Protocol>
+GlobalRouter::GetL3Protocol() const
+{
+  return m_ndn;
+}
+
+void
+GlobalRouter::AddLocalPrefix(shared_ptr<Name> prefix)
+{
+  m_localPrefixes.push_back(prefix);
+}
+
+void
+GlobalRouter::AddIncidency(shared_ptr<Face> face, Ptr<GlobalRouter> gr)
+{
+  m_incidencies.push_back(boost::make_tuple(this, face, gr));
+}
+
+GlobalRouter::IncidencyList&
+GlobalRouter::GetIncidencies()
+{
+  return m_incidencies;
+}
+
+const GlobalRouter::LocalPrefixList&
+GlobalRouter::GetLocalPrefixes() const
+{
+  return m_localPrefixes;
+}
+
+// void
+// GlobalRouter::AddIncidencyChannel (Ptr< NdnFace > face, Ptr< Channel > channel)
+// {
+//   m_incidenciesChannel.push_back (make_tuple (face, channel));
+// }
+
+} // namespace ndn
+} // namespace ns3
diff --git a/model/ndn-global-router.hpp b/model/ndn-global-router.hpp
new file mode 100644
index 0000000..74cf5f1
--- /dev/null
+++ b/model/ndn-global-router.hpp
@@ -0,0 +1,143 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_GLOBAL_ROUTER_H
+#define NDN_GLOBAL_ROUTER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+
+#include <list>
+#include <boost/tuple/tuple.hpp>
+
+namespace ns3 {
+
+class Channel;
+
+namespace ndn {
+
+class L3Protocol;
+class Face;
+
+/**
+ * @ingroup ndn
+ * @brief Class representing global router interface for ndnSIM
+ */
+class GlobalRouter : public Object {
+public:
+  /**
+   * @brief Graph edge
+   */
+  typedef boost::tuple<Ptr<GlobalRouter>, shared_ptr<Face>, Ptr<GlobalRouter>> Incidency;
+  /**
+   * @brief List of graph edges
+   */
+  typedef std::list<Incidency> IncidencyList;
+  /**
+   * @brief List of locally exported prefixes
+   */
+  typedef std::list<shared_ptr<Name>> LocalPrefixList;
+
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static TypeId
+  GetTypeId();
+
+  /**
+   * @brief Default constructor
+   */
+  GlobalRouter();
+
+  /**
+   * @brief Get numeric ID of the node (internally assigned)
+   */
+  uint32_t
+  GetId() const;
+
+  /**
+   * @brief Helper function to get smart pointer to ndn::L3Protocol object (basically, self)
+   */
+  Ptr<L3Protocol>
+  GetL3Protocol() const;
+
+  /**
+   * @brief Add new locally exported prefix
+   * @param prefix Prefix
+   */
+  void
+  AddLocalPrefix(shared_ptr<Name> prefix);
+
+  /**
+   * @brief Add edge to the node
+   * @param face Face of the edge
+   * @param ndn GlobalRouter of another node
+   */
+  void
+  AddIncidency(shared_ptr<Face> face, Ptr<GlobalRouter> ndn);
+
+  /**
+   * @brief Get list of edges that are connected to this node
+   */
+  IncidencyList&
+  GetIncidencies();
+
+  /**
+   * @brief Get list of locally exported prefixes
+   */
+  const LocalPrefixList&
+  GetLocalPrefixes() const;
+
+  // ??
+protected:
+  virtual void
+  NotifyNewAggregate(); ///< @brief Notify when the object is aggregated to another object (e.g.,
+  /// Node)
+
+private:
+  uint32_t m_id;
+
+  Ptr<L3Protocol> m_ndn;
+  LocalPrefixList m_localPrefixes;
+  IncidencyList m_incidencies;
+
+  static uint32_t m_idCounter;
+};
+
+inline bool
+operator==(const GlobalRouter::Incidency& a, const GlobalRouter::Incidency& b)
+{
+  return a.get<0>() == b.get<0>() && a.get<1>() == b.get<1>() && a.get<2>() == b.get<2>();
+}
+
+inline bool
+operator!=(const GlobalRouter::Incidency& a, const GlobalRouter::Incidency& b)
+{
+  return !(a == b);
+}
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_GLOBAL_ROUTER_H
diff --git a/model/ndn-header.cpp b/model/ndn-header.cpp
new file mode 100644
index 0000000..89c9251
--- /dev/null
+++ b/model/ndn-header.cpp
@@ -0,0 +1,158 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#include "ndn-header.hpp"
+
+#include <iosfwd>
+#include <boost/iostreams/concepts.hpp>
+#include <boost/iostreams/stream.hpp>
+
+namespace io = boost::iostreams;
+
+namespace ns3 {
+namespace ndn {
+
+template<>
+ns3::TypeId
+PacketHeader<Interest>::GetTypeId()
+{
+  static ns3::TypeId tid =
+    ns3::TypeId("ns3::ndn::Interest")
+    .SetGroupName("Ndn")
+    .SetParent<Header>()
+    .AddConstructor<PacketHeader<Interest>>()
+    ;
+
+  return tid;
+}
+
+template<>
+ns3::TypeId
+PacketHeader<Data>::GetTypeId()
+{
+  static ns3::TypeId tid =
+    ns3::TypeId("ns3::ndn::Data")
+    .SetGroupName("Ndn")
+    .SetParent<Header>()
+    .AddConstructor<PacketHeader<Data>>()
+    ;
+  return tid;
+}
+
+template<class Pkt>
+TypeId
+PacketHeader<Pkt>::GetInstanceTypeId(void) const
+{
+  return GetTypeId();
+}
+
+template<class Pkt>
+PacketHeader<Pkt>::PacketHeader()
+{
+}
+
+template<class Pkt>
+PacketHeader<Pkt>::PacketHeader(const Pkt& packet)
+  : m_packet(packet.shared_from_this())
+{
+}
+
+template<class Pkt>
+uint32_t
+PacketHeader<Pkt>::GetSerializedSize(void) const
+{
+  return m_packet->wireEncode().size();
+}
+
+template<class Pkt>
+void
+PacketHeader<Pkt>::Serialize(Buffer::Iterator start) const
+{
+  start.Write(m_packet->wireEncode().wire(), m_packet->wireEncode().size());
+}
+
+class Ns3BufferIteratorSource : public io::source {
+public:
+  Ns3BufferIteratorSource(Buffer::Iterator& is)
+    : m_is(is)
+  {
+  }
+
+  std::streamsize
+  read(char* buf, std::streamsize nMaxRead)
+  {
+    std::streamsize i = 0;
+    for (; i < nMaxRead && !m_is.IsEnd(); ++i) {
+      buf[i] = m_is.ReadU8();
+    }
+    if (i == 0) {
+      return -1;
+    }
+    else {
+      return i;
+    }
+  }
+
+private:
+  Buffer::Iterator& m_is;
+};
+
+template<class Pkt>
+uint32_t
+PacketHeader<Pkt>::Deserialize(Buffer::Iterator start)
+{
+  auto packet = make_shared<Pkt>();
+  io::stream<Ns3BufferIteratorSource> is(start);
+  packet->wireDecode(::ndn::Block::fromStream(is));
+  m_packet = packet;
+  return packet->wireEncode().size();
+}
+
+template<>
+void
+PacketHeader<Interest>::Print(std::ostream& os) const
+{
+  os << "I: " << *m_packet;
+}
+
+template<>
+void
+PacketHeader<Data>::Print(std::ostream& os) const
+{
+  os << "D: " << *m_packet;
+}
+
+template<class Pkt>
+shared_ptr<const Pkt>
+PacketHeader<Pkt>::getPacket()
+{
+  return m_packet;
+}
+
+typedef PacketHeader<Interest> InterestHeader;
+typedef PacketHeader<Data> DataHeader;
+
+NS_OBJECT_ENSURE_REGISTERED(InterestHeader);
+NS_OBJECT_ENSURE_REGISTERED(DataHeader);
+
+template class PacketHeader<Interest>;
+template class PacketHeader<Data>;
+
+} // namespace ndn
+} // namespace ns3
diff --git a/model/ndn-header.hpp b/model/ndn-header.hpp
new file mode 100644
index 0000000..86395d2
--- /dev/null
+++ b/model/ndn-header.hpp
@@ -0,0 +1,65 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDNSIM_NDN_HEADER_HPP
+#define NDNSIM_NDN_HEADER_HPP
+
+#include "ns3/header.h"
+
+#include "ndn-common.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+template<class Pkt>
+class PacketHeader : public Header {
+public:
+  static ns3::TypeId
+  GetTypeId();
+
+  virtual TypeId
+  GetInstanceTypeId(void) const;
+
+  PacketHeader();
+
+  PacketHeader(const Pkt& packet);
+
+  virtual uint32_t
+  GetSerializedSize(void) const;
+
+  virtual void
+  Serialize(ns3::Buffer::Iterator start) const;
+
+  virtual uint32_t
+  Deserialize(ns3::Buffer::Iterator start);
+
+  virtual void
+  Print(std::ostream& os) const;
+
+  shared_ptr<const Pkt>
+  getPacket();
+
+private:
+  shared_ptr<const Pkt> m_packet;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDNSIM_NDN_HEADER_HPP
diff --git a/model/ndn-l3-protocol.cpp b/model/ndn-l3-protocol.cpp
new file mode 100644
index 0000000..4ea8189
--- /dev/null
+++ b/model/ndn-l3-protocol.cpp
@@ -0,0 +1,141 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ndn-l3-protocol.hpp"
+
+#include "ns3/packet.h"
+#include "ns3/node.h"
+#include "ns3/log.h"
+#include "ns3/callback.h"
+#include "ns3/uinteger.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/object-vector.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/random-variable.h"
+
+#include "ndn-face.hpp"
+#include "ndn-net-device-face.hpp"
+
+#include <boost/foreach.hpp>
+
+NS_LOG_COMPONENT_DEFINE("ndn.L3Protocol");
+
+namespace ns3 {
+namespace ndn {
+
+const uint16_t L3Protocol::ETHERNET_FRAME_TYPE = 0x7777;
+const uint16_t L3Protocol::IP_STACK_PORT = 9695;
+
+NS_OBJECT_ENSURE_REGISTERED(L3Protocol);
+
+TypeId
+L3Protocol::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::L3Protocol")
+      .SetGroupName("ndn")
+      .SetParent<Object>()
+      .AddConstructor<L3Protocol>()
+    ;
+      // .AddAttribute("FaceList", "List of faces associated with ndn stack", ObjectVectorValue(),
+      //               MakeObjectVectorAccessor(&L3Protocol::m_faces),
+      //               MakeObjectVectorChecker<Face>());
+  return tid;
+}
+
+L3Protocol::L3Protocol()
+{
+  NS_LOG_FUNCTION(this);
+}
+
+L3Protocol::~L3Protocol()
+{
+  NS_LOG_FUNCTION(this);
+}
+
+/*
+ * This method is called by AddAgregate and completes the aggregation
+ * by setting the node in the ndn stack
+ */
+void
+L3Protocol::NotifyNewAggregate()
+{
+  // not really efficient, but this will work only once
+  if (m_node == 0) {
+    m_node = GetObject<Node>();
+    if (m_node != 0) {
+    }
+  }
+
+  Object::NotifyNewAggregate ();
+}
+
+void
+L3Protocol::DoDispose(void)
+{
+  NS_LOG_FUNCTION(this);
+
+  m_node = 0;
+
+  Object::DoDispose();
+}
+
+uint32_t
+L3Protocol::AddFace(const shared_ptr<Face>& face)
+{
+  NS_LOG_FUNCTION(this << &face);
+
+  return 0;
+}
+
+void
+L3Protocol::RemoveFace(shared_ptr<Face> face)
+{
+  NS_LOG_FUNCTION(this << std::cref(*face));
+}
+
+shared_ptr<Face>
+L3Protocol::GetFace(uint32_t index) const
+{
+  return nullptr;
+}
+
+shared_ptr<Face>
+L3Protocol::GetFaceById(uint32_t index) const
+{
+  return nullptr;
+}
+
+shared_ptr<Face>
+L3Protocol::GetFaceByNetDevice(Ptr<NetDevice> netDevice) const
+{
+  return nullptr;
+}
+
+uint32_t
+L3Protocol::GetNFaces(void) const
+{
+  return 0;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/model/ndn-l3-protocol.hpp b/model/ndn-l3-protocol.hpp
new file mode 100644
index 0000000..73ca77b
--- /dev/null
+++ b/model/ndn-l3-protocol.hpp
@@ -0,0 +1,161 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_L3_PROTOCOL_H
+#define NDN_L3_PROTOCOL_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include <list>
+#include <vector>
+
+#include "ns3/ptr.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+
+namespace ns3 {
+
+class Packet;
+class NetDevice;
+class Node;
+class Header;
+
+namespace ndn {
+
+class Face;
+
+/**
+ * \defgroup ndn ndnSIM: NDN simulation module
+ *
+ * This is a modular implementation of NDN protocol for NS-3
+ */
+/**
+ * \ingroup ndn
+ * \brief Implementation network-layer of NDN stack
+ *
+ * This class defines the API to manipulate the following aspects of
+ * the NDN stack implementation:
+ * -# register a face (Face-derived object) for use by the NDN
+ *    layer
+ *
+ * Each Face-derived object has conceptually a single NDN
+ * interface associated with it.
+ *
+ * In addition, this class defines NDN packet coding constants
+ *
+ * \see Face, ForwardingStrategy
+ */
+class L3Protocol : public Object {
+public:
+  typedef std::vector<shared_ptr<Face>> FaceList;
+
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static TypeId
+  GetTypeId();
+
+  static const uint16_t ETHERNET_FRAME_TYPE; ///< @brief Ethernet Frame Type of Ndn
+  static const uint16_t IP_STACK_PORT;       ///< @brief TCP/UDP port for NDN stack
+  // static const uint16_t IP_PROTOCOL_TYPE;    ///< \brief IP protocol type of NDN
+
+  /**
+   * \brief Default constructor. Creates an empty stack without forwarding strategy set
+   */
+  L3Protocol();
+  virtual ~L3Protocol();
+
+  /**
+   * \brief Add face to Ndn stack
+   *
+   * \param face smart pointer to NdnFace-derived object
+   * (NdnLocalFace, NdnNetDeviceFace, NdnUdpFace) \returns the
+   * index of the Ndn interface added.
+   *
+   * \see NdnLocalFace, NdnNetDeviceFace, NdnUdpFace
+   */
+  virtual uint32_t
+  AddFace(const shared_ptr<Face>& face);
+
+  /**
+   * \brief Get current number of faces added to Ndn stack
+   *
+   * \returns the number of faces
+   */
+  virtual uint32_t
+  GetNFaces() const;
+
+  /**
+   * \brief Get face by face index
+   * \param face The face number (number in face list)
+   * \returns The NdnFace associated with the Ndn face number.
+   */
+  virtual shared_ptr<Face>
+  GetFace(uint32_t face) const;
+
+  /**
+   * \brief Get face by face ID
+   * \param face The face ID number
+   * \returns The NdnFace associated with the Ndn face number.
+   */
+  virtual shared_ptr<Face>
+  GetFaceById(uint32_t face) const;
+
+  /**
+   * \brief Remove face from ndn stack (remove callbacks)
+   */
+  virtual void
+  RemoveFace(shared_ptr<Face> face);
+
+  /**
+   * \brief Get face for NetDevice
+   */
+  virtual shared_ptr<Face>
+  GetFaceByNetDevice(Ptr<NetDevice> netDevice) const;
+
+protected:
+  virtual void
+  DoDispose(void); ///< @brief Do cleanup
+
+  /**
+   * This function will notify other components connected to the node that a new stack member is now
+   * connected
+   * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them
+   * together.
+   */
+  virtual void
+  NotifyNewAggregate();
+
+private:
+  L3Protocol(const L3Protocol&); ///< copy constructor is disabled
+
+  L3Protocol&
+  operator=(const L3Protocol&); ///< copy operator is disabled
+
+private:
+  Ptr<Node> m_node; ///< \brief node on which ndn stack is installed
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif /* NDN_L3_PROTOCOL_H */
diff --git a/model/ndn-net-device-face.cpp b/model/ndn-net-device-face.cpp
new file mode 100644
index 0000000..ae9de5d
--- /dev/null
+++ b/model/ndn-net-device-face.cpp
@@ -0,0 +1,83 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *
+ */
+
+#include "ndn-net-device-face.hpp"
+#include "ndn-l3-protocol.hpp"
+
+#include "ns3/net-device.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/node.h"
+#include "ns3/pointer.h"
+
+// #include "ns3/address.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/channel.h"
+
+NS_LOG_COMPONENT_DEFINE("ndn.NetDeviceFace");
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * By default, Ndn face are created in the "down" state.  Before
+ * becoming useable, the user must invoke SetUp on the face
+ */
+NetDeviceFace::NetDeviceFace(Ptr<Node> node, const Ptr<NetDevice>& netDevice)
+  // : Face(node)
+  : m_netDevice(netDevice)
+{
+  NS_LOG_FUNCTION(this << netDevice);
+
+  // SetMetric(1); // default metric
+
+  NS_ASSERT_MSG(m_netDevice != 0, "NetDeviceFace needs to be assigned a valid NetDevice");
+}
+
+NetDeviceFace::~NetDeviceFace()
+{
+  NS_LOG_FUNCTION_NOARGS();
+}
+
+Ptr<NetDevice>
+NetDeviceFace::GetNetDevice() const
+{
+  return m_netDevice;
+}
+
+bool
+NetDeviceFace::Send(Ptr<Packet> packet)
+{
+  return false;
+}
+
+// callback
+void
+NetDeviceFace::ReceiveFromNetDevice(Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol,
+                                    const Address& from, const Address& to,
+                                    NetDevice::PacketType packetType)
+{
+  NS_LOG_FUNCTION(device << p << protocol << from << to << packetType);
+  // Receive(p);
+}
+
+} // namespace ndnsim
+} // namespace ns3
diff --git a/model/ndn-net-device-face.hpp b/model/ndn-net-device-face.hpp
new file mode 100644
index 0000000..f832b52
--- /dev/null
+++ b/model/ndn-net-device-face.hpp
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_NET_DEVICE_FACE_H
+#define NDN_NET_DEVICE_FACE_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-face.hpp"
+#include "ns3/net-device.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * \ingroup ndn-face
+ * \brief Implementation of layer-2 (Ethernet) Ndn face
+ *
+ * This class defines basic functionality of Ndn face. Face is core
+ * component responsible for actual delivery of data packet to and
+ * from Ndn stack
+ *
+ * NdnNetDevice face is permanently associated with one NetDevice
+ * object and this object cannot be changed for the lifetime of the
+ * face
+ *
+ * \see NdnAppFace, NdnNetDeviceFace, NdnIpv4Face, NdnUdpFace
+ */
+class NetDeviceFace : public Face {
+public:
+  /**
+   * \brief Constructor
+   *
+   * @param node Node associated with the face
+   * @param netDevice a smart pointer to NetDevice object to which
+   * this face will be associate
+   */
+  NetDeviceFace(Ptr<Node> node, const Ptr<NetDevice>& netDevice);
+  virtual ~NetDeviceFace();
+
+protected:
+  virtual bool
+  Send(Ptr<Packet> p);
+
+public:
+  /**
+   * \brief Get NetDevice associated with the face
+   *
+   * \returns smart pointer to NetDevice associated with the face
+   */
+  Ptr<NetDevice>
+  GetNetDevice() const;
+
+private:
+  /// \brief callback from lower layers
+  void
+  ReceiveFromNetDevice(Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol,
+                       const Address& from, const Address& to, NetDevice::PacketType packetType);
+
+private:
+  Ptr<NetDevice> m_netDevice; ///< \brief Smart pointer to NetDevice
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_NET_DEVICE_FACE_H
diff --git a/model/ndn-ns3.cpp b/model/ndn-ns3.cpp
new file mode 100644
index 0000000..c7d6c29
--- /dev/null
+++ b/model/ndn-ns3.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#include "ndn-ns3.hpp"
+
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/data.hpp>
+
+#include "ndn-header.hpp"
+#include "../utils/ndn-ns3-packet-tag.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+template<class T>
+std::shared_ptr<const T>
+Convert::FromPacket(Ptr<Packet> packet)
+{
+  PacketHeader<T> header;
+  packet->RemoveHeader(header);
+
+  auto pkt = header.getPacket();
+  pkt->setTag(make_shared<Ns3PacketTag>(packet));
+
+  return pkt;
+}
+
+template std::shared_ptr<const Interest>
+Convert::FromPacket<Interest>(Ptr<Packet> packet);
+
+template std::shared_ptr<const Data>
+Convert::FromPacket<Data>(Ptr<Packet> packet);
+
+template<class T>
+Ptr<Packet>
+Convert::ToPacket(const T& pkt)
+{
+  PacketHeader<T> header(pkt);
+
+  Ptr<Packet> packet;
+
+  auto tag = pkt.template getTag<Ns3PacketTag>();
+  if (tag != nullptr) {
+    packet = tag->getPacket()->Copy();
+  }
+  else {
+    packet = Create<Packet>();
+  }
+
+  packet->AddHeader(header);
+  return packet;
+}
+
+template Ptr<Packet>
+Convert::ToPacket<Interest>(const Interest& packet);
+
+template Ptr<Packet>
+Convert::ToPacket<Data>(const Data& packet);
+
+uint32_t
+Convert::getPacketType(Ptr<const Packet> packet)
+{
+  uint8_t type;
+  uint32_t nRead = packet->CopyData(&type, 1);
+  if (nRead != 1) {
+    throw ::ndn::tlv::Error("Unknown header");
+  }
+
+  if (type == ::ndn::tlv::Interest || type == ::ndn::tlv::Data) {
+    return type;
+  }
+  else {
+    throw ::ndn::tlv::Error("Unknown header");
+  }
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/model/ndn-ns3.hpp b/model/ndn-ns3.hpp
new file mode 100644
index 0000000..1f8172f
--- /dev/null
+++ b/model/ndn-ns3.hpp
@@ -0,0 +1,46 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDN_NS3_HPP
+#define NDN_NS3_HPP
+
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+
+namespace ns3 {
+namespace ndn {
+
+class Convert {
+public:
+  template<class T>
+  static std::shared_ptr<const T>
+  FromPacket(Ptr<Packet> packet);
+
+  template<class T>
+  static Ptr<Packet>
+  ToPacket(const T& pkt);
+
+  static uint32_t
+  getPacketType(Ptr<const Packet> packet);
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif
diff --git a/ndn-all.hpp b/ndn-all.hpp
new file mode 100644
index 0000000..294e30b
--- /dev/null
+++ b/ndn-all.hpp
@@ -0,0 +1,61 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDNSIM_NDN_ALL_HPP
+#define NDNSIM_NDN_ALL_HPP
+
+// #include "ns3/ndnSIM/helper/ndn-app-helper.hpp"
+// #include "ns3/ndnSIM/helper/ndn-face-container.hpp"
+// #include "ns3/ndnSIM/helper/ndn-fib-helper.hpp"
+// #include "ns3/ndnSIM/helper/ndn-global-routing-helper.hpp"
+// #include "ns3/ndnSIM/helper/ndn-ip-faces-helper.hpp"
+// #include "ns3/ndnSIM/helper/ndn-link-control-helper.hpp"
+// #include "ns3/ndnSIM/helper/ndn-stack-helper.hpp"
+// #include "ns3/ndnSIM/helper/ndn-strategy-choice-helper.hpp"
+
+// #include "ns3/ndnSIM/utils/batches.hpp"
+// #include "ns3/ndnSIM/utils/topology/annotated-topology-reader.hpp"
+// #include "ns3/ndnSIM/utils/topology/rocketfuel-map-reader.hpp"
+// #include "ns3/ndnSIM/utils/topology/rocketfuel-weights-reader.hpp"
+// #include "ns3/ndnSIM/utils/tracers/l2-rate-tracer.hpp"
+// #include "ns3/ndnSIM/utils/tracers/l2-tracer.hpp"
+// #include "ns3/ndnSIM/utils/tracers/ndn-app-delay-tracer.hpp"
+// #include "ns3/ndnSIM/utils/tracers/ndn-cs-tracer.hpp"
+// #include "ns3/ndnSIM/utils/tracers/ndn-l3-aggregate-tracer.hpp"
+// #include "ns3/ndnSIM/utils/tracers/ndn-l3-rate-tracer.hpp"
+// #include "ns3/ndnSIM/utils/tracers/ndn-l3-tracer.hpp"
+
+// #include "ns3/ndnSIM/model/ndn-app-face.hpp"
+// #include "ns3/ndnSIM/model/ndn-common.hpp"
+// #include "ns3/ndnSIM/model/ndn-global-router.hpp"
+// #include "ns3/ndnSIM/model/ndn-header.hpp"
+// #include "ns3/ndnSIM/model/ndn-l3-protocol.hpp"
+// #include "ns3/ndnSIM/model/ndn-net-device-face.hpp"
+// #include "ns3/ndnSIM/model/ndn-ns3.hpp"
+
+// #include "ns3/ndnSIM/apps/callback-based-app.hpp"
+// #include "ns3/ndnSIM/apps/ndn-app.hpp"
+// #include "ns3/ndnSIM/apps/ndn-consumer-batches.hpp"
+// #include "ns3/ndnSIM/apps/ndn-consumer-cbr.hpp"
+// #include "ns3/ndnSIM/apps/ndn-consumer-window.hpp"
+// #include "ns3/ndnSIM/apps/ndn-consumer-zipf-mandelbrot.hpp"
+// #include "ns3/ndnSIM/apps/ndn-consumer.hpp"
+// #include "ns3/ndnSIM/apps/ndn-producer.hpp"
+
+#endif // NDNSIM_NDN_ALL_HPP
diff --git a/utils/batches.cpp b/utils/batches.cpp
new file mode 100644
index 0000000..6f593e3
--- /dev/null
+++ b/utils/batches.cpp
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011,2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "batches.hpp"
+
+namespace ns3 {
+
+ATTRIBUTE_HELPER_CPP(Batches);
+
+std::ostream&
+operator<<(std::ostream& os, const Batches& batch)
+{
+  for (Batches::const_iterator i = batch.begin(); i != batch.end(); i++)
+    os << i->get<0>() << " " << i->get<1>() << " ";
+
+  return os;
+}
+
+/**
+ * \brief Read components from input and add them to components. Will read input stream till eof
+ * Substrings separated by slashes will become separate components
+ */
+std::istream&
+operator>>(std::istream& is, Batches& batch)
+{
+  Time time;
+  uint32_t amount;
+  while (!is.eof()) {
+    is >> time >> amount;
+    batch.Add(time, amount);
+    // std::cout << time << ", " << amount << ". \n";
+  }
+
+  is.clear();
+  return is;
+}
+}
diff --git a/utils/batches.hpp b/utils/batches.hpp
new file mode 100644
index 0000000..457210f
--- /dev/null
+++ b/utils/batches.hpp
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011,2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef _BATCHES_H_
+#define _BATCHES_H_
+
+#include "ns3/attribute.h"
+#include "ns3/attribute-helper.h"
+#include "ns3/nstime.h"
+#include <list>
+#include <boost/tuple/tuple.hpp>
+
+namespace ns3 {
+
+/**
+ * @ingroup ndn-apps
+ * @brief Class representing sets of (time, number) tuples with support of reading writing to
+ * streams
+ */
+class Batches : public std::list<boost::tuple<Time, uint32_t>> {
+public:
+  /**
+   * @brief Default constructor
+   */
+  Batches(){};
+
+  /**
+   * @brief Add tuple
+   * @param when   time for the tuple
+   * @param amount number for the tuple
+   */
+  void
+  Add(const Time& when, uint32_t amount)
+  {
+    push_back(boost::make_tuple<Time, uint32_t>(when, amount));
+  }
+};
+
+ATTRIBUTE_HELPER_HEADER(Batches);
+
+/**
+ * @brief Output contents of the Batches to the std::ostream
+ * @param os reference to std::ostream
+ * @param batch constant reference to Batch object
+ */
+std::ostream&
+operator<<(std::ostream& os, const Batches& batch);
+
+/**
+ * \brief Read components from input and add them to components. Will read input stream till eof
+ * Substrings separated by slashes will become separate components
+ */
+std::istream&
+operator>>(std::istream& is, Batches& batch);
+
+} // namespace ns3
+
+#endif // _BATCHES_H_
diff --git a/utils/mem-usage.hpp b/utils/mem-usage.hpp
new file mode 100644
index 0000000..e58b9ad
--- /dev/null
+++ b/utils/mem-usage.hpp
@@ -0,0 +1,100 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef MEM_USAGE_H
+#define MEM_USAGE_H
+
+#ifdef __linux__
+// #include <proc/readproc.h>
+// #include <unistd.h>
+// // #include <sys/resource.h>
+#include <sys/sysinfo.h>
+#endif
+
+#ifdef __APPLE__
+#include <mach/task.h>
+#include <mach/mach_traps.h>
+#include <mach/mach.h>
+#include <unistd.h>
+#include <err.h>
+#include <sys/param.h>
+#include <mach-o/ldsyms.h>
+#endif
+
+/**
+ * @ingroup ndn-helpers
+ * @brief Utility class to evaluate current usage of RAM
+ */
+class MemUsage {
+public:
+  /**
+   * @brief Get memory utilization in bytes
+   */
+  static inline int64_t
+  Get()
+  {
+#if defined(__linux__)
+    /*
+    /proc/[pid]/statm
+                  Provides information about memory usage, measured in pages.  The
+                  columns are:
+
+                      size       (1) total program size
+                                 (same as VmSize in /proc/[pid]/status)
+                      resident   (2) resident set size
+                                 (same as VmRSS in /proc/[pid]/status)
+                      share      (3) shared pages (i.e., backed by a file)
+                      text       (4) text (code)
+                      lib        (5) library (unused in Linux 2.6)
+                      data       (6) data + stack
+                      dt         (7) dirty pages (unused in Linux 2.6)
+
+    Reference: http://man7.org/linux/man-pages/man5/proc.5.html
+    */
+    std::ifstream is("/proc/self/statm");
+    if (!is.bad() && !is.eof()) {
+      unsigned long vm;
+      unsigned long rss;
+      is >> vm  // the first number: virtual memory
+        >> rss; // the second number: resident set size
+
+      return rss * getpagesize();
+    }
+    else {
+      return -1;
+    }
+
+#elif defined(__APPLE__)
+    struct task_basic_info t_info;
+    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
+
+    if (KERN_SUCCESS
+        != task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)) {
+      return -1; // something is wrong
+    }
+
+    return t_info.resident_size;
+#endif
+    // other systems are not yet supported
+    return -1;
+  }
+};
+
+#endif // MEM_USAGE_H
diff --git a/utils/ndn-fw-hop-count-tag.cpp b/utils/ndn-fw-hop-count-tag.cpp
new file mode 100644
index 0000000..027bdfe
--- /dev/null
+++ b/utils/ndn-fw-hop-count-tag.cpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-fw-hop-count-tag.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+TypeId
+FwHopCountTag::GetTypeId()
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::FwHopCountTag").SetParent<Tag>().AddConstructor<FwHopCountTag>();
+  return tid;
+}
+
+TypeId
+FwHopCountTag::GetInstanceTypeId() const
+{
+  return FwHopCountTag::GetTypeId();
+}
+
+uint32_t
+FwHopCountTag::GetSerializedSize() const
+{
+  return sizeof(uint32_t);
+}
+
+void
+FwHopCountTag::Serialize(TagBuffer i) const
+{
+  i.WriteU32(m_hopCount);
+}
+
+void
+FwHopCountTag::Deserialize(TagBuffer i)
+{
+  m_hopCount = i.ReadU32();
+}
+
+void
+FwHopCountTag::Print(std::ostream& os) const
+{
+  os << m_hopCount;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/ndn-fw-hop-count-tag.hpp b/utils/ndn-fw-hop-count-tag.hpp
new file mode 100644
index 0000000..6b4920c
--- /dev/null
+++ b/utils/ndn-fw-hop-count-tag.hpp
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_FW_HOP_COUNT_TAG_H
+#define NDN_FW_HOP_COUNT_TAG_H
+
+#include "ns3/tag.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-fw
+ * @brief Packet tag that is used to track hop count for Interest-Data pairs
+ */
+class FwHopCountTag : public Tag {
+public:
+  static TypeId
+  GetTypeId(void);
+
+  /**
+   * @brief Default constructor
+   */
+  FwHopCountTag()
+    : m_hopCount(0){};
+
+  /**
+   * @brief Destructor
+   */
+  ~FwHopCountTag()
+  {
+  }
+
+  /**
+   * @brief Increment hop count
+   */
+  void
+  Increment()
+  {
+    m_hopCount++;
+  }
+
+  /**
+   * @brief Get value of hop count
+   */
+  uint32_t
+  Get() const
+  {
+    return m_hopCount;
+  }
+
+  ////////////////////////////////////////////////////////
+  // from ObjectBase
+  ////////////////////////////////////////////////////////
+  virtual TypeId
+  GetInstanceTypeId() const;
+
+  ////////////////////////////////////////////////////////
+  // from Tag
+  ////////////////////////////////////////////////////////
+
+  virtual uint32_t
+  GetSerializedSize() const;
+
+  virtual void
+  Serialize(TagBuffer i) const;
+
+  virtual void
+  Deserialize(TagBuffer i);
+
+  virtual void
+  Print(std::ostream& os) const;
+
+private:
+  uint32_t m_hopCount;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_FW_HOP_COUNT_TAG_H
diff --git a/utils/ndn-ns3-packet-tag.hpp b/utils/ndn-ns3-packet-tag.hpp
new file mode 100644
index 0000000..af9213f
--- /dev/null
+++ b/utils/ndn-ns3-packet-tag.hpp
@@ -0,0 +1,56 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDN_NS3_PACKET_TAG_HPP
+#define NDN_NS3_PACKET_TAG_HPP
+
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include <ndn-cxx/tag.hpp>
+
+namespace ns3 {
+namespace ndn {
+
+class Ns3PacketTag : public ::ndn::Tag {
+public:
+  static size_t
+  getTypeId()
+  {
+    return 0xaee87802; // md5("Ns3PacketTag")[0:8]
+  }
+
+  Ns3PacketTag(Ptr<const Packet> packet)
+    : m_packet(packet)
+  {
+  }
+
+  Ptr<const Packet>
+  getPacket() const
+  {
+    return m_packet;
+  }
+
+private:
+  Ptr<const Packet> m_packet;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_NS3_PACKET_TAG_HPP
diff --git a/utils/ndn-rtt-estimator.cpp b/utils/ndn-rtt-estimator.cpp
new file mode 100644
index 0000000..376c4ab
--- /dev/null
+++ b/utils/ndn-rtt-estimator.cpp
@@ -0,0 +1,256 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Author: Rajib Bhattacharjea<raj.b@gatech.edu>
+//
+
+// THIS IS A COPY OF rtt-estimator.cc from internet module with minor modifications
+
+// Ported from:
+// Georgia Tech Network Simulator - Round Trip Time Estimation Class
+// George F. Riley.  Georgia Tech, Spring 2002
+
+// Implements several variations of round trip time estimators
+
+#include <iostream>
+
+#include "ndn-rtt-estimator.hpp"
+#include "ns3/simulator.h"
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/uinteger.h"
+#include "ns3/log.h"
+
+NS_LOG_COMPONENT_DEFINE("ndn.RttEstimator");
+
+namespace ns3 {
+
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED(RttEstimator);
+
+TypeId
+RttEstimator::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::RttEstimator")
+      .SetParent<Object>()
+      .AddAttribute("MaxMultiplier", "Maximum RTO Multiplier", UintegerValue(64),
+                    MakeUintegerAccessor(&RttEstimator::m_maxMultiplier),
+                    MakeUintegerChecker<uint16_t>())
+      .AddAttribute("InitialEstimation", "Initial RTT estimation", TimeValue(Seconds(1.0)),
+                    MakeTimeAccessor(&RttEstimator::m_initialEstimatedRtt), MakeTimeChecker())
+      .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
+                    MakeTimeAccessor(&RttEstimator::SetMinRto, &RttEstimator::GetMinRto),
+                    MakeTimeChecker())
+      .AddAttribute("MaxRTO", "Maximum retransmit timeout value", TimeValue(Seconds(200.0)),
+                    MakeTimeAccessor(&RttEstimator::SetMaxRto, &RttEstimator::GetMaxRto),
+                    MakeTimeChecker());
+  return tid;
+}
+
+void
+RttEstimator::SetMinRto(Time minRto)
+{
+  NS_LOG_FUNCTION(this << minRto);
+  m_minRto = minRto;
+}
+Time
+RttEstimator::GetMinRto(void) const
+{
+  return m_minRto;
+}
+
+void
+RttEstimator::SetMaxRto(Time maxRto)
+{
+  NS_LOG_FUNCTION(this << maxRto);
+  m_maxRto = maxRto;
+}
+Time
+RttEstimator::GetMaxRto(void) const
+{
+  return m_maxRto;
+}
+
+void
+RttEstimator::SetCurrentEstimate(Time estimate)
+{
+  NS_LOG_FUNCTION(this << estimate);
+  m_currentEstimatedRtt = estimate;
+}
+Time
+RttEstimator::GetCurrentEstimate(void) const
+{
+  return m_currentEstimatedRtt;
+}
+
+// RttHistory methods
+RttHistory::RttHistory(SequenceNumber32 s, uint32_t c, Time t)
+  : seq(s)
+  , count(c)
+  , time(t)
+  , retx(false)
+{
+  NS_LOG_FUNCTION(this);
+}
+
+RttHistory::RttHistory(const RttHistory& h)
+  : seq(h.seq)
+  , count(h.count)
+  , time(h.time)
+  , retx(h.retx)
+{
+  NS_LOG_FUNCTION(this);
+}
+
+// Base class methods
+
+RttEstimator::RttEstimator()
+  : m_next(1)
+  , m_nSamples(0)
+  , m_multiplier(1)
+  , m_history()
+{
+  NS_LOG_FUNCTION(this);
+  // note next=1 everywhere since first segment will have sequence 1
+
+  // We need attributes initialized here, not later, so use the
+  // ConstructSelf() technique documented in the manual
+  ObjectBase::ConstructSelf(AttributeConstructionList());
+  m_currentEstimatedRtt = m_initialEstimatedRtt;
+  NS_LOG_DEBUG("Initialize m_currentEstimatedRtt to " << m_currentEstimatedRtt.GetSeconds()
+                                                      << " sec.");
+}
+
+RttEstimator::RttEstimator(const RttEstimator& c)
+  : Object(c)
+  , m_next(c.m_next)
+  , m_maxMultiplier(c.m_maxMultiplier)
+  , m_initialEstimatedRtt(c.m_initialEstimatedRtt)
+  , m_currentEstimatedRtt(c.m_currentEstimatedRtt)
+  , m_minRto(c.m_minRto)
+  , m_maxRto(c.m_maxRto)
+  , m_nSamples(c.m_nSamples)
+  , m_multiplier(c.m_multiplier)
+  , m_history(c.m_history)
+{
+  NS_LOG_FUNCTION(this);
+}
+
+RttEstimator::~RttEstimator()
+{
+  NS_LOG_FUNCTION(this);
+}
+
+TypeId
+RttEstimator::GetInstanceTypeId(void) const
+{
+  return GetTypeId();
+}
+
+void
+RttEstimator::SentSeq(SequenceNumber32 seq, uint32_t size)
+{
+  NS_LOG_FUNCTION(this << seq << size);
+  // Note that a particular sequence has been sent
+  if (seq == m_next) { // This is the next expected one, just log at end
+    m_history.push_back(RttHistory(seq, size, Simulator::Now()));
+    m_next = seq + SequenceNumber32(size); // Update next expected
+  }
+  else { // This is a retransmit, find in list and mark as re-tx
+    for (RttHistory_t::iterator i = m_history.begin(); i != m_history.end(); ++i) {
+      if ((seq >= i->seq) && (seq < (i->seq + SequenceNumber32(i->count)))) { // Found it
+        i->retx = true;
+        // One final test..be sure this re-tx does not extend "next"
+        if ((seq + SequenceNumber32(size)) > m_next) {
+          m_next = seq + SequenceNumber32(size);
+          i->count = ((seq + SequenceNumber32(size)) - i->seq); // And update count in hist
+        }
+        break;
+      }
+    }
+  }
+}
+
+Time
+RttEstimator::AckSeq(SequenceNumber32 ackSeq)
+{
+  NS_LOG_FUNCTION(this << ackSeq);
+  // An ack has been received, calculate rtt and log this measurement
+  // Note we use a linear search (O(n)) for this since for the common
+  // case the ack'ed packet will be at the head of the list
+  Time m = Seconds(0.0);
+  if (m_history.size() == 0)
+    return (m); // No pending history, just exit
+  RttHistory& h = m_history.front();
+  if (!h.retx && ackSeq >= (h.seq + SequenceNumber32(h.count))) { // Ok to use this sample
+    m = Simulator::Now() - h.time;                                // Elapsed time
+    Measurement(m);                                               // Log the measurement
+    ResetMultiplier(); // Reset multiplier on valid measurement
+  }
+  // Now delete all ack history with seq <= ack
+  while (m_history.size() > 0) {
+    RttHistory& h = m_history.front();
+    if ((h.seq + SequenceNumber32(h.count)) > ackSeq)
+      break;               // Done removing
+    m_history.pop_front(); // Remove
+  }
+  return m;
+}
+
+void
+RttEstimator::ClearSent()
+{
+  NS_LOG_FUNCTION(this);
+  // Clear all history entries
+  m_next = 1;
+  m_history.clear();
+}
+
+void
+RttEstimator::IncreaseMultiplier()
+{
+  NS_LOG_FUNCTION(this);
+  m_multiplier = (m_multiplier * 2 < m_maxMultiplier) ? m_multiplier * 2 : m_maxMultiplier;
+  NS_LOG_DEBUG("Multiplier increased to " << m_multiplier);
+}
+
+void
+RttEstimator::ResetMultiplier()
+{
+  NS_LOG_FUNCTION(this);
+  m_multiplier = 1;
+}
+
+void
+RttEstimator::Reset()
+{
+  NS_LOG_FUNCTION(this);
+  // Reset to initial state
+  m_next = 1;
+  m_currentEstimatedRtt = m_initialEstimatedRtt;
+  m_history.clear(); // Remove all info from the history
+  m_nSamples = 0;
+  ResetMultiplier();
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/ndn-rtt-estimator.hpp b/utils/ndn-rtt-estimator.hpp
new file mode 100644
index 0000000..58cc754
--- /dev/null
+++ b/utils/ndn-rtt-estimator.hpp
@@ -0,0 +1,191 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Author: Rajib Bhattacharjea<raj.b@gatech.edu>
+//
+
+// Georgia Tech Network Simulator - Round Trip Time Estimation Class
+// George F. Riley.  Georgia Tech, Spring 2002
+
+// THIS IS A COPY OF rtt-estimator.h from internet module with minor modifications
+
+#ifndef NDN_RTT_ESTIMATOR_H
+#define NDN_RTT_ESTIMATOR_H
+
+#include <deque>
+#include "ns3/sequence-number.h"
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+
+namespace ns3 {
+
+namespace ndn {
+
+/**
+ * \ingroup ndn-apps
+ *
+ * \brief Helper class to store RTT measurements
+ */
+class RttHistory {
+public:
+  RttHistory(SequenceNumber32 s, uint32_t c, Time t);
+  RttHistory(const RttHistory& h); // Copy constructor
+public:
+  SequenceNumber32 seq; // First sequence number in packet sent
+  uint32_t count;       // Number of bytes sent
+  Time time;            // Time this one was sent
+  bool retx;            // True if this has been retransmitted
+};
+
+typedef std::deque<RttHistory> RttHistory_t;
+
+/**
+ * \ingroup tcp
+ *
+ * \brief Base class for all RTT Estimators
+ */
+class RttEstimator : public Object {
+public:
+  static TypeId
+  GetTypeId(void);
+
+  RttEstimator();
+  RttEstimator(const RttEstimator&);
+
+  virtual ~RttEstimator();
+
+  virtual TypeId
+  GetInstanceTypeId(void) const;
+
+  /**
+   * \brief Note that a particular sequence has been sent
+   * \param seq the packet sequence number.
+   * \param size the packet size.
+   */
+  virtual void
+  SentSeq(SequenceNumber32 seq, uint32_t size);
+
+  /**
+   * \brief Note that a particular ack sequence has been received
+   * \param ackSeq the ack sequence number.
+   * \return The measured RTT for this ack.
+   */
+  virtual Time
+  AckSeq(SequenceNumber32 ackSeq);
+
+  /**
+   * \brief Clear all history entries
+   */
+  virtual void
+  ClearSent();
+
+  /**
+   * \brief Add a new measurement to the estimator. Pure virtual function.
+   * \param t the new RTT measure.
+   */
+  virtual void
+  Measurement(Time t) = 0;
+
+  /**
+   * \brief Returns the estimated RTO. Pure virtual function.
+   * \return the estimated RTO.
+   */
+  virtual Time
+  RetransmitTimeout() = 0;
+
+  virtual Ptr<RttEstimator>
+  Copy() const = 0;
+
+  /**
+   * \brief Increase the estimation multiplier up to MaxMultiplier.
+   */
+  virtual void
+  IncreaseMultiplier();
+
+  /**
+   * \brief Resets the estimation multiplier to 1.
+   */
+  virtual void
+  ResetMultiplier();
+
+  /**
+   * \brief Resets the estimation to its initial state.
+   */
+  virtual void
+  Reset();
+
+  /**
+   * \brief Sets the Minimum RTO.
+   * \param minRto The minimum RTO returned by the estimator.
+   */
+  void
+  SetMinRto(Time minRto);
+
+  /**
+   * \brief Get the Minimum RTO.
+   * \return The minimum RTO returned by the estimator.
+   */
+  Time
+  GetMinRto(void) const;
+
+  /**
+   * \brief Sets the Maximum RTO.
+   * \param minRto The maximum RTO returned by the estimator.
+   */
+  void
+  SetMaxRto(Time maxRto);
+
+  /**
+   * \brief Get the Maximum RTO.
+   * \return The maximum RTO returned by the estimator.
+   */
+  Time
+  GetMaxRto(void) const;
+
+  /**
+   * \brief Sets the current RTT estimate (forcefully).
+   * \param estimate The current RTT estimate.
+   */
+  void
+  SetCurrentEstimate(Time estimate);
+
+  /**
+   * \brief gets the current RTT estimate.
+   * \return The current RTT estimate.
+   */
+  Time
+  GetCurrentEstimate(void) const;
+
+private:
+  SequenceNumber32 m_next; // Next expected sequence to be sent
+  uint16_t m_maxMultiplier;
+  Time m_initialEstimatedRtt;
+
+protected:
+  Time m_currentEstimatedRtt; // Current estimate
+  Time m_minRto;              // minimum value of the timeout
+  Time m_maxRto;              // maximum value of the timeout
+  uint32_t m_nSamples;        // Number of samples
+  uint16_t m_multiplier;      // RTO Multiplier
+  RttHistory_t m_history;     // List of sent packet
+};
+
+} // namespace ndn
+
+} // namespace ns3
+
+#endif /* RTT_ESTIMATOR_H */
diff --git a/utils/ndn-rtt-mean-deviation.cpp b/utils/ndn-rtt-mean-deviation.cpp
new file mode 100644
index 0000000..c6c7218
--- /dev/null
+++ b/utils/ndn-rtt-mean-deviation.cpp
@@ -0,0 +1,190 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+//           (c) 2013 University of Arizona
+//           (c) 2013 University of California, Los Angeles
+//
+// 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: Rajib Bhattacharjea<raj.b@gatech.edu>
+//         Cheng Yi <yic@email.arizona.edu>
+//         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+//
+
+// Georgia Tech Network Simulator - Round Trip Time Estimation Class
+// George F. Riley.  Georgia Tech, Spring 2002
+
+#include "ndn-rtt-mean-deviation.hpp"
+#include "ns3/simulator.h"
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/uinteger.h"
+#include "ns3/log.h"
+
+NS_LOG_COMPONENT_DEFINE("ndn.RttMeanDeviation");
+
+namespace ns3 {
+namespace ndn {
+
+//---------------------------------------------------------------------------------
+// A modified version of Mean-Deviation Estimator optimized for NDN packet delivery
+
+NS_OBJECT_ENSURE_REGISTERED(RttMeanDeviation);
+
+TypeId
+RttMeanDeviation::GetTypeId(void)
+{
+  static TypeId tid =
+    TypeId("ns3::ndn::RttMeanDeviation")
+      .SetParent<RttEstimator>()
+      .AddConstructor<RttMeanDeviation>()
+      .AddAttribute("Gain", "Gain used in estimating the RTT (smoothed RTT), must be 0 < Gain < 1",
+                    DoubleValue(0.125), MakeDoubleAccessor(&RttMeanDeviation::m_gain),
+                    MakeDoubleChecker<double>())
+      .AddAttribute("Gain2", "Gain2 used in estimating the RTT (variance), must be 0 < Gain2 < 1",
+                    DoubleValue(0.25), MakeDoubleAccessor(&RttMeanDeviation::m_gain2),
+                    MakeDoubleChecker<double>());
+  return tid;
+}
+
+RttMeanDeviation::RttMeanDeviation()
+  : m_variance(0)
+{
+  NS_LOG_FUNCTION(this);
+}
+
+RttMeanDeviation::RttMeanDeviation(const RttMeanDeviation& c)
+  : RttEstimator(c)
+  , m_gain(c.m_gain)
+  , m_gain2(c.m_gain2)
+  , m_variance(c.m_variance)
+{
+  NS_LOG_FUNCTION(this);
+}
+
+TypeId
+RttMeanDeviation::GetInstanceTypeId(void) const
+{
+  return GetTypeId();
+}
+
+void
+RttMeanDeviation::Measurement(Time m)
+{
+  NS_LOG_FUNCTION(this << m);
+  if (m_nSamples) { // Not first
+    Time err(m - m_currentEstimatedRtt);
+    double gErr = err.ToDouble(Time::S) * m_gain;
+    m_currentEstimatedRtt += Time::FromDouble(gErr, Time::S);
+    Time difference = Abs(err) - m_variance;
+    NS_LOG_DEBUG(
+      "m_variance += " << Time::FromDouble(difference.ToDouble(Time::S) * m_gain2, Time::S));
+    m_variance += Time::FromDouble(difference.ToDouble(Time::S) * m_gain2, Time::S);
+  }
+  else {                       // First sample
+    m_currentEstimatedRtt = m; // Set estimate to current
+    // variance = sample / 2;               // And variance to current / 2
+    // m_variance = m; // try this  why????
+    m_variance = Seconds(m.ToDouble(Time::S) / 2);
+    NS_LOG_DEBUG("(first sample) m_variance += " << m);
+  }
+  m_nSamples++;
+}
+
+Time
+RttMeanDeviation::RetransmitTimeout()
+{
+  NS_LOG_FUNCTION(this);
+
+  double retval = std::min(m_maxRto.ToDouble(Time::S),
+                           std::max(m_multiplier * m_minRto.ToDouble(Time::S),
+                                    m_multiplier * (m_currentEstimatedRtt.ToDouble(Time::S)
+                                                    + 4 * m_variance.ToDouble(Time::S))));
+
+  NS_LOG_DEBUG("RetransmitTimeout:  return " << retval);
+
+  return Seconds(retval);
+}
+
+Ptr<RttEstimator>
+RttMeanDeviation::Copy() const
+{
+  NS_LOG_FUNCTION(this);
+  return CopyObject<RttMeanDeviation>(this);
+}
+
+void
+RttMeanDeviation::Reset()
+{
+  NS_LOG_FUNCTION(this);
+  // Reset to initial state
+  m_variance = Seconds(0);
+  RttEstimator::Reset();
+}
+
+void
+RttMeanDeviation::Gain(double g)
+{
+  NS_LOG_FUNCTION(this);
+  NS_ASSERT_MSG((g > 0) && (g < 1),
+                "RttMeanDeviation: Gain must be less than 1 and greater than 0");
+  m_gain = g;
+}
+
+void
+RttMeanDeviation::SentSeq(SequenceNumber32 seq, uint32_t size)
+{
+  NS_LOG_FUNCTION(this << seq << size);
+
+  RttHistory_t::iterator i;
+  for (i = m_history.begin(); i != m_history.end(); ++i) {
+    if (seq == i->seq) { // Found it
+      i->retx = true;
+      break;
+    }
+  }
+
+  // Note that a particular sequence has been sent
+  if (i == m_history.end())
+    m_history.push_back(RttHistory(seq, size, Simulator::Now()));
+}
+
+Time
+RttMeanDeviation::AckSeq(SequenceNumber32 ackSeq)
+{
+  NS_LOG_FUNCTION(this << ackSeq);
+  // An ack has been received, calculate rtt and log this measurement
+  // Note we use a linear search (O(n)) for this since for the common
+  // case the ack'ed packet will be at the head of the list
+  Time m = Seconds(0.0);
+  if (m_history.size() == 0)
+    return (m); // No pending history, just exit
+
+  for (RttHistory_t::iterator i = m_history.begin(); i != m_history.end(); ++i) {
+    if (ackSeq == i->seq) { // Found it
+      if (!i->retx) {
+        m = Simulator::Now() - i->time; // Elapsed time
+        Measurement(m);                 // Log the measurement
+        ResetMultiplier();              // Reset multiplier on valid measurement
+      }
+      m_history.erase(i);
+      break;
+    }
+  }
+
+  return m;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/ndn-rtt-mean-deviation.hpp b/utils/ndn-rtt-mean-deviation.hpp
new file mode 100644
index 0000000..fdb6144
--- /dev/null
+++ b/utils/ndn-rtt-mean-deviation.hpp
@@ -0,0 +1,82 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+//           (c) 2013 University of Arizona
+//           (c) 2013 University of California, Los Angeles
+//
+// 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: Rajib Bhattacharjea<raj.b@gatech.edu>
+//         Cheng Yi <yic@email.arizona.edu>
+//         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+//
+
+// Georgia Tech Network Simulator - Round Trip Time Estimation Class
+// George F. Riley.  Georgia Tech, Spring 2002
+
+#ifndef NDN_RTT_MEAN_DEVIATION_H
+#define NDN_RTT_MEAN_DEVIATION_H
+
+#include "ndn-rtt-estimator.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * \ingroup ndn-apps
+ *
+ * \brief The modified version of "Mean--Deviation" RTT estimator, as discussed by Van Jacobson that
+ *better suits NDN communication model
+ *
+ * This class implements the "Mean--Deviation" RTT estimator, as discussed
+ * by Van Jacobson and Michael J. Karels, in
+ * "Congestion Avoidance and Control", SIGCOMM 88, Appendix A
+ *
+ */
+class RttMeanDeviation : public RttEstimator {
+public:
+  static TypeId
+  GetTypeId(void);
+
+  RttMeanDeviation();
+  RttMeanDeviation(const RttMeanDeviation&);
+
+  virtual TypeId
+  GetInstanceTypeId(void) const;
+
+  void
+  SentSeq(SequenceNumber32 seq, uint32_t size);
+  Time
+  AckSeq(SequenceNumber32 ackSeq);
+  void
+  Measurement(Time measure);
+  Time
+  RetransmitTimeout();
+  Ptr<RttEstimator>
+  Copy() const;
+  void
+  Reset();
+  void
+  Gain(double g);
+
+private:
+  double m_gain;   // Filter gain
+  double m_gain2;  // Filter gain
+  Time m_variance; // Current variance
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_RTT_MEAN_DEVIATION
diff --git a/utils/topology/annotated-topology-reader.cpp b/utils/topology/annotated-topology-reader.cpp
new file mode 100644
index 0000000..c64d823
--- /dev/null
+++ b/utils/topology/annotated-topology-reader.cpp
@@ -0,0 +1,561 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "annotated-topology-reader.hpp"
+
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/ipv4.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/ndn-l3-protocol.hpp"
+#include "ns3/ndn-face.hpp"
+#include "ns3/random-variable.h"
+#include "ns3/error-model.h"
+
+#include "ns3/constant-position-mobility-model.h"
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/graphviz.hpp>
+
+#include <set>
+
+#ifdef NS3_MPI
+#include <ns3/mpi-interface.h>
+#endif
+
+using namespace std;
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE("AnnotatedTopologyReader");
+
+AnnotatedTopologyReader::AnnotatedTopologyReader(const std::string& path, double scale /*=1.0*/)
+  : m_path(path)
+  , m_randX(0, 100.0)
+  , m_randY(0, 100.0)
+  , m_scale(scale)
+  , m_requiredPartitions(1)
+{
+  NS_LOG_FUNCTION(this);
+
+  SetMobilityModel("ns3::ConstantPositionMobilityModel");
+}
+
+void
+AnnotatedTopologyReader::SetBoundingBox(double ulx, double uly, double lrx, double lry)
+{
+  NS_LOG_FUNCTION(this << ulx << uly << lrx << lry);
+
+  m_randX = UniformVariable(ulx, lrx);
+  m_randY = UniformVariable(uly, lry);
+}
+
+void
+AnnotatedTopologyReader::SetMobilityModel(const std::string& model)
+{
+  NS_LOG_FUNCTION(this << model);
+  m_mobilityFactory.SetTypeId(model);
+}
+
+AnnotatedTopologyReader::~AnnotatedTopologyReader()
+{
+  NS_LOG_FUNCTION(this);
+}
+
+Ptr<Node>
+AnnotatedTopologyReader::CreateNode(const std::string name, uint32_t systemId)
+{
+  NS_LOG_FUNCTION(this << name);
+  m_requiredPartitions = std::max(m_requiredPartitions, systemId + 1);
+
+  Ptr<Node> node = CreateObject<Node>(systemId);
+
+  Names::Add(m_path, name, node);
+  m_nodes.Add(node);
+
+  return node;
+}
+
+Ptr<Node>
+AnnotatedTopologyReader::CreateNode(const std::string name, double posX, double posY,
+                                    uint32_t systemId)
+{
+  NS_LOG_FUNCTION(this << name << posX << posY);
+  m_requiredPartitions = std::max(m_requiredPartitions, systemId + 1);
+
+  Ptr<Node> node = CreateObject<Node>(systemId);
+  Ptr<MobilityModel> loc = DynamicCast<MobilityModel>(m_mobilityFactory.Create());
+  node->AggregateObject(loc);
+
+  loc->SetPosition(Vector(posX, posY, 0));
+
+  Names::Add(m_path, name, node);
+  m_nodes.Add(node);
+
+  return node;
+}
+
+NodeContainer
+AnnotatedTopologyReader::GetNodes() const
+{
+  return m_nodes;
+}
+
+const std::list<TopologyReader::Link>&
+AnnotatedTopologyReader::GetLinks() const
+{
+  return m_linksList;
+}
+
+NodeContainer
+AnnotatedTopologyReader::Read(void)
+{
+  ifstream topgen;
+  topgen.open(GetFileName().c_str());
+
+  if (!topgen.is_open() || !topgen.good()) {
+    NS_FATAL_ERROR("Cannot open file " << GetFileName() << " for reading");
+    return m_nodes;
+  }
+
+  while (!topgen.eof()) {
+    string line;
+    getline(topgen, line);
+
+    if (line == "router")
+      break;
+  }
+
+  if (topgen.eof()) {
+    NS_FATAL_ERROR("Topology file " << GetFileName() << " does not have \"router\" section");
+    return m_nodes;
+  }
+
+  while (!topgen.eof()) {
+    string line;
+    getline(topgen, line);
+    if (line[0] == '#')
+      continue; // comments
+    if (line == "link")
+      break; // stop reading nodes
+
+    istringstream lineBuffer(line);
+    string name, city;
+    double latitude = 0, longitude = 0;
+    uint32_t systemId = 0;
+
+    lineBuffer >> name >> city >> latitude >> longitude >> systemId;
+    if (name.empty())
+      continue;
+
+    Ptr<Node> node;
+
+    if (abs(latitude) > 0.001 && abs(latitude) > 0.001)
+      node = CreateNode(name, m_scale * longitude, -m_scale * latitude, systemId);
+    else {
+      UniformVariable var(0, 200);
+      node = CreateNode(name, var.GetValue(), var.GetValue(), systemId);
+      // node = CreateNode (name, systemId);
+    }
+  }
+
+  map<string, set<string>> processedLinks; // to eliminate duplications
+
+  if (topgen.eof()) {
+    NS_LOG_ERROR("Topology file " << GetFileName() << " does not have \"link\" section");
+    return m_nodes;
+  }
+
+  // SeekToSection ("link");
+  while (!topgen.eof()) {
+    string line;
+    getline(topgen, line);
+    if (line == "")
+      continue;
+    if (line[0] == '#')
+      continue; // comments
+
+    // NS_LOG_DEBUG ("Input: [" << line << "]");
+
+    istringstream lineBuffer(line);
+    string from, to, capacity, metric, delay, maxPackets, lossRate;
+
+    lineBuffer >> from >> to >> capacity >> metric >> delay >> maxPackets >> lossRate;
+
+    if (processedLinks[to].size() != 0
+        && processedLinks[to].find(from) != processedLinks[to].end()) {
+      continue; // duplicated link
+    }
+    processedLinks[from].insert(to);
+
+    Ptr<Node> fromNode = Names::Find<Node>(m_path, from);
+    NS_ASSERT_MSG(fromNode != 0, from << " node not found");
+    Ptr<Node> toNode = Names::Find<Node>(m_path, to);
+    NS_ASSERT_MSG(toNode != 0, to << " node not found");
+
+    Link link(fromNode, from, toNode, to);
+
+    link.SetAttribute("DataRate", capacity);
+    link.SetAttribute("OSPF", metric);
+
+    if (!delay.empty())
+      link.SetAttribute("Delay", delay);
+    if (!maxPackets.empty())
+      link.SetAttribute("MaxPackets", maxPackets);
+
+    // Saran Added lossRate
+    if (!lossRate.empty())
+      link.SetAttribute("LossRate", lossRate);
+
+    AddLink(link);
+    NS_LOG_DEBUG("New link " << from << " <==> " << to << " / " << capacity << " with " << metric
+                             << " metric (" << delay << ", " << maxPackets << ", " << lossRate
+                             << ")");
+  }
+
+  NS_LOG_INFO("Annotated topology created with " << m_nodes.GetN() << " nodes and " << LinksSize()
+                                                 << " links");
+  topgen.close();
+
+  ApplySettings();
+
+  return m_nodes;
+}
+
+void
+AnnotatedTopologyReader::AssignIpv4Addresses(Ipv4Address base)
+{
+  Ipv4AddressHelper address(base, Ipv4Mask("/24"));
+
+  BOOST_FOREACH (const Link& link, m_linksList) {
+    address.Assign(NetDeviceContainer(link.GetFromNetDevice(), link.GetToNetDevice()));
+
+    base = Ipv4Address(base.Get() + 256);
+    address.SetBase(base, Ipv4Mask("/24"));
+  }
+}
+
+void
+AnnotatedTopologyReader::ApplyOspfMetric()
+{
+  BOOST_FOREACH (const Link& link, m_linksList) {
+    NS_LOG_DEBUG("OSPF: " << link.GetAttribute("OSPF"));
+    uint16_t metric = boost::lexical_cast<uint16_t>(link.GetAttribute("OSPF"));
+
+    {
+      Ptr<Ipv4> ipv4 = link.GetFromNode()->GetObject<Ipv4>();
+      if (ipv4 != 0) {
+        int32_t interfaceId = ipv4->GetInterfaceForDevice(link.GetFromNetDevice());
+        NS_ASSERT(interfaceId >= 0);
+
+        ipv4->SetMetric(interfaceId, metric);
+      }
+
+      Ptr<ndn::L3Protocol> ndn = link.GetFromNode()->GetObject<ndn::L3Protocol>();
+      if (ndn != 0) {
+        Ptr<ndn::Face> face = ndn->GetFaceByNetDevice(link.GetFromNetDevice());
+        NS_ASSERT(face != 0);
+
+        face->SetMetric(metric);
+      }
+    }
+
+    {
+      Ptr<Ipv4> ipv4 = link.GetToNode()->GetObject<Ipv4>();
+      if (ipv4 != 0) {
+        int32_t interfaceId = ipv4->GetInterfaceForDevice(link.GetToNetDevice());
+        NS_ASSERT(interfaceId >= 0);
+
+        ipv4->SetMetric(interfaceId, metric);
+      }
+
+      Ptr<ndn::L3Protocol> ndn = link.GetToNode()->GetObject<ndn::L3Protocol>();
+      if (ndn != 0) {
+        Ptr<ndn::Face> face = ndn->GetFaceByNetDevice(link.GetToNetDevice());
+        NS_ASSERT(face != 0);
+
+        face->SetMetric(metric);
+      }
+    }
+  }
+}
+
+void
+AnnotatedTopologyReader::ApplySettings()
+{
+#ifdef NS3_MPI
+  if (MpiInterface::IsEnabled() && MpiInterface::GetSize() != m_requiredPartitions) {
+    std::cerr << "MPI interface is enabled, but number of partitions (" << MpiInterface::GetSize()
+              << ") is not equal to number of partitions in the topology (" << m_requiredPartitions
+              << ")";
+    exit(-1);
+  }
+#endif
+
+  PointToPointHelper p2p;
+
+  BOOST_FOREACH (Link& link, m_linksList) {
+    // cout << "Link: " << Findlink.GetFromNode () << ", " << link.GetToNode () << endl;
+    string tmp;
+
+    ////////////////////////////////////////////////
+    if (link.GetAttributeFailSafe("MaxPackets", tmp)) {
+      NS_LOG_INFO("MaxPackets = " + link.GetAttribute("MaxPackets"));
+
+      try {
+        uint32_t maxPackets = boost::lexical_cast<uint32_t>(link.GetAttribute("MaxPackets"));
+
+        // compatibility mode. Only DropTailQueue is supported
+        p2p.SetQueue("ns3::DropTailQueue", "MaxPackets", UintegerValue(maxPackets));
+      }
+      catch (...) {
+        typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;
+        tokenizer tok(link.GetAttribute("MaxPackets"));
+
+        tokenizer::iterator token = tok.begin();
+        p2p.SetQueue(*token);
+
+        for (token++; token != tok.end(); token++) {
+          boost::escaped_list_separator<char> separator('\\', '=', '\"');
+          tokenizer attributeTok(*token, separator);
+
+          tokenizer::iterator attributeToken = attributeTok.begin();
+
+          string attribute = *attributeToken;
+          attributeToken++;
+
+          if (attributeToken == attributeTok.end()) {
+            NS_LOG_ERROR("Queue attribute [" << *token
+                                             << "] should be in form <Attribute>=<Value>");
+            continue;
+          }
+
+          string value = *attributeToken;
+
+          p2p.SetQueueAttribute(attribute, StringValue(value));
+        }
+      }
+    }
+
+    if (link.GetAttributeFailSafe("DataRate", tmp)) {
+      NS_LOG_INFO("DataRate = " + link.GetAttribute("DataRate"));
+      p2p.SetDeviceAttribute("DataRate", StringValue(link.GetAttribute("DataRate")));
+    }
+
+    if (link.GetAttributeFailSafe("Delay", tmp)) {
+      NS_LOG_INFO("Delay = " + link.GetAttribute("Delay"));
+      p2p.SetChannelAttribute("Delay", StringValue(link.GetAttribute("Delay")));
+    }
+
+    NetDeviceContainer nd = p2p.Install(link.GetFromNode(), link.GetToNode());
+    link.SetNetDevices(nd.Get(0), nd.Get(1));
+
+    ////////////////////////////////////////////////
+    if (link.GetAttributeFailSafe("LossRate", tmp)) {
+      NS_LOG_INFO("LinkError = " + link.GetAttribute("LossRate"));
+
+      typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;
+      tokenizer tok(link.GetAttribute("LossRate"));
+
+      tokenizer::iterator token = tok.begin();
+      ObjectFactory factory(*token);
+
+      for (token++; token != tok.end(); token++) {
+        boost::escaped_list_separator<char> separator('\\', '=', '\"');
+        tokenizer attributeTok(*token, separator);
+
+        tokenizer::iterator attributeToken = attributeTok.begin();
+
+        string attribute = *attributeToken;
+        attributeToken++;
+
+        if (attributeToken == attributeTok.end()) {
+          NS_LOG_ERROR("ErrorModel attribute [" << *token
+                                                << "] should be in form <Attribute>=<Value>");
+          continue;
+        }
+
+        string value = *attributeToken;
+
+        factory.Set(attribute, StringValue(value));
+      }
+
+      nd.Get(0)->SetAttribute("ReceiveErrorModel", PointerValue(factory.Create<ErrorModel>()));
+      nd.Get(1)->SetAttribute("ReceiveErrorModel", PointerValue(factory.Create<ErrorModel>()));
+    }
+  }
+}
+
+void
+AnnotatedTopologyReader::SaveTopology(const std::string& file)
+{
+  ofstream os(file.c_str(), ios::trunc);
+  os << "# any empty lines and lines starting with '#' symbol is ignored\n"
+     << "\n"
+     << "# The file should contain exactly two sections: router and link, each starting with the "
+        "corresponding keyword\n"
+     << "\n"
+     << "# router section defines topology nodes and their relative positions (e.g., to use in "
+        "visualizer)\n"
+     << "router\n"
+     << "\n"
+     << "# each line in this section represents one router and should have the following data\n"
+     << "# node  comment     yPos    xPos\n";
+
+  for (NodeContainer::Iterator node = m_nodes.Begin(); node != m_nodes.End(); node++) {
+    std::string name = Names::FindName(*node);
+    Ptr<MobilityModel> mobility = (*node)->GetObject<MobilityModel>();
+    Vector position = mobility->GetPosition();
+
+    os << name << "\t"
+       << "NA"
+       << "\t" << -position.y << "\t" << position.x << "\n";
+  }
+
+  os
+    << "# link section defines point-to-point links between nodes and characteristics of these "
+       "links\n"
+    << "\n"
+    << "link\n"
+    << "\n"
+    << "# Each line should be in the following format (only first two are required, the rest can "
+       "be omitted)\n"
+    << "# srcNode   dstNode     bandwidth   metric  delay   queue\n"
+    << "# bandwidth: link bandwidth\n"
+    << "# metric: routing metric\n"
+    << "# delay:  link delay\n"
+    << "# queue:  MaxPackets for transmission queue on the link (both directions)\n"
+    << "# error:  comma-separated list, specifying class for ErrorModel and necessary attributes\n";
+
+  for (std::list<Link>::const_iterator link = m_linksList.begin(); link != m_linksList.end();
+       link++) {
+    os << Names::FindName(link->GetFromNode()) << "\t";
+    os << Names::FindName(link->GetToNode()) << "\t";
+
+    string tmp;
+    if (link->GetAttributeFailSafe("DataRate", tmp))
+      os << link->GetAttribute("DataRate") << "\t";
+    else
+      NS_FATAL_ERROR("DataRate must be specified for the link");
+
+    if (link->GetAttributeFailSafe("OSPF", tmp))
+      os << link->GetAttribute("OSPF") << "\t";
+    else
+      os << "1\t";
+
+    if (link->GetAttributeFailSafe("Delay", tmp)) {
+      os << link->GetAttribute("Delay") << "\t";
+
+      if (link->GetAttributeFailSafe("MaxPackets", tmp)) {
+        os << link->GetAttribute("MaxPackets") << "\t";
+
+        if (link->GetAttributeFailSafe("LossRate", tmp)) {
+          os << link->GetAttribute("LossRate") << "\t";
+        }
+      }
+    }
+    os << "\n";
+  }
+}
+
+template<class Names>
+class name_writer {
+public:
+  name_writer(Names _names)
+    : names(_names)
+  {
+  }
+
+  template<class VertexOrEdge>
+  void
+  operator()(std::ostream& out, const VertexOrEdge& v) const
+  {
+    // out << "[label=\"" << names[v] << "\",style=filled,fillcolor=\"" << colors[v] << "\"]";
+    out << "[shape=\"circle\",width=0.1,label=\"\",style=filled,fillcolor=\"green\"]";
+  }
+
+private:
+  Names names;
+};
+
+template<class Names>
+inline name_writer<Names>
+make_name_writer(Names n)
+{
+  return name_writer<Names>(n);
+}
+
+void
+AnnotatedTopologyReader::SaveGraphviz(const std::string& file)
+{
+  typedef boost::adjacency_list_traits<boost::setS, boost::setS, boost::undirectedS> Traits;
+
+  typedef boost::property<boost::vertex_name_t, std::string,
+                          boost::property<boost::vertex_index_t, uint32_t>> nodeProperty;
+
+  typedef boost::no_property edgeProperty;
+
+  typedef boost::adjacency_list<boost::setS, boost::setS, boost::undirectedS, nodeProperty,
+                                edgeProperty> Graph;
+
+  typedef map<string, Traits::vertex_descriptor> node_map_t;
+  node_map_t graphNodes;
+  Graph graph;
+
+  for (NodeContainer::Iterator node = m_nodes.Begin(); node != m_nodes.End(); node++) {
+    std::pair<node_map_t::iterator, bool> retval = graphNodes.insert(
+      make_pair(Names::FindName(*node), add_vertex(nodeProperty(Names::FindName(*node)), graph)));
+    // NS_ASSERT (ok == true);
+
+    put(boost::vertex_index, graph, retval.first->second, (*node)->GetId());
+  }
+
+  for (std::list<Link>::const_iterator link = m_linksList.begin(); link != m_linksList.end();
+       link++) {
+    node_map_t::iterator from = graphNodes.find(Names::FindName(link->GetFromNode()));
+    node_map_t::iterator to = graphNodes.find(Names::FindName(link->GetToNode()));
+
+    // add_edge (node->second, otherNode->second, m_graph);
+    boost::add_edge(from->second, to->second, graph);
+  }
+
+  ofstream of(file.c_str());
+  boost::property_map<Graph, boost::vertex_name_t>::type names = get(boost::vertex_name, graph);
+  write_graphviz(of, graph, make_name_writer(names));
+}
+}
diff --git a/utils/topology/annotated-topology-reader.hpp b/utils/topology/annotated-topology-reader.hpp
new file mode 100644
index 0000000..d8679ed
--- /dev/null
+++ b/utils/topology/annotated-topology-reader.hpp
@@ -0,0 +1,152 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef __ANNOTATED_TOPOLOGY_READER_H__
+#define __ANNOTATED_TOPOLOGY_READER_H__
+
+#include "ns3/topology-reader.h"
+#include "ns3/random-variable.h"
+#include "ns3/object-factory.h"
+
+namespace ns3 {
+
+/**
+ * \brief This class reads annotated topology and apply settings to the corresponding nodes and
+ *links
+ *
+ */
+class AnnotatedTopologyReader : public TopologyReader {
+public:
+  /**
+   * \brief Constructor
+   *
+   * \param path ns3::Names path
+   * \param scale Scaling factor for coordinates in input file
+   *
+   * \see ns3::Names class
+   */
+  AnnotatedTopologyReader(const std::string& path = "", double scale = 1.0);
+  virtual ~AnnotatedTopologyReader();
+
+  /**
+   * \brief Main annotated topology reading function.
+   *
+   * This method opens an input stream and reads topology file with annotations.
+   *
+   * \return the container of the nodes created (or empty container if there was an error)
+   */
+  virtual NodeContainer
+  Read();
+
+  /**
+   * \brief Get nodes read by the reader
+   */
+  virtual NodeContainer
+  GetNodes() const;
+
+  /**
+   * \brief Get links read by the reader
+   */
+  virtual const std::list<Link>&
+  GetLinks() const;
+
+  /**
+   * \brief Assign IPv4 addresses to all links
+   *
+   * Note, IPv4 stack should be installed on all nodes prior this call
+   *
+   * Every link will receive /24 netmask
+   *
+   * \param base Starting IPv4 address (second link will have base+256)
+   */
+  virtual void
+  AssignIpv4Addresses(Ipv4Address base);
+
+  /**
+   * \brief Set bounding box where nodes will be randomly places (if positions are unspecified)
+   * \param ulx Upper left x coordinate
+   * \param uly Upper left y coordinate
+   * \param lrx Lower right x coordinate
+   * \param lry Lower right y coordinate
+   */
+  virtual void
+  SetBoundingBox(double ulx, double uly, double lrx, double lry);
+
+  /**
+   * \brief Set mobility model to be used on nodes
+   * \param model class name of the model
+   */
+  virtual void
+  SetMobilityModel(const std::string& model);
+
+  /**
+   * \brief Apply OSPF metric on Ipv4 (if exists) and Ccnx (if exists) stacks
+   */
+  virtual void
+  ApplyOspfMetric();
+
+  /**
+   * \brief Save positions (e.g., after manual modification using visualizer)
+   */
+  virtual void
+  SaveTopology(const std::string& file);
+
+  /**
+   * \brief Save topology in graphviz format (.dot file)
+   */
+  virtual void
+  SaveGraphviz(const std::string& file);
+
+protected:
+  Ptr<Node>
+  CreateNode(const std::string name, uint32_t systemId);
+
+  Ptr<Node>
+  CreateNode(const std::string name, double posX, double posY, uint32_t systemId);
+
+protected:
+  /**
+   * \brief This method applies setting to corresponding nodes and links
+   * NetDeviceContainer must be allocated
+   * NodeContainer from Read method
+   */
+  void
+  ApplySettings();
+
+protected:
+  std::string m_path;
+  NodeContainer m_nodes;
+
+private:
+  AnnotatedTopologyReader(const AnnotatedTopologyReader&);
+  AnnotatedTopologyReader&
+  operator=(const AnnotatedTopologyReader&);
+
+  UniformVariable m_randX;
+  UniformVariable m_randY;
+
+  ObjectFactory m_mobilityFactory;
+  double m_scale;
+
+  uint32_t m_requiredPartitions;
+};
+}
+
+#endif
diff --git a/utils/topology/rocketfuel-map-reader.cpp b/utils/topology/rocketfuel-map-reader.cpp
new file mode 100644
index 0000000..774ce8f
--- /dev/null
+++ b/utils/topology/rocketfuel-map-reader.cpp
@@ -0,0 +1,725 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * 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:  Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *          Hajime Tazaki (tazaki@sfc.wide.ad.jp)
+ *          Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *
+ */
+
+#include "rocketfuel-map-reader.hpp"
+
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+#include "ns3/fatal-error.h"
+#include "ns3/assert.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/ipv4.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/node-list.h"
+#include "ns3/random-variable.h"
+
+#include "ns3/mobility-model.h"
+
+#include <regex.h>
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <boost/graph/graphviz.hpp>
+#include <boost/graph/connected_components.hpp>
+
+#include <iomanip>
+
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE("RocketfuelMapReader");
+
+namespace ns3 {
+
+RocketfuelMapReader::RocketfuelMapReader(const std::string& path /*=""*/, double scale /*=1.0*/,
+                                         const std::string& referenceOspfRate)
+  : AnnotatedTopologyReader(path, scale)
+  , m_referenceOspfRate(boost::lexical_cast<DataRate>(referenceOspfRate))
+{
+}
+
+RocketfuelMapReader::~RocketfuelMapReader()
+{
+}
+
+NodeContainer
+RocketfuelMapReader::Read()
+{
+  NS_FATAL_ERROR("Deprecated call. Use the other overloaded method instead");
+  return NodeContainer();
+}
+
+/* uid @loc [+] [bb] (num_neigh) [&ext] -> <nuid-1> <nuid-2> ... {-euid} ... =name[!] rn */
+
+#define REGMATCH_MAX 16
+
+#define START "^"
+#define END "$"
+#define SPACE "[ \t]+"
+#define MAYSPACE "[ \t]*"
+
+#define ROCKETFUEL_MAPS_LINE                                                                       \
+  START "(-*[0-9]+)" SPACE "(@[?A-Za-z0-9,+]+)" SPACE "(\\+)*" MAYSPACE "(bb)*" MAYSPACE           \
+        "\\(([0-9]+)\\)" SPACE "(&[0-9]+)*" MAYSPACE "->" MAYSPACE "(<[0-9 \t<>]+>)*" MAYSPACE     \
+        "(\\{-[0-9\\{\\} \t-]+\\})*" SPACE "=([A-Za-z0-9.!-]+)" SPACE "r([0-9])" MAYSPACE END
+
+void
+RocketfuelMapReader::CreateLink(string nodeName1, string nodeName2, double averageRtt,
+                                const string& minBw, const string& maxBw, const string& minDelay,
+                                const string& maxDelay)
+{
+  Ptr<Node> node1 = Names::Find<Node>(m_path, nodeName1);
+  Ptr<Node> node2 = Names::Find<Node>(m_path, nodeName2);
+  Link link(node1, nodeName1, node2, nodeName2);
+
+  DataRate randBandwidth(
+    m_randVar.GetInteger(static_cast<uint32_t>(lexical_cast<DataRate>(minBw).GetBitRate()),
+                         static_cast<uint32_t>(lexical_cast<DataRate>(maxBw).GetBitRate())));
+
+  int32_t metric = std::max(1, static_cast<int32_t>(1.0 * m_referenceOspfRate.GetBitRate()
+                                                    / randBandwidth.GetBitRate()));
+
+  Time randDelay =
+    Time::FromDouble((m_randVar.GetValue(lexical_cast<Time>(minDelay).ToDouble(Time::US),
+                                         lexical_cast<Time>(maxDelay).ToDouble(Time::US))),
+                     Time::US);
+
+  uint32_t queue = ceil(averageRtt * (randBandwidth.GetBitRate() / 8.0 / 1100.0));
+
+  link.SetAttribute("DataRate", boost::lexical_cast<string>(randBandwidth));
+  link.SetAttribute("OSPF", boost::lexical_cast<string>(metric));
+  link.SetAttribute("Delay",
+                    boost::lexical_cast<string>(ceil(randDelay.ToDouble(Time::US))) + "us");
+  link.SetAttribute("MaxPackets", boost::lexical_cast<string>(queue));
+
+  AddLink(link);
+}
+
+// NodeContainer
+void
+RocketfuelMapReader::GenerateFromMapsFile(int argc, char* argv[])
+{
+  string uid;
+  string loc;
+  string ptr;
+  string name;
+  string nuid;
+  // bool dns = false;
+  // bool bb = false;
+  int num_neigh_s = 0;
+  unsigned int num_neigh = 0;
+  int radius = 0;
+  vector<string> neigh_list;
+
+  uid = argv[0];
+  loc = argv[1];
+
+  // if (argv[2])
+  // {
+  //   dns = true;
+  // }
+
+  // if (argv[3])
+  // {
+  //   bb = true;
+  // }
+
+  num_neigh_s = ::atoi(argv[4]);
+  if (num_neigh_s < 0) {
+    num_neigh = 0;
+    NS_LOG_WARN("Negative number of neighbors given");
+  }
+  else {
+    num_neigh = num_neigh_s;
+  }
+
+  /* neighbors */
+  if (argv[6]) {
+    char* nbr;
+    char* stringp = argv[6];
+    while ((nbr = strsep(&stringp, " \t")) != NULL) {
+      nbr[strlen(nbr) - 1] = '\0';
+      neigh_list.push_back(nbr + 1);
+    }
+  }
+
+  if (num_neigh != neigh_list.size()) {
+    NS_LOG_WARN("Given number of neighbors = " << num_neigh << " != size of neighbors list = "
+                                               << neigh_list.size());
+  }
+
+  /* externs */
+  if (argv[7]) {
+    //      euid = argv[7];
+  }
+
+  /* name */
+  if (argv[8]) {
+    name = argv[8];
+  }
+
+  radius = ::atoi(&argv[9][1]);
+  if (radius > 0) {
+    return;
+  }
+
+  // Create node and link
+  if (uid.empty())
+    return;
+
+  node_map_t::iterator node = m_graphNodes.find(uid);
+  if (node == m_graphNodes.end()) {
+    bool ok;
+    tie(node, ok) = m_graphNodes.insert(make_pair(uid, add_vertex(nodeProperty(uid), m_graph)));
+    NS_ASSERT(ok == true);
+
+    put(vertex_index, m_graph, node->second, m_maxNodeId);
+    m_maxNodeId++;
+  }
+
+  for (uint32_t i = 0; i < neigh_list.size(); ++i) {
+    nuid = neigh_list[i];
+
+    if (nuid.empty()) {
+      continue;
+    }
+
+    node_map_t::iterator otherNode = m_graphNodes.find(nuid);
+    if (otherNode == m_graphNodes.end()) {
+      bool ok;
+      tie(otherNode, ok) =
+        m_graphNodes.insert(make_pair(nuid, add_vertex(nodeProperty(nuid), m_graph)));
+      NS_ASSERT(ok == true);
+
+      put(vertex_index, m_graph, otherNode->second, m_maxNodeId);
+      m_maxNodeId++;
+    }
+
+    // cout << node->second << " <-> " << otherNode->second << endl;
+    // parallel edges are disabled in the graph, so no need to worry
+    add_edge(node->second, otherNode->second, m_graph);
+  }
+}
+
+void
+RocketfuelMapReader::assignGw(Traits::vertex_descriptor vertex, uint32_t degree,
+                              node_type_t nodeType)
+{
+  graph_traits<Graph>::adjacency_iterator u, endu;
+  for (tie(u, endu) = adjacent_vertices(vertex, m_graph); u != endu; u++) {
+    if (get(vertex_rank, m_graph, *u) != UNKNOWN)
+      continue;
+
+    put(vertex_rank, m_graph, *u, nodeType);
+    put(vertex_color, m_graph, *u, "green");
+
+    uint32_t u_degree = out_degree(*u, m_graph);
+    if (u_degree < degree)
+      assignGw(*u, degree, BACKBONE);
+  }
+};
+
+void
+RocketfuelMapReader::AssignClients(uint32_t clientDegree, uint32_t gwDegree)
+{
+  graph_traits<Graph>::vertex_iterator v, endv;
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    uint32_t degree = out_degree(*v, m_graph);
+    if (degree == clientDegree) {
+      put(vertex_rank, m_graph, *v, CLIENT);
+      put(vertex_color, m_graph, *v, "red");
+
+      assignGw(*v, gwDegree + 1, GATEWAY);
+    }
+  }
+};
+
+NodeContainer
+RocketfuelMapReader::Read(RocketfuelParams params, bool keepOneComponent /*=true*/,
+                          bool connectBackbones /*=true*/)
+{
+  m_maxNodeId = 0;
+
+  ifstream topgen;
+  topgen.open(GetFileName().c_str());
+  // NodeContainer nodes;
+  UniformVariable var;
+
+  istringstream lineBuffer;
+  string line;
+  int lineNumber = 0;
+  char errbuf[512];
+
+  if (!topgen.is_open()) {
+    NS_LOG_WARN("Couldn't open the file " << GetFileName());
+    return m_nodes;
+  }
+
+  while (!topgen.eof()) {
+    int ret;
+    int argc;
+    char* argv[REGMATCH_MAX];
+    char* buf;
+
+    lineNumber++;
+    line.clear();
+    lineBuffer.clear();
+
+    getline(topgen, line);
+    buf = (char*)line.c_str();
+
+    regmatch_t regmatch[REGMATCH_MAX];
+    regex_t regex;
+
+    ret = regcomp(&regex, ROCKETFUEL_MAPS_LINE, REG_EXTENDED | REG_NEWLINE);
+    if (ret != 0) {
+      regerror(ret, &regex, errbuf, sizeof(errbuf));
+      regfree(&regex);
+      continue;
+    }
+
+    ret = regexec(&regex, buf, REGMATCH_MAX, regmatch, 0);
+    if (ret == REG_NOMATCH) {
+      NS_LOG_WARN("match failed (maps file): %s" << buf);
+      regfree(&regex);
+      continue;
+    }
+
+    line = buf;
+    argc = 0;
+
+    /* regmatch[0] is the entire strings that matched */
+    for (int i = 1; i < REGMATCH_MAX; i++) {
+      if (regmatch[i].rm_so == -1) {
+        argv[i - 1] = NULL;
+      }
+      else {
+        line[regmatch[i].rm_eo] = '\0';
+        argv[i - 1] = &line[regmatch[i].rm_so];
+        argc = i;
+      }
+    }
+
+    GenerateFromMapsFile(argc, argv);
+    regfree(&regex);
+  }
+
+  if (keepOneComponent) {
+    NS_LOG_DEBUG("Before eliminating disconnected nodes: " << num_vertices(m_graph));
+    KeepOnlyBiggestConnectedComponent();
+    NS_LOG_DEBUG("After eliminating disconnected nodes:  " << num_vertices(m_graph));
+  }
+
+  for (int clientDegree = 1; clientDegree <= params.clientNodeDegrees; clientDegree++) {
+    AssignClients(clientDegree, std::min(clientDegree, 3));
+  }
+
+  graph_traits<Graph>::vertex_iterator v, endv;
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    node_type_t type = get(vertex_rank, m_graph, *v);
+    if (type == UNKNOWN) {
+      put(vertex_rank, m_graph, *v, BACKBONE);
+      put(vertex_color, m_graph, *v, "blue");
+    }
+  }
+
+  if (connectBackbones) {
+    ConnectBackboneRouters();
+  }
+
+  graph_traits<Graph>::edge_iterator e, ende;
+  for (tie(e, ende) = edges(m_graph); e != ende;) {
+    Traits::vertex_descriptor u = source(*e, m_graph), v = target(*e, m_graph);
+
+    node_type_t u_type = get(vertex_rank, m_graph, u), v_type = get(vertex_rank, m_graph, v);
+
+    if (u_type == BACKBONE && v_type == BACKBONE) {
+      // ok
+    }
+    else if ((u_type == GATEWAY && v_type == BACKBONE)
+             || (u_type == BACKBONE && v_type == GATEWAY)) {
+      // ok
+    }
+    else if (u_type == GATEWAY && v_type == GATEWAY) {
+      // ok
+    }
+    else if ((u_type == GATEWAY && v_type == CLIENT) || (u_type == CLIENT && v_type == GATEWAY)) {
+      // ok
+    }
+    else {
+      // not ok
+      NS_LOG_DEBUG("Wrong link type between nodes: " << u_type << " <-> " << v_type
+                                                     << " (deleting the link)");
+
+      graph_traits<Graph>::edge_iterator tmp = e;
+      tmp++;
+
+      remove_edge(*e, m_graph);
+      e = tmp;
+      continue;
+    }
+    e++;
+  }
+
+  if (keepOneComponent) {
+    NS_LOG_DEBUG("Before 2 eliminating disconnected nodes: " << num_vertices(m_graph));
+    KeepOnlyBiggestConnectedComponent();
+    NS_LOG_DEBUG("After 2 eliminating disconnected nodes:  " << num_vertices(m_graph));
+  }
+
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    string nodeName = get(vertex_name, m_graph, *v);
+    Ptr<Node> node = CreateNode(nodeName, 0);
+
+    node_type_t type = get(vertex_rank, m_graph, *v);
+    switch (type) {
+    case BACKBONE:
+      Names::Rename(nodeName, "bb-" + nodeName);
+      put(vertex_name, m_graph, *v, "bb-" + nodeName);
+      m_backboneRouters.Add(node);
+      break;
+    case CLIENT:
+      Names::Rename(nodeName, "leaf-" + nodeName);
+      put(vertex_name, m_graph, *v, "leaf-" + nodeName);
+      m_customerRouters.Add(node);
+      break;
+    case GATEWAY:
+      Names::Rename(nodeName, "gw-" + nodeName);
+      put(vertex_name, m_graph, *v, "gw-" + nodeName);
+      m_gatewayRouters.Add(node);
+      break;
+    case UNKNOWN:
+      NS_FATAL_ERROR("Should not happen");
+      break;
+    }
+  }
+
+  for (tie(e, ende) = edges(m_graph); e != ende; e++) {
+    Traits::vertex_descriptor u = source(*e, m_graph), v = target(*e, m_graph);
+
+    node_type_t u_type = get(vertex_rank, m_graph, u), v_type = get(vertex_rank, m_graph, v);
+
+    string u_name = get(vertex_name, m_graph, u), v_name = get(vertex_name, m_graph, v);
+
+    if (u_type == BACKBONE && v_type == BACKBONE) {
+      CreateLink(u_name, v_name, params.averageRtt, params.minb2bBandwidth, params.maxb2bBandwidth,
+                 params.minb2bDelay, params.maxb2bDelay);
+    }
+    else if ((u_type == GATEWAY && v_type == BACKBONE)
+             || (u_type == BACKBONE && v_type == GATEWAY)) {
+      CreateLink(u_name, v_name, params.averageRtt, params.minb2gBandwidth, params.maxb2gBandwidth,
+                 params.minb2gDelay, params.maxb2gDelay);
+    }
+    else if (u_type == GATEWAY && v_type == GATEWAY) {
+      CreateLink(u_name, v_name, params.averageRtt, params.minb2gBandwidth, params.maxb2gBandwidth,
+                 params.minb2gDelay, params.maxb2gDelay);
+    }
+    else if ((u_type == GATEWAY && v_type == CLIENT) || (u_type == CLIENT && v_type == GATEWAY)) {
+      CreateLink(u_name, v_name, params.averageRtt, params.ming2cBandwidth, params.maxg2cBandwidth,
+                 params.ming2cDelay, params.maxg2cDelay);
+    }
+    else {
+      NS_FATAL_ERROR("Wrong link type between nodes: " << u_type << " <-> " << v_type);
+    }
+  }
+
+  ApplySettings();
+
+  NS_LOG_INFO("Clients:   " << m_customerRouters.GetN());
+  NS_LOG_INFO("Gateways:  " << m_gatewayRouters.GetN());
+  NS_LOG_INFO("Backbones: " << m_backboneRouters.GetN());
+  NS_LOG_INFO("Links:     " << GetLinks().size());
+
+  return m_nodes;
+}
+
+const NodeContainer&
+RocketfuelMapReader::GetBackboneRouters() const
+{
+  return m_backboneRouters;
+}
+
+const NodeContainer&
+RocketfuelMapReader::GetGatewayRouters() const
+{
+  return m_gatewayRouters;
+}
+
+const NodeContainer&
+RocketfuelMapReader::GetCustomerRouters() const
+{
+  return m_customerRouters;
+}
+
+static void
+nodeWriter(std::ostream& os, NodeContainer& m)
+{
+  for (NodeContainer::Iterator node = m.Begin(); node != m.End(); node++) {
+    std::string name = Names::FindName(*node);
+
+    os << name << "\t"
+       << "NA"
+       << "\t" << 0 << "\t" << 0 << "\n";
+  }
+};
+
+void
+RocketfuelMapReader::SaveTopology(const std::string& file)
+{
+  ofstream os(file.c_str(), ios::trunc);
+  os << "# any empty lines and lines starting with '#' symbol is ignored\n"
+     << "\n"
+     << "# The file should contain exactly two sections: router and link, each starting with the "
+        "corresponding keyword\n"
+     << "\n"
+     << "# router section defines topology nodes and their relative positions (e.g., to use in "
+        "visualizer)\n"
+     << "router\n"
+     << "\n"
+     << "# each line in this section represents one router and should have the following data\n"
+     << "# node  comment     yPos    xPos\n";
+
+  nodeWriter(os, m_backboneRouters);
+  nodeWriter(os, m_gatewayRouters);
+  nodeWriter(os, m_customerRouters);
+
+  os << "# link section defines point-to-point links between nodes and characteristics of these "
+        "links\n"
+     << "\n"
+     << "link\n"
+     << "\n"
+     << "# Each line should be in the following format (only first two are required, the rest can "
+        "be omitted)\n"
+     << "# srcNode   dstNode     bandwidth   metric  delay   queue\n"
+     << "# bandwidth: link bandwidth\n"
+     << "# metric: routing metric\n"
+     << "# delay:  link delay\n"
+     << "# queue:  MaxPackets for transmission queue on the link (both directions)\n";
+
+  for (std::list<Link>::iterator link = m_linksList.begin(); link != m_linksList.end(); link++) {
+    string src = Names::FindName(link->GetFromNode());
+    string dst = Names::FindName(link->GetToNode());
+    os << src << "\t";
+    os << dst << "\t";
+
+    string tmp;
+    if (link->GetAttributeFailSafe("DataRate", tmp))
+      os << link->GetAttribute("DataRate") << "\t";
+    else
+      NS_FATAL_ERROR("DataRate must be specified for the link");
+
+    if (link->GetAttributeFailSafe("OSPF", tmp))
+      os << link->GetAttribute("OSPF") << "\t";
+    else {
+      DataRate rate = boost::lexical_cast<DataRate>(link->GetAttribute("DataRate"));
+
+      int32_t cost = std::max(1, static_cast<int32_t>(1.0 * m_referenceOspfRate.GetBitRate()
+                                                      / rate.GetBitRate()));
+
+      os << cost << "\t";
+    }
+
+    if (link->GetAttributeFailSafe("Delay", tmp)) {
+      os << link->GetAttribute("Delay") << "\t";
+
+      if (link->GetAttributeFailSafe("MaxPackets", tmp)) {
+        os << link->GetAttribute("MaxPackets") << "\t";
+      }
+    }
+    os << "\n";
+  }
+}
+
+template<class Names, class Colors>
+class name_color_writer {
+public:
+  name_color_writer(Names _names, Colors _colors)
+    : names(_names)
+    , colors(_colors)
+  {
+  }
+
+  template<class VertexOrEdge>
+  void
+  operator()(std::ostream& out, const VertexOrEdge& v) const
+  {
+    // out << "[label=\"" << names[v] << "\",style=filled,fillcolor=\"" << colors[v] << "\"]";
+    out << "[shape=\"circle\",width=0.1,label=\"\",style=filled,fillcolor=\"" << colors[v] << "\"]";
+  }
+
+private:
+  Names names;
+  Colors colors;
+};
+
+template<class Names, class Colors>
+inline name_color_writer<Names, Colors>
+make_name_color_writer(Names n, Colors c)
+{
+  return name_color_writer<Names, Colors>(n, c);
+}
+
+void
+RocketfuelMapReader::SaveGraphviz(const std::string& file)
+{
+  ofstream of(file.c_str());
+  property_map<Graph, vertex_name_t>::type names = get(vertex_name, m_graph);
+  property_map<Graph, vertex_color_t>::type colors = get(vertex_color, m_graph);
+  write_graphviz(of, m_graph, make_name_color_writer(names, colors));
+}
+
+void
+RocketfuelMapReader::KeepOnlyBiggestConnectedComponent()
+{
+  std::map<graph_traits<Graph>::vertex_descriptor, int> temp;
+  associative_property_map<std::map<graph_traits<Graph>::vertex_descriptor, int>> components(temp);
+
+  // //check if topology has breaks in its structure and trim it if yes
+  // property_map<Graph, vertex_index1_t>::type components = get (vertex_index1, m_graph);
+
+  int num = connected_components(m_graph, components);
+  NS_LOG_DEBUG("Topology has " << num << " components");
+
+  vector<int> sizes(num, 0);
+
+  graph_traits<Graph>::vertex_iterator v, endv;
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    sizes[get(components, *v)]++;
+  }
+  int largestComponent = max_element(sizes.begin(), sizes.end()) - sizes.begin();
+  // cout << "Largest: " << largestComponent << endl;
+
+  // for (int i =0 ; i < num; i++) cout << sizes[i] << " ";
+  // cout << endl;
+
+  ////////////////////////////////////////////////////
+  // remove nodes and edges from smaller components //
+  ////////////////////////////////////////////////////
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    if (get(components, *v) == largestComponent)
+      continue;
+
+    clear_vertex(*v, m_graph);
+  }
+
+  // this works only if vertices are organized in listS or setS (iterator is not invalidated on
+  // remove)
+  for (tie(v, endv) = vertices(m_graph); v != endv;) {
+    if (get(components, *v) == largestComponent) {
+      v++;
+      continue;
+    }
+
+    graph_traits<Graph>::vertex_iterator tmp = v;
+    tmp++;
+
+    remove_vertex(*v, m_graph);
+    v = tmp;
+  }
+
+  int index = 0;
+  // renumber nodes
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    put(vertex_index, m_graph, *v, index++);
+  }
+}
+
+void
+RocketfuelMapReader::ConnectBackboneRouters()
+{
+  // not the tricky part.  we want backbone to be a fully connected component,
+  // so traffic doesn't bounce from backbone to gateway and back
+
+  typedef adjacency_list<setS, setS, boost::undirectedS,
+                         property<vertex_name_t, Traits::vertex_descriptor,
+                                  property<vertex_index_t, int, property<vertex_index1_t, int>>>>
+    BbGraph;
+  BbGraph bbGraph;
+  map<Traits::vertex_descriptor, graph_traits<BbGraph>::vertex_descriptor> nodeMap;
+
+  int index = 0;
+
+  graph_traits<Graph>::vertex_iterator v, endv;
+  for (tie(v, endv) = vertices(m_graph); v != endv; v++) {
+    node_type_t type = get(vertex_rank, m_graph, *v);
+    if (type == BACKBONE) {
+      graph_traits<BbGraph>::vertex_descriptor newv = add_vertex(*v, bbGraph);
+      put(vertex_index, bbGraph, newv, index++);
+      nodeMap[*v] = newv;
+    }
+  }
+
+  graph_traits<BbGraph>::vertex_iterator bb, endBb;
+  for (tie(bb, endBb) = vertices(bbGraph); bb != endBb; bb++) {
+    Traits::vertex_descriptor actualVertex = get(vertex_name, bbGraph, *bb);
+
+    graph_traits<Graph>::adjacency_iterator u, endu;
+    for (tie(u, endu) = adjacent_vertices(actualVertex, m_graph); u != endu; u++) {
+      if (nodeMap.find(*u) != nodeMap.end()) {
+        add_edge(nodeMap[actualVertex], nodeMap[*u], bbGraph);
+      }
+    }
+  }
+
+  property_map<BbGraph, vertex_index1_t>::type components = get(vertex_index1, bbGraph);
+
+  int num = connected_components(bbGraph, components);
+  NS_LOG_DEBUG("Backbone has " << num << " components");
+  if (num == 1)
+    return; // nothing to do
+
+  vector<vector<graph_traits<BbGraph>::vertex_descriptor>> subgraphs(num);
+  for (tie(bb, endBb) = vertices(bbGraph); bb != endBb; bb++) {
+    int component = get(vertex_index1, bbGraph, *bb);
+    subgraphs[component].push_back(*bb);
+  }
+
+  UniformVariable randVar;
+
+  for (int i = 1; i < num; i++) {
+    int node1 = randVar.GetInteger(0, subgraphs[i - 1].size() - 1);
+    int node2 = randVar.GetInteger(0, subgraphs[i].size() - 1);
+
+    Traits::vertex_descriptor v1 = get(vertex_name, bbGraph, subgraphs[i - 1][node1]),
+                              v2 = get(vertex_name, bbGraph, subgraphs[i][node2]);
+
+    NS_LOG_DEBUG("Connecting " << get(vertex_name, m_graph, v1) << "[" << node1 << "] with "
+                               << get(vertex_name, m_graph, v2) << "[" << node2 << "]");
+
+    add_edge(v1, v2, m_graph);
+  }
+}
+
+} /* namespace ns3 */
diff --git a/utils/topology/rocketfuel-map-reader.hpp b/utils/topology/rocketfuel-map-reader.hpp
new file mode 100644
index 0000000..59879d9
--- /dev/null
+++ b/utils/topology/rocketfuel-map-reader.hpp
@@ -0,0 +1,187 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * 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:  Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *          Hajime Tazaki (tazaki@sfc.wide.ad.jp)
+ *          Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef ROCKETFUEL_MAP_READER_H
+#define ROCKETFUEL_MAP_READER_H
+
+#include "ns3/annotated-topology-reader.hpp"
+#include "ns3/net-device-container.h"
+#include "ns3/random-variable.h"
+#include <set>
+#include "ns3/data-rate.h"
+
+#include <boost/graph/adjacency_list.hpp>
+
+using namespace std;
+
+namespace ns3 {
+
+struct RocketfuelParams {
+  double averageRtt;
+  int clientNodeDegrees;
+
+  // parameters for links Backbone <->Backbone
+  string minb2bBandwidth;
+  string minb2bDelay;
+
+  string maxb2bBandwidth;
+  string maxb2bDelay;
+
+  // parameters for links Backbone<->Gateway and Gateway <-> Gateway
+  string minb2gBandwidth;
+  string minb2gDelay;
+
+  string maxb2gBandwidth;
+  string maxb2gDelay;
+
+  // parameters for links Gateway <-> Customer
+  string ming2cBandwidth;
+  string ming2cDelay;
+
+  string maxg2cBandwidth;
+  string maxg2cDelay;
+};
+
+/**
+ * \brief Topology file reader and topology estimator (extension of Rocketfuel-format type).
+ *
+ * http://www.cs.washington.edu/research/networking/rocketfuel/
+ *
+ * Only map file (.cch) is supported
+ *
+ * In addition to reading specified topology from the .cch file, this class divides nodes into three
+ *categories:
+ * - client nodes (nodes with degrees less or equal to RocketfuelParams.clientNodeDegrees
+ * - gateway nodes (nodes that directly connected to client nodes)
+ * - backbone nodes (all the rest)
+ *
+ * As some of the .cch files do not give a connected network graph, this reader also allows to keep
+ *only the largest connected
+ * network graph component.
+ */
+class RocketfuelMapReader : public AnnotatedTopologyReader {
+public:
+  RocketfuelMapReader(const std::string& path = "", double scale = 1.0,
+                      const string& referenceOspfRate = "100Mbps");
+  virtual ~RocketfuelMapReader();
+
+  /**
+   * @brief Deprecated call. Read (RocketfuelParams params, bool keepOneComponent=true, bool
+   * connectBackbones=true) should be used instead
+   */
+  virtual NodeContainer
+  Read();
+
+  /**
+   * \brief Main topology reading function.
+   *
+   * @param params parameters specifying range from which link bandwidths and delays should be
+   *assigned
+   * @param keepOneComponent if true, then only the largest connected component will be kept
+   * @param connectBackbones if true, then extra links will be added to ensure connectivity of
+   *estimated backbone
+   *
+   * This method opens an input stream and reads the Rocketfuel-format file.
+   * Every row represents a topology link (the ids of a couple of nodes),
+   * so the input file is read line by line to figure out how many links
+   * and nodes are in the topology.
+   *
+   * \return the container of the nodes created (or empty container if there was an error)
+   */
+  virtual NodeContainer
+  Read(RocketfuelParams params, bool keepOneComponent = true, bool connectBackbones = true);
+
+  const NodeContainer&
+  GetBackboneRouters() const;
+
+  const NodeContainer&
+  GetGatewayRouters() const;
+
+  const NodeContainer&
+  GetCustomerRouters() const;
+
+  virtual void
+  SaveTopology(const std::string& file);
+
+  virtual void
+  SaveGraphviz(const std::string& file);
+
+private:
+  RocketfuelMapReader(const RocketfuelMapReader&);
+  RocketfuelMapReader&
+  operator=(const RocketfuelMapReader&);
+
+  // NodeContainer
+  void
+  GenerateFromMapsFile(int argc, char* argv[]);
+
+  void
+  CreateLink(string nodeName1, string nodeName2, double averageRtt, const string& minBw,
+             const string& maxBw, const string& minDelay, const string& maxDelay);
+  void
+  KeepOnlyBiggestConnectedComponent();
+
+  void
+  AssignClients(uint32_t clientDegree, uint32_t gwDegree);
+
+  void
+  ConnectBackboneRouters();
+
+private:
+  UniformVariable m_randVar;
+
+  NodeContainer m_backboneRouters;
+  NodeContainer m_gatewayRouters;
+  NodeContainer m_customerRouters;
+
+  typedef boost::adjacency_list_traits<boost::setS, boost::setS, boost::undirectedS> Traits;
+
+  enum node_type_t { UNKNOWN = 0, CLIENT = 1, GATEWAY = 2, BACKBONE = 3 };
+
+  typedef boost::
+    property<boost::vertex_name_t, std::string,
+             boost::property<boost::vertex_index_t, uint32_t,
+                             boost::property<boost::vertex_rank_t, node_type_t,
+                                             boost::property<boost::vertex_color_t, std::string>>>>
+      nodeProperty;
+
+  typedef boost::no_property edgeProperty;
+
+  typedef boost::adjacency_list<boost::setS, boost::setS, boost::undirectedS, nodeProperty,
+                                edgeProperty> Graph;
+
+  typedef map<string, Traits::vertex_descriptor> node_map_t;
+  node_map_t m_graphNodes;
+
+  Graph m_graph;
+  uint32_t m_maxNodeId;
+
+  const DataRate m_referenceOspfRate; // reference rate of OSPF metric calculation
+
+private:
+  void
+  assignGw(Traits::vertex_descriptor vertex, uint32_t degree, node_type_t nodeType);
+}; // end class RocketfuelMapReader
+
+}; // end namespace ns3
+
+#endif /* ROCKETFUEL_MAP_READER_H */
diff --git a/utils/topology/rocketfuel-weights-reader.cpp b/utils/topology/rocketfuel-weights-reader.cpp
new file mode 100644
index 0000000..8f6f0e0
--- /dev/null
+++ b/utils/topology/rocketfuel-weights-reader.cpp
@@ -0,0 +1,194 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Hajime Tazaki
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki (tazaki@sfc.wide.ad.jp)
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "rocketfuel-weights-reader.hpp"
+
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/ipv4.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
+#include "ns3/ipv4-address.h"
+
+#include "ns3/mobility-model.h"
+
+#include <regex.h>
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iomanip>
+#include <set>
+
+using namespace std;
+
+NS_LOG_COMPONENT_DEFINE("RocketfuelWeightsReader");
+
+namespace ns3 {
+
+RocketfuelWeightsReader::RocketfuelWeightsReader(const std::string& path /*=""*/,
+                                                 double scale /*=1.0*/)
+  : AnnotatedTopologyReader(path, scale)
+  , m_defaultBandwidth("100Mbps")
+{
+  NS_LOG_FUNCTION(this);
+
+  // TypeId tid;
+  // bool ok = TypeId::LookupByNameFailSafe ("ns3::SpringMobilityModel", &tid);
+  // if (ok)
+  //   SetMobilityModel ("ns3::SpringMobilityModel");
+  // else
+  //   Use default mobility model (supplied by AnnotatedTopologyReader)
+}
+
+RocketfuelWeightsReader::~RocketfuelWeightsReader()
+{
+  NS_LOG_FUNCTION(this);
+}
+
+void
+RocketfuelWeightsReader::SetFileType(uint8_t inputType)
+{
+  m_inputType = inputType;
+}
+
+NodeContainer
+RocketfuelWeightsReader::Read()
+{
+  if (m_inputType == POSITIONS)
+    return AnnotatedTopologyReader::Read();
+
+  ifstream topgen;
+  topgen.open(GetFileName().c_str());
+
+  if (!topgen.is_open()) {
+    NS_LOG_ERROR("Cannot open file " << GetFileName() << " for reading");
+    return m_nodes;
+  }
+
+  map<string, set<string>> processedLinks; // to eliminate duplications
+  bool repeatedRun = LinksSize() > 0;
+  std::list<Link>::iterator linkIterator = m_linksList.begin();
+
+  while (!topgen.eof()) {
+    string line;
+    getline(topgen, line);
+    if (line == "")
+      continue;
+    if (line[0] == '#')
+      continue; // comments
+
+    // NS_LOG_DEBUG ("Input: [" << line << "]");
+
+    istringstream lineBuffer(line);
+    string from, to, attribute;
+
+    lineBuffer >> from >> to >> attribute;
+
+    if (processedLinks[to].size() != 0
+        && processedLinks[to].find(from) != processedLinks[to].end()) {
+      continue; // duplicated link
+    }
+    processedLinks[from].insert(to);
+
+    Ptr<Node> fromNode = Names::Find<Node>(m_path, from);
+    if (fromNode == 0) {
+      fromNode = CreateNode(from, 0);
+    }
+
+    Ptr<Node> toNode = Names::Find<Node>(m_path, to);
+    if (toNode == 0) {
+      toNode = CreateNode(to, 0);
+    }
+
+    Link* link;
+    if (!repeatedRun)
+      link = new Link(fromNode, from, toNode, to);
+    else {
+      NS_ASSERT(linkIterator != m_linksList.end());
+      link = &(*linkIterator);
+
+      linkIterator++;
+    }
+
+    switch (m_inputType) {
+    case LINKS: {
+      // links only
+      // do nothing
+      break;
+    }
+    case WEIGHTS: {
+      if (attribute == "")
+        attribute = "1";
+      uint16_t metric = boost::lexical_cast<uint16_t>(attribute);
+      link->SetAttribute("OSPF", boost::lexical_cast<string>(metric));
+      break;
+    }
+    case LATENCIES:
+      if (attribute == "")
+        attribute = "1";
+
+      link->SetAttribute("DataRate", m_defaultBandwidth);
+      link->SetAttribute("Delay", attribute + "ms");
+      if (!m_queue.empty()) {
+        link->SetAttribute("MaxPackets", m_queue);
+      }
+      break;
+    default:
+      ; //
+    }
+
+    NS_LOG_DEBUG("Link " << from << " <==> " << to << " / " << attribute);
+    if (!repeatedRun) {
+      AddLink(*link);
+      delete link;
+    }
+  }
+
+  topgen.close();
+
+  if (!repeatedRun) {
+    NS_LOG_INFO("Rocketfuel topology created with " << m_nodes.GetN() << " nodes and "
+                                                    << LinksSize() << " links");
+  }
+  return m_nodes;
+}
+
+void
+RocketfuelWeightsReader::Commit()
+{
+  ApplySettings();
+
+  // SpringMobilityHelper::InstallSprings (LinksBegin (), LinksEnd ());
+}
+
+} /* namespace ns3 */
diff --git a/utils/topology/rocketfuel-weights-reader.hpp b/utils/topology/rocketfuel-weights-reader.hpp
new file mode 100644
index 0000000..85f6ab7
--- /dev/null
+++ b/utils/topology/rocketfuel-weights-reader.hpp
@@ -0,0 +1,115 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Hajime Tazaki
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki (tazaki@sfc.wide.ad.jp)
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef ROCKETFUEL_TOPOLOGY_WEIGHTS_READER_H
+#define ROCKETFUEL_TOPOLOGY_WEIGHTS_READER_H
+
+#include "annotated-topology-reader.hpp"
+#include "ns3/net-device-container.h"
+
+namespace ns3 {
+
+// ------------------------------------------------------------
+// --------------------------------------------
+/**
+ * \brief Topology file reader (extension of Rocketfuel-format type).
+ *
+ * http://www.cs.washington.edu/research/networking/rocketfuel/
+ *
+ * Only weights and latencies file is supported
+ */
+class RocketfuelWeightsReader : public AnnotatedTopologyReader {
+public:
+  RocketfuelWeightsReader(const std::string& path = "", double scale = 1.0);
+  virtual ~RocketfuelWeightsReader();
+
+  void
+  SetFileType(uint8_t inputType);
+
+  /**
+   * \brief Main topology reading function.
+   *
+   * This method opens an input stream and reads the Rocketfuel-format file.
+   * Every row represents a topology link (the ids of a couple of nodes),
+   * so the input file is read line by line to figure out how many links
+   * and nodes are in the topology.
+   *
+   * \return the container of the nodes created (or empty container if there was an error)
+   */
+  virtual NodeContainer
+  Read(void);
+
+  void
+  Commit();
+
+  enum { LINKS, WEIGHTS, LATENCIES, POSITIONS };
+
+  inline void
+  SetDefaultBandwidth(const std::string& bw);
+
+  inline std::string
+  GetDefaultBandwidth() const;
+
+  inline void
+  SetDefaultQueue(const std::string& queue);
+
+  inline std::string
+  GetDefaultQueue() const;
+
+private:
+  RocketfuelWeightsReader(const RocketfuelWeightsReader&);
+  RocketfuelWeightsReader&
+  operator=(const RocketfuelWeightsReader&);
+
+private:
+  uint8_t m_inputType;
+  std::string m_defaultBandwidth; // since the topology files don't provide bandwidth parameter
+  std::string m_queue;
+
+}; // end class RocketfuelWeightsReader
+
+inline void
+RocketfuelWeightsReader::SetDefaultBandwidth(const std::string& bw)
+{
+  m_defaultBandwidth = bw;
+}
+
+inline std::string
+RocketfuelWeightsReader::GetDefaultBandwidth() const
+{
+  return m_defaultBandwidth;
+}
+
+inline void
+RocketfuelWeightsReader::SetDefaultQueue(const std::string& queue)
+{
+  m_queue = queue;
+}
+
+inline std::string
+RocketfuelWeightsReader::GetDefaultQueue() const
+{
+  return m_queue;
+}
+
+}; // end namespace ns3
+
+#endif /* ROCKETFUEL_TOPOLOGY_WEIGHTS_READER_H */
diff --git a/utils/tracers/l2-rate-tracer.cpp b/utils/tracers/l2-rate-tracer.cpp
new file mode 100644
index 0000000..f5c4d22
--- /dev/null
+++ b/utils/tracers/l2-rate-tracer.cpp
@@ -0,0 +1,183 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "l2-rate-tracer.hpp"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/log.h"
+
+#include <boost/lexical_cast.hpp>
+#include <fstream>
+
+using namespace boost;
+using namespace std;
+
+NS_LOG_COMPONENT_DEFINE("L2RateTracer");
+
+namespace ns3 {
+
+static std::list<boost::tuple<boost::shared_ptr<std::ostream>, std::list<Ptr<L2RateTracer>>>>
+  g_tracers;
+
+template<class T>
+static inline void
+NullDeleter(T* ptr)
+{
+}
+
+void
+L2RateTracer::Destroy()
+{
+  g_tracers.clear();
+}
+
+void
+L2RateTracer::InstallAll(const std::string& file, Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  std::list<Ptr<L2RateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    NS_LOG_DEBUG("Node: " << lexical_cast<string>((*node)->GetId()));
+
+    Ptr<L2RateTracer> trace = Create<L2RateTracer>(outputStream, *node);
+    trace->SetAveragingPeriod(averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+L2RateTracer::L2RateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node)
+  : L2Tracer(node)
+  , m_os(os)
+{
+  SetAveragingPeriod(Seconds(1.0));
+}
+
+L2RateTracer::~L2RateTracer()
+{
+  m_printEvent.Cancel();
+}
+
+void
+L2RateTracer::SetAveragingPeriod(const Time& period)
+{
+  m_period = period;
+  m_printEvent.Cancel();
+  m_printEvent = Simulator::Schedule(m_period, &L2RateTracer::PeriodicPrinter, this);
+}
+
+void
+L2RateTracer::PeriodicPrinter()
+{
+  Print(*m_os);
+  Reset();
+
+  m_printEvent = Simulator::Schedule(m_period, &L2RateTracer::PeriodicPrinter, this);
+}
+
+void
+L2RateTracer::PrintHeader(std::ostream& os) const
+{
+  os << "Time"
+     << "\t"
+
+     << "Node"
+     << "\t"
+     << "Interface"
+     << "\t"
+
+     << "Type"
+     << "\t"
+     << "Packets"
+     << "\t"
+     << "Kilobytes"
+     << "\t"
+     << "PacketsRaw"
+     << "\t"
+     << "KilobytesRaw";
+}
+
+void
+L2RateTracer::Reset()
+{
+  m_stats.get<0>().Reset();
+  m_stats.get<1>().Reset();
+}
+
+const double alpha = 0.8;
+
+#define STATS(INDEX) m_stats.get<INDEX>()
+#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble(Time::S)
+
+#define PRINTER(printName, fieldName, interface)                                                   \
+  STATS(2).fieldName =                                                                             \
+    /*new value*/ alpha * RATE(0, fieldName) + /*old value*/ (1 - alpha) * STATS(2).fieldName;     \
+  STATS(3).fieldName = /*new value*/ alpha * RATE(1, fieldName) / 1024.0                           \
+                       + /*old value*/ (1 - alpha) * STATS(3).fieldName;                           \
+                                                                                                   \
+  os << time.ToDouble(Time::S) << "\t" << m_node << "\t" << interface << "\t" << printName << "\t" \
+     << STATS(2).fieldName << "\t" << STATS(3).fieldName << "\t" << STATS(0).fieldName << "\t"     \
+     << STATS(1).fieldName / 1024.0 << "\n";
+
+void
+L2RateTracer::Print(std::ostream& os) const
+{
+  Time time = Simulator::Now();
+
+  PRINTER("Drop", m_drop, "combined");
+}
+
+void
+L2RateTracer::Drop(Ptr<const Packet> packet)
+{
+  // no interface information... this should be part of this L2Tracer object data
+
+  m_stats.get<0>().m_drop++;
+  m_stats.get<1>().m_drop += packet->GetSize();
+}
+
+} // namespace ns3
diff --git a/utils/tracers/l2-rate-tracer.hpp b/utils/tracers/l2-rate-tracer.hpp
new file mode 100644
index 0000000..79f16c4
--- /dev/null
+++ b/utils/tracers/l2-rate-tracer.hpp
@@ -0,0 +1,103 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef L2_RATE_TRACER_H
+#define L2_RATE_TRACER_H
+
+#include "l2-tracer.hpp"
+
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <map>
+
+namespace ns3 {
+
+/**
+ * @ingroup ndn-tracers
+ * @brief Tracer to collect link-layer rate information about links
+ *
+ * @todo Finish implementation
+ */
+class L2RateTracer : public L2Tracer {
+public:
+  /**
+   * @brief Network layer tracer constructor
+   */
+  L2RateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node);
+  virtual ~L2RateTracer();
+
+  /**
+   * @brief Helper method to install tracers on all simulation nodes
+   *
+   * @param file File to which traces will be written
+   * @param averagingPeriod Defines averaging period for the rate calculation,
+   *        as well as how often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  InstallAll(const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Explicit request to remove all statically created tracers
+   *
+   * This method can be helpful if simulation scenario contains several independent run,
+   * or if it is desired to do a postprocessing of the resulting data
+   */
+  static void
+  Destroy();
+
+  void
+  SetAveragingPeriod(const Time& period);
+
+  virtual void
+  PrintHeader(std::ostream& os) const;
+
+  virtual void
+  Print(std::ostream& os) const;
+
+  virtual void
+  Drop(Ptr<const Packet>);
+
+private:
+  void
+  PeriodicPrinter();
+
+  void
+  Reset();
+
+private:
+  boost::shared_ptr<std::ostream> m_os;
+  Time m_period;
+  EventId m_printEvent;
+
+  mutable boost::tuple<Stats, Stats, Stats, Stats> m_stats;
+};
+
+} // namespace ns3
+
+#endif // L2_RATE_TRACER_H
diff --git a/utils/tracers/l2-tracer.cpp b/utils/tracers/l2-tracer.cpp
new file mode 100644
index 0000000..bf1fcf1
--- /dev/null
+++ b/utils/tracers/l2-tracer.cpp
@@ -0,0 +1,60 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "l2-tracer.hpp"
+#include "ns3/node.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/callback.h"
+
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/queue.h"
+#include <boost/lexical_cast.hpp>
+
+using namespace std;
+
+namespace ns3 {
+
+L2Tracer::L2Tracer(Ptr<Node> node)
+  : m_nodePtr(node)
+{
+  m_node = boost::lexical_cast<string>(m_nodePtr->GetId());
+
+  Connect();
+
+  string name = Names::FindName(node);
+  if (!name.empty()) {
+    m_node = name;
+  }
+}
+
+void
+L2Tracer::Connect()
+{
+  for (uint32_t devId = 0; devId < m_nodePtr->GetNDevices(); devId++) {
+    Ptr<PointToPointNetDevice> p2pnd =
+      DynamicCast<PointToPointNetDevice>(m_nodePtr->GetDevice(devId));
+    if (p2pnd) {
+      p2pnd->GetQueue()->TraceConnectWithoutContext("Drop", MakeCallback(&L2Tracer::Drop, this));
+    }
+  }
+}
+
+} // namespace ns3
diff --git a/utils/tracers/l2-tracer.hpp b/utils/tracers/l2-tracer.hpp
new file mode 100644
index 0000000..814a860
--- /dev/null
+++ b/utils/tracers/l2-tracer.hpp
@@ -0,0 +1,91 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef L2_TRACER_H
+#define L2_TRACER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/packet.h"
+
+namespace ns3 {
+
+class Node;
+
+/**
+ * @ingroup ndn-tracers
+ * @brief Link-layer tracer
+ *
+ * @todo Finish implementation
+ */
+class L2Tracer : public SimpleRefCount<L2Tracer> {
+public:
+  L2Tracer(Ptr<Node> node);
+  virtual ~L2Tracer(){};
+
+  void
+  Connect();
+
+  virtual void
+  PrintHeader(std::ostream& os) const = 0;
+
+  virtual void
+  Print(std::ostream& os) const = 0;
+
+  virtual void
+  Drop(Ptr<const Packet>) = 0;
+
+  // Rx/Tx is NetDevice specific
+  // please refer to pyviz.cc in order to extend this tracer
+
+protected:
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+
+  struct Stats {
+    void
+    Reset()
+    {
+      m_in = 0;
+      m_out = 0;
+      m_drop = 0;
+    }
+
+    uint64_t m_in;
+    uint64_t m_out;
+    uint64_t m_drop;
+  };
+};
+
+inline std::ostream&
+operator<<(std::ostream& os, const L2Tracer& tracer)
+{
+  os << "# ";
+  tracer.PrintHeader(os);
+  os << "\n";
+  tracer.Print(os);
+  return os;
+}
+
+} // namespace ns3
+
+#endif // L2_TRACER_H
diff --git a/utils/tracers/ndn-app-delay-tracer.cpp b/utils/tracers/ndn-app-delay-tracer.cpp
new file mode 100644
index 0000000..fa9ab3a
--- /dev/null
+++ b/utils/tracers/ndn-app-delay-tracer.cpp
@@ -0,0 +1,265 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-app-delay-tracer.hpp"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/callback.h"
+
+#include "ns3/ndn-app.hpp"
+#include "ns3/simulator.h"
+#include "ns3/node-list.h"
+#include "ns3/log.h"
+
+#include <boost/lexical_cast.hpp>
+#include <boost/make_shared.hpp>
+
+#include <fstream>
+
+NS_LOG_COMPONENT_DEFINE("ndn.AppDelayTracer");
+
+using namespace std;
+
+namespace ns3 {
+namespace ndn {
+
+static std::list<boost::tuple<boost::shared_ptr<std::ostream>, std::list<Ptr<AppDelayTracer>>>>
+  g_tracers;
+
+template<class T>
+static inline void
+NullDeleter(T* ptr)
+{
+}
+
+void
+AppDelayTracer::Destroy()
+{
+  g_tracers.clear();
+}
+
+void
+AppDelayTracer::InstallAll(const std::string& file)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<AppDelayTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<AppDelayTracer> trace = Install(*node, outputStream);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+AppDelayTracer::Install(const NodeContainer& nodes, const std::string& file)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<AppDelayTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
+    Ptr<AppDelayTracer> trace = Install(*node, outputStream);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+AppDelayTracer::Install(Ptr<Node> node, const std::string& file)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<AppDelayTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  Ptr<AppDelayTracer> trace = Install(node, outputStream);
+  tracers.push_back(trace);
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+Ptr<AppDelayTracer>
+AppDelayTracer::Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream)
+{
+  NS_LOG_DEBUG("Node: " << node->GetId());
+
+  Ptr<AppDelayTracer> trace = Create<AppDelayTracer>(outputStream, node);
+
+  return trace;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+AppDelayTracer::AppDelayTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node)
+  : m_nodePtr(node)
+  , m_os(os)
+{
+  m_node = boost::lexical_cast<string>(m_nodePtr->GetId());
+
+  Connect();
+
+  string name = Names::FindName(node);
+  if (!name.empty()) {
+    m_node = name;
+  }
+}
+
+AppDelayTracer::AppDelayTracer(boost::shared_ptr<std::ostream> os, const std::string& node)
+  : m_node(node)
+  , m_os(os)
+{
+  Connect();
+}
+
+AppDelayTracer::~AppDelayTracer(){};
+
+void
+AppDelayTracer::Connect()
+{
+  Config::ConnectWithoutContext("/NodeList/" + m_node
+                                  + "/ApplicationList/*/LastRetransmittedInterestDataDelay",
+                                MakeCallback(&AppDelayTracer::LastRetransmittedInterestDataDelay,
+                                             this));
+
+  Config::ConnectWithoutContext("/NodeList/" + m_node + "/ApplicationList/*/FirstInterestDataDelay",
+                                MakeCallback(&AppDelayTracer::FirstInterestDataDelay, this));
+}
+
+void
+AppDelayTracer::PrintHeader(std::ostream& os) const
+{
+  os << "Time"
+     << "\t"
+     << "Node"
+     << "\t"
+     << "AppId"
+     << "\t"
+     << "SeqNo"
+     << "\t"
+
+     << "Type"
+     << "\t"
+     << "DelayS"
+     << "\t"
+     << "DelayUS"
+     << "\t"
+     << "RetxCount"
+     << "\t"
+     << "HopCount"
+     << "";
+}
+
+void
+AppDelayTracer::LastRetransmittedInterestDataDelay(Ptr<App> app, uint32_t seqno, Time delay,
+                                                   int32_t hopCount)
+{
+  *m_os << Simulator::Now().ToDouble(Time::S) << "\t" << m_node << "\t" << app->GetId() << "\t"
+        << seqno << "\t"
+        << "LastDelay"
+        << "\t" << delay.ToDouble(Time::S) << "\t" << delay.ToDouble(Time::US) << "\t" << 1 << "\t"
+        << hopCount << "\n";
+}
+
+void
+AppDelayTracer::FirstInterestDataDelay(Ptr<App> app, uint32_t seqno, Time delay, uint32_t retxCount,
+                                       int32_t hopCount)
+{
+  *m_os << Simulator::Now().ToDouble(Time::S) << "\t" << m_node << "\t" << app->GetId() << "\t"
+        << seqno << "\t"
+        << "FullDelay"
+        << "\t" << delay.ToDouble(Time::S) << "\t" << delay.ToDouble(Time::US) << "\t" << retxCount
+        << "\t" << hopCount << "\n";
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/tracers/ndn-app-delay-tracer.hpp b/utils/tracers/ndn-app-delay-tracer.hpp
new file mode 100644
index 0000000..72cccec
--- /dev/null
+++ b/utils/tracers/ndn-app-delay-tracer.hpp
@@ -0,0 +1,166 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_APP_DELAY_TRACER_H
+#define CCNX_APP_DELAY_TRACER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include <ns3/nstime.h>
+#include <ns3/event-id.h>
+#include <ns3/node-container.h>
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <list>
+
+namespace ns3 {
+
+class Node;
+class Packet;
+
+namespace ndn {
+
+class App;
+
+/**
+ * @ingroup ndn-tracers
+ * @brief Tracer to obtain application-level delays
+ */
+class AppDelayTracer : public SimpleRefCount<AppDelayTracer> {
+public:
+  /**
+   * @brief Helper method to install tracers on all simulation nodes
+   *
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  InstallAll(const std::string& file);
+
+  /**
+   * @brief Helper method to install tracers on the selected simulation nodes
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  Install(const NodeContainer& nodes, const std::string& file);
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  Install(Ptr<Node> node, const std::string& file);
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param outputStream Smart pointer to a stream
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   */
+  static Ptr<AppDelayTracer>
+  Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream);
+
+  /**
+   * @brief Explicit request to remove all statically created tracers
+   *
+   * This method can be helpful if simulation scenario contains several independent run,
+   * or if it is desired to do a postprocessing of the resulting data
+   */
+  static void
+  Destroy();
+
+  /**
+   * @brief Trace constructor that attaches to all applications on the node using node's pointer
+   * @param os    reference to the output stream
+   * @param node  pointer to the node
+   */
+  AppDelayTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node);
+
+  /**
+   * @brief Trace constructor that attaches to all applications on the node using node's name
+   * @param os        reference to the output stream
+   * @param nodeName  name of the node registered using Names::Add
+   */
+  AppDelayTracer(boost::shared_ptr<std::ostream> os, const std::string& node);
+
+  /**
+   * @brief Destructor
+   */
+  ~AppDelayTracer();
+
+  /**
+   * @brief Print head of the trace (e.g., for post-processing)
+   *
+   * @param os reference to output stream
+   */
+  void
+  PrintHeader(std::ostream& os) const;
+
+private:
+  void
+  Connect();
+
+  void
+  LastRetransmittedInterestDataDelay(Ptr<App> app, uint32_t seqno, Time delay, int32_t hopCount);
+
+  void
+  FirstInterestDataDelay(Ptr<App> app, uint32_t seqno, Time delay, uint32_t rextCount,
+                         int32_t hopCount);
+
+private:
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+
+  boost::shared_ptr<std::ostream> m_os;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // CCNX_CS_TRACER_H
diff --git a/utils/tracers/ndn-cs-tracer.cpp b/utils/tracers/ndn-cs-tracer.cpp
new file mode 100644
index 0000000..f470aae
--- /dev/null
+++ b/utils/tracers/ndn-cs-tracer.cpp
@@ -0,0 +1,284 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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: Xiaoyan Hu <x......u@gmail.com>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-cs-tracer.hpp"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/callback.h"
+
+#include "ns3/ndn-app.hpp"
+#include "ns3/ndn-content-store.hpp"
+#include "ns3/simulator.h"
+#include "ns3/node-list.h"
+#include "ns3/log.h"
+
+#include <boost/lexical_cast.hpp>
+
+#include <fstream>
+
+NS_LOG_COMPONENT_DEFINE("ndn.CsTracer");
+
+using namespace std;
+
+namespace ns3 {
+namespace ndn {
+
+static std::list<boost::tuple<boost::shared_ptr<std::ostream>, std::list<Ptr<CsTracer>>>> g_tracers;
+
+template<class T>
+static inline void
+NullDeleter(T* ptr)
+{
+}
+
+void
+CsTracer::Destroy()
+{
+  g_tracers.clear();
+}
+
+void
+CsTracer::InstallAll(const std::string& file, Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<CsTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<CsTracer> trace = Install(*node, outputStream, averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+CsTracer::Install(const NodeContainer& nodes, const std::string& file,
+                  Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<CsTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
+    Ptr<CsTracer> trace = Install(*node, outputStream, averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+CsTracer::Install(Ptr<Node> node, const std::string& file,
+                  Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<CsTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  Ptr<CsTracer> trace = Install(node, outputStream, averagingPeriod);
+  tracers.push_back(trace);
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+Ptr<CsTracer>
+CsTracer::Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
+                  Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  NS_LOG_DEBUG("Node: " << node->GetId());
+
+  Ptr<CsTracer> trace = Create<CsTracer>(outputStream, node);
+  trace->SetAveragingPeriod(averagingPeriod);
+
+  return trace;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+CsTracer::CsTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node)
+  : m_nodePtr(node)
+  , m_os(os)
+{
+  m_node = boost::lexical_cast<string>(m_nodePtr->GetId());
+
+  Connect();
+
+  string name = Names::FindName(node);
+  if (!name.empty()) {
+    m_node = name;
+  }
+}
+
+CsTracer::CsTracer(boost::shared_ptr<std::ostream> os, const std::string& node)
+  : m_node(node)
+  , m_os(os)
+{
+  Connect();
+}
+
+CsTracer::~CsTracer(){};
+
+void
+CsTracer::Connect()
+{
+  Ptr<ContentStore> cs = m_nodePtr->GetObject<ContentStore>();
+  cs->TraceConnectWithoutContext("CacheHits", MakeCallback(&CsTracer::CacheHits, this));
+  cs->TraceConnectWithoutContext("CacheMisses", MakeCallback(&CsTracer::CacheMisses, this));
+
+  Reset();
+}
+
+void
+CsTracer::SetAveragingPeriod(const Time& period)
+{
+  m_period = period;
+  m_printEvent.Cancel();
+  m_printEvent = Simulator::Schedule(m_period, &CsTracer::PeriodicPrinter, this);
+}
+
+void
+CsTracer::PeriodicPrinter()
+{
+  Print(*m_os);
+  Reset();
+
+  m_printEvent = Simulator::Schedule(m_period, &CsTracer::PeriodicPrinter, this);
+}
+
+void
+CsTracer::PrintHeader(std::ostream& os) const
+{
+  os << "Time"
+     << "\t"
+
+     << "Node"
+     << "\t"
+
+     << "Type"
+     << "\t"
+     << "Packets"
+     << "\t";
+}
+
+void
+CsTracer::Reset()
+{
+  m_stats.Reset();
+}
+
+#define PRINTER(printName, fieldName)                                                              \
+  os << time.ToDouble(Time::S) << "\t" << m_node << "\t" << printName << "\t" << m_stats.fieldName \
+     << "\n";
+
+void
+CsTracer::Print(std::ostream& os) const
+{
+  Time time = Simulator::Now();
+
+  PRINTER("CacheHits", m_cacheHits);
+  PRINTER("CacheMisses", m_cacheMisses);
+}
+
+void
+CsTracer::CacheHits(shared_ptr<const Interest>, shared_ptr<const Data>)
+{
+  m_stats.m_cacheHits++;
+}
+
+void
+CsTracer::CacheMisses(shared_ptr<const Interest>)
+{
+  m_stats.m_cacheMisses++;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/tracers/ndn-cs-tracer.hpp b/utils/tracers/ndn-cs-tracer.hpp
new file mode 100644
index 0000000..d14d005
--- /dev/null
+++ b/utils/tracers/ndn-cs-tracer.hpp
@@ -0,0 +1,221 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * 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: Xiaoyan Hu <x......u@gmail.com>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_CS_TRACER_H
+#define CCNX_CS_TRACER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include <ns3/nstime.h>
+#include <ns3/event-id.h>
+#include <ns3/node-container.h>
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <map>
+#include <list>
+
+namespace ns3 {
+
+class Node;
+class Packet;
+
+namespace ndn {
+
+namespace cs {
+
+/// @cond include_hidden
+struct Stats {
+  inline void
+  Reset()
+  {
+    m_cacheHits = 0;
+    m_cacheMisses = 0;
+  }
+  double m_cacheHits;
+  double m_cacheMisses;
+};
+/// @endcond
+}
+
+/**
+ * @ingroup ndn-tracers
+ * @brief NDN tracer for cache performance (hits and misses)
+ */
+class CsTracer : public SimpleRefCount<CsTracer> {
+public:
+  /**
+   * @brief Helper method to install tracers on all simulation nodes
+   *
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  InstallAll(const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on the selected simulation nodes
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  Install(const NodeContainer& nodes, const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  Install(Ptr<Node> node, const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param outputStream Smart pointer to a stream
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   */
+  static Ptr<CsTracer>
+  Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
+          Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Explicit request to remove all statically created tracers
+   *
+   * This method can be helpful if simulation scenario contains several independent run,
+   * or if it is desired to do a postprocessing of the resulting data
+   */
+  static void
+  Destroy();
+
+  /**
+   * @brief Trace constructor that attaches to the node using node pointer
+   * @param os    reference to the output stream
+   * @param node  pointer to the node
+   */
+  CsTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node);
+
+  /**
+   * @brief Trace constructor that attaches to the node using node name
+   * @param os        reference to the output stream
+   * @param nodeName  name of the node registered using Names::Add
+   */
+  CsTracer(boost::shared_ptr<std::ostream> os, const std::string& node);
+
+  /**
+   * @brief Destructor
+   */
+  ~CsTracer();
+
+  /**
+   * @brief Print head of the trace (e.g., for post-processing)
+   *
+   * @param os reference to output stream
+   */
+  void
+  PrintHeader(std::ostream& os) const;
+
+  /**
+   * @brief Print current trace data
+   *
+   * @param os reference to output stream
+   */
+  void
+  Print(std::ostream& os) const;
+
+private:
+  void
+  Connect();
+
+  void
+  CacheHits(shared_ptr<const Interest>, shared_ptr<const Data>);
+
+  void
+  CacheMisses(shared_ptr<const Interest>);
+
+private:
+  void
+  SetAveragingPeriod(const Time& period);
+
+  void
+  Reset();
+
+  void
+  PeriodicPrinter();
+
+private:
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+
+  boost::shared_ptr<std::ostream> m_os;
+
+  Time m_period;
+  EventId m_printEvent;
+  cs::Stats m_stats;
+};
+
+/**
+ * @brief Helper to dump the trace to an output stream
+ */
+inline std::ostream&
+operator<<(std::ostream& os, const CsTracer& tracer)
+{
+  os << "# ";
+  tracer.PrintHeader(os);
+  os << "\n";
+  tracer.Print(os);
+  return os;
+}
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // CCNX_CS_TRACER_H
diff --git a/utils/tracers/ndn-l3-aggregate-tracer.cpp b/utils/tracers/ndn-l3-aggregate-tracer.cpp
new file mode 100644
index 0000000..5f0dca6
--- /dev/null
+++ b/utils/tracers/ndn-l3-aggregate-tracer.cpp
@@ -0,0 +1,383 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-l3-aggregate-tracer.hpp"
+
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "apps/ndn-app.hpp"
+#include "model/ndn-face.hpp"
+
+#include "ns3/simulator.h"
+#include "ns3/node-list.h"
+#include "ns3/log.h"
+
+#include <fstream>
+
+NS_LOG_COMPONENT_DEFINE("ndn.L3AggregateTracer");
+
+namespace ns3 {
+namespace ndn {
+
+static std::list<boost::tuple<boost::shared_ptr<std::ostream>, std::list<Ptr<L3AggregateTracer>>>>
+  g_tracers;
+
+template<class T>
+static inline void
+NullDeleter(T* ptr)
+{
+}
+
+void
+L3AggregateTracer::Destroy()
+{
+  g_tracers.clear();
+}
+
+void
+L3AggregateTracer::InstallAll(const std::string& file, Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<L3AggregateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<L3AggregateTracer> trace = Install(*node, outputStream, averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+L3AggregateTracer::Install(const NodeContainer& nodes, const std::string& file,
+                           Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<L3AggregateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
+    Ptr<L3AggregateTracer> trace = Install(*node, outputStream, averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+L3AggregateTracer::Install(Ptr<Node> node, const std::string& file,
+                           Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<L3AggregateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  Ptr<L3AggregateTracer> trace = Install(node, outputStream, averagingPeriod);
+  tracers.push_back(trace);
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+Ptr<L3AggregateTracer>
+L3AggregateTracer::Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
+                           Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  NS_LOG_DEBUG("Node: " << node->GetId());
+
+  Ptr<L3AggregateTracer> trace = Create<L3AggregateTracer>(outputStream, node);
+  trace->SetAveragingPeriod(averagingPeriod);
+
+  return trace;
+}
+
+L3AggregateTracer::L3AggregateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node)
+  : L3Tracer(node)
+  , m_os(os)
+{
+  Reset();
+}
+
+L3AggregateTracer::L3AggregateTracer(boost::shared_ptr<std::ostream> os, const std::string& node)
+  : L3Tracer(node)
+  , m_os(os)
+{
+  Reset();
+}
+
+L3AggregateTracer::~L3AggregateTracer(){};
+
+void
+L3AggregateTracer::SetAveragingPeriod(const Time& period)
+{
+  m_period = period;
+  m_printEvent.Cancel();
+  m_printEvent = Simulator::Schedule(m_period, &L3AggregateTracer::PeriodicPrinter, this);
+}
+
+void
+L3AggregateTracer::PeriodicPrinter()
+{
+  Print(*m_os);
+  Reset();
+
+  m_printEvent = Simulator::Schedule(m_period, &L3AggregateTracer::PeriodicPrinter, this);
+}
+
+void
+L3AggregateTracer::PrintHeader(std::ostream& os) const
+{
+  os << "Time"
+     << "\t"
+
+     << "Node"
+     << "\t"
+     << "FaceId"
+     << "\t"
+     << "FaceDescr"
+     << "\t"
+
+     << "Type"
+     << "\t"
+     << "Packets"
+     << "\t"
+     << "Kilobytes";
+}
+
+void
+L3AggregateTracer::Reset()
+{
+  for (std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats>>::iterator stats = m_stats.begin();
+       stats != m_stats.end(); stats++) {
+    stats->second.get<0>().Reset();
+    stats->second.get<1>().Reset();
+  }
+}
+
+#define STATS(INDEX) stats->second.get<INDEX>()
+
+#define PRINTER(printName, fieldName)                                                              \
+  os << time.ToDouble(Time::S) << "\t" << m_node << "\t";                                          \
+  if (stats->first) {                                                                              \
+    os << stats->first->GetId() << "\t" << *stats->first << "\t";                                  \
+  }                                                                                                \
+  else {                                                                                           \
+    os << "-1\tall\t";                                                                             \
+  }                                                                                                \
+  os << printName << "\t" << STATS(0).fieldName << "\t" << STATS(1).fieldName / 1024.0 << "\n";
+
+void
+L3AggregateTracer::Print(std::ostream& os) const
+{
+  Time time = Simulator::Now();
+
+  for (std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats>>::iterator stats = m_stats.begin();
+       stats != m_stats.end(); stats++) {
+    if (!stats->first)
+      continue;
+
+    PRINTER("InInterests", m_inInterests);
+    PRINTER("OutInterests", m_outInterests);
+    PRINTER("DropInterests", m_dropInterests);
+
+    PRINTER("InNacks", m_inNacks);
+    PRINTER("OutNacks", m_outNacks);
+    PRINTER("DropNacks", m_dropNacks);
+
+    PRINTER("InData", m_inData);
+    PRINTER("OutData", m_outData);
+    PRINTER("DropData", m_dropData);
+  }
+
+  {
+    std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats>>::iterator stats =
+      m_stats.find(shared_ptr<const Face>(0));
+    if (stats != m_stats.end()) {
+      PRINTER("SatisfiedInterests", m_satisfiedInterests);
+      PRINTER("TimedOutInterests", m_timedOutInterests);
+    }
+  }
+}
+
+void
+L3AggregateTracer::OutInterests(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_outInterests++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_outInterests += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::InInterests(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_inInterests++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_inInterests += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::DropInterests(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_dropInterests++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_dropInterests += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::OutNacks(shared_ptr<const Interest> nack, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_outNacks++;
+  if (nack->GetWire()) {
+    m_stats[face].get<1>().m_outNacks += nack->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::InNacks(shared_ptr<const Interest> nack, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_inNacks++;
+  if (nack->GetWire()) {
+    m_stats[face].get<1>().m_inNacks += nack->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::DropNacks(shared_ptr<const Interest> nack, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_dropNacks++;
+  if (nack->GetWire()) {
+    m_stats[face].get<1>().m_dropNacks += nack->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::OutData(shared_ptr<const Data> data, bool fromCache, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_outData++;
+  if (data->GetWire()) {
+    m_stats[face].get<1>().m_outData += data->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::InData(shared_ptr<const Data> data, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_inData++;
+  if (data->GetWire()) {
+    m_stats[face].get<1>().m_inData += data->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::DropData(shared_ptr<const Data> data, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_dropData++;
+  if (data->GetWire()) {
+    m_stats[face].get<1>().m_dropData += data->GetWire()->GetSize();
+  }
+}
+
+void
+L3AggregateTracer::SatisfiedInterests(Ptr<const pit::Entry>)
+{
+  m_stats[0].get<0>().m_satisfiedInterests++;
+  // no "size" stats
+}
+
+void
+L3AggregateTracer::TimedOutInterests(Ptr<const pit::Entry>)
+{
+  m_stats[0].get<0>().m_timedOutInterests++;
+  // no "size" stats
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/tracers/ndn-l3-aggregate-tracer.hpp b/utils/tracers/ndn-l3-aggregate-tracer.hpp
new file mode 100644
index 0000000..35bf917
--- /dev/null
+++ b/utils/tracers/ndn-l3-aggregate-tracer.hpp
@@ -0,0 +1,200 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_L3_AGGREGATE_TRACER_H
+#define NDN_L3_AGGREGATE_TRACER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-l3-tracer.hpp"
+
+#include <ns3/nstime.h>
+#include <ns3/event-id.h>
+#include <ns3/node-container.h>
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <map>
+#include <list>
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-tracers
+ * @brief NDN network-layer tracer for aggregate packet counts
+ */
+class L3AggregateTracer : public L3Tracer {
+public:
+  /**
+   * @brief Helper method to install tracers on all simulation nodes
+   *
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  InstallAll(const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on the selected simulation nodes
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  Install(const NodeContainer& nodes, const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   *
+   */
+  static void
+  Install(Ptr<Node> node, const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Explicit request to remove all statically created tracers
+   *
+   * This method can be helpful if simulation scenario contains several independent run,
+   * or if it is desired to do a postprocessing of the resulting data
+   */
+  static void
+  Destroy();
+
+  /**
+   * @brief Trace constructor that attaches to the node using node pointer
+   * @param os    reference to the output stream
+   * @param node  pointer to the node
+   */
+  L3AggregateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node);
+
+  /**
+   * @brief Trace constructor that attaches to the node using node name
+   * @param os        reference to the output stream
+   * @param nodeName  name of the node registered using Names::Add
+   */
+  L3AggregateTracer(boost::shared_ptr<std::ostream> os, const std::string& nodeName);
+
+  /**
+   * @brief Destructor
+   */
+  virtual ~L3AggregateTracer();
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param outputStream Smart pointer to a stream
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   */
+  static Ptr<L3AggregateTracer>
+  Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
+          Time averagingPeriod = Seconds(0.5));
+
+protected:
+  // from L3Tracer
+  virtual void
+  PrintHeader(std::ostream& os) const;
+
+  virtual void
+  Print(std::ostream& os) const;
+
+  virtual void
+  OutInterests(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  InInterests(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  DropInterests(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  OutNacks(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  InNacks(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  DropNacks(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  OutData(shared_ptr<const Data>, bool fromCache, shared_ptr<const Face>);
+
+  virtual void
+  InData(shared_ptr<const Data>, shared_ptr<const Face>);
+
+  virtual void
+  DropData(shared_ptr<const Data>, shared_ptr<const Face>);
+
+  virtual void
+  SatisfiedInterests(Ptr<const pit::Entry>);
+
+  virtual void
+  TimedOutInterests(Ptr<const pit::Entry>);
+
+protected:
+  void
+  SetAveragingPeriod(const Time& period);
+
+  void
+  Reset();
+
+  void
+  PeriodicPrinter();
+
+protected:
+  boost::shared_ptr<std::ostream> m_os;
+
+  Time m_period;
+  EventId m_printEvent;
+
+  mutable std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats>> m_stats;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_L3_AGGREGATE_TRACER_H
diff --git a/utils/tracers/ndn-l3-rate-tracer.cpp b/utils/tracers/ndn-l3-rate-tracer.cpp
new file mode 100644
index 0000000..1b91c46
--- /dev/null
+++ b/utils/tracers/ndn-l3-rate-tracer.cpp
@@ -0,0 +1,428 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-l3-rate-tracer.hpp"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+#include "ns3/node-list.h"
+
+#include "ns3/ndn-app.hpp"
+#include "ns3/ndn-face.hpp"
+#include "ns3/ndn-pit-entry.hpp"
+
+#include <fstream>
+#include <boost/lexical_cast.hpp>
+
+using namespace boost;
+using namespace std;
+
+NS_LOG_COMPONENT_DEFINE("ndn.L3RateTracer");
+
+namespace ns3 {
+namespace ndn {
+
+static std::list<boost::tuple<boost::shared_ptr<std::ostream>, std::list<Ptr<L3RateTracer>>>>
+  g_tracers;
+
+template<class T>
+static inline void
+NullDeleter(T* ptr)
+{
+}
+
+void
+L3RateTracer::Destroy()
+{
+  g_tracers.clear();
+}
+
+void
+L3RateTracer::InstallAll(const std::string& file, Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  std::list<Ptr<L3RateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
+    Ptr<L3RateTracer> trace = Install(*node, outputStream, averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+L3RateTracer::Install(const NodeContainer& nodes, const std::string& file,
+                      Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<L3RateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
+    Ptr<L3RateTracer> trace = Install(*node, outputStream, averagingPeriod);
+    tracers.push_back(trace);
+  }
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+void
+L3RateTracer::Install(Ptr<Node> node, const std::string& file,
+                      Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+
+  std::list<Ptr<L3RateTracer>> tracers;
+  boost::shared_ptr<std::ostream> outputStream;
+  if (file != "-") {
+    boost::shared_ptr<std::ofstream> os(new std::ofstream());
+    os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
+
+    if (!os->is_open()) {
+      NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
+      return;
+    }
+
+    outputStream = os;
+  }
+  else {
+    outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
+  }
+
+  Ptr<L3RateTracer> trace = Install(node, outputStream, averagingPeriod);
+  tracers.push_back(trace);
+
+  if (tracers.size() > 0) {
+    // *m_l3RateTrace << "# "; // not necessary for R's read.table
+    tracers.front()->PrintHeader(*outputStream);
+    *outputStream << "\n";
+  }
+
+  g_tracers.push_back(boost::make_tuple(outputStream, tracers));
+}
+
+Ptr<L3RateTracer>
+L3RateTracer::Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
+                      Time averagingPeriod /* = Seconds (0.5)*/)
+{
+  NS_LOG_DEBUG("Node: " << node->GetId());
+
+  Ptr<L3RateTracer> trace = Create<L3RateTracer>(outputStream, node);
+  trace->SetAveragingPeriod(averagingPeriod);
+
+  return trace;
+}
+
+L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node)
+  : L3Tracer(node)
+  , m_os(os)
+{
+  SetAveragingPeriod(Seconds(1.0));
+}
+
+L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, const std::string& node)
+  : L3Tracer(node)
+  , m_os(os)
+{
+  SetAveragingPeriod(Seconds(1.0));
+}
+
+L3RateTracer::~L3RateTracer()
+{
+  m_printEvent.Cancel();
+}
+
+void
+L3RateTracer::SetAveragingPeriod(const Time& period)
+{
+  m_period = period;
+  m_printEvent.Cancel();
+  m_printEvent = Simulator::Schedule(m_period, &L3RateTracer::PeriodicPrinter, this);
+}
+
+void
+L3RateTracer::PeriodicPrinter()
+{
+  Print(*m_os);
+  Reset();
+
+  m_printEvent = Simulator::Schedule(m_period, &L3RateTracer::PeriodicPrinter, this);
+}
+
+void
+L3RateTracer::PrintHeader(std::ostream& os) const
+{
+  os << "Time"
+     << "\t"
+
+     << "Node"
+     << "\t"
+     << "FaceId"
+     << "\t"
+     << "FaceDescr"
+     << "\t"
+
+     << "Type"
+     << "\t"
+     << "Packets"
+     << "\t"
+     << "Kilobytes"
+     << "\t"
+     << "PacketRaw"
+     << "\t"
+     << "KilobytesRaw";
+}
+
+void
+L3RateTracer::Reset()
+{
+  for (std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>>::iterator stats =
+         m_stats.begin();
+       stats != m_stats.end(); stats++) {
+    stats->second.get<0>().Reset();
+    stats->second.get<1>().Reset();
+  }
+}
+
+const double alpha = 0.8;
+
+#define STATS(INDEX) stats->second.get<INDEX>()
+#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble(Time::S)
+
+#define PRINTER(printName, fieldName)                                                              \
+  STATS(2).fieldName =                                                                             \
+    /*new value*/ alpha * RATE(0, fieldName) + /*old value*/ (1 - alpha) * STATS(2).fieldName;     \
+  STATS(3).fieldName = /*new value*/ alpha * RATE(1, fieldName) / 1024.0                           \
+                       + /*old value*/ (1 - alpha) * STATS(3).fieldName;                           \
+                                                                                                   \
+  os << time.ToDouble(Time::S) << "\t" << m_node << "\t";                                          \
+  if (stats->first) {                                                                              \
+    os << stats->first->GetId() << "\t" << *stats->first << "\t";                                  \
+  }                                                                                                \
+  else {                                                                                           \
+    os << "-1\tall\t";                                                                             \
+  }                                                                                                \
+  os << printName << "\t" << STATS(2).fieldName << "\t" << STATS(3).fieldName << "\t"              \
+     << STATS(0).fieldName << "\t" << STATS(1).fieldName / 1024.0 << "\n";
+
+void
+L3RateTracer::Print(std::ostream& os) const
+{
+  Time time = Simulator::Now();
+
+  for (std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>>::iterator stats =
+         m_stats.begin();
+       stats != m_stats.end(); stats++) {
+    if (!stats->first)
+      continue;
+
+    PRINTER("InInterests", m_inInterests);
+    PRINTER("OutInterests", m_outInterests);
+    PRINTER("DropInterests", m_dropInterests);
+
+    PRINTER("InNacks", m_inNacks);
+    PRINTER("OutNacks", m_outNacks);
+    PRINTER("DropNacks", m_dropNacks);
+
+    PRINTER("InData", m_inData);
+    PRINTER("OutData", m_outData);
+    PRINTER("DropData", m_dropData);
+
+    PRINTER("InSatisfiedInterests", m_satisfiedInterests);
+    PRINTER("InTimedOutInterests", m_timedOutInterests);
+
+    PRINTER("OutSatisfiedInterests", m_outSatisfiedInterests);
+    PRINTER("OutTimedOutInterests", m_outTimedOutInterests);
+  }
+
+  {
+    std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>>::iterator stats =
+      m_stats.find(shared_ptr<const Face>(0));
+    if (stats != m_stats.end()) {
+      PRINTER("SatisfiedInterests", m_satisfiedInterests);
+      PRINTER("TimedOutInterests", m_timedOutInterests);
+    }
+  }
+}
+
+void
+L3RateTracer::OutInterests(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_outInterests++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_outInterests += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::InInterests(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_inInterests++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_inInterests += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::DropInterests(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_dropInterests++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_dropInterests += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::OutNacks(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_outNacks++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_outNacks += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::InNacks(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_inNacks++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_inNacks += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::DropNacks(shared_ptr<const Interest> interest, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_dropNacks++;
+  if (interest->GetWire()) {
+    m_stats[face].get<1>().m_dropNacks += interest->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::OutData(shared_ptr<const Data> data, bool fromCache, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_outData++;
+  if (data->GetWire()) {
+    m_stats[face].get<1>().m_outData += data->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::InData(shared_ptr<const Data> data, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_inData++;
+  if (data->GetWire()) {
+    m_stats[face].get<1>().m_inData += data->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::DropData(shared_ptr<const Data> data, shared_ptr<const Face> face)
+{
+  m_stats[face].get<0>().m_dropData++;
+  if (data->GetWire()) {
+    m_stats[face].get<1>().m_dropData += data->GetWire()->GetSize();
+  }
+}
+
+void
+L3RateTracer::SatisfiedInterests(Ptr<const pit::Entry> entry)
+{
+  m_stats[0].get<0>().m_satisfiedInterests++;
+  // no "size" stats
+
+  for (pit::Entry::in_container::const_iterator i = entry->GetIncoming().begin();
+       i != entry->GetIncoming().end(); i++) {
+    m_stats[i->m_face].get<0>().m_satisfiedInterests++;
+  }
+
+  for (pit::Entry::out_container::const_iterator i = entry->GetOutgoing().begin();
+       i != entry->GetOutgoing().end(); i++) {
+    m_stats[i->m_face].get<0>().m_outSatisfiedInterests++;
+  }
+}
+
+void
+L3RateTracer::TimedOutInterests(Ptr<const pit::Entry> entry)
+{
+  m_stats[0].get<0>().m_timedOutInterests++;
+  // no "size" stats
+
+  for (pit::Entry::in_container::const_iterator i = entry->GetIncoming().begin();
+       i != entry->GetIncoming().end(); i++) {
+    m_stats[i->m_face].get<0>().m_timedOutInterests++;
+  }
+
+  for (pit::Entry::out_container::const_iterator i = entry->GetOutgoing().begin();
+       i != entry->GetOutgoing().end(); i++) {
+    m_stats[i->m_face].get<0>().m_outTimedOutInterests++;
+  }
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/tracers/ndn-l3-rate-tracer.hpp b/utils/tracers/ndn-l3-rate-tracer.hpp
new file mode 100644
index 0000000..1dc8118
--- /dev/null
+++ b/utils/tracers/ndn-l3-rate-tracer.hpp
@@ -0,0 +1,186 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_RATE_L3_TRACER_H
+#define CCNX_RATE_L3_TRACER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ndn-l3-tracer.hpp"
+
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+#include <ns3/node-container.h>
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <map>
+#include <list>
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * @ingroup ndn-tracers
+ * @brief NDN network-layer rate tracer
+ */
+class L3RateTracer : public L3Tracer {
+public:
+  /**
+   * @brief Helper method to install tracers on all simulation nodes
+   *
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod Defines averaging period for the rate calculation,
+   *        as well as how often data will be written into the trace file (default, every half
+   *second)
+   */
+  static void
+  InstallAll(const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on the selected simulation nodes
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   */
+  static void
+  Install(const NodeContainer& nodes, const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param file File to which traces will be written.  If filename is -, then std::out is used
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   */
+  static void
+  Install(Ptr<Node> node, const std::string& file, Time averagingPeriod = Seconds(0.5));
+
+  /**
+   * @brief Explicit request to remove all statically created tracers
+   *
+   * This method can be helpful if simulation scenario contains several independent run,
+   * or if it is desired to do a postprocessing of the resulting data
+   */
+  static void
+  Destroy();
+
+  /**
+   * @brief Trace constructor that attaches to the node using node pointer
+   * @param os    reference to the output stream
+   * @param node  pointer to the node
+   */
+  L3RateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node);
+
+  /**
+   * @brief Trace constructor that attaches to the node using node name
+   * @param os        reference to the output stream
+   * @param nodeName  name of the node registered using Names::Add
+   */
+  L3RateTracer(boost::shared_ptr<std::ostream> os, const std::string& node);
+
+  /**
+   * @brief Destructor
+   */
+  virtual ~L3RateTracer();
+
+  /**
+   * @brief Helper method to install tracers on a specific simulation node
+   *
+   * @param nodes Nodes on which to install tracer
+   * @param outputStream Smart pointer to a stream
+   * @param averagingPeriod How often data will be written into the trace file (default, every half
+   *second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This
+   *tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   */
+  static Ptr<L3RateTracer>
+  Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
+          Time averagingPeriod = Seconds(0.5));
+
+  // from L3Tracer
+  virtual void
+  PrintHeader(std::ostream& os) const;
+
+  virtual void
+  Print(std::ostream& os) const;
+
+protected:
+  // from L3Tracer
+  virtual void
+  OutInterests(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  InInterests(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  DropInterests(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  OutNacks(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  InNacks(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  DropNacks(shared_ptr<const Interest>, shared_ptr<const Face>);
+
+  virtual void
+  OutData(shared_ptr<const Data>, bool fromCache, shared_ptr<const Face>);
+
+  virtual void
+  InData(shared_ptr<const Data>, shared_ptr<const Face>);
+
+  virtual void
+  DropData(shared_ptr<const Data>, shared_ptr<const Face>);
+
+  virtual void
+  SatisfiedInterests(Ptr<const pit::Entry>);
+
+  virtual void
+  TimedOutInterests(Ptr<const pit::Entry>);
+
+private:
+  void
+  SetAveragingPeriod(const Time& period);
+
+  void
+  PeriodicPrinter();
+
+  void
+  Reset();
+
+private:
+  boost::shared_ptr<std::ostream> m_os;
+  Time m_period;
+  EventId m_printEvent;
+
+  mutable std::map<shared_ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>> m_stats;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // CCNX_RATE_L3_TRACER_H
diff --git a/utils/tracers/ndn-l3-tracer.cpp b/utils/tracers/ndn-l3-tracer.cpp
new file mode 100644
index 0000000..25e9f07
--- /dev/null
+++ b/utils/tracers/ndn-l3-tracer.cpp
@@ -0,0 +1,86 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-l3-tracer.hpp"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/callback.h"
+#include "ns3/ndn-forwarding-strategy.hpp"
+
+#include <boost/lexical_cast.hpp>
+
+#include "ns3/ndn-face.hpp"
+#include "ns3/ndn-pit-entry.hpp"
+
+using namespace std;
+
+namespace ns3 {
+namespace ndn {
+
+L3Tracer::L3Tracer(Ptr<Node> node)
+  : m_nodePtr(node)
+{
+  m_node = boost::lexical_cast<string>(m_nodePtr->GetId());
+
+  Connect();
+
+  string name = Names::FindName(node);
+  if (!name.empty()) {
+    m_node = name;
+  }
+}
+
+L3Tracer::L3Tracer(const std::string& node)
+  : m_node(node)
+{
+  Connect();
+}
+
+L3Tracer::~L3Tracer(){};
+
+void
+L3Tracer::Connect()
+{
+  Ptr<ForwardingStrategy> fw = m_nodePtr->GetObject<ForwardingStrategy>();
+
+  fw->TraceConnectWithoutContext("OutInterests", MakeCallback(&L3Tracer::OutInterests, this));
+  fw->TraceConnectWithoutContext("InInterests", MakeCallback(&L3Tracer::InInterests, this));
+  fw->TraceConnectWithoutContext("DropInterests", MakeCallback(&L3Tracer::DropInterests, this));
+
+  fw->TraceConnectWithoutContext("OutData", MakeCallback(&L3Tracer::OutData, this));
+  fw->TraceConnectWithoutContext("InData", MakeCallback(&L3Tracer::InData, this));
+  fw->TraceConnectWithoutContext("DropData", MakeCallback(&L3Tracer::DropData, this));
+
+  // only for some strategies
+  fw->TraceConnectWithoutContext("OutNacks", MakeCallback(&L3Tracer::OutNacks, this));
+  fw->TraceConnectWithoutContext("InNacks", MakeCallback(&L3Tracer::InNacks, this));
+  fw->TraceConnectWithoutContext("DropNacks", MakeCallback(&L3Tracer::DropNacks, this));
+
+  // satisfied/timed out PIs
+  fw->TraceConnectWithoutContext("SatisfiedInterests",
+                                 MakeCallback(&L3Tracer::SatisfiedInterests, this));
+  fw->TraceConnectWithoutContext("TimedOutInterests",
+                                 MakeCallback(&L3Tracer::TimedOutInterests, this));
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/tracers/ndn-l3-tracer.hpp b/utils/tracers/ndn-l3-tracer.hpp
new file mode 100644
index 0000000..4b2cc5a
--- /dev/null
+++ b/utils/tracers/ndn-l3-tracer.hpp
@@ -0,0 +1,154 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011-2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_L3_TRACER_H
+#define NDN_L3_TRACER_H
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+
+/**
+ * @ingroup ndn-helpers
+ * @defgroup ndn-tracers Helpers to simplify metric collection
+ */
+
+namespace ns3 {
+
+class Node;
+class Packet;
+
+namespace ndn {
+
+namespace pit {
+class Entry;
+}
+
+class Face;
+
+/**
+ * @ingroup ndn-tracers
+ * @brief Base class for network-layer (incoming/outgoing Interests and Data) tracing of NDN stack
+ */
+class L3Tracer : public SimpleRefCount<L3Tracer> {
+public:
+  /**
+   * @brief Trace constructor that attaches to the node using node pointer
+   * @param node  pointer to the node
+   */
+  L3Tracer(Ptr<Node> node);
+
+  /**
+   * @brief Trace constructor that attaches to the node using node name
+   * @param nodeName  name of the node registered using Names::Add
+   */
+  L3Tracer(const std::string& node);
+
+  /**
+   * @brief Destructor
+   */
+  virtual ~L3Tracer();
+
+  /**
+   * @brief Print head of the trace (e.g., for post-processing)
+   *
+   * @param os reference to output stream
+   */
+  virtual void
+  PrintHeader(std::ostream& os) const = 0;
+
+  /**
+   * @brief Print current trace data
+   *
+   * @param os reference to output stream
+   */
+  virtual void
+  Print(std::ostream& os) const = 0;
+
+protected:
+  void
+  Connect();
+
+  virtual void
+  OutInterests(shared_ptr<const Interest>, shared_ptr<const Face>) = 0;
+
+  virtual void
+  InInterests(shared_ptr<const Interest>, shared_ptr<const Face>) = 0;
+
+  virtual void
+  OutData(shared_ptr<const Data>, bool fromCache, shared_ptr<const Face>) = 0;
+
+  virtual void
+  InData(shared_ptr<const Data>, shared_ptr<const Face>) = 0;
+
+  virtual void
+  SatisfiedInterests(Ptr<const pit::Entry>) = 0;
+
+  virtual void
+  TimedOutInterests(Ptr<const pit::Entry>) = 0;
+
+protected:
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+
+  struct Stats {
+    inline void
+    Reset()
+    {
+      m_inInterests = 0;
+      m_outInterests = 0;
+      m_inData = 0;
+      m_outData = 0;
+      m_satisfiedInterests = 0;
+      m_timedOutInterests = 0;
+
+      m_outSatisfiedInterests = 0;
+      m_outTimedOutInterests = 0;
+    }
+
+    double m_inInterests;
+    double m_outInterests;
+    double m_inData;
+    double m_outData;
+    double m_satisfiedInterests;
+    double m_timedOutInterests;
+    double m_outSatisfiedInterests;
+    double m_outTimedOutInterests;
+  };
+};
+
+/**
+ * @brief Helper to dump the trace to an output stream
+ */
+inline std::ostream&
+operator<<(std::ostream& os, const L3Tracer& tracer)
+{
+  os << "# ";
+  tracer.PrintHeader(os);
+  os << "\n";
+  tracer.Print(os);
+  return os;
+}
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_L3_TRACER_H
diff --git a/utils/trie/aggregate-stats-policy.hpp b/utils/trie/aggregate-stats-policy.hpp
new file mode 100644
index 0000000..b2cb0bd
--- /dev/null
+++ b/utils/trie/aggregate-stats-policy.hpp
@@ -0,0 +1,163 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef AGGREGATE_STATS_POLICY_H_
+#define AGGREGATE_STATS_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for policy that just keeps track of number of elements
+ * It's doing a rather expensive job, but just in case it needs to be extended later
+ */
+struct aggregate_stats_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "AggregateStats";
+  }
+  struct policy_hook_type {
+  };
+
+  template<class Container>
+  struct container_hook {
+    struct type {
+    };
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    // typedef typename boost::intrusive::list< Container, Hook > policy_container;
+
+    // could be just typedef
+    class type {
+    public:
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , m_updates(0)
+        , m_inserts(0)
+        , m_lookups(0)
+        , m_erases(0)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        m_updates++;
+        // do nothing
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        m_inserts++;
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        m_lookups++;
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        m_erases++;
+      }
+
+      inline void set_max_size(uint32_t)
+      {
+      }
+
+      inline uint32_t
+      get_max_size() const
+      {
+        return 0;
+      }
+
+      inline void
+      clear()
+      {
+        // is called only at the end of simulation
+      }
+
+      inline void
+      ResetStats()
+      {
+        m_updates = 0;
+        m_inserts = 0;
+        m_lookups = 0;
+        m_erases = 0;
+      }
+
+      inline uint64_t
+      GetUpdates() const
+      {
+        return m_updates;
+      }
+
+      inline uint64_t
+      GetInserts() const
+      {
+        return m_inserts;
+      }
+
+      inline uint64_t
+      GetLookups() const
+      {
+        return m_lookups;
+      }
+
+      inline uint64_t
+      GetErases() const
+      {
+        return m_erases;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+
+      uint64_t m_updates;
+      uint64_t m_inserts;
+      uint64_t m_lookups;
+      uint64_t m_erases;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // AGGREGATE_STATS_POLICY_H_
diff --git a/utils/trie/counting-policy.hpp b/utils/trie/counting-policy.hpp
new file mode 100644
index 0000000..a44c290
--- /dev/null
+++ b/utils/trie/counting-policy.hpp
@@ -0,0 +1,112 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef COUNTING_POLICY_H_
+#define COUNTING_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for policy that just keeps track of number of elements
+ * It's doing a rather expensive job, but just in case it needs to be extended later
+ */
+struct counting_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Counting";
+  }
+
+  struct policy_hook_type : public boost::intrusive::list_member_hook<> {
+  };
+
+  template<class Container>
+  struct container_hook {
+    // could be class/struct implementation
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        policy_container::push_back(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // COUNTING_POLICY_H_
diff --git a/utils/trie/detail/functor-hook.hpp b/utils/trie/detail/functor-hook.hpp
new file mode 100644
index 0000000..b0daadd
--- /dev/null
+++ b/utils/trie/detail/functor-hook.hpp
@@ -0,0 +1,77 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef FUNCTOR_HOOK_H_
+#define FUNCTOR_HOOK_H_
+
+#include <boost/intrusive/parent_from_member.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+namespace detail {
+
+template<class BaseHook, class ValueType, int N>
+struct FunctorHook {
+  typedef typename BaseHook::template index<N>::type hook_type;
+  typedef hook_type* hook_ptr;
+  typedef const hook_type* const_hook_ptr;
+
+  typedef ValueType value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+
+  // Required static functions
+  static hook_ptr
+  to_hook_ptr(value_type& value)
+  {
+    return &value.policy_hook_.template get<N>();
+  }
+
+  static const_hook_ptr
+  to_hook_ptr(const value_type& value)
+  {
+    return &value.policy_hook_.template get<N>();
+  }
+
+  static pointer
+  to_value_ptr(hook_ptr n)
+  {
+    return boost::intrusive::get_parent_from_member<value_type>(
+      static_cast<BaseHook*>(
+        boost::intrusive::get_parent_from_member<wrap<hook_type>>(n, &wrap<hook_type>::value_)),
+      &value_type::policy_hook_);
+  }
+  static const_pointer
+  to_value_ptr(const_hook_ptr n)
+  {
+    return boost::intrusive::get_parent_from_member<value_type>(
+      static_cast<const BaseHook*>(
+        boost::intrusive::get_parent_from_member<wrap<hook_type>>(n, &wrap<hook_type>::value_)),
+      &value_type::policy_hook_);
+  }
+};
+
+} // detail
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // FUNCTOR_HOOK_H_
diff --git a/utils/trie/detail/multi-policy-container.hpp b/utils/trie/detail/multi-policy-container.hpp
new file mode 100644
index 0000000..00bfbf1
--- /dev/null
+++ b/utils/trie/detail/multi-policy-container.hpp
@@ -0,0 +1,211 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef MULTI_POLICY_CONTAINER_H_
+#define MULTI_POLICY_CONTAINER_H_
+
+#include <boost/mpl/inherit_linearly.hpp>
+#include <boost/mpl/at.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+namespace detail {
+
+template<class Base, class Value>
+struct policy_wrap {
+  policy_wrap(Base& base)
+    : value_(base)
+  {
+  }
+  Value value_;
+};
+
+template<class Base, class Super /*empy_wrap/previous level*/,
+         class Value /*policy_wrap< element in vector >*/>
+struct inherit_with_base : Super, Value {
+  inherit_with_base(Base& base)
+    : Super(base)
+    , Value(base)
+  {
+  }
+
+  void
+  update(typename Base::iterator item)
+  {
+    Value::value_.update(item);
+    Super::update(item);
+  }
+
+  bool
+  insert(typename Base::iterator item)
+  {
+    bool ok = Value::value_.insert(item);
+    if (!ok)
+      return false;
+
+    ok = Super::insert(item);
+    if (!ok) {
+      Value::value_.erase(item);
+      return false;
+    }
+    return true;
+  }
+
+  void
+  lookup(typename Base::iterator item)
+  {
+    Value::value_.lookup(item);
+    Super::lookup(item);
+  }
+
+  void
+  erase(typename Base::iterator item)
+  {
+    Value::value_.erase(item);
+    Super::erase(item);
+  }
+
+  void
+  clear()
+  {
+    Value::value_.clear();
+    Super::clear();
+  }
+};
+
+template<class Base>
+struct empty_policy_wrap {
+  empty_policy_wrap(Base& base)
+  {
+  }
+
+  void
+  update(typename Base::iterator item)
+  {
+  }
+  bool
+  insert(typename Base::iterator item)
+  {
+    return true;
+  }
+  void
+  lookup(typename Base::iterator item)
+  {
+  }
+  void
+  erase(typename Base::iterator item)
+  {
+  }
+  void
+  clear()
+  {
+  }
+};
+
+template<class Base, class Vector>
+struct multi_policy_container
+  : public boost::mpl::
+      fold<Vector, empty_policy_wrap<Base>,
+           inherit_with_base<Base, boost::mpl::_1 /*empty/previous*/,
+                             policy_wrap<Base, boost::mpl::_2> /*element in vector*/>>::type {
+  typedef typename boost::mpl::
+    fold<Vector, empty_policy_wrap<Base>,
+         inherit_with_base<Base, boost::mpl::_1 /*empty/previous*/,
+                           policy_wrap<Base, boost::mpl::_2> /*element in vector*/>>::type super;
+
+  typedef typename boost::mpl::at_c<Vector, 0>::type::iterator iterator;
+  typedef typename boost::mpl::at_c<Vector, 0>::type::const_iterator const_iterator;
+
+  iterator
+  begin()
+  {
+    return this->get<0>().begin();
+  }
+  const_iterator
+  begin() const
+  {
+    return this->get<0>().begin();
+  }
+
+  iterator
+  end()
+  {
+    return this->get<0>().end();
+  }
+  const_iterator
+  end() const
+  {
+    return this->get<0>().end();
+  }
+
+  size_t
+  size() const
+  {
+    return this->get<0>().size();
+  }
+
+  multi_policy_container(Base& base)
+    : super(base)
+  {
+  }
+
+  template<int N>
+  struct index {
+    typedef typename boost::mpl::at_c<Vector, N>::type type;
+  };
+
+  template<class T>
+  T&
+  get()
+  {
+    return static_cast<policy_wrap<Base, T>&>(*this).value_;
+  }
+
+  template<class T>
+  const T&
+  get() const
+  {
+    return static_cast<const policy_wrap<Base, T>&>(*this).value_;
+  }
+
+  template<int N>
+  typename boost::mpl::at_c<Vector, N>::type&
+  get()
+  {
+    typedef typename boost::mpl::at_c<Vector, N>::type T;
+    return static_cast<policy_wrap<Base, T>&>(*this).value_;
+  }
+
+  template<int N>
+  const typename boost::mpl::at_c<Vector, N>::type&
+  get() const
+  {
+    typedef typename boost::mpl::at_c<Vector, N>::type T;
+    return static_cast<const policy_wrap<Base, T>&>(*this).value_;
+  }
+};
+
+} // detail
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // MULTI_POLICY_CONTAINER_H_
diff --git a/utils/trie/detail/multi-type-container.hpp b/utils/trie/detail/multi-type-container.hpp
new file mode 100644
index 0000000..56dc89e
--- /dev/null
+++ b/utils/trie/detail/multi-type-container.hpp
@@ -0,0 +1,83 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef MULTI_TYPE_CONTAINER_H_
+#define MULTI_TYPE_CONTAINER_H_
+
+#include <boost/mpl/inherit_linearly.hpp>
+#include <boost/mpl/inherit.hpp>
+#include <boost/mpl/at.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+namespace detail {
+
+template<class T>
+struct wrap {
+  T value_;
+};
+
+template<class Vector>
+struct multi_type_container
+  : public boost::mpl::inherit_linearly<Vector, boost::mpl::inherit<wrap<boost::mpl::_2>,
+                                                                    boost::mpl::_1>>::type {
+  template<int N>
+  struct index {
+    typedef typename boost::mpl::at_c<Vector, N>::type type;
+  };
+
+  template<class T>
+  T&
+  get()
+  {
+    return static_cast<wrap<T>&>(*this).value_;
+  }
+
+  template<class T>
+  const T&
+  get() const
+  {
+    return static_cast<const wrap<T>&>(*this).value_;
+  }
+
+  template<int N>
+  typename boost::mpl::at_c<Vector, N>::type&
+  get()
+  {
+    typedef typename boost::mpl::at_c<Vector, N>::type T;
+    return static_cast<wrap<T>&>(*this).value_;
+  }
+
+  template<int N>
+  const typename boost::mpl::at_c<Vector, N>::type&
+  get() const
+  {
+    typedef typename boost::mpl::at_c<Vector, N>::type T;
+    return static_cast<const wrap<T>&>(*this).value_;
+  }
+};
+
+} // detail
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // MULTI_TYPE_CONTAINER_H_
diff --git a/utils/trie/empty-policy.hpp b/utils/trie/empty-policy.hpp
new file mode 100644
index 0000000..7d077b6
--- /dev/null
+++ b/utils/trie/empty-policy.hpp
@@ -0,0 +1,80 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef EMPTY_POLICY_H_
+#define EMPTY_POLICY_H_
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for empty (bogus) replacement policy
+ */
+struct empty_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "";
+  }
+
+  typedef void* policy_hook_type;
+
+  template<class Container>
+  struct container_hook {
+    typedef void* type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    struct type {
+      inline type(Base& base)
+      {
+      }
+
+      inline void update(typename Container::iterator)
+      {
+      }
+      inline bool insert(typename Container::iterator)
+      {
+        return true;
+      }
+      inline void
+      lookup(typename Container::iterator item)
+      {
+      }
+      inline void
+      erase(typename Container::iterator item)
+      {
+      }
+      inline void
+      clear()
+      {
+      }
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // EMPTY_POLICY_H_
diff --git a/utils/trie/fifo-policy.hpp b/utils/trie/fifo-policy.hpp
new file mode 100644
index 0000000..2527c16
--- /dev/null
+++ b/utils/trie/fifo-policy.hpp
@@ -0,0 +1,129 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef FIFO_POLICY_H_
+#define FIFO_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for First In First Out replacement policy
+ */
+struct fifo_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Fifo";
+  }
+
+  struct policy_hook_type : public boost::intrusive::list_member_hook<> {
+  };
+
+  template<class Container>
+  struct container_hook {
+    // could be class/struct implementation
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        if (max_size_ != 0 && policy_container::size() >= max_size_) {
+          base_.erase(&(*policy_container::begin()));
+        }
+
+        policy_container::push_back(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif
diff --git a/utils/trie/lfu-policy.hpp b/utils/trie/lfu-policy.hpp
new file mode 100644
index 0000000..897dc49
--- /dev/null
+++ b/utils/trie/lfu-policy.hpp
@@ -0,0 +1,162 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef LFU_POLICY_H_
+#define LFU_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/set.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for LFU replacement policy
+ */
+struct lfu_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Lfu";
+  }
+
+  struct policy_hook_type : public boost::intrusive::set_member_hook<> {
+    double frequency;
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    static double&
+    get_order(typename Container::iterator item)
+    {
+      return static_cast<policy_hook_type*>(policy_container::value_traits::to_node_ptr(*item))
+        ->frequency;
+    }
+
+    static const double&
+    get_order(typename Container::const_iterator item)
+    {
+      return static_cast<const policy_hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->frequency;
+    }
+
+    template<class Key>
+    struct MemberHookLess {
+      bool
+      operator()(const Key& a, const Key& b) const
+      {
+        return get_order(&a) < get_order(&b);
+      }
+    };
+
+    typedef boost::intrusive::multiset<Container,
+                                       boost::intrusive::compare<MemberHookLess<Container>>,
+                                       Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef policy policy_base; // to get access to get_order methods from outside
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+        get_order(item) += 1;
+        policy_container::insert(*item);
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        get_order(item) = 0;
+
+        if (max_size_ != 0 && policy_container::size() >= max_size_) {
+          // this erases the "least frequently used item" from cache
+          base_.erase(&(*policy_container::begin()));
+        }
+
+        policy_container::insert(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+        get_order(item) += 1;
+        policy_container::insert(*item);
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // LFU_POLICY_H
diff --git a/utils/trie/lru-policy.hpp b/utils/trie/lru-policy.hpp
new file mode 100644
index 0000000..77a65ca
--- /dev/null
+++ b/utils/trie/lru-policy.hpp
@@ -0,0 +1,132 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef LRU_POLICY_H_
+#define LRU_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for Least Recently Used replacement policy
+ */
+struct lru_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Lru";
+  }
+
+  struct policy_hook_type : public boost::intrusive::list_member_hook<> {
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do relocation
+        policy_container::splice(policy_container::end(), *this,
+                                 policy_container::s_iterator_to(*item));
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        if (max_size_ != 0 && policy_container::size() >= max_size_) {
+          base_.erase(&(*policy_container::begin()));
+        }
+
+        policy_container::push_back(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do relocation
+        policy_container::splice(policy_container::end(), *this,
+                                 policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif
diff --git a/utils/trie/multi-policy.hpp b/utils/trie/multi-policy.hpp
new file mode 100644
index 0000000..170f691
--- /dev/null
+++ b/utils/trie/multi-policy.hpp
@@ -0,0 +1,193 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef MULTI_POLICY_H_
+#define MULTI_POLICY_H_
+
+#include "detail/multi-type-container.hpp"
+#include "detail/multi-policy-container.hpp"
+#include "detail/functor-hook.hpp"
+
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/range_c.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/for_each.hpp>
+
+#include <boost/intrusive/options.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+template<typename Policies> // e.g., mpl::vector1< lru_policy_traits >
+struct multi_policy_traits {
+  typedef Policies policy_traits;
+
+  struct getHook {
+    template<class Item>
+    struct apply {
+      typedef typename Item::policy_hook_type type;
+    };
+  };
+  typedef detail::multi_type_container<
+    typename boost::mpl::transform1<policy_traits, getHook>::type> policy_hook_type;
+
+  template<class Container>
+  struct container_hook {
+    typedef policy_hook_type type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef boost::mpl::range_c<int, 0, boost::mpl::size<policy_traits>::type::value>
+      policies_range;
+
+    struct getPolicy {
+      template<class Number>
+      struct apply {
+        typedef typename boost::mpl::at_c<policy_traits, Number::value>::type::
+          template policy<Base, Container,
+                          boost::intrusive::function_hook<detail::FunctorHook<Hook, Container,
+                                                                              Number::value>>>::type
+            type;
+      };
+    };
+
+    typedef typename boost::mpl::transform1<policies_range, getPolicy,
+                                            boost::mpl::back_inserter<boost::mpl::vector0<>>>::type
+      policies;
+
+    typedef detail::multi_policy_container<Base, policies> policy_container;
+
+    class type : public policy_container {
+    public:
+      typedef policy policy_base; // to get access to get_time methods from outside
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : policy_container(base)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        policy_container::update(item);
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        return policy_container::insert(item);
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        policy_container::lookup(item);
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(item);
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      struct max_size_setter {
+        max_size_setter(policy_container& container, size_t size)
+          : m_container(container)
+          , m_size(size)
+        {
+        }
+
+        template<typename U>
+        void
+        operator()(U index)
+        {
+          m_container.template get<U::value>().set_max_size(m_size);
+        }
+
+      private:
+        policy_container& m_container;
+        size_t m_size;
+      };
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        boost::mpl::for_each<boost::mpl::range_c<int, 0,
+                                                 boost::mpl::size<policy_traits>::type::value>>(
+          max_size_setter(*this, max_size));
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        // as max size should be the same everywhere, get the value from the first available policy
+        return policy_container::template get<0>().get_max_size();
+      }
+    };
+  };
+
+  struct name_getter {
+    name_getter(std::string& name)
+      : m_name(name)
+    {
+    }
+
+    template<typename U>
+    void
+    operator()(U index)
+    {
+      if (!m_name.empty())
+        m_name += "::";
+      m_name += boost::mpl::at_c<policy_traits, U::value>::type::GetName();
+    }
+
+    std::string& m_name;
+  };
+
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    // combine names of all internal policies
+    std::string name;
+    boost::mpl::for_each<boost::mpl::range_c<int, 0, boost::mpl::size<policy_traits>::type::value>>(
+      name_getter(name));
+
+    return name;
+  }
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // MULTI_POLICY_H_
diff --git a/utils/trie/payload-policy.hpp b/utils/trie/payload-policy.hpp
new file mode 100644
index 0000000..9193442
--- /dev/null
+++ b/utils/trie/payload-policy.hpp
@@ -0,0 +1,126 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef PAYLOAD_POLICY_H_
+#define PAYLOAD_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for policy that keeps items in a sorted order using payload member
+ */
+template<class Member>
+struct payload_policy_traits {
+  struct policy_hook_type : public boost::intrusive::set_member_hook<> {
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do relocation
+        policy_container::splice(policy_container::end(), *this,
+                                 policy_container::s_iterator_to(*item));
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        if (policy_container::size() >= max_size_) {
+          base_.erase(&(*policy_container::begin()));
+        }
+
+        policy_container::push_back(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do relocation
+        policy_container::splice(policy_container::end(), *this,
+                                 policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // PAYLOAD_POLICY_H
diff --git a/utils/trie/payload-with-policy.hpp b/utils/trie/payload-with-policy.hpp
new file mode 100644
index 0000000..5d2fe47
--- /dev/null
+++ b/utils/trie/payload-with-policy.hpp
@@ -0,0 +1,104 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef PAYLOAD_WITH_INDEX_H_
+#define PAYLOAD_WITH_INDEX_H_
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+template<typename PayloadTraits, typename IndexTraits>
+class payload_with_index {
+public:
+  typedef PayloadTraits::pointer_type iterator;
+
+  typedef typename IndexTraits::
+    template index<PayloadTraits,
+                   typename IndexTraits::template container_hook<parent_trie>::type>::type
+      index_container;
+
+  inline payload_with_index()
+    : index_(*this)
+  {
+  }
+
+  inline std::pair<iterator, bool>
+  insert(typename iterator payload)
+  {
+    bool ok = policy_.insert(s_iterator_to(item.first));
+    if (!ok) {
+      item.first->erase(); // cannot insert
+      return std::make_pair(end(), false);
+    }
+
+    return item;
+  }
+
+  // inline void
+  // erase (const FullKey &key)
+  // {
+  //   iterator foundItem, lastItem;
+  //   bool reachLast;
+  //   std::tie (foundItem, reachLast, lastItem) = trie_.find (key);
+
+  //   if (!reachLast || lastItem->payload () == PayloadTraits::empty_payload)
+  //     return; // nothing to invalidate
+
+  //   erase (lastItem);
+  // }
+
+  // inline void
+  // erase (iterator node)
+  // {
+  //   if (node == end ()) return;
+
+  //   policy_.erase (s_iterator_to (node));
+  //   node->erase (); // will do cleanup here
+  // }
+
+  // inline void
+  // clear ()
+  // {
+  //   policy_.clear ();
+  //   trie_.clear ();
+  // }
+
+  // template<typename Modifier>
+  // bool
+  // modify (iterator position, Modifier mod)
+  // {
+  //   if (position == end ()) return false;
+  //   if (position->payload () == PayloadTraits::empty_payload) return false;
+
+  //   mod (*position->payload ());
+  //   policy_.update (position);
+  //   return true;
+  // }
+
+private:
+  mutable index_container policy_;
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // PAYLOAD_WITH_POLICY_H_
diff --git a/utils/trie/persistent-policy.hpp b/utils/trie/persistent-policy.hpp
new file mode 100644
index 0000000..c8f116c
--- /dev/null
+++ b/utils/trie/persistent-policy.hpp
@@ -0,0 +1,130 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef PERSISTENT_POLICY_H_
+#define PERSISTENT_POLICY_H_
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/list.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for persistent replacement policy
+ *
+ * In this policy entries are added until there is a space (controlled by set_max_size call).
+ * If maximum is reached, new entries will not be added and nothing will be removed from the
+ *container
+ */
+struct persistent_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Persistent";
+  }
+
+  struct policy_hook_type : public boost::intrusive::list_member_hook<> {
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    typedef typename boost::intrusive::list<Container, Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , max_size_(100) // when 0, policy is not enforced
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        if (max_size_ != 0 && policy_container::size() >= max_size_)
+          return false;
+
+        policy_container::push_back(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      // type () : base_(*((Base*)0)) { };
+
+    private:
+      Base& base_;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // PERSISTENT_POLICY_H_
diff --git a/utils/trie/random-policy.hpp b/utils/trie/random-policy.hpp
new file mode 100644
index 0000000..7264bed
--- /dev/null
+++ b/utils/trie/random-policy.hpp
@@ -0,0 +1,169 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef RANDOM_POLICY_H_
+#define RANDOM_POLICY_H_
+
+#include "ns3/random-variable.h"
+
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/set.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/**
+ * @brief Traits for random replacement policy
+ */
+struct random_policy_traits {
+  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
+  static std::string
+  GetName()
+  {
+    return "Random";
+  }
+
+  struct policy_hook_type : public boost::intrusive::set_member_hook<> {
+    uint32_t randomOrder;
+  };
+
+  template<class Container>
+  struct container_hook {
+    typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
+      type;
+  };
+
+  template<class Base, class Container, class Hook>
+  struct policy {
+    static uint32_t&
+    get_order(typename Container::iterator item)
+    {
+      return static_cast<typename policy_container::value_traits::hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->randomOrder;
+    }
+
+    static const uint32_t&
+    get_order(typename Container::const_iterator item)
+    {
+      return static_cast<const typename policy_container::value_traits::hook_type*>(
+               policy_container::value_traits::to_node_ptr(*item))->randomOrder;
+    }
+
+    template<class Key>
+    struct MemberHookLess {
+      bool
+      operator()(const Key& a, const Key& b) const
+      {
+        return get_order(&a) < get_order(&b);
+      }
+    };
+
+    typedef boost::intrusive::multiset<Container,
+                                       boost::intrusive::compare<MemberHookLess<Container>>,
+                                       Hook> policy_container;
+
+    // could be just typedef
+    class type : public policy_container {
+    public:
+      typedef policy policy_base; // to get access to get_order methods from outside
+      typedef Container parent_trie;
+
+      type(Base& base)
+        : base_(base)
+        , u_rand(0, std::numeric_limits<uint32_t>::max())
+        , max_size_(100)
+      {
+      }
+
+      inline void
+      update(typename parent_trie::iterator item)
+      {
+        // do nothing. it's random policy
+      }
+
+      inline bool
+      insert(typename parent_trie::iterator item)
+      {
+        get_order(item) = u_rand.GetValue();
+
+        if (max_size_ != 0 && policy_container::size() >= max_size_) {
+          if (MemberHookLess<Container>()(*item, *policy_container::begin())) {
+            // std::cout << "Cannot add. Signaling fail\n";
+            // just return false. Indicating that insert "failed"
+            return false;
+          }
+          else {
+            // removing some random element
+            base_.erase(&(*policy_container::begin()));
+          }
+        }
+
+        policy_container::insert(*item);
+        return true;
+      }
+
+      inline void
+      lookup(typename parent_trie::iterator item)
+      {
+        // do nothing. it's random policy
+      }
+
+      inline void
+      erase(typename parent_trie::iterator item)
+      {
+        policy_container::erase(policy_container::s_iterator_to(*item));
+      }
+
+      inline void
+      clear()
+      {
+        policy_container::clear();
+      }
+
+      inline void
+      set_max_size(size_t max_size)
+      {
+        max_size_ = max_size;
+      }
+
+      inline size_t
+      get_max_size() const
+      {
+        return max_size_;
+      }
+
+    private:
+      type()
+        : base_(*((Base*)0)){};
+
+    private:
+      Base& base_;
+      ns3::UniformVariable u_rand;
+      size_t max_size_;
+    };
+  };
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // RANDOM_POLICY_H
diff --git a/utils/trie/trie-with-policy.hpp b/utils/trie/trie-with-policy.hpp
new file mode 100644
index 0000000..d6b00b3
--- /dev/null
+++ b/utils/trie/trie-with-policy.hpp
@@ -0,0 +1,303 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef TRIE_WITH_POLICY_H_
+#define TRIE_WITH_POLICY_H_
+
+#include "trie.hpp"
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+template<typename FullKey, typename PayloadTraits, typename PolicyTraits>
+class trie_with_policy {
+public:
+  typedef trie<FullKey, PayloadTraits, typename PolicyTraits::policy_hook_type> parent_trie;
+
+  typedef typename parent_trie::iterator iterator;
+  typedef typename parent_trie::const_iterator const_iterator;
+
+  typedef typename PolicyTraits::
+    template policy<trie_with_policy<FullKey, PayloadTraits, PolicyTraits>, parent_trie,
+                    typename PolicyTraits::template container_hook<parent_trie>::type>::type
+      policy_container;
+
+  inline trie_with_policy(size_t bucketSize = 1, size_t bucketIncrement = 1)
+    : trie_(name::Component(), bucketSize, bucketIncrement)
+    , policy_(*this)
+  {
+  }
+
+  inline std::pair<iterator, bool>
+  insert(const FullKey& key, typename PayloadTraits::insert_type payload)
+  {
+    std::pair<iterator, bool> item = trie_.insert(key, payload);
+
+    if (item.second) // real insert
+    {
+      bool ok = policy_.insert(s_iterator_to(item.first));
+      if (!ok) {
+        item.first->erase(); // cannot insert
+        return std::make_pair(end(), false);
+      }
+    }
+    else {
+      return std::make_pair(s_iterator_to(item.first), false);
+    }
+
+    return item;
+  }
+
+  inline void
+  erase(const FullKey& key)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+
+    if (!reachLast || lastItem->payload() == PayloadTraits::empty_payload)
+      return; // nothing to invalidate
+
+    erase(lastItem);
+  }
+
+  inline void
+  erase(iterator node)
+  {
+    if (node == end())
+      return;
+
+    policy_.erase(s_iterator_to(node));
+    node->erase(); // will do cleanup here
+  }
+
+  inline void
+  clear()
+  {
+    policy_.clear();
+    trie_.clear();
+  }
+
+  template<typename Modifier>
+  bool
+  modify(iterator position, Modifier mod)
+  {
+    if (position == end())
+      return false;
+    if (position->payload() == PayloadTraits::empty_payload)
+      return false;
+
+    mod(*position->payload());
+    policy_.update(position);
+    return true;
+  }
+
+  /**
+   * @brief Find a node that has the exact match with the key
+   */
+  inline iterator
+  find_exact(const FullKey& key)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+
+    if (!reachLast || lastItem->payload() == PayloadTraits::empty_payload)
+      return end();
+
+    return lastItem;
+  }
+
+  /**
+   * @brief Find a node that has the longest common prefix with key (FIB/PIT lookup)
+   */
+  inline iterator
+  longest_prefix_match(const FullKey& key)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    if (foundItem != trie_.end()) {
+      policy_.lookup(s_iterator_to(foundItem));
+    }
+    return foundItem;
+  }
+
+  /**
+   * @brief Find a node that has the longest common prefix with key (FIB/PIT lookup)
+   */
+  template<class Predicate>
+  inline iterator
+  longest_prefix_match_if(const FullKey& key, Predicate pred)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find_if(key, pred);
+    if (foundItem != trie_.end()) {
+      policy_.lookup(s_iterator_to(foundItem));
+    }
+    return foundItem;
+  }
+
+  // /**
+  //  * @brief Const version of the longest common prefix match
+  //  * (semi-const, because there could be update of the policy anyways)
+  //  */
+  // inline const_iterator
+  // longest_prefix_match (const FullKey &key) const
+  // {
+  //   return static_cast<trie_with_policy*> (this)->longest_prefix_match (key);
+  // }
+
+  /**
+   * @brief Find a node that has prefix at least as the key (cache lookup)
+   */
+  inline iterator
+  deepest_prefix_match(const FullKey& key)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+
+    // guard in case we don't have anything in the trie
+    if (lastItem == trie_.end())
+      return trie_.end();
+
+    if (reachLast) {
+      if (foundItem == trie_.end()) {
+        foundItem = lastItem->find(); // should be something
+      }
+      policy_.lookup(s_iterator_to(foundItem));
+      return foundItem;
+    }
+    else { // couldn't find a node that has prefix at least as key
+      return trie_.end();
+    }
+  }
+
+  /**
+   * @brief Find a node that has prefix at least as the key
+   */
+  template<class Predicate>
+  inline iterator
+  deepest_prefix_match_if(const FullKey& key, Predicate pred)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+
+    // guard in case we don't have anything in the trie
+    if (lastItem == trie_.end())
+      return trie_.end();
+
+    if (reachLast) {
+      foundItem = lastItem->find_if(pred); // may or may not find something
+      if (foundItem == trie_.end()) {
+        return trie_.end();
+      }
+      policy_.lookup(s_iterator_to(foundItem));
+      return foundItem;
+    }
+    else { // couldn't find a node that has prefix at least as key
+      return trie_.end();
+    }
+  }
+
+  /**
+   * @brief Find a node that has prefix at least as the key
+   *
+   * This version of find checks predicate for the next level and if
+   * predicate is True, returns first deepest match available
+   */
+  template<class Predicate>
+  inline iterator
+  deepest_prefix_match_if_next_level(const FullKey& key, Predicate pred)
+  {
+    iterator foundItem, lastItem;
+    bool reachLast;
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+
+    // guard in case we don't have anything in the trie
+    if (lastItem == trie_.end())
+      return trie_.end();
+
+    if (reachLast) {
+      foundItem = lastItem->find_if_next_level(pred); // may or may not find something
+      if (foundItem == trie_.end()) {
+        return trie_.end();
+      }
+      policy_.lookup(s_iterator_to(foundItem));
+      return foundItem;
+    }
+    else { // couldn't find a node that has prefix at least as key
+      return trie_.end();
+    }
+  }
+
+  iterator
+  end() const
+  {
+    return 0;
+  }
+
+  const parent_trie&
+  getTrie() const
+  {
+    return trie_;
+  }
+
+  parent_trie&
+  getTrie()
+  {
+    return trie_;
+  }
+
+  const policy_container&
+  getPolicy() const
+  {
+    return policy_;
+  }
+
+  policy_container&
+  getPolicy()
+  {
+    return policy_;
+  }
+
+  static inline iterator
+  s_iterator_to(typename parent_trie::iterator item)
+  {
+    if (item == 0)
+      return 0;
+    else
+      return &(*item);
+  }
+
+private:
+  parent_trie trie_;
+  mutable policy_container policy_;
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // TRIE_WITH_POLICY_H_
diff --git a/utils/trie/trie.hpp b/utils/trie/trie.hpp
new file mode 100644
index 0000000..dd10e6d
--- /dev/null
+++ b/utils/trie/trie.hpp
@@ -0,0 +1,775 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef TRIE_H_
+#define TRIE_H_
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
+#include "ns3/ptr.h"
+
+#include <boost/intrusive/unordered_set.hpp>
+#include <boost/intrusive/list.hpp>
+#include <boost/intrusive/set.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/interprocess/smart_ptr/unique_ptr.hpp>
+#include <tuple>
+#include <boost/foreach.hpp>
+#include <boost/mpl/if.hpp>
+
+namespace ns3 {
+namespace ndn {
+namespace ndnSIM {
+
+/////////////////////////////////////////////////////
+// Allow customization for payload
+//
+template<typename Payload, typename BasePayload = Payload>
+struct pointer_payload_traits {
+  typedef Payload payload_type;  // general type of the payload
+  typedef Payload* storage_type; // how the payload is actually stored
+  typedef Payload* insert_type;  // what parameter is inserted
+
+  typedef Payload* return_type;             // what is returned on access
+  typedef const Payload* const_return_type; // what is returned on const access
+
+  typedef BasePayload*
+    base_type; // base type of the entry (when implementation details need to be hidden)
+  typedef const BasePayload*
+    const_base_type; // const base type of the entry (when implementation details need to be hidden)
+
+  static Payload* empty_payload;
+};
+
+template<typename Payload, typename BasePayload>
+Payload* pointer_payload_traits<Payload, BasePayload>::empty_payload = 0;
+
+template<typename Payload, typename BasePayload = Payload>
+struct smart_pointer_payload_traits {
+  typedef Payload payload_type;
+  typedef ns3::Ptr<Payload> storage_type;
+  typedef ns3::Ptr<Payload> insert_type;
+
+  typedef ns3::Ptr<Payload> return_type;
+  typedef ns3::Ptr<const Payload> const_return_type;
+
+  typedef ns3::Ptr<BasePayload> base_type;
+  typedef ns3::Ptr<const BasePayload> const_base_type;
+
+  static ns3::Ptr<Payload> empty_payload;
+};
+
+template<typename Payload, typename BasePayload>
+ns3::Ptr<Payload> smart_pointer_payload_traits<Payload, BasePayload>::empty_payload = 0;
+
+template<typename Payload, typename BasePayload = Payload>
+struct non_pointer_traits {
+  typedef Payload payload_type;
+  typedef Payload storage_type;
+  typedef const Payload& insert_type; // nothing to insert
+
+  typedef Payload& return_type;
+  typedef const Payload& const_return_type;
+
+  typedef BasePayload& base_type;
+  typedef const BasePayload& const_base_type;
+
+  static Payload empty_payload;
+};
+
+template<typename Payload, typename BasePayload>
+Payload non_pointer_traits<Payload, BasePayload>::empty_payload = Payload();
+
+////////////////////////////////////////////////////
+// forward declarations
+//
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+class trie;
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+inline std::ostream&
+operator<<(std::ostream& os, const trie<FullKey, PayloadTraits, PolicyHook>& trie_node);
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+bool
+operator==(const trie<FullKey, PayloadTraits, PolicyHook>& a,
+           const trie<FullKey, PayloadTraits, PolicyHook>& b);
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+std::size_t
+hash_value(const trie<FullKey, PayloadTraits, PolicyHook>& trie_node);
+
+///////////////////////////////////////////////////
+// actual definition
+//
+template<class T, class NonConstT>
+class trie_iterator;
+
+template<class T>
+class trie_point_iterator;
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+class trie {
+public:
+  typedef typename FullKey::value_type Key;
+
+  typedef trie* iterator;
+  typedef const trie* const_iterator;
+
+  typedef trie_iterator<trie, trie> recursive_iterator;
+  typedef trie_iterator<const trie, trie> const_recursive_iterator;
+
+  typedef trie_point_iterator<trie> point_iterator;
+  typedef trie_point_iterator<const trie> const_point_iterator;
+
+  typedef PayloadTraits payload_traits;
+
+  inline trie(const Key& key, size_t bucketSize = 1, size_t bucketIncrement = 1)
+    : key_(key)
+    , initialBucketSize_(bucketSize)
+    , bucketIncrement_(bucketIncrement)
+    , bucketSize_(initialBucketSize_)
+    , buckets_(new bucket_type[bucketSize_]) // cannot use normal pointer, because lifetime of
+                                             // buckets should be larger than lifetime of the
+                                             // container
+    , children_(bucket_traits(buckets_.get(), bucketSize_))
+    , payload_(PayloadTraits::empty_payload)
+    , parent_(0)
+  {
+  }
+
+  inline ~trie()
+  {
+    payload_ = PayloadTraits::empty_payload; // necessary for smart pointers...
+    children_.clear_and_dispose(trie_delete_disposer());
+  }
+
+  void
+  clear()
+  {
+    children_.clear_and_dispose(trie_delete_disposer());
+  }
+
+  template<class Predicate>
+  void
+  clear_if(Predicate cond)
+  {
+    recursive_iterator trieNode(this);
+    recursive_iterator end(0);
+
+    while (trieNode != end) {
+      if (cond(*trieNode)) {
+        trieNode = recursive_iterator(trieNode->erase());
+      }
+      trieNode++;
+    }
+  }
+
+  // actual entry
+  friend bool operator==<>(const trie<FullKey, PayloadTraits, PolicyHook>& a,
+                           const trie<FullKey, PayloadTraits, PolicyHook>& b);
+
+  friend std::size_t
+  hash_value<>(const trie<FullKey, PayloadTraits, PolicyHook>& trie_node);
+
+  inline std::pair<iterator, bool>
+  insert(const FullKey& key, typename PayloadTraits::insert_type payload)
+  {
+    trie* trieNode = this;
+
+    BOOST_FOREACH (const Key& subkey, key) {
+      typename unordered_set::iterator item = trieNode->children_.find(subkey);
+      if (item == trieNode->children_.end()) {
+        trie* newNode = new trie(subkey, initialBucketSize_, bucketIncrement_);
+        // std::cout << "new " << newNode << "\n";
+        newNode->parent_ = trieNode;
+
+        if (trieNode->children_.size() >= trieNode->bucketSize_) {
+          trieNode->bucketSize_ += trieNode->bucketIncrement_;
+          trieNode->bucketIncrement_ *= 2; // increase bucketIncrement exponentially
+
+          buckets_array newBuckets(new bucket_type[trieNode->bucketSize_]);
+          trieNode->children_.rehash(bucket_traits(newBuckets.get(), trieNode->bucketSize_));
+          trieNode->buckets_.swap(newBuckets);
+        }
+
+        std::pair<typename unordered_set::iterator, bool> ret =
+          trieNode->children_.insert(*newNode);
+
+        trieNode = &(*ret.first);
+      }
+      else
+        trieNode = &(*item);
+    }
+
+    if (trieNode->payload_ == PayloadTraits::empty_payload) {
+      trieNode->payload_ = payload;
+      return std::make_pair(trieNode, true);
+    }
+    else
+      return std::make_pair(trieNode, false);
+  }
+
+  /**
+   * @brief Removes payload (if it exists) and if there are no children, prunes parents trie
+   */
+  inline iterator
+  erase()
+  {
+    payload_ = PayloadTraits::empty_payload;
+    return prune();
+  }
+
+  /**
+   * @brief Do exactly as erase, but without erasing the payload
+   */
+  inline iterator
+  prune()
+  {
+    if (payload_ == PayloadTraits::empty_payload && children_.size() == 0) {
+      if (parent_ == 0)
+        return this;
+
+      trie* parent = parent_;
+      parent->children_
+        .erase_and_dispose(*this,
+                           trie_delete_disposer()); // delete this; basically, committing a suicide
+
+      return parent->prune();
+    }
+    return this;
+  }
+
+  /**
+   * @brief Perform prune of the node, but without attempting to parent of the node
+   */
+  inline void
+  prune_node()
+  {
+    if (payload_ == PayloadTraits::empty_payload && children_.size() == 0) {
+      if (parent_ == 0)
+        return;
+
+      trie* parent = parent_;
+      parent->children_
+        .erase_and_dispose(*this,
+                           trie_delete_disposer()); // delete this; basically, committing a suicide
+    }
+  }
+
+  // inline std::tuple<const iterator, bool, const iterator>
+  // find (const FullKey &key) const
+  // {
+  //   return const_cast<trie*> (this)->find (key);
+  // }
+
+  /**
+   * @brief Perform the longest prefix match
+   * @param key the key for which to perform the longest prefix match
+   *
+   * @return ->second is true if prefix in ->first is longer than key
+   */
+  inline std::tuple<iterator, bool, iterator>
+  find(const FullKey& key)
+  {
+    trie* trieNode = this;
+    iterator foundNode = (payload_ != PayloadTraits::empty_payload) ? this : 0;
+    bool reachLast = true;
+
+    BOOST_FOREACH (const Key& subkey, key) {
+      typename unordered_set::iterator item = trieNode->children_.find(subkey);
+      if (item == trieNode->children_.end()) {
+        reachLast = false;
+        break;
+      }
+      else {
+        trieNode = &(*item);
+
+        if (trieNode->payload_ != PayloadTraits::empty_payload)
+          foundNode = trieNode;
+      }
+    }
+
+    return std::make_tuple(foundNode, reachLast, trieNode);
+  }
+
+  /**
+   * @brief Perform the longest prefix match satisfying preficate
+   * @param key the key for which to perform the longest prefix match
+   *
+   * @return ->second is true if prefix in ->first is longer than key
+   */
+  template<class Predicate>
+  inline std::tuple<iterator, bool, iterator>
+  find_if(const FullKey& key, Predicate pred)
+  {
+    trie* trieNode = this;
+    iterator foundNode = (payload_ != PayloadTraits::empty_payload) ? this : 0;
+    bool reachLast = true;
+
+    BOOST_FOREACH (const Key& subkey, key) {
+      typename unordered_set::iterator item = trieNode->children_.find(subkey);
+      if (item == trieNode->children_.end()) {
+        reachLast = false;
+        break;
+      }
+      else {
+        trieNode = &(*item);
+
+        if (trieNode->payload_ != PayloadTraits::empty_payload && pred(trieNode->payload_)) {
+          foundNode = trieNode;
+        }
+      }
+    }
+
+    return std::make_tuple(foundNode, reachLast, trieNode);
+  }
+
+  /**
+   * @brief Find next payload of the sub-trie
+   * @returns end() or a valid iterator pointing to the trie leaf (order is not defined, enumeration
+   * )
+   */
+  inline iterator
+  find()
+  {
+    if (payload_ != PayloadTraits::empty_payload)
+      return this;
+
+    typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
+    for (typename trie::unordered_set::iterator subnode = children_.begin();
+         subnode != children_.end(); subnode++)
+    // BOOST_FOREACH (trie &subnode, children_)
+    {
+      iterator value = subnode->find();
+      if (value != 0)
+        return value;
+    }
+
+    return 0;
+  }
+
+  /**
+   * @brief Find next payload of the sub-trie satisfying the predicate
+   * @param pred predicate
+   * @returns end() or a valid iterator pointing to the trie leaf (order is not defined, enumeration
+   * )
+   */
+  template<class Predicate>
+  inline const iterator
+  find_if(Predicate pred)
+  {
+    if (payload_ != PayloadTraits::empty_payload && pred(payload_))
+      return this;
+
+    typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
+    for (typename trie::unordered_set::iterator subnode = children_.begin();
+         subnode != children_.end(); subnode++)
+    // BOOST_FOREACH (const trie &subnode, children_)
+    {
+      iterator value = subnode->find_if(pred);
+      if (value != 0)
+        return value;
+    }
+
+    return 0;
+  }
+
+  /**
+   * @brief Find next payload of the sub-trie satisfying the predicate
+   * @param pred predicate
+   *
+   * This version check predicate only for the next level children
+   *
+   * @returns end() or a valid iterator pointing to the trie leaf (order is not defined, enumeration
+   *)
+   */
+  template<class Predicate>
+  inline const iterator
+  find_if_next_level(Predicate pred)
+  {
+    typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
+    for (typename trie::unordered_set::iterator subnode = children_.begin();
+         subnode != children_.end(); subnode++) {
+      if (pred(subnode->key())) {
+        return subnode->find();
+      }
+    }
+
+    return 0;
+  }
+
+  iterator
+  end()
+  {
+    return 0;
+  }
+
+  const_iterator
+  end() const
+  {
+    return 0;
+  }
+
+  typename PayloadTraits::const_return_type
+  payload() const
+  {
+    return payload_;
+  }
+
+  typename PayloadTraits::return_type
+  payload()
+  {
+    return payload_;
+  }
+
+  void
+  set_payload(typename PayloadTraits::insert_type payload)
+  {
+    payload_ = payload;
+  }
+
+  Key
+  key() const
+  {
+    return key_;
+  }
+
+  inline void
+  PrintStat(std::ostream& os) const;
+
+private:
+  // The disposer object function
+  struct trie_delete_disposer {
+    void
+    operator()(trie* delete_this)
+    {
+      delete delete_this;
+    }
+  };
+
+  template<class D>
+  struct array_disposer {
+    void
+    operator()(D* array)
+    {
+      delete[] array;
+    }
+  };
+
+  friend std::ostream& operator<<<>(std::ostream& os, const trie& trie_node);
+
+public:
+  PolicyHook policy_hook_;
+
+private:
+  boost::intrusive::unordered_set_member_hook<> unordered_set_member_hook_;
+
+  // necessary typedefs
+  typedef trie self_type;
+  typedef boost::intrusive::member_hook<trie, boost::intrusive::unordered_set_member_hook<>,
+                                        &trie::unordered_set_member_hook_> member_hook;
+
+  typedef boost::intrusive::unordered_set<trie, member_hook> unordered_set;
+  typedef typename unordered_set::bucket_type bucket_type;
+  typedef typename unordered_set::bucket_traits bucket_traits;
+
+  template<class T, class NonConstT>
+  friend class trie_iterator;
+
+  template<class T>
+  friend class trie_point_iterator;
+
+  ////////////////////////////////////////////////
+  // Actual data
+  ////////////////////////////////////////////////
+
+  Key key_; ///< name component
+
+  size_t initialBucketSize_;
+  size_t bucketIncrement_;
+
+  size_t bucketSize_;
+  typedef boost::interprocess::unique_ptr<bucket_type, array_disposer<bucket_type>> buckets_array;
+  buckets_array buckets_;
+  unordered_set children_;
+
+  typename PayloadTraits::storage_type payload_;
+  trie* parent_; // to make cleaning effective
+};
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+inline std::ostream&
+operator<<(std::ostream& os, const trie<FullKey, PayloadTraits, PolicyHook>& trie_node)
+{
+  os << "# " << trie_node.key_ << ((trie_node.payload_ != PayloadTraits::empty_payload) ? "*" : "")
+     << std::endl;
+  typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
+
+  for (typename trie::unordered_set::const_iterator subnode = trie_node.children_.begin();
+       subnode != trie_node.children_.end(); subnode++)
+  // BOOST_FOREACH (const trie &subnode, trie_node.children_)
+  {
+    os << "\"" << &trie_node << "\""
+       << " [label=\"" << trie_node.key_
+       << ((trie_node.payload_ != PayloadTraits::empty_payload) ? "*" : "") << "\"]\n";
+    os << "\"" << &(*subnode) << "\""
+       << " [label=\"" << subnode->key_
+       << ((subnode->payload_ != PayloadTraits::empty_payload) ? "*" : "") << "\"]"
+                                                                              "\n";
+
+    os << "\"" << &trie_node << "\""
+       << " -> "
+       << "\"" << &(*subnode) << "\""
+       << "\n";
+    os << *subnode;
+  }
+
+  return os;
+}
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+inline void
+trie<FullKey, PayloadTraits, PolicyHook>::PrintStat(std::ostream& os) const
+{
+  os << "# " << key_ << ((payload_ != PayloadTraits::empty_payload) ? "*" : "") << ": "
+     << children_.size() << " children" << std::endl;
+  for (size_t bucket = 0, maxbucket = children_.bucket_count(); bucket < maxbucket; bucket++) {
+    os << " " << children_.bucket_size(bucket);
+  }
+  os << "\n";
+
+  typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
+  for (typename trie::unordered_set::const_iterator subnode = children_.begin();
+       subnode != children_.end(); subnode++)
+  // BOOST_FOREACH (const trie &subnode, children_)
+  {
+    subnode->PrintStat(os);
+  }
+}
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+inline bool
+operator==(const trie<FullKey, PayloadTraits, PolicyHook>& a,
+           const trie<FullKey, PayloadTraits, PolicyHook>& b)
+{
+  return a.key_ == b.key_;
+}
+
+template<typename FullKey, typename PayloadTraits, typename PolicyHook>
+inline std::size_t
+hash_value(const trie<FullKey, PayloadTraits, PolicyHook>& trie_node)
+{
+  return boost::hash_value(trie_node.key_);
+}
+
+template<class Trie, class NonConstTrie> // hack for boost < 1.47
+class trie_iterator {
+public:
+  trie_iterator()
+    : trie_(0)
+  {
+  }
+  trie_iterator(typename Trie::iterator item)
+    : trie_(item)
+  {
+  }
+  trie_iterator(Trie& item)
+    : trie_(&item)
+  {
+  }
+
+  Trie& operator*()
+  {
+    return *trie_;
+  }
+  const Trie& operator*() const
+  {
+    return *trie_;
+  }
+  Trie* operator->()
+  {
+    return trie_;
+  }
+  const Trie* operator->() const
+  {
+    return trie_;
+  }
+  bool
+  operator==(trie_iterator<const Trie, NonConstTrie>& other) const
+  {
+    return (trie_ == other.trie_);
+  }
+  bool
+  operator==(trie_iterator<Trie, NonConstTrie>& other)
+  {
+    return (trie_ == other.trie_);
+  }
+  bool
+  operator!=(trie_iterator<const Trie, NonConstTrie>& other) const
+  {
+    return !(*this == other);
+  }
+  bool
+  operator!=(trie_iterator<Trie, NonConstTrie>& other)
+  {
+    return !(*this == other);
+  }
+
+  trie_iterator<Trie, NonConstTrie>&
+  operator++(int)
+  {
+    if (trie_->children_.size() > 0)
+      trie_ = &(*trie_->children_.begin());
+    else
+      trie_ = goUp();
+    return *this;
+  }
+
+  trie_iterator<Trie, NonConstTrie>&
+  operator++()
+  {
+    (*this)++;
+    return *this;
+  }
+
+private:
+  typedef typename boost::mpl::if_<boost::is_same<Trie, NonConstTrie>,
+                                   typename Trie::unordered_set::iterator,
+                                   typename Trie::unordered_set::const_iterator>::type set_iterator;
+
+  Trie*
+  goUp()
+  {
+    if (trie_->parent_ != 0) {
+      // typename Trie::unordered_set::iterator item =
+      set_iterator item = const_cast<NonConstTrie*>(trie_)
+                            ->parent_->children_.iterator_to(const_cast<NonConstTrie&>(*trie_));
+      item++;
+      if (item != trie_->parent_->children_.end()) {
+        return &(*item);
+      }
+      else {
+        trie_ = trie_->parent_;
+        return goUp();
+      }
+    }
+    else
+      return 0;
+  }
+
+private:
+  Trie* trie_;
+};
+
+template<class Trie>
+class trie_point_iterator {
+private:
+  typedef typename boost::mpl::if_<boost::is_same<Trie, const Trie>,
+                                   typename Trie::unordered_set::const_iterator,
+                                   typename Trie::unordered_set::iterator>::type set_iterator;
+
+public:
+  trie_point_iterator()
+    : trie_(0)
+  {
+  }
+  trie_point_iterator(typename Trie::iterator item)
+    : trie_(item)
+  {
+  }
+  trie_point_iterator(Trie& item)
+  {
+    if (item.children_.size() != 0)
+      trie_ = &*item.children_.begin();
+    else
+      trie_ = 0;
+  }
+
+  Trie& operator*()
+  {
+    return *trie_;
+  }
+  const Trie& operator*() const
+  {
+    return *trie_;
+  }
+  Trie* operator->()
+  {
+    return trie_;
+  }
+  const Trie* operator->() const
+  {
+    return trie_;
+  }
+  bool
+  operator==(trie_point_iterator<const Trie>& other) const
+  {
+    return (trie_ == other.trie_);
+  }
+  bool
+  operator==(trie_point_iterator<Trie>& other)
+  {
+    return (trie_ == other.trie_);
+  }
+  bool
+  operator!=(trie_point_iterator<const Trie>& other) const
+  {
+    return !(*this == other);
+  }
+  bool
+  operator!=(trie_point_iterator<Trie>& other)
+  {
+    return !(*this == other);
+  }
+
+  trie_point_iterator<Trie>&
+  operator++(int)
+  {
+    if (trie_->parent_ != 0) {
+      set_iterator item = trie_->parent_->children_.iterator_to(*trie_);
+      item++;
+      if (item == trie_->parent_->children_.end())
+        trie_ = 0;
+      else
+        trie_ = &*item;
+    }
+    else {
+      trie_ = 0;
+    }
+    return *this;
+  }
+
+  trie_point_iterator<Trie>&
+  operator++()
+  {
+    (*this)++;
+    return *this;
+  }
+
+private:
+  Trie* trie_;
+};
+
+} // ndnSIM
+} // ndn
+} // ns3
+
+#endif // TRIE_H_
diff --git a/wscript b/wscript
index 65c249a..7bd46d3 100644
--- a/wscript
+++ b/wscript
@@ -1,321 +1,125 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
-"""
-Copyright (c) 2014  Regents of the University of California,
-                    Arizona Board of Regents,
-                    Colorado State University,
-                    University Pierre & Marie Curie, Sorbonne University,
-                    Washington University in St. Louis,
-                    Beijing Institute of Technology
-
-This file is part of NFD (Named Data Networking Forwarding Daemon).
-See AUTHORS.md for complete list of NFD authors and contributors.
-
-NFD is free software: you can redistribute it and/or modify it under the terms
-of the GNU General Public License as published by the Free Software Foundation,
-either version 3 of the License, or (at your option) any later version.
-
-NFD 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
-NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
-"""
-
-VERSION = "0.2.0"
-APPNAME = "nfd"
-BUGREPORT = "http://redmine.named-data.net/projects/nfd"
-URL = "http://named-data.net/doc/NFD/"
-GIT_TAG_PREFIX = "NFD-"
-
-from waflib import Logs, Utils, Context
 import os
+from waflib import Logs, Utils, Options, TaskGen, Task
+from waflib.Errors import WafError
 
-def options(opt):
-    opt.load(['compiler_cxx', 'gnu_dirs'])
-    opt.load(['boost', 'unix-socket', 'dependency-checker', 'websocket',
-              'default-compiler-flags', 'coverage', 'pch', 'boost-kqueue',
-              'doxygen', 'sphinx_build', 'type_traits', 'compiler-features'],
-             tooldir=['.waf-tools'])
+import wutils
 
-    nfdopt = opt.add_option_group('NFD Options')
-    opt.addUnixOptions(nfdopt)
-    opt.addWebsocketOptions(nfdopt)
-    opt.addDependencyOptions(nfdopt, 'libpcap')
-    nfdopt.add_option('--without-libpcap', action='store_true', default=False,
-                      dest='without_libpcap',
-                      help='''Disable libpcap (Ethernet face support will be disabled)''')
+REQUIRED_BOOST_LIBS = ['graph']
 
-    opt.addDependencyOptions(nfdopt, 'librt',     '(optional)')
-    opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
-
-    nfdopt.add_option('--with-tests', action='store_true', default=False,
-                      dest='with_tests', help='''Build unit tests''')
-    nfdopt.add_option('--with-other-tests', action='store_true', default=False,
-                      dest='with_other_tests', help='''Build other tests''')
+def required_boost_libs(conf):
+    conf.env.REQUIRED_BOOST_LIBS += REQUIRED_BOOST_LIBS
 
 def configure(conf):
-    conf.load(['compiler_cxx', 'gnu_dirs',
-               'default-compiler-flags', 'pch', 'boost-kqueue',
-               'boost', 'dependency-checker', 'websocket',
-               'doxygen', 'sphinx_build', 'type_traits', 'compiler-features'])
+    conf.env['ENABLE_NDNSIM']=False;
 
-    conf.find_program('bash', var='BASH')
-
-    if not os.environ.has_key('PKG_CONFIG_PATH'):
-        os.environ['PKG_CONFIG_PATH'] = ':'.join([
-            '/usr/local/lib/pkgconfig',
-            '/opt/local/lib/pkgconfig'])
     conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
                    uselib_store='NDN_CXX', mandatory=True)
 
-    conf.checkDependency(name='librt', lib='rt', mandatory=False)
-    conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
-
-    boost_libs = 'system chrono program_options random'
-    if conf.options.with_tests:
-        conf.env['WITH_TESTS'] = 1
-        conf.define('WITH_TESTS', 1);
-        boost_libs += ' unit_test_framework'
-
-    if conf.options.with_other_tests:
-        conf.env['WITH_OTHER_TESTS'] = 1
-
-    conf.check_boost(lib=boost_libs)
-    if conf.env.BOOST_VERSION_NUMBER < 104800:
-        Logs.error("Minimum required boost version is 1.48.0")
-        Logs.error("Please upgrade your distribution or install custom boost libraries" +
-                   " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
+    if not conf.env['LIB_BOOST']:
+        conf.report_optional_feature("ndnSIM", "ndnSIM", False,
+                                     "Required boost libraries not found")
+        Logs.error ("ndnSIM will not be build as it requires boost libraries of version at least 1.48")
+        conf.env['MODULES_NOT_BUILT'].append('ndnSIM')
         return
+    else:
+        present_boost_libs = []
+        for boost_lib_name in conf.env['LIB_BOOST']:
+            if boost_lib_name.startswith("boost_"):
+                boost_lib_name = boost_lib_name[6:]
+            if boost_lib_name.endswith("-mt"):
+                boost_lib_name = boost_lib_name[:-3]
+            present_boost_libs.append(boost_lib_name)
 
-    conf.load('unix-socket')
-    conf.checkWebsocket(mandatory=True)
+        missing_boost_libs = [lib for lib in REQUIRED_BOOST_LIBS if lib not in present_boost_libs]
 
-    if not conf.options.without_libpcap:
-        conf.check_asio_pcap_support()
-        if conf.env['HAVE_ASIO_PCAP_SUPPORT']:
-            conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
-                                 errmsg='not found, but required for Ethernet face support. '
-                                        'Specify --without-libpcap to disable Ethernet face support.')
-        else:
-            Logs.warn('Warning: Ethernet face support is not supported on this platform with Boost libraries version 1.56. '
-                      'See http://redmine.named-data.net/issues/1877 for more details')
-    if conf.env['HAVE_LIBPCAP']:
-        conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
-                       cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
+        if missing_boost_libs != []:
+            conf.report_optional_feature("ndnSIM", "ndnSIM", False,
+                                         "ndnSIM requires boost libraries: %s" % ' '.join(missing_boost_libs))
+            conf.env['MODULES_NOT_BUILT'].append('ndnSIM')
 
-    conf.load('coverage')
+            Logs.error ("ndnSIM will not be build as it requires boost libraries: %s" % ' '.join(missing_boost_libs))
+            Logs.error ("Please upgrade your distribution or install custom boost libraries (http://ndnsim.net/faq.html#boost-libraries)")
+            return
 
-    conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
+        boost_version = conf.env.BOOST_VERSION.split('_')
+        if int(boost_version[0]) < 1 or int(boost_version[1]) < 48:
+            conf.report_optional_feature("ndnSIM", "ndnSIM", False,
+                                         "ndnSIM requires at least boost version 1.48")
+            conf.env['MODULES_NOT_BUILT'].append('ndnSIM')
 
-    # disable assertions in release builds
-    if not conf.options.debug:
-        conf.define('NDEBUG', 1)
+            Logs.error ("ndnSIM will not be build as it requires boost libraries of version at least 1.48")
+            Logs.error ("Please upgrade your distribution or install custom boost libraries (http://ndnsim.net/faq.html#boost-libraries)")
+            return
 
-    conf.write_config_header('config.hpp')
+    conf.env['ENABLE_NDNSIM']=True;
+    conf.env['MODULES_BUILT'].append('ndnSIM')
+
+    conf.report_optional_feature("ndnSIM", "ndnSIM", True, "")
 
 def build(bld):
-    version(bld)
+    deps = ['core', 'network', 'point-to-point', 'topology-read', 'mobility', 'internet']
+    if 'ns3-visualizer' in bld.env['NS3_ENABLED_MODULES']:
+        deps.append('visualizer')
 
-    bld(features="subst",
-        name='version',
-        source='version.hpp.in',
-        target='version.hpp',
-        install_path=None,
-        VERSION_STRING=VERSION_BASE,
-        VERSION_BUILD=VERSION,
-        VERSION=int(VERSION_SPLIT[0]) * 1000000 +
-                int(VERSION_SPLIT[1]) * 1000 +
-                int(VERSION_SPLIT[2]),
-        VERSION_MAJOR=VERSION_SPLIT[0],
-        VERSION_MINOR=VERSION_SPLIT[1],
-        VERSION_PATCH=VERSION_SPLIT[2],
-        )
+    if bld.env.ENABLE_EXAMPLES:
+        deps += ['point-to-point-layout', 'csma', 'applications']
 
-    core = bld(
-        target='core-objects',
-        name='core-objects',
-        features='cxx pch',
-        source=bld.path.ant_glob(['core/**/*.cpp']),
-        use='version BOOST NDN_CXX LIBRT',
-        includes='. core',
-        export_includes='. core',
-        headers='common.hpp',
-        )
+    module = bld.create_ns3_module ('ndnSIM', deps)
+    module.module = 'ndnSIM'
+    module.features += ' ns3fullmoduleheaders'
+    module.uselib = 'NDN_CXX BOOST'
+    module.includes = [".", "./NFD", "./NFD/daemon", "./NFD/core"]
+    module.export_includes = [".", "./NFD", "./NFD/daemon", "./NFD/core"]
 
-    nfd_objects = bld(
-        target='daemon-objects',
-        name='daemon-objects',
-        features='cxx',
-        source=bld.path.ant_glob(['daemon/**/*.cpp'],
-                                 excl=['daemon/face/ethernet-*.cpp',
-                                       'daemon/face/unix-*.cpp',
-                                       'daemon/face/websocket-*.cpp',
-                                       'daemon/main.cpp']),
-        use='core-objects WEBSOCKET',
-        includes='daemon',
-        export_includes='daemon',
-        )
+    headers = bld (features='ns3header')
+    headers.module = 'ndnSIM'
+    headers.source = ["ndn-all.hpp"]
 
-    if bld.env['HAVE_LIBPCAP']:
-        nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
-        nfd_objects.use += ' LIBPCAP'
-
-    if bld.env['HAVE_UNIX_SOCKETS']:
-        nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
-
-    if bld.env['HAVE_WEBSOCKET']:
-        nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
-
-    bld(target='bin/nfd',
-        features='cxx cxxprogram',
-        source='daemon/main.cpp',
-        use='daemon-objects',
-        )
-
-    rib_objects = bld(
-        target='rib-objects',
-        name='rib-objects',
-        features='cxx',
-        source=bld.path.ant_glob(['rib/**/*.cpp'],
-                                 excl=['rib/main.cpp']),
-        use='core-objects',
-        )
-
-    bld(target='bin/nrd',
-        features='cxx cxxprogram',
-        source='rib/main.cpp',
-        use='rib-objects',
-        )
-
-    for app in bld.path.ant_glob('tools/*.cpp'):
-        bld(features=['cxx', 'cxxprogram'],
-            target='bin/%s' % (str(app.change_ext(''))),
-            source=['tools/%s' % (str(app))],
-            use='core-objects LIBRESOLV',
-            )
-
-    bld.recurse("tests")
-
-    bld(features="subst",
-        source='nfd.conf.sample.in',
-        target='nfd.conf.sample',
-        install_path="${SYSCONFDIR}/ndn",
-        IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
-        IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
-
-    if bld.env['SPHINX_BUILD']:
-        bld(features="sphinx",
-            builder="man",
-            outdir="docs/manpages",
-            config="docs/conf.py",
-            source=bld.path.ant_glob('docs/manpages/**/*.rst'),
-            install_path="${MANDIR}/",
-            VERSION=VERSION)
-
-    for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
-        bld(features='subst',
-            source='tools/%s' % (str(script)),
-            target='bin/%s' % (str(script.change_ext(''))),
-            install_path="${BINDIR}",
-            chmod=Utils.O755,
-            VERSION=VERSION)
-
-    bld.install_files("${DATAROOTDIR}/ndn",
-                      bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
-
-def docs(bld):
-    from waflib import Options
-    Options.commands = ['doxygen', 'sphinx'] + Options.commands
-
-def doxygen(bld):
-    version(bld)
-
-    if not bld.env.DOXYGEN:
-        Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
-    else:
-        bld(features="subst",
-            name="doxygen-conf",
-            source=["docs/doxygen.conf.in",
-                    "docs/named_data_theme/named_data_footer-with-analytics.html.in"],
-            target=["docs/doxygen.conf",
-                    "docs/named_data_theme/named_data_footer-with-analytics.html"],
-            VERSION=VERSION_BASE,
-            HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
-                          if os.getenv('GOOGLE_ANALYTICS', None) \
-                          else "../docs/named_data_theme/named_data_footer.html",
-            GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""),
-            )
-
-        bld(features="doxygen",
-            doxyfile='docs/doxygen.conf',
-            use="doxygen-conf")
-
-def sphinx(bld):
-    version(bld)
-
-    if not bld.env.SPHINX_BUILD:
-        bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
-    else:
-        bld(features="sphinx",
-            outdir="docs",
-            source=bld.path.ant_glob('docs/**/*.rst'),
-            config="docs/conf.py",
-            VERSION=VERSION_BASE)
-
-def version(ctx):
-    if getattr(Context.g_module, 'VERSION_BASE', None):
+    if not bld.env['ENABLE_NDNSIM']:
+        bld.env['MODULES_NOT_BUILT'].append('ndnSIM')
         return
 
-    Context.g_module.VERSION_BASE = Context.g_module.VERSION
-    Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
+    module_dirs = ['NFD', 'apps', 'helper', 'model', 'utils']
+    
+    module.source = bld.path.ant_glob(['%s/**/*.cpp' % dir for dir in module_dirs],
+                                      excl=['model/ip-faces/*',
+                                            'apps/*',
+                                            'helper/*',
+                                            'utils/**/*'])
 
-    didGetVersion = False
-    try:
-        cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
-        p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
-                                   stderr=None, stdin=None)
-        out = str(p.communicate()[0].strip())
-        didGetVersion = (p.returncode == 0 and out != "")
-        if didGetVersion:
-            if out.startswith(GIT_TAG_PREFIX):
-                Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
-            else:
-                Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
-    except OSError:
-        pass
+    module.full_headers = [p.path_from(bld.path) for p in bld.path.ant_glob(
+        ['%s/**/*.hpp' % dir for dir in module_dirs])]
 
-    versionFile = ctx.path.find_node('VERSION')
+    # if bld.env.ENABLE_EXAMPLES:
+    #     bld.recurse('examples')
 
-    if not didGetVersion and versionFile is not None:
-        try:
-            Context.g_module.VERSION = versionFile.read()
-            return
-        except (OSError, IOError):
-            pass
+    bld.ns3_python_bindings()
 
-    # version was obtained from git, update VERSION file if necessary
-    if versionFile is not None:
-        try:
-            version = versionFile.read()
-            if version == Context.g_module.VERSION:
-                return # no need to update
-        except (OSError, IOError):
-            Logs.warn("VERSION file exists, but not readable")
-    else:
-        versionFile = ctx.path.make_node('VERSION')
+@TaskGen.feature('ns3fullmoduleheaders')
+@TaskGen.after_method('process_rule')
+def apply_ns3fullmoduleheaders(self):
+    # ## get all of the ns3 headers
+    ns3_dir_node = self.bld.path.find_or_declare("ns3")
 
-    if versionFile is None:
-        return
+    mode = getattr(self, "mode", "install")
 
-    try:
-        versionFile.write(Context.g_module.VERSION)
-    except (OSError, IOError):
-        Logs.warn("VERSION file is not writeable")
+    for filename in set(self.to_list(self.full_headers)):
+        src_node = self.path.find_resource(filename)
+        if src_node is None:
+            raise WafError("source ns3 header file %s not found" % (filename,))
+        dst_node = ns3_dir_node.find_or_declare(src_node.path_from(self.bld.path.find_dir('src')))
+        assert dst_node is not None
 
-def dist(ctx):
-    version(ctx)
+        relpath = src_node.parent.path_from(self.bld.path.find_dir('src'))
 
-def distcheck(ctx):
-    version(ctx)
+        task = self.create_task('ns3header')
+        task.mode = getattr(self, 'mode', 'install')
+        if task.mode == 'install':
+            self.bld.install_files('${INCLUDEDIR}/%s%s/ns3/%s' % (wutils.APPNAME, wutils.VERSION, relpath),
+                                   [src_node])
+            task.set_inputs([src_node])
+            task.set_outputs([dst_node])
+        else:
+            task.header_to_remove = dst_node