diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644
index 0000000..ca686c7
--- /dev/null
+++ b/AUTHORS.md
@@ -0,0 +1,2 @@
+Ilya Moiseenko      <http://ilyamoiseenko.com/>
+Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
diff --git a/COPYING.md b/COPYING.md
new file mode 100644
index 0000000..d799430
--- /dev/null
+++ b/COPYING.md
@@ -0,0 +1,677 @@
+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/LICENSE b/LICENSE
deleted file mode 100644
index c0cd90e..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2013, Regents of the University of California
-All rights reserved.
-
-Authors of individual source files and components are listed in the
-respective files.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of the Regents of the University of California nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL REGENTS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/linux/fib-input-dialog.cpp b/linux/fib-input-dialog.cpp
deleted file mode 100644
index d205f45..0000000
--- a/linux/fib-input-dialog.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include "fib-input-dialog.h"
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-
-FibInputDialog::FibInputDialog(QWidget *parent)
-    : QDialog(parent)
-{
-    prefixLabel = new QLabel(tr("NDN name (prefix): "));
-    prefixTextField = new QLineEdit;
-    prefixLabel->setBuddy(prefixTextField);
-
-    tunnelLabel = new QLabel(tr("Tunnel type: "));
-    tunnelComboBox = new QComboBox;
-    tunnelComboBox->addItem(tr("TCP"));
-    tunnelComboBox->addItem(tr("UDP"));
-    tunnelComboBox->setEditable(false);
-    tunnelComboBox->setCurrentIndex(0);
-
-    endpointLabel = new QLabel(tr("Endpoint (IP address): "));
-    endpointTextField = new QLineEdit;
-    endpointLabel->setBuddy(endpointTextField);
-
-    okButton = new QPushButton(tr("&Ok"));
-    cancelButton = new QPushButton(tr("&Cancel"));
-
-    connect(okButton,SIGNAL(pressed()), parent, SLOT(addFibEntry()));
-    connect(cancelButton,SIGNAL(pressed()), this, SLOT(hide()));
-
-    buttonBox = new QDialogButtonBox(Qt::Horizontal);
-    buttonBox->addButton(cancelButton, QDialogButtonBox::ActionRole);
-    buttonBox->addButton(okButton, QDialogButtonBox::ActionRole);
-
-    QHBoxLayout *hlayout = new QHBoxLayout;
-    hlayout->addWidget(tunnelLabel);
-    hlayout->addWidget(tunnelComboBox);
-
-    QVBoxLayout *layout = new QVBoxLayout;
-    layout->addWidget(prefixLabel);
-    layout->addWidget(prefixTextField);
-    layout->addLayout(hlayout);
-    layout->addWidget(endpointLabel);
-    layout->addWidget(endpointTextField);
-    layout->addWidget(buttonBox);
-
-    setLayout(layout);
-
-    setWindowTitle(tr("NDNx Control Center"));
-}
-
-QString
-FibInputDialog::getPrefixName()
-{
-    return prefixTextField->text();
-}
-
-QString
-FibInputDialog::getEndpoint()
-{
-    return endpointTextField->text();
-}
-
-QString
-FibInputDialog::getTunnelType()
-{
-    return tunnelComboBox->currentText();
-}
-
-void
-FibInputDialog::clear()
-{
-    prefixTextField->setText("");
-    tunnelComboBox->setCurrentIndex(0);
-    endpointTextField->setText("");
-}
-
-#if WAF
-#include "fib-input-dialog.moc"
-#include "fib-input-dialog.cpp.moc"
-#endif
diff --git a/linux/main.cpp b/linux/main.cpp
deleted file mode 100644
index 867abdb..0000000
--- a/linux/main.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include <QtGui/QApplication>
-#include "tray-menu.h"
-
-int main(int argc, char *argv[])
-{
-    QApplication a(argc, argv);
-    TrayMenu w;
-    
-    return a.exec();
-}
diff --git a/linux/ndnxcontrolcenter.desktop.in b/linux/ndnxcontrolcenter.desktop.in
deleted file mode 100644
index 7eecf80..0000000
--- a/linux/ndnxcontrolcenter.desktop.in
+++ /dev/null
@@ -1,7 +0,0 @@
-[Desktop Entry]
-Type=Application
-Name=NDNx Control Center
-Exec=@BINDIR@/@BINARY@
-X-GNOME-Autostart-enabled=true
-X-KDE-autostart-after=panel
-X-GNOME-Autostart-Phase=Application
diff --git a/linux/network-manager.cpp b/linux/network-manager.cpp
deleted file mode 100644
index 65a04cd..0000000
--- a/linux/network-manager.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include "config.h"
-#include "network-manager.h"
-
-NetworkManager::NetworkManager()
-  : isAutoconfigRunning(false)
-{
-    if (!QDBusConnection::systemBus().isConnected())
-    {
-        return;
-    }
-
-    autoconfigProcess = new QProcess(this);
-    connect(autoconfigProcess,SIGNAL(finished(int)),this,SLOT(autoconfigFinished()));
-    connect(autoconfigProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(autoconfigFinished()));
-
-    QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager",
-                                          "/org/freedesktop/NetworkManager",
-                                          "org.freedesktop.NetworkManager",
-                                          "StateChanged", this, SLOT(stateChanged(uint)));
-
-    QDBusConnection::systemBus().connect("org.freedesktop.UPower",
-                                          "/org/freedesktop/UPower",
-                                          "org.freedesktop.UPower",
-                                          "Resuming", this, SLOT(autoconfigDaemon()));
-}
-
-void NetworkManager::stateChanged(uint state)
-{
-    if(state == NM_STATE_CONNECTED_GLOBAL)
-        autoconfigDaemon();
-}
-
-void NetworkManager::autoconfigDaemon()
-{
-    if(IsAutoconfigRunning())
-        return;
-
-    isAutoconfigRunning = true;
-
-    if(autoconfigProcess != NULL)
-        autoconfigProcess->start(NDND_AUTOCONFIG_COMMAND);
-}
-
-void NetworkManager::autoconfigFinished()
-{
-    isAutoconfigRunning = false;
-}
-
-bool NetworkManager::IsAutoconfigRunning()
-{
-    return isAutoconfigRunning;
-}
-
-#if WAF
-#include "network-manager.moc"
-#include "network-manager.cpp.moc"
-#endif
diff --git a/linux/network-manager.h b/linux/network-manager.h
deleted file mode 100644
index e62ab6d..0000000
--- a/linux/network-manager.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include <QtDBus>
-#include <QProcess>
-
-#ifndef NETWORKMANAGER_H
-#define NETWORKMANAGER_H
-
-#define NM_STATE_DISCONNECTED 20
-#define NM_STATE_CONNECTING 40
-#define NM_STATE_CONNECTED_GLOBAL 70
-
-class NetworkManager : public QObject
-{
-     Q_OBJECT
-
-public:
-    NetworkManager();
-    bool IsAutoconfigRunning();
-
-public slots:
-    void autoconfigDaemon();
-
-private:
-    QProcess *autoconfigProcess;
-    bool isAutoconfigRunning;
-
-private slots:
-    void stateChanged(uint state);
-    void autoconfigFinished();
-};
-
-
-#endif // NETWORKMANAGER_H
diff --git a/linux/quit-dialog.cpp b/linux/quit-dialog.cpp
deleted file mode 100644
index a99ce5c..0000000
--- a/linux/quit-dialog.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include "quit-dialog.h"
-#include <QVBoxLayout>
-#include <QApplication>
-
-QuitDialog::QuitDialog(QWidget *parent)
-    : QDialog(parent)
-{
-    question = new QLabel(tr("Shutdown NDN daemon as well?"));
-    information = new QLabel(tr("All NDN operations will become unavailable."));
-
-    confirmButton = new QPushButton(tr("Yes"));
-    noButton = new QPushButton(tr("No"));
-    cancelButton = new QPushButton(tr("Cancel"));
-    cancelButton->setDefault(true);
-
-    buttonBox = new QDialogButtonBox(Qt::Horizontal);
-    buttonBox->addButton(cancelButton, QDialogButtonBox::ActionRole);
-    buttonBox->addButton(noButton, QDialogButtonBox::ActionRole);
-    buttonBox->addButton(confirmButton, QDialogButtonBox::ActionRole);
-
-    connect(confirmButton,SIGNAL(pressed()), parent, SLOT(terminateDaemonAndClose()));
-    connect(noButton,SIGNAL(pressed()), qApp, SLOT(quit()));
-    connect(cancelButton,SIGNAL(pressed()), this, SLOT(hide()));
-
-    QVBoxLayout *layout = new QVBoxLayout;
-    layout->addWidget(question);
-    layout->addWidget(information);
-    layout->addWidget(buttonBox);
-
-    setLayout(layout);
-
-    setWindowTitle(tr("NDNx Control Center"));
-}
-
-#if WAF
-#include "quit-dialog.moc"
-#include "quit-dialog.cpp.moc"
-#endif
diff --git a/linux/quit-dialog.h b/linux/quit-dialog.h
deleted file mode 100644
index e6fc7e3..0000000
--- a/linux/quit-dialog.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include <QDialog>
-#include <QLabel>
-#include <QDialogButtonBox>
-#include <QPushButton>
-
-#ifndef QUITDIALOG_H
-#define QUITDIALOG_H
-
-class QuitDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    QuitDialog(QWidget *parent = 0);
-
-private:
-    QLabel *question;
-    QLabel *information;
-    QDialogButtonBox *buttonBox;
-    QPushButton *confirmButton;
-    QPushButton *noButton;
-    QPushButton *cancelButton;
-};
-
-#endif // QUITDIALOG_H
diff --git a/linux/tray-menu.cpp b/linux/tray-menu.cpp
deleted file mode 100644
index 3dd006a..0000000
--- a/linux/tray-menu.cpp
+++ /dev/null
@@ -1,590 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include "config.h"
-
-#include "tray-menu.h"
-#include "ui_traymenu.h"   //generated from traymenu.ui
-#include "quit-dialog.h"
-#include "fib-input-dialog.h"
-#include "network-manager.h"
-
-#include <QMenu>
-#include <QCloseEvent>
-#include <QDesktopServices>
-#include <QUrl>
-#include <QCheckBox>
-#include <QLabel>
-#include <QHBoxLayout>
-#include <QLineEdit>
-#include <QDir>
-#include <QScrollBar>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-
-TrayMenu::TrayMenu(QWidget *parent) :
-    QMainWindow(parent),
-    ui(new Ui::TrayMenu)
-{
-    processLookup = new QProcess(this);
-    QStringList arguments;
-    arguments << "-al";
-    connect(processLookup,SIGNAL(finished(int)), this, SLOT(parseProcessLookup()));
-    processLookup->start("ps",arguments);
-
-    networkManager = new NetworkManager();
-
-    QCoreApplication::setOrganizationName("UCLA");
-    QCoreApplication::setOrganizationDomain("named-data.net");
-    QCoreApplication::setApplicationName("NDNx Control Center");
-
-    persistentSettings = new QSettings();
-
-    ui->setupUi(this);
-
-    createTrayIcon();
-    setIcon(true);
-    createToolbar();
-    createTableView();
-
-    loadSettings();
-
-    connect(ui->openTrafficMapButton, SIGNAL(pressed()), this, SLOT(openTrafficMap()));
-    connect(ui->openRoutingStatusButton, SIGNAL(pressed()), this, SLOT(openRoutingStatus()));
-    connect(ui->addFibButton, SIGNAL(pressed()), this, SLOT(showFibInputDialog()));
-    connect(ui->deleteFibButton, SIGNAL(released()), this, SLOT(deleteFibEntry()));
-    connect(ui->hubDiscoveryCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeHubDiscovery()));
-    connect(ui->loginStartCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeLoginStart()));
-    connect(ui->tableView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectTableRow()));
-    connect(ui->openNdnCertificationButton, SIGNAL(released()), this, SLOT(openCertificationPage()));
-
-    statusUpdateThread = new QThread();
-    statusUpdateThread->start();
-
-    daemonStatusTimer = new QTimer(statusUpdateThread);
-    connect(daemonStatusTimer, SIGNAL(timeout()), this, SLOT(daemonStatusUpdate()));
-    daemonStatusTimer->start(2000);
-
-    trayIcon->show();
-    model = NULL;
-    dialog = new FibInputDialog(this);
-
-    urlManager = new QNetworkAccessManager(this);
-    connect(urlManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(runXmlProc(QNetworkReply*)));
-}
-
-void TrayMenu::loadSettings()
-{
-    QVariant value;
-
-    value = persistentSettings->value(ENABLE_HUB_DISCOVERY);
-    if(!value.isNull())
-    {
-        enableHubDiscovery = value.toBool();
-        ui->hubDiscoveryCheckbox->setChecked(enableHubDiscovery);
-    }
-    else
-    {
-        ui->hubDiscoveryCheckbox->setChecked(true);
-        changeHubDiscovery();
-    }
-
-    value = persistentSettings->value(ENABLE_START_ON_LOGIN);
-    if(!value.isNull())
-    {
-        enableStartOnLogin = value.toBool();
-        ui->loginStartCheckbox->setChecked(enableStartOnLogin);
-    }
-    else
-    {
-        ui->loginStartCheckbox->setChecked(false);
-        changeLoginStart();
-    }
-}
-
-void TrayMenu::changeHubDiscovery()
-{
-    if(ui->hubDiscoveryCheckbox->isChecked())
-    {
-        enableHubDiscovery = true;
-        persistentSettings->setValue(ENABLE_HUB_DISCOVERY, true);
-    }
-    else
-    {
-        enableHubDiscovery = false;
-        persistentSettings->setValue(ENABLE_HUB_DISCOVERY, false);
-    }
-}
-
-void TrayMenu::changeLoginStart()
-{
-    if(ui->loginStartCheckbox->isChecked())
-    {
-        enableStartOnLogin = true;
-        persistentSettings->setValue(ENABLE_START_ON_LOGIN, true);
-        makeAutostartDirectory();
-    }
-    else
-    {
-        enableStartOnLogin = false;
-        persistentSettings->setValue(ENABLE_START_ON_LOGIN, false);
-
-        QProcess *process = new QProcess();
-        connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
-        QStringList arguments;
-        arguments << QDir::homePath() + AUTOSTART_DIRECTORY + SHORTCUT_FILE;
-        process->start("rm", arguments);
-    }
-}
-
-void TrayMenu::makeAutostartDirectory()
-{
-    QProcess *process = new QProcess();
-    connect(process, SIGNAL(finished(int)), this, SLOT(copyFile()));
-    connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
-    QStringList arguments;
-    arguments << QDir::homePath() + AUTOSTART_DIRECTORY;
-    process->start("mkdir", arguments);
-}
-
-void TrayMenu::copyFile()
-{
-    QProcess *process = new QProcess();
-    connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
-    QStringList arguments;
-    arguments << QString(RESOURCES_DIR) + "/" + SHORTCUT_FILE << QDir::homePath() + AUTOSTART_DIRECTORY;
-    process->start("cp",arguments);
-}
-
-void TrayMenu::showFibInputDialog()
-{
-    dialog->clear();
-    dialog->exec();
-}
-
-void TrayMenu::openTrafficMap()
-{
-    QDesktopServices::openUrl(QUrl("http://ndnmap.arl.wustl.edu/", QUrl::TolerantMode));
-}
-
-void TrayMenu::openRoutingStatus()
-{
-    QDesktopServices::openUrl(QUrl("http://netlab.cs.memphis.edu/script/htm/status.htm", QUrl::TolerantMode));
-}
-
-void TrayMenu::openCertificationPage()
-{
-    QDesktopServices::openUrl(QUrl("http://ndncert.named-data.net", QUrl::TolerantMode));
-}
-
-void TrayMenu::createTrayIcon()
-{
-    trayIconMenu = new QMenu(this);
-
-    statusIndicator = new QAction("Inactive", this);
-    trayIconMenu->addAction(statusIndicator);
-
-    trayIconMenu->addSeparator();
-
-    displayStatus = new QAction("                           Sent / Recv   ", this);
-    trayIconMenu->addAction(displayStatus);
-    interestSentRecv = new QAction("Interests      0 / 0", this);
-    trayIconMenu->addAction(interestSentRecv);
-    dataSentRecv = new QAction("Data               0 / 0", this);
-    trayIconMenu->addAction(dataSentRecv);
-
-    trayIconMenu->addSeparator();
-
-    open = new QAction("Preferences...", this);
-    connect(open, SIGNAL(triggered()), this, SLOT(show()));
-    trayIconMenu->addAction(open);
-
-    close = new QAction("Quit", this);
-    // connect(close, SIGNAL(triggered()), this, SLOT(confirmQuit()));
-    connect(close, SIGNAL(triggered()), qApp, SLOT(quit()));
-    trayIconMenu->addAction(close);
-
-    trayIcon = new QSystemTrayIcon(this);
-    trayIcon->setContextMenu(trayIconMenu);
-
-    connect(
-            trayIcon,
-            SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
-            this,
-            SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason))
-           );
-}
-
-void TrayMenu::createToolbar()
-{
-    ui->toolBar->setFloatable(false);
-    ui->toolBar->setMovable(false);
-    ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-    ui->toolBar->setAllowedAreas(Qt::TopToolBarArea);
-    ui->toolBar->setOrientation(Qt::Horizontal);
-    ui->toolBar->setIconSize(QSize(32,32));
-    ui->toolBar->resize(this->width(), 64);
-
-    openGeneralSettings = new QAction("General", this);
-    openGeneralSettings->setIcon(QIcon(":/resource/Resources/preferences-desktop.png"));
-    connect(openGeneralSettings,SIGNAL(triggered()),this, SLOT(generalSettingsClicked()));
-
-    openForwardingSettings = new QAction("Forwarding", this);
-    openForwardingSettings->setIcon(QIcon(":/resource/Resources/emblem-web.png"));
-    connect(openForwardingSettings,SIGNAL(triggered()),this, SLOT(forwardingSettingsClicked()));
-
-    openSecuritySettings = new QAction("Security", this);
-    openSecuritySettings->setIcon(QIcon(":/resource/Resources/emblem-system.png"));
-    connect(openSecuritySettings,SIGNAL(triggered()),this, SLOT(securitySettingsClicked()));
-
-    ui->toolBar->addAction(openGeneralSettings);
-    ui->toolBar->addAction(openForwardingSettings);
-    ui->toolBar->addAction(openSecuritySettings);
-}
-
-void TrayMenu::generalSettingsClicked()
-{
-    ui->generalSettingsWidget->show();
-    ui->forwardingSettingsWidget->hide();
-    ui->securitySettingsWidget->hide();
-}
-
-void TrayMenu::forwardingSettingsClicked()
-{
-    ui->generalSettingsWidget->hide();
-    ui->forwardingSettingsWidget->show();
-    ui->securitySettingsWidget->hide();
-}
-
-void TrayMenu::securitySettingsClicked()
-{
-    ui->generalSettingsWidget->hide();
-    ui->forwardingSettingsWidget->hide();
-    ui->securitySettingsWidget->show();
-}
-
-void TrayMenu::displayPopup()
-{
-    trayIcon->showMessage("NDNx Status", statusXml);
-}
-
-void TrayMenu::addFibEntry()
-{
-    QString name = dialog->getPrefixName();
-    QString tunnelType = dialog->getTunnelType();
-    QString endpoint = dialog->getEndpoint();
-
-    QStringList arguments;
-    arguments << "add" << name << tunnelType << endpoint;
-
-    dialog->hide();
-
-    QProcess *process = new QProcess();
-    connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
-    process->start(NDND_FIB_COMMAND, arguments);
-}
-
-void TrayMenu::closeEvent(QCloseEvent *event)
-{
-    if (trayIcon->isVisible())
-    {
-        hide();
-        event->ignore();
-    }
-}
-
-void TrayMenu::showEvent(QShowEvent * event)
-{
-    ui->generalSettingsWidget->show();
-    ui->forwardingSettingsWidget->hide();
-    ui->securitySettingsWidget->hide();
-}
-
-void TrayMenu::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
-{
-    if(reason == QSystemTrayIcon::Trigger)
-        this->show();
-}
-
-void TrayMenu::setIcon(bool isConnected)
-{
-    if(isConnected)
-        trayIcon->setIcon(QIcon(":/resource/Resources/icon-connected-white.png"));
-    else
-        trayIcon->setIcon(QIcon(":/resource/Resources/icon-disconnected-white.png"));
-}
-
-void TrayMenu::daemonStatusUpdate()
-{
-    urlManager->get(QNetworkRequest(QUrl("http://localhost:6363/?f=xml")));
-}
-
-void TrayMenu::runXmlProc(QNetworkReply *reply)
-{
-    QByteArray buffer = reply->readAll();
-    applyStatusXslt = new QProcess();
-
-    QStringList arguments;
-    arguments << QString(RESOURCES_DIR) + "/" + STATUS_XSLT_FILE << "-";
-    connect(applyStatusXslt,SIGNAL(finished(int)), this, SLOT(parseStatusXml()));
-    //connect(applyStatusXslt,SIGNAL(finished(int)), applyStatusXslt, SLOT(deleteLater()));
-    applyStatusXslt->start(XSLTPROC,arguments);
-    applyStatusXslt->write(buffer);
-    applyStatusXslt->closeWriteChannel();
-
-    applyFibXslt = new QProcess();
-    QStringList args;
-    args << QString(RESOURCES_DIR) + "/" + FIB_XSLT_FILE << "-";
-    connect(applyFibXslt,SIGNAL(finished(int)), this, SLOT(parseFibXml()));
-    //connect(applyFibXslt,SIGNAL(finished(int)), applyFibXslt, SLOT(deleteLater()));
-    applyFibXslt->start(XSLTPROC,args);
-    applyFibXslt->write(buffer);
-    applyFibXslt->closeWriteChannel();
-}
-
-void TrayMenu::parseStatusXml()
-{
-    QByteArray stdout = applyStatusXslt->readAllStandardOutput();
-    QByteArray stderr = applyStatusXslt->readAllStandardError();
-    applyStatusXslt->deleteLater();
-
-    statusXml = QString(stdout);
-
-    if((statusXml == "") || (stderr.length()>0)) // there was an error during Query evaluation
-    {
-        daemonStarted = false;
-        setIcon(false);
-        statusIndicator->setText("Inactive");
-
-        // QProcess *process = new QProcess();
-        // if(enableHubDiscovery)
-        //     connect(process, SIGNAL(finished(int)), networkManager, SLOT(autoconfigDaemon()));
-        // 
-        // connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
-        // process->start(NDND_START_COMMAND);
-    }
-    else
-    {
-        daemonStarted = true;
-        setIcon(true);
-        statusIndicator->setText("Active");
-
-        QString interestIn = statusXml.mid(statusXml.indexOf("<in>")+4, statusXml.indexOf("</in>") - (statusXml.indexOf("<in>")+4));
-        QString interestOut = statusXml.mid(statusXml.indexOf("<out>")+5, statusXml.indexOf("</out>") - (statusXml.indexOf("<out>")+5));
-        QString dataIn = statusXml.mid(statusXml.lastIndexOf("<in>")+4, statusXml.lastIndexOf("</in>") - (statusXml.lastIndexOf("<in>")+4));
-        QString dataOut = statusXml.mid(statusXml.lastIndexOf("<out>")+5, statusXml.lastIndexOf("</out>") - (statusXml.lastIndexOf("<out>")+5));
-
-        int i = 0;
-        int k = 0;
-        if((dataOut.length() - interestOut.length()) > 0)
-        {
-            i = dataOut.length() - interestOut.length();
-            i*=2; //because space takes less space than a letter
-        }
-
-        if((interestOut.length() - dataOut.length()) > 0)
-        {
-            k = interestOut.length() - dataOut.length();
-            k*=2; //because space takes less space than a letter
-        }
-
-        QString interestStats = QString("%1%2%3%4").arg("Interests",-16,' ').arg(interestOut,6+i,' ').arg(" / ",3).arg(interestIn,-6,' ');
-        QString dataStats = QString("%1%2%3%4").arg("Data",-20,' ').arg(dataOut,6+k,' ').arg(" / ",3).arg(dataIn,-6,' ');
-
-        //Now I try to align header "Sent / Recv" centrally with the upper line
-        QString padding;
-        for(int j = 0; j < interestStats.indexOf(interestOut); j++)
-        {
-            if(interestStats.at(j)==' ')
-                padding +=" ";
-            else
-                padding += "  "; //because space takes less space than a letter
-        }
-
-        QString header;
-        int m = 0;
-        if(interestOut.length() - QString("Sent").length() > 0)
-        {
-            m = interestOut.length() - QString("Sent").length();
-            m *=3;
-            header = QString("%1%2").arg(padding).arg("  Sent / Recv",QString("  Sent / Recv").length() + m,' ');
-        }
-        else if(interestOut.length() - QString("Sent").length() < 0)
-        {
-            padding.truncate(padding.length()-(QString("Sent").length() - interestOut.length()));
-            header = padding + "Sent / Recv";
-        }
-        else
-        {
-            header = padding + "  Sent / Recv";
-        }
-
-        interestSentRecv->setText(interestStats);
-        dataSentRecv->setText(dataStats);
-        displayStatus->setText(header);
-    }
-}
-
-void TrayMenu::parseFibXml()
-{
-    QByteArray stdout = applyFibXslt->readAllStandardOutput();
-    QByteArray stderr = applyFibXslt->readAllStandardError();
-    applyFibXslt->deleteLater();
-
-    fibContentsXml = QString(stdout);
-
-    if((stdout == "") || (stderr.length()>0))
-        return;
-
-    if ((enableHubDiscovery) && (fibContentsXml.indexOf("ndn:/autoconf-route",0,Qt::CaseInsensitive) == -1))
-    {
-        networkManager->autoconfigDaemon();
-    }
-
-    QDomDocument xmldoc;
-    QDomElement root;
-
-    xmldoc.setContent(fibContentsXml);
-    root=xmldoc.documentElement();
-
-    if(model != NULL)
-    {
-        scrollPosition = ui->tableView->verticalScrollBar()->value();
-        model->clear();
-        delete model;
-    }
-
-    model = new QStandardItemModel(root.childNodes().count(),3);
-    model->setHorizontalHeaderItem(0, new QStandardItem("NDN prefix"));
-    model->setHorizontalHeaderItem(1, new QStandardItem("Face ID"));
-    model->setHorizontalHeaderItem(2, new QStandardItem("Endpoint"));
-
-    int row = 0;
-    QDomNode fibEntry=root.firstChild();
-
-    while (!fibEntry.isNull())
-    {
-        QDomNodeList properties = fibEntry.childNodes();
-
-        QDomNode faceID = properties.at(0);
-        QDomNode ip =  properties.at(1);
-        QDomNode prefix = properties.at(2);
-
-        model->setItem(row, 0, new QStandardItem(prefix.toElement().text()));
-        model->setItem(row, 1, new QStandardItem(faceID.toElement().text()));
-        model->setItem(row, 2, new QStandardItem(ip.toElement().text()));
-
-        fibEntry = fibEntry.nextSibling();
-        row++;
-    }
-
-    ui->tableView->setModel(model);
-
-    ui->tableView->setColumnWidth(0, ui->tableView->size().width() / 2 );
-    ui->tableView->setColumnWidth(1, ui->tableView->size().width() / 6 );
-    
-    if(selectedRow >= 0)
-        ui->tableView->selectRow(selectedRow);
-
-    if(scrollPosition >= 0)
-        ui->tableView->verticalScrollBar()->setValue(scrollPosition);
-}
-
-void TrayMenu::createTableView()
-{
-    ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
-    ui->tableView->horizontalHeader()->setStretchLastSection(true);
-    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
-    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
-
-    selectedRow = -1;
-    scrollPosition = -1;
-
-    QHBoxLayout *hlayout = new QHBoxLayout();
-    hlayout->addWidget(ui->addFibButton,0, Qt::AlignLeft);
-    hlayout->addWidget(ui->deleteFibButton, 20, Qt::AlignLeft);
-
-    QVBoxLayout *vlayout = new QVBoxLayout();
-    vlayout->addWidget(ui->label);
-    vlayout->addWidget(ui->tableView);
-    vlayout->addLayout(hlayout);
-
-    ui->forwardingSettingsWidget->setLayout(vlayout);
-
-    QVBoxLayout *expanding = new QVBoxLayout();
-    expanding->addWidget(ui->forwardingSettingsWidget);
-    ui->centralWidget->setLayout(expanding); 
-}
-
-void TrayMenu::selectTableRow()
-{
-    selectedRow = ui->tableView->selectionModel()->selection().indexes().at(0).row();
-}
-
-void TrayMenu::deleteFibEntry()
-{
-    if(selectedRow < 0)
-        return;
-
-    QStandardItem *prefix = model->item(selectedRow,0);
-    if(prefix == NULL)
-        return;
-
-    QStandardItem *faceID = model->item(selectedRow,1);
-    if(faceID == NULL)
-        return;
-
-    QStringList arguments;
-    arguments << "del" << prefix->text() << "face" << faceID->text();
-
-    QProcess *process = new QProcess();
-    connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
-    process->start(NDND_FIB_COMMAND, arguments);
-}
-
-void TrayMenu::resizeEvent(QResizeEvent *  event)
-{
-    ui->tableView->setColumnWidth(0, ui->tableView->size().width() / 2);
-    ui->tableView->setColumnWidth(1, ui->tableView->size().width() / 6);
-}
-
-
-void TrayMenu::parseProcessLookup()
-{
-    QByteArray stdout = processLookup->readAllStandardOutput();
-    processLookup->deleteLater();
-     
-    QString s = QString(stdout);
-
-    if(s == "")
-      return;
-    else if(s.indexOf("ndnx-control") != s.lastIndexOf("ndnx-control"))
-      qApp->quit();
-}
-
-TrayMenu::~TrayMenu()
-{
-    daemonStatusTimer->stop();
-    statusUpdateThread->exit(0);
-    delete ui;
-    delete trayIcon;
-    delete trayIconMenu;
-    delete open;
-    delete close;
-    delete openGeneralSettings;
-    delete openForwardingSettings;
-    delete openSecuritySettings;
-    delete statusUpdateThread;
-    delete dialog;
-    delete networkManager;
-    delete persistentSettings;
-}
-
-#if WAF
-#include "tray-menu.moc"
-#include "tray-menu.cpp.moc"
-#endif
diff --git a/linux/tray-menu.h b/linux/tray-menu.h
deleted file mode 100644
index 174e338..0000000
--- a/linux/tray-menu.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
- *
- * @author Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#ifndef TRAYMENU_H
-#define TRAYMENU_H
-
-#include <QMainWindow>
-#include <QWidget>
-#include <QSystemTrayIcon>
-#include <QMenu>
-#include <QTimer>
-#include <QProcess>
-#include <QThread>
-#include <QStandardItemModel>
-#include <QtXml>
-#include <QThread>
-#include <QSettings>
-#include <QNetworkAccessManager>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-
-#include "fib-input-dialog.h"
-#include "quit-dialog.h"
-#include "network-manager.h"
-
-#define ALLOW_SOFTWARE_UPDATES "AllowAutomaticUpdates"
-#define ENABLE_HUB_DISCOVERY "EnableHubDiscovery"
-#define ENABLE_START_ON_LOGIN "enableStartOnLogin"
-#define SHUTDOWN_ON_EXIT "ShutdownOnExit"
-
-#define AUTOSTART_DIRECTORY "/.config/autostart/"
-#define SHORTCUT_FILE "ndnxcontrolcenter.desktop"
-#define STATUS_XSLT_FILE "status.xslt"
-#define FIB_XSLT_FILE "status-to-fib.xslt"
-
-namespace Ui
-{
-    class TrayMenu;
-}
-
-class TrayMenu : public QMainWindow
-{
-    Q_OBJECT
-    
-public:
-    explicit TrayMenu(QWidget *parent = 0);
-    ~TrayMenu();
-
-private:
-    Ui::TrayMenu *ui;
-
-    void createTrayIcon();
-    void setIcon(bool isConnected);
-    void createToolbar();
-    void createTableView();
-    void closeEvent(QCloseEvent *); // Overriding the window's close event
-    void showEvent(QShowEvent * event); //Overriding the window's show event
-
-    void loadSettings();
-    void makeAutostartDirectory();
-
-    void resizeEvent (QResizeEvent * event);
-
-    bool daemonStarted;
-
-    QSettings *persistentSettings;
-
-    QSystemTrayIcon *trayIcon;
-    QMenu *trayIconMenu;
-
-    QTimer *daemonStatusTimer;
-    QThread *statusUpdateThread;
-
-    QProcess *processLookup;
-    QProcess *applyStatusXslt;
-    QProcess *applyFibXslt;
-
-    QString statusXml;
-    QString fibContentsXml;
-
-    QStandardItemModel *model;
-    int selectedRow;
-    int scrollPosition;
-
-    QAction *statusIndicator;
-    QAction *displayStatus;
-    QAction *interestSentRecv;
-    QAction *dataSentRecv;
-    QAction *open;
-    QAction *close;
-    QAction *openGeneralSettings;
-    QAction *openForwardingSettings;
-    QAction *openSecuritySettings;
-
-    FibInputDialog *dialog;
-
-    bool enableHubDiscovery;
-    bool enableStartOnLogin;
-
-    NetworkManager *networkManager;
-    QNetworkAccessManager *urlManager;
-
-private slots:
-    void trayIconClicked(QSystemTrayIcon::ActivationReason);
-    void generalSettingsClicked();
-    void forwardingSettingsClicked();
-    void securitySettingsClicked();
-    void openTrafficMap();
-    void openRoutingStatus();
-    void openCertificationPage();
-    void displayPopup();
-    // void confirmQuit();
-    void showFibInputDialog();
-    // void terminateDaemonAndClose();
-    void addFibEntry();
-    void daemonStatusUpdate();
-    void selectTableRow();
-    void deleteFibEntry();
-    void changeHubDiscovery();
-    void changeLoginStart();
-    void copyFile();
-    void runXmlProc(QNetworkReply *reply);
-    void parseStatusXml();
-    void parseFibXml();
-    void parseProcessLookup();
-};
-
-#endif // TRAYMENU_H
diff --git a/osx/Info.plist b/osx/Info.plist
index bafb8e6..bb7bbb1 100644
--- a/osx/Info.plist
+++ b/osx/Info.plist
@@ -5,15 +5,15 @@
     <key>CFBundleDevelopmentRegion</key>
     <string>English</string>
     <key>CFBundleExecutable</key>
-    <string>NDNx Control Center</string>
+    <string>NFD Control Center</string>
     <key>CFBundleIconFile</key>
-    <string>ndnx-main.icns</string>
+    <string>nfd-main.icns</string>
     <key>CFBundleIdentifier</key>
     <string>net.named-data.control-center</string>
     <key>CFBundleInfoDictionaryVersion</key>
     <string>6.0</string>
     <key>CFBundleName</key>
-    <string>NDNx Control Center</string>
+    <string>NFD Control Center</string>
     <key>CFBundlePackageType</key>
     <string>APPL</string>
     <key>CFBundleSignature</key>
diff --git a/osx/LaunchAtLoginController/launch-at-login-controller.mm b/osx/LaunchAtLoginController/launch-at-login-controller.mm
index 88ba818..3354b1c 100644
--- a/osx/LaunchAtLoginController/launch-at-login-controller.mm
+++ b/osx/LaunchAtLoginController/launch-at-login-controller.mm
@@ -49,14 +49,14 @@
     self = [super init];
     loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
     LSSharedFileListAddObserver(loginItems, CFRunLoopGetMain(),
-        (CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, (voidPtr)CFBridgingRetain(self));
+        (__bridge CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, (voidPtr)CFBridgingRetain(self));
     return self;
 }
 
 - (void) dealloc
 {
     LSSharedFileListRemoveObserver(loginItems, CFRunLoopGetMain(),
-        (CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, (__bridge void *)(self));
+        (__bridge CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, (__bridge void *)(self));
     CFRelease(loginItems);
 }
 
diff --git a/osx/Resources/ndnx-main.icns b/osx/Resources/nfd-main.icns
similarity index 100%
rename from osx/Resources/ndnx-main.icns
rename to osx/Resources/nfd-main.icns
Binary files differ
diff --git a/osx/Resources/ndnx-tray.icns b/osx/Resources/nfd-tray.icns
similarity index 100%
rename from osx/Resources/ndnx-tray.icns
rename to osx/Resources/nfd-tray.icns
Binary files differ
diff --git a/osx/fib-table-controller.h b/osx/fib-table-controller.h
index 65d60f7..1912521 100644
--- a/osx/fib-table-controller.h
+++ b/osx/fib-table-controller.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Cocoa/Cocoa.h>
diff --git a/osx/fib-table-controller.mm b/osx/fib-table-controller.mm
index 04821d0..8d56cea 100644
--- a/osx/fib-table-controller.mm
+++ b/osx/fib-table-controller.mm
@@ -1,12 +1,26 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
-#include "config.h"
+#include "config.hpp"
 #import "fib-table-controller.h"
 
 @implementation FibTableController
@@ -29,7 +43,7 @@
 }
 
 -(id)tableView:(NSTableView *)aTableView
-  objectValueForTableColumn:(NSTableColumn *)aTableColumn 
+  objectValueForTableColumn:(NSTableColumn *)aTableColumn
   row:(NSInteger)rowIndex
 {
   NSXMLNode *element = [[m_document rootElement] childAtIndex:rowIndex];
@@ -46,7 +60,7 @@
   {
     return [[element childAtIndex:1] stringValue];
   }
-  
+
   return nil;
 }
 
diff --git a/osx/main.mm b/osx/main.mm
index e9b10aa..f0f20fa 100644
--- a/osx/main.mm
+++ b/osx/main.mm
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Cocoa/Cocoa.h>
diff --git a/osx/menu-delegate.h b/osx/menu-delegate.h
index dc736a6..4fe76b9 100644
--- a/osx/menu-delegate.h
+++ b/osx/menu-delegate.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Cocoa/Cocoa.h>
@@ -14,7 +28,7 @@
 @interface MenuDelegate : NSObject <NSApplicationDelegate>
 {
   NSOperationQueue *m_operationQueue;
-  
+
   NSStatusItem *statusItem;
 
   NSImage *m_connectedIcon;
@@ -31,16 +45,16 @@
   IBOutlet NSMenuItem *routingStatus;
   IBOutlet NSMenuItem *trafficMap;
   IBOutlet NSMenuItem *ndnPreferences;
-  
+
   BOOL m_daemonStarted;
-  
+
   IBOutlet NSTextField *interestSentRecv;
   IBOutlet NSTextField *dataSentRecv;
-  
+
   IBOutlet NSView *daemonStatusView;
-  
+
   TightMenuItemView *connectionStatusView;
-  
+
   IBOutlet PreferenceDelegate *preferencesDelegate;
 
   SystemEvents *m_systemEvents;
diff --git a/osx/menu-delegate.mm b/osx/menu-delegate.mm
index 6b6c75e..4eff7f9 100644
--- a/osx/menu-delegate.mm
+++ b/osx/menu-delegate.mm
@@ -1,12 +1,26 @@
-/* -*- Mode: obj; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
-#include "config.h"
+#include "config.hpp"
 #import "menu-delegate.h"
 #import "ndnd-status-operation.h"
 #import "tight-menu-item-view.h"
@@ -28,9 +42,9 @@
   interestRecv = @"N/A";
   dataSent = @"N/A";
   dataRecv = @"N/A";
-  
+
   m_autoconfInProgress = false;
-  m_operationQueue = [[NSOperationQueue alloc] init];
+  // m_operationQueue = [[NSOperationQueue alloc] init];
   return self;
 }
 
@@ -45,30 +59,33 @@
                   nil
      ];
   [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
- 
+
    // Other initialization...
 
-  m_daemonStarted = false; 
+  m_daemonStarted = false;
 
   NSBundle *bundle = [NSBundle bundleForClass:[self class]];
   m_connectedIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"FlatConnected" ofType:@"png"]];
   m_disconnectedIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"FlatDisconnected" ofType:@"png"]];
-  m_statusXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status" ofType:@"xslt"]];
-  m_statusToFibXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status-to-fib" ofType:@"xslt"]];
-  
-  [NSTimer scheduledTimerWithTimeInterval: 1.0
-           target: self
-           selector:@selector(onTick:)
-           userInfo: nil
-           repeats:YES];
-  [self updateStatus];
 
-  m_systemEvents = [[SystemEvents alloc] init];
+  [statusItem setImage:m_disconnectedIcon];
+
+  // m_statusXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status" ofType:@"xslt"]];
+  // m_statusToFibXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status-to-fib" ofType:@"xslt"]];
+
+  // [NSTimer scheduledTimerWithTimeInterval: 1.0
+  //          target: self
+  //          selector:@selector(onTick:)
+  //          userInfo: nil
+  //          repeats:YES];
+  // [self updateStatus];
+
+  // m_systemEvents = [[SystemEvents alloc] init];
 }
 
 - (void)applicationWillTerminate:(NSNotification *)aNotification
 {
-  [m_systemEvents disable];
+  // [m_systemEvents disable];
 }
 
 -(void)awakeFromNib
@@ -81,8 +98,7 @@
   //[statusItem setTarget:self];
 
   [statusItem setTitle:@""];
-  [statusItem setImage:m_disconnectedIcon];
-  
+
   float menuItemHeight = 20;
 
   NSRect viewRect = NSMakeRect(0, 0, /* width autoresizes */ 1, menuItemHeight);
@@ -91,7 +107,7 @@
 
   [connectionStatus setView:connectionStatusView];
   [connectionStatus setTarget:self];
-  
+
   [daemonStatus setView: daemonStatusView];
   [daemonStatus setTarget:self];
 }
@@ -105,12 +121,12 @@
   if ([[NSUserDefaults standardUserDefaults] boolForKey:@"shutdownNdndOnExit"]) {
     [m_operationQueue cancelAllOperations];
 
-    [m_operationQueue addOperationWithBlock:^{
-        NSTask *task = [[NSTask alloc] init];
-        [task setLaunchPath: @NDND_STOP_COMMAND];
-        [task launch];
-        [task waitUntilExit];
-      }];
+    // [m_operationQueue addOperationWithBlock:^{
+    //     NSTask *task = [[NSTask alloc] init];
+    //     [task setLaunchPath: @NDND_STOP_COMMAND];
+    //     [task launch];
+    //     [task waitUntilExit];
+    //   }];
 
     [m_operationQueue waitUntilAllOperationsAreFinished];
     [NSApp terminate:self];
@@ -130,12 +146,12 @@
       // "YES" stop ndnd
       [m_operationQueue cancelAllOperations];
 
-      [m_operationQueue addOperationWithBlock:^{
-          NSTask *task = [[NSTask alloc] init];
-          [task setLaunchPath: @NDND_STOP_COMMAND];
-          [task launch];
-          [task waitUntilExit];
-        }];
+      // [m_operationQueue addOperationWithBlock:^{
+      //     NSTask *task = [[NSTask alloc] init];
+      //     [task setLaunchPath: @NDND_STOP_COMMAND];
+      //     [task launch];
+      //     [task waitUntilExit];
+      //   }];
 
       [m_operationQueue waitUntilAllOperationsAreFinished];
       [NSApp terminate:self];
@@ -169,102 +185,102 @@
 
 - (void)statusUpdated:(NSXMLDocument*)document
 {
-  if (!m_daemonStarted) {
-    m_daemonStarted = true;
-    [connectionStatusView setStatus:@"Active"];
-    
-    [statusItem setImage:m_connectedIcon];
-  }
+  // if (!m_daemonStarted) {
+  //   m_daemonStarted = true;
+  //   [connectionStatusView setStatus:@"Active"];
 
-  NSXMLDocument *statusXml = [document objectByApplyingXSLT:m_statusXslt
-                              arguments:nil
-                              error:nil];
+  //   [statusItem setImage:m_connectedIcon];
+  // }
 
-  NSXMLDocument *statusFibXml = [document objectByApplyingXSLT:m_statusToFibXslt
-                                 arguments:nil
-                                 error:nil];
-  
-  NSXMLNode *element = [[statusXml rootElement] childAtIndex:0]; //data
-  [self setDataRecv:[[element childAtIndex:0] stringValue]];
-  [self setDataSent:[[element childAtIndex:1] stringValue]];
-  
-  element = [[statusXml rootElement] childAtIndex:1]; //interests
-  [self setInterestRecv:[[element childAtIndex:0] stringValue]];
-  [self setInterestSent:[[element childAtIndex:1] stringValue]];
+  // NSXMLDocument *statusXml = [document objectByApplyingXSLT:m_statusXslt
+  //                             arguments:nil
+  //                             error:nil];
 
-  [preferencesDelegate updateFibStatus:statusFibXml];
+  // NSXMLDocument *statusFibXml = [document objectByApplyingXSLT:m_statusToFibXslt
+  //                                arguments:nil
+  //                                error:nil];
 
-  if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"]) { 
-    NSArray *autoconf = [[statusFibXml rootElement] nodesForXPath:@"//fib/prefix[text()='ndn:/autoconf-route']" error:nil];
-    if ([autoconf count] == 0)
-      {
-        [self restartDaemon:nil];
-      }
-  }
+  // NSXMLNode *element = [[statusXml rootElement] childAtIndex:0]; //data
+  // [self setDataRecv:[[element childAtIndex:0] stringValue]];
+  // [self setDataSent:[[element childAtIndex:1] stringValue]];
+
+  // element = [[statusXml rootElement] childAtIndex:1]; //interests
+  // [self setInterestRecv:[[element childAtIndex:0] stringValue]];
+  // [self setInterestSent:[[element childAtIndex:1] stringValue]];
+
+  // [preferencesDelegate updateFibStatus:statusFibXml];
+
+  // if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"]) {
+  //   NSArray *autoconf = [[statusFibXml rootElement] nodesForXPath:@"//fib/prefix[text()='ndn:/autoconf-route']" error:nil];
+  //   if ([autoconf count] == 0)
+  //     {
+  //       [self restartDaemon:nil];
+  //     }
+  // }
 }
 
 - (void)statusUnavailable:(id)none
 {
-  // try start ndnd if it is not started yet
-  if (m_daemonStarted) {
-    m_daemonStarted = false;
-    
-    [connectionStatusView setStatus:@"Starting..."];
-    
-    [statusItem setImage:m_disconnectedIcon];
-  }
+  // // try start ndnd if it is not started yet
+  // if (m_daemonStarted) {
+  //   m_daemonStarted = false;
 
-  [self setInterestSent:@"N/A"];
-  [self setInterestRecv:@"N/A"];
-  [self setDataSent:@"N/A"];
-  [self setDataRecv:@"N/A"];
+  //   [connectionStatusView setStatus:@"Starting..."];
 
-  [preferencesDelegate updateFibStatus:nil];
+  //   [statusItem setImage:m_disconnectedIcon];
+  // }
 
-  m_autoconfInProgress = true;
-  
-  NSOperation *startOp = [NSBlockOperation blockOperationWithBlock:^{
-      NSTask *task = [[NSTask alloc] init];
-      [task setLaunchPath: @NDND_START_COMMAND];
-      [task launch];
-    }];
+  // [self setInterestSent:@"N/A"];
+  // [self setInterestRecv:@"N/A"];
+  // [self setDataSent:@"N/A"];
+  // [self setDataRecv:@"N/A"];
 
-  if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"]) {
-    NSOperation *autoconfOp = [NSBlockOperation blockOperationWithBlock:^{
-        NSTask *task = [[NSTask alloc] init];
-        [task setLaunchPath: @NDND_AUTOCONFIG_COMMAND];
-        [task launch];
-        [task waitUntilExit];
+  // [preferencesDelegate updateFibStatus:nil];
 
-        m_autoconfInProgress = false;
-      }];
+  // m_autoconfInProgress = true;
 
-    [autoconfOp addDependency:startOp];
-    [m_operationQueue addOperation:autoconfOp];
-  }
+  // // NSOperation *startOp = [NSBlockOperation blockOperationWithBlock:^{
+  // //     NSTask *task = [[NSTask alloc] init];
+  // //     [task setLaunchPath: @NDND_START_COMMAND];
+  // //     [task launch];
+  // //   }];
 
-  [m_operationQueue addOperation:startOp];
+  // // if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"]) {
+  // //   NSOperation *autoconfOp = [NSBlockOperation blockOperationWithBlock:^{
+  // //       NSTask *task = [[NSTask alloc] init];
+  // //       [task setLaunchPath: @NDND_AUTOCONFIG_COMMAND];
+  // //       [task launch];
+  // //       [task waitUntilExit];
+
+  // //       m_autoconfInProgress = false;
+  // //     }];
+
+  // //   [autoconfOp addDependency:startOp];
+  // //   [m_operationQueue addOperation:autoconfOp];
+  // // }
+
+  // // [m_operationQueue addOperation:startOp];
 }
 
 -(void)restartDaemon:(id)none
 {
-  if (![[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"])
-    return;
-    
-  if (m_autoconfInProgress)
-    return;
+  // if (![[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"])
+  //   return;
 
-  NSLog (@"No automatically detected route configured, trying to get one");
-  
-  m_autoconfInProgress = true;
-  [m_operationQueue addOperationWithBlock:^{
-      NSTask *task = [[NSTask alloc] init];
-      [task setLaunchPath: @NDND_AUTOCONFIG_COMMAND];
-      [task launch];
-      [task waitUntilExit];
+  // if (m_autoconfInProgress)
+  //   return;
 
-      m_autoconfInProgress = false;
-    }];
+  // NSLog(@"No automatically detected route configured, trying to get one");
+
+  // // m_autoconfInProgress = true;
+  // // [m_operationQueue addOperationWithBlock:^{
+  // //     NSTask *task = [[NSTask alloc] init];
+  // //     [task setLaunchPath: @NDND_AUTOCONFIG_COMMAND];
+  // //     [task launch];
+  // //     [task waitUntilExit];
+
+  // //     m_autoconfInProgress = false;
+  // //   }];
 }
 
 @end
diff --git a/osx/ndnd-status-operation.h b/osx/ndnd-status-operation.h
index 8970288..2226cd7 100644
--- a/osx/ndnd-status-operation.h
+++ b/osx/ndnd-status-operation.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Cocoa/Cocoa.h>
diff --git a/osx/ndnd-status-operation.mm b/osx/ndnd-status-operation.mm
index 8bd5ac9..be7632b 100644
--- a/osx/ndnd-status-operation.mm
+++ b/osx/ndnd-status-operation.mm
@@ -1,12 +1,26 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
-#include "config.h"
+#include "config.hpp"
 #import "ndnd-status-operation.h"
 
 @implementation NdndStatusOperation
@@ -20,38 +34,36 @@
 
 -(void)main
 {
-  NSTask *task = [[NSTask alloc] init];
-  [task setLaunchPath: @NDND_STATUS_COMMAND];
-  [task setArguments: [NSArray arrayWithObjects: @"status",@"-x",nil]];
+  // NSTask *task = [[NSTask alloc] init];
+  // [task setLaunchPath: @NDND_STATUS_COMMAND];
+  // [task setArguments: [NSArray arrayWithObjects: @"status",@"-x",nil]];
 
-  NSPipe * out = [NSPipe pipe];
-  [task setStandardOutput:out];
+  // NSPipe * out = [NSPipe pipe];
+  // [task setStandardOutput:out];
 
-  [task launch];
-  [task waitUntilExit];
+  // [task launch];
+  // [task waitUntilExit];
 
-  NSFileHandle * read = [out fileHandleForReading];
-  NSData * dataRead = [read readDataToEndOfFile];
-  NSString *stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
+  // NSFileHandle * read = [out fileHandleForReading];
+  // NSData * dataRead = [read readDataToEndOfFile];
+  // NSString *stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
 
-  if ([stringRead isEqualToString:@""]) {
-    [m_delegate performSelectorOnMainThread:@selector(statusUnavailable:)
-                                 withObject:nil
-                                 waitUntilDone:YES];
-    
-  } else {
-    NSError *error = nil;
-    NSXMLDocument *document = [[NSXMLDocument alloc]
-                                initWithXMLString:stringRead
-                                          options:0
-                                          error:&error];
+  // if ([stringRead isEqualToString:@""]) {
+  //   [m_delegate performSelectorOnMainThread:@selector(statusUnavailable:)
+  //                                withObject:nil
+  //                                waitUntilDone:YES];
 
-    [m_delegate performSelectorOnMainThread:@selector(statusUpdated:)
-                                 withObject:document
-                                 waitUntilDone:YES];
-  }
-  
-  // [daemonStatusText setStringValue:stringRead];
+  // } else {
+  //   NSError *error = nil;
+  //   NSXMLDocument *document = [[NSXMLDocument alloc]
+  //                               initWithXMLString:stringRead
+  //                                         options:0
+  //                                         error:&error];
+
+  //   [m_delegate performSelectorOnMainThread:@selector(statusUpdated:)
+  //                                withObject:document
+  //                                waitUntilDone:YES];
+  // }
 }
 
 @end
diff --git a/osx/preference-delegate.h b/osx/preference-delegate.h
index aa2d28b..efe0b16 100644
--- a/osx/preference-delegate.h
+++ b/osx/preference-delegate.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Cocoa/Cocoa.h>
@@ -12,7 +26,7 @@
 @interface PreferenceDelegate : NSObject
 {
   IBOutlet NSWindow *preferencesPanel;
-  
+
   IBOutlet NSView *generalSettingsView;
   IBOutlet NSButton *checkAllowSoftwareUpdates;
   IBOutlet NSButton *checkEnableHubDiscovery;
@@ -20,15 +34,15 @@
 
   IBOutlet NSView *forwardingSettingsView;
   IBOutlet NSTableView *fibTableView;
-  
+
   IBOutlet NSView *securitySettingsView;
   IBOutlet NSView *testbedSettingsView;
-  
+
   IBOutlet NSPanel *prefixRegistrationSheet;
   IBOutlet NSComboBox *tunnelCombobox;
   IBOutlet NSTextField *namePrefixText;
   IBOutlet NSTextField *endpointText;
-  
+
   IBOutlet FibTableController *tableController;
 }
 
diff --git a/osx/preference-delegate.mm b/osx/preference-delegate.mm
index dd0bfaf..f164c10 100644
--- a/osx/preference-delegate.mm
+++ b/osx/preference-delegate.mm
@@ -1,12 +1,26 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
-#include "config.h"
+#include "config.hpp"
 #import "preference-delegate.h"
 #import "menu-delegate.h"
 
@@ -17,7 +31,7 @@
   [preferencesPanel setContentView:generalSettingsView];
   [preferencesPanel makeKeyAndOrderFront:sender];
   [preferencesPanel setLevel: NSStatusWindowLevel];
-  
+
   tableController.m_tableView = fibTableView;
 }
 
@@ -46,29 +60,29 @@
 {
   [NSApp endSheet:prefixRegistrationSheet];
   [prefixRegistrationSheet orderOut:sender];
-  
+
   NSString *prefixName = [namePrefixText stringValue];
   NSString *tunnelType = [tunnelCombobox itemObjectValueAtIndex:[tunnelCombobox indexOfSelectedItem]];
   NSString *endpoint = [endpointText stringValue];
 
-  NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
-      NSTask *task = [[NSTask alloc] init];
-      [task setLaunchPath: @NDND_FIB_COMMAND];
-      [task setArguments: [NSArray arrayWithObjects: @"add", prefixName, tunnelType, endpoint, nil]];
-      [task launch];
-      [task waitUntilExit];
-    }];
+  // NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
+  //     NSTask *task = [[NSTask alloc] init];
+  //     [task setLaunchPath: @NDND_FIB_COMMAND];
+  //     [task setArguments: [NSArray arrayWithObjects: @"add", prefixName, tunnelType, endpoint, nil]];
+  //     [task launch];
+  //     [task waitUntilExit];
+  //   }];
 
-  [(MenuDelegate*)[[NSApplication sharedApplication] delegate] updateStatusWithDependency:operation];
+  // [(MenuDelegate*)[[NSApplication sharedApplication] delegate] updateStatusWithDependency:operation];
 }
 
 -(IBAction)removeFibEntry:(id)sender
 {
   NSInteger selectedRow = [fibTableView selectedRow];
-  
+
   if(selectedRow == -1)
     return;
-  
+
   NSString *faceID = [tableController getFaceByRowIndex:selectedRow];
   if (faceID == nil)
     return;
@@ -77,15 +91,15 @@
   if (prefix == nil)
     return;
 
-  NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
-      NSTask *task = [[NSTask alloc] init];
-      [task setLaunchPath: @NDND_FIB_COMMAND];
-      [task setArguments: [NSArray arrayWithObjects: @"del", prefix, @"face", faceID, nil]];
-      [task launch];
-      [task waitUntilExit];
-    }];
+  // NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
+  //     NSTask *task = [[NSTask alloc] init];
+  //     [task setLaunchPath: @NDND_FIB_COMMAND];
+  //     [task setArguments: [NSArray arrayWithObjects: @"del", prefix, @"face", faceID, nil]];
+  //     [task launch];
+  //     [task waitUntilExit];
+  //   }];
 
-  [(MenuDelegate*)[[NSApplication sharedApplication] delegate] updateStatusWithDependency:operation];
+  // [(MenuDelegate*)[[NSApplication sharedApplication] delegate] updateStatusWithDependency:operation];
 }
 
 - (IBAction) showFibEntrySheet:(id)sender
@@ -95,7 +109,7 @@
     modalDelegate:self
     didEndSelector:nil
     contextInfo:nil];
-  
+
   [tunnelCombobox selectItemAtIndex:0];
 }
 
diff --git a/osx/sparkle-auto-update.h b/osx/sparkle-auto-update.h
index 78c793f..b8c850f 100644
--- a/osx/sparkle-auto-update.h
+++ b/osx/sparkle-auto-update.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #ifndef SPARKLE_AUTO_UPDATE_H
diff --git a/osx/sparkle-auto-update.mm b/osx/sparkle-auto-update.mm
index a3a9b20..84612b3 100644
--- a/osx/sparkle-auto-update.mm
+++ b/osx/sparkle-auto-update.mm
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #include "sparkle-auto-update.h"
diff --git a/osx/system-events.h b/osx/system-events.h
index 52370ce..fa8cd25 100644
--- a/osx/system-events.h
+++ b/osx/system-events.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Cocoa/Cocoa.h>
diff --git a/osx/system-events.mm b/osx/system-events.mm
index b7297f8..812ebf4 100644
--- a/osx/system-events.mm
+++ b/osx/system-events.mm
@@ -1,24 +1,38 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 /*
   Potentially useful System Configuration regex patterns:
 
   (backslash quoting below is only to protect the C comment)
-  State:/Network/Interface/.*\/Link 
+  State:/Network/Interface/.*\/Link
   State:/Network/Interface/.*\/IPv4
   State:/Network/Interface/.*\/IPv6
-        
+
   State:/Network/Global/DNS
   State:/Network/Global/IPv4
-        
+
   Potentially useful notifications from Darwin Notify Center:
-    
+
   com.apple.system.config.network_change
 */
 
@@ -60,8 +74,8 @@
     return nil;
   }
 
-  [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
-            selector: @selector(wakeUpNotification:) 
+  [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
+            selector: @selector(wakeUpNotification:)
             name: NSWorkspaceDidWakeNotification object: NULL];
 
   CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
@@ -70,7 +84,7 @@
                                   CFSTR ("com.apple.system.config.network_change"), // name of notification
                                   NULL, // object to observe
                                   NSNotificationSuspensionBehaviorDeliverImmediately);
-  
+
   return self;
 }
 
diff --git a/osx/tight-menu-item-view.h b/osx/tight-menu-item-view.h
index 43b04b6..c0925a5 100644
--- a/osx/tight-menu-item-view.h
+++ b/osx/tight-menu-item-view.h
@@ -1,9 +1,23 @@
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import <Foundation/Foundation.h>
diff --git a/osx/tight-menu-item-view.mm b/osx/tight-menu-item-view.mm
index acd7830..65e0125 100644
--- a/osx/tight-menu-item-view.mm
+++ b/osx/tight-menu-item-view.mm
@@ -1,10 +1,23 @@
-//
 /* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * @copyright See LICENCE for copyright and license information.
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
  *
- * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author Ilya Moiseenko <iliamo@ucla.edu>
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
  */
 
 #import "tight-menu-item-view.h"
@@ -30,7 +43,7 @@
                               blue:(70.0f/255.0f)
                               alpha:1.0] set];
   NSRectFill(fullBounds);
-  
+
   NSTextField *connectionStatusText = [[NSTextField alloc] initWithFrame:[self bounds]];
   [connectionStatusText setTextColor:[NSColor whiteColor]];
   [connectionStatusText setStringValue:status];
@@ -41,7 +54,7 @@
   [connectionStatusText setAlignment:NSCenterTextAlignment];
   NSFont *theFont = [NSFont fontWithName:@"Lucida Grande" size:14];
   [connectionStatusText setFont:theFont];
-  
+
   [self addSubview: connectionStatusText];
 }
 
diff --git a/osx/wscript b/osx/wscript
new file mode 100644
index 0000000..9a6c4bf
--- /dev/null
+++ b/osx/wscript
@@ -0,0 +1,76 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import Logs, Utils, Task, TaskGen
+
+top = '..'
+
+def configure(conf):
+
+    conf.find_program('ibtool', var='IBTOOL', mandatory=False)
+
+    conf.check_cxx(framework_name='Foundation', uselib_store='FOUNDATION',
+                   compile_filename='test.mm')
+    conf.check_cxx(framework_name='AppKit',     uselib_store='APPKIT',
+                   compile_filename='test.mm')
+    conf.check_cxx(framework_name='Cocoa',      uselib_store='COCOA',
+                   compile_filename='test.mm')
+
+    conf.env.ARCH_OSX = 'x86_64'
+    conf.env.CXXFLAGS_OSX += ['-fobjc-arc', '-mmacosx-version-min=10.7']
+    conf.env.LINKFLAGS_OSX += ['-mmacosx-version-min=10.7']
+    conf.env.MACOSX_DEPLOYMENT_TARGET = '10.7'
+
+    conf.load('sparkle')
+
+def build(bld):
+    bld(
+        target = "../NFD Control Center",
+        features=['cxxprogram', 'cxx'],
+        includes = ".. .",
+        source = bld.path.ant_glob(['**/*.mm', 'MainMenu.xib']),
+
+        mac_app = True,
+        use = "OSX COCOA FOUNDATION APPKIT SPARKLE",
+
+        mac_plist = 'Info.plist',
+        mac_resources = [i.path_from(bld.path) for i in bld.path.ant_glob('Resources/**/*')],
+        mac_frameworks = "Frameworks/Sparkle.framework",
+        )
+
+from waflib import TaskGen
+@TaskGen.extension('.mm')
+def m_hook(self, node):
+    """Alias .mm files to be compiled the same as .cc files, gcc/clang will do the right thing."""
+    return self.create_compiled_task('cxx', node)
+
+@TaskGen.extension('.m')
+def m_hook(self, node):
+    """Alias .m files to be compiled the same as .c files, gcc/clang will do the right thing."""
+    return self.create_compiled_task('c', node)
+
+
+def bundle_name_for_output(name):
+    return "%s.app" % name
+    # k = name.rfind('.')
+    # if k >= 0:
+    #     name = name[:k] + '.app'
+    # else:
+    #     name = name + '.app'
+    # return name
+
+@TaskGen.extension('.xib')
+def xib(self,node):
+    out = node.change_ext('.nib')
+
+    name = self.path.get_bld().find_or_declare(bundle_name_for_output(self.target))
+    resources = name.find_or_declare(['Contents', 'Resources'])
+    resources.mkdir()
+    real_out = resources.make_node(out.name)
+
+    self.create_task('xib', node, real_out)
+    inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Contents/Resources' % name
+    self.bld.install_as(inst_to + '/%s' % real_out.name, real_out)
+
+class xib(Task.Task):
+    color='PINK'
+    run_str = '${IBTOOL} --errors --warnings --notices --output-format human-readable-text --compile ${TGT} ${SRC}'
diff --git a/linux/Resources/emblem-dropbox-unsyncable.png b/qt/Resources/emblem-dropbox-unsyncable.png
similarity index 100%
rename from linux/Resources/emblem-dropbox-unsyncable.png
rename to qt/Resources/emblem-dropbox-unsyncable.png
Binary files differ
diff --git a/linux/Resources/emblem-system.png b/qt/Resources/emblem-system.png
similarity index 100%
rename from linux/Resources/emblem-system.png
rename to qt/Resources/emblem-system.png
Binary files differ
diff --git a/linux/Resources/emblem-web.png b/qt/Resources/emblem-web.png
similarity index 100%
rename from linux/Resources/emblem-web.png
rename to qt/Resources/emblem-web.png
Binary files differ
diff --git a/linux/Resources/gnome-system.png b/qt/Resources/gnome-system.png
similarity index 100%
rename from linux/Resources/gnome-system.png
rename to qt/Resources/gnome-system.png
Binary files differ
diff --git a/linux/Resources/icon-connected-white.png b/qt/Resources/icon-connected-white.png
similarity index 100%
rename from linux/Resources/icon-connected-white.png
rename to qt/Resources/icon-connected-white.png
Binary files differ
diff --git a/linux/Resources/icon-disconnected-white.png b/qt/Resources/icon-disconnected-white.png
similarity index 100%
rename from linux/Resources/icon-disconnected-white.png
rename to qt/Resources/icon-disconnected-white.png
Binary files differ
diff --git a/linux/Resources/mail-send-receive.png b/qt/Resources/mail-send-receive.png
similarity index 100%
rename from linux/Resources/mail-send-receive.png
rename to qt/Resources/mail-send-receive.png
Binary files differ
diff --git a/linux/Resources/ndnx-main.png b/qt/Resources/ndnx-main.png
similarity index 100%
rename from linux/Resources/ndnx-main.png
rename to qt/Resources/ndnx-main.png
Binary files differ
diff --git a/linux/Resources/ndnx-main.xpm b/qt/Resources/ndnx-main.xpm
similarity index 100%
rename from linux/Resources/ndnx-main.xpm
rename to qt/Resources/ndnx-main.xpm
diff --git a/linux/Resources/preferences-desktop.png b/qt/Resources/preferences-desktop.png
similarity index 100%
rename from linux/Resources/preferences-desktop.png
rename to qt/Resources/preferences-desktop.png
Binary files differ
diff --git a/linux/Resources/status-to-fib.xslt b/qt/Resources/status-to-fib.xslt
similarity index 100%
rename from linux/Resources/status-to-fib.xslt
rename to qt/Resources/status-to-fib.xslt
diff --git a/linux/Resources/status.xslt b/qt/Resources/status.xslt
similarity index 100%
rename from linux/Resources/status.xslt
rename to qt/Resources/status.xslt
diff --git a/linux/Resources/system-run.png b/qt/Resources/system-run.png
similarity index 100%
rename from linux/Resources/system-run.png
rename to qt/Resources/system-run.png
Binary files differ
diff --git a/qt/disabled/fib-input-dialog.cpp b/qt/disabled/fib-input-dialog.cpp
new file mode 100644
index 0000000..69700db
--- /dev/null
+++ b/qt/disabled/fib-input-dialog.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * @copyright See LICENCE for copyright and license information.
+ *
+ * @author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "fib-input-dialog.hpp"
+
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+
+FibInputDialog::FibInputDialog(QWidget *parent)
+  : QDialog(parent)
+{
+  prefixLabel = new QLabel(tr("NDN name (prefix): "));
+  prefixTextField = new QLineEdit;
+  prefixLabel->setBuddy(prefixTextField);
+
+  tunnelLabel = new QLabel(tr("Tunnel type: "));
+  tunnelComboBox = new QComboBox;
+  tunnelComboBox->addItem(tr("TCP"));
+  tunnelComboBox->addItem(tr("UDP"));
+  tunnelComboBox->setEditable(false);
+  tunnelComboBox->setCurrentIndex(0);
+
+  endpointLabel = new QLabel(tr("Endpoint (IP address): "));
+  endpointTextField = new QLineEdit;
+  endpointLabel->setBuddy(endpointTextField);
+
+  okButton = new QPushButton(tr("&Ok"));
+  cancelButton = new QPushButton(tr("&Cancel"));
+
+  connect(okButton,SIGNAL(pressed()), parent, SLOT(addFibEntry()));
+  connect(cancelButton,SIGNAL(pressed()), this, SLOT(hide()));
+
+  buttonBox = new QDialogButtonBox(Qt::Horizontal);
+  buttonBox->addButton(cancelButton, QDialogButtonBox::ActionRole);
+  buttonBox->addButton(okButton, QDialogButtonBox::ActionRole);
+
+  QHBoxLayout *hlayout = new QHBoxLayout;
+  hlayout->addWidget(tunnelLabel);
+  hlayout->addWidget(tunnelComboBox);
+
+  QVBoxLayout *layout = new QVBoxLayout;
+  layout->addWidget(prefixLabel);
+  layout->addWidget(prefixTextField);
+  layout->addLayout(hlayout);
+  layout->addWidget(endpointLabel);
+  layout->addWidget(endpointTextField);
+  layout->addWidget(buttonBox);
+
+  setLayout(layout);
+
+  setWindowTitle(tr("NDNx Control Center"));
+}
+
+QString
+FibInputDialog::getPrefixName()
+{
+  return prefixTextField->text();
+}
+
+QString
+FibInputDialog::getEndpoint()
+{
+  return endpointTextField->text();
+}
+
+QString
+FibInputDialog::getTunnelType()
+{
+  return tunnelComboBox->currentText();
+}
+
+void
+FibInputDialog::clear()
+{
+  prefixTextField->setText("");
+  tunnelComboBox->setCurrentIndex(0);
+  endpointTextField->setText("");
+}
+
+#if WAF
+#include "fib-input-dialog.moc"
+#include "fib-input-dialog.cpp.moc"
+#endif
diff --git a/linux/fib-input-dialog.h b/qt/disabled/fib-input-dialog.hpp
similarity index 100%
rename from linux/fib-input-dialog.h
rename to qt/disabled/fib-input-dialog.hpp
diff --git a/qt/main.cpp b/qt/main.cpp
new file mode 100644
index 0000000..5268e80
--- /dev/null
+++ b/qt/main.cpp
@@ -0,0 +1,32 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "tray-menu.hpp"
+
+#include <QtGui/QApplication>
+
+int main(int argc, char *argv[])
+{
+  QApplication a(argc, argv);
+  TrayMenu w;
+
+  return a.exec();
+}
diff --git a/qt/network-manager.cpp b/qt/network-manager.cpp
new file mode 100644
index 0000000..05bf378
--- /dev/null
+++ b/qt/network-manager.cpp
@@ -0,0 +1,79 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "network-manager.hpp"
+#include "config.hpp"
+
+NetworkManager::NetworkManager()
+  : isAutoconfigRunning(false)
+{
+  if (!QDBusConnection::systemBus().isConnected())
+    {
+      return;
+    }
+
+  autoconfigProcess = new QProcess(this);
+  connect(autoconfigProcess,SIGNAL(finished(int)),this,SLOT(autoconfigFinished()));
+  connect(autoconfigProcess, SIGNAL(error(QProcess::ProcessError)),
+          this, SLOT(autoconfigFinished()));
+
+  QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager",
+                                       "/org/freedesktop/NetworkManager",
+                                       "org.freedesktop.NetworkManager",
+                                       "StateChanged", this, SLOT(stateChanged(uint)));
+
+  QDBusConnection::systemBus().connect("org.freedesktop.UPower",
+                                       "/org/freedesktop/UPower",
+                                       "org.freedesktop.UPower",
+                                       "Resuming", this, SLOT(autoconfigDaemon()));
+}
+
+void NetworkManager::stateChanged(uint state)
+{
+  if (state == NM_STATE_CONNECTED_GLOBAL)
+    autoconfigDaemon();
+}
+
+void NetworkManager::autoconfigDaemon()
+{
+  if (IsAutoconfigRunning())
+    return;
+
+  isAutoconfigRunning = true;
+
+  if (autoconfigProcess != 0)
+    autoconfigProcess->start(NFD_AUTOCONFIG_COMMAND);
+}
+
+void NetworkManager::autoconfigFinished()
+{
+  isAutoconfigRunning = false;
+}
+
+bool NetworkManager::IsAutoconfigRunning()
+{
+  return isAutoconfigRunning;
+}
+
+#if WAF
+#include "network-manager.moc"
+#include "network-manager.cpp.moc"
+#endif
diff --git a/qt/network-manager.hpp b/qt/network-manager.hpp
new file mode 100644
index 0000000..f111fc6
--- /dev/null
+++ b/qt/network-manager.hpp
@@ -0,0 +1,53 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include <QtDBus>
+#include <QProcess>
+
+#ifndef NCC_QT_NETWORK_MANAGER_HPP
+#define NCC_QT_NETWORK_MANAGER_HPP
+
+#define NM_STATE_DISCONNECTED 20
+#define NM_STATE_CONNECTING 40
+#define NM_STATE_CONNECTED_GLOBAL 70
+
+class NetworkManager : public QObject
+{
+     Q_OBJECT
+
+public:
+    NetworkManager();
+    bool IsAutoconfigRunning();
+
+public slots:
+    void autoconfigDaemon();
+
+private:
+    QProcess *autoconfigProcess;
+    bool isAutoconfigRunning;
+
+private slots:
+    void stateChanged(uint state);
+    void autoconfigFinished();
+};
+
+
+#endif // NCC_QT_NETWORK_MANAGER_HPP
diff --git a/linux/ndnx-control-center.desktop.in b/qt/nfd-control-center.desktop.in
similarity index 100%
rename from linux/ndnx-control-center.desktop.in
rename to qt/nfd-control-center.desktop.in
diff --git a/qt/quit-dialog.cpp b/qt/quit-dialog.cpp
new file mode 100644
index 0000000..98e993f
--- /dev/null
+++ b/qt/quit-dialog.cpp
@@ -0,0 +1,60 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "quit-dialog.hpp"
+
+#include <QVBoxLayout>
+#include <QApplication>
+
+QuitDialog::QuitDialog(QWidget *parent)
+  : QDialog(parent)
+{
+  question = new QLabel(tr("Shutdown NDN daemon as well?"));
+  information = new QLabel(tr("All NDN operations will become unavailable."));
+
+  confirmButton = new QPushButton(tr("Yes"));
+  noButton = new QPushButton(tr("No"));
+  cancelButton = new QPushButton(tr("Cancel"));
+  cancelButton->setDefault(true);
+
+  buttonBox = new QDialogButtonBox(Qt::Horizontal);
+  buttonBox->addButton(cancelButton, QDialogButtonBox::ActionRole);
+  buttonBox->addButton(noButton, QDialogButtonBox::ActionRole);
+  buttonBox->addButton(confirmButton, QDialogButtonBox::ActionRole);
+
+  connect(confirmButton,SIGNAL(pressed()), parent, SLOT(terminateDaemonAndClose()));
+  connect(noButton,SIGNAL(pressed()), qApp, SLOT(quit()));
+  connect(cancelButton,SIGNAL(pressed()), this, SLOT(hide()));
+
+  QVBoxLayout *layout = new QVBoxLayout;
+  layout->addWidget(question);
+  layout->addWidget(information);
+  layout->addWidget(buttonBox);
+
+  setLayout(layout);
+
+  setWindowTitle(tr("NDNx Control Center"));
+}
+
+#if WAF
+#include "quit-dialog.moc"
+#include "quit-dialog.cpp.moc"
+#endif
diff --git a/qt/quit-dialog.hpp b/qt/quit-dialog.hpp
new file mode 100644
index 0000000..c28c300
--- /dev/null
+++ b/qt/quit-dialog.hpp
@@ -0,0 +1,46 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include <QDialog>
+#include <QLabel>
+#include <QDialogButtonBox>
+#include <QPushButton>
+
+#ifndef NCC_QT_QUIT_DIALOG_H
+#define NCC_QT_QUIT_DIALOG_H
+
+class QuitDialog : public QDialog
+{
+  Q_OBJECT
+
+public:
+  QuitDialog(QWidget *parent = 0);
+
+private:
+  QLabel *question;
+  QLabel *information;
+  QDialogButtonBox *buttonBox;
+  QPushButton *confirmButton;
+  QPushButton *noButton;
+  QPushButton *cancelButton;
+};
+
+#endif // NCC_QT_QUIT_DIALOG_H
diff --git a/linux/resource.qrc b/qt/resource.qrc
similarity index 100%
rename from linux/resource.qrc
rename to qt/resource.qrc
diff --git a/qt/tray-menu.cpp b/qt/tray-menu.cpp
new file mode 100644
index 0000000..da9874d
--- /dev/null
+++ b/qt/tray-menu.cpp
@@ -0,0 +1,605 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "config.hpp"
+
+#include "tray-menu.hpp"
+#include "ui_traymenu.h"   //generated from traymenu.ui
+
+#include "quit-dialog.hpp"
+// #include "fib-input-dialog.hpp"
+#include "network-manager.hpp"
+
+#include <QMenu>
+#include <QCloseEvent>
+#include <QDesktopServices>
+#include <QUrl>
+#include <QCheckBox>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QLineEdit>
+#include <QDir>
+#include <QScrollBar>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+
+TrayMenu::TrayMenu(QWidget *parent)
+  : QMainWindow(parent)
+  , ui(new Ui::TrayMenu)
+{
+  processLookup = new QProcess(this);
+  QStringList arguments;
+  arguments << "-al";
+  connect(processLookup,SIGNAL(finished(int)), this, SLOT(parseProcessLookup()));
+  processLookup->start("ps",arguments);
+
+  networkManager = new NetworkManager();
+
+  QCoreApplication::setOrganizationName("UCLA");
+  QCoreApplication::setOrganizationDomain("named-data.net");
+  QCoreApplication::setApplicationName("NDNx Control Center");
+
+  persistentSettings = new QSettings();
+
+  ui->setupUi(this);
+
+  createTrayIcon();
+  setIcon(true);
+  createToolbar();
+  createTableView();
+
+  loadSettings();
+
+  connect(ui->openTrafficMapButton, SIGNAL(pressed()), this, SLOT(openTrafficMap()));
+  connect(ui->openRoutingStatusButton, SIGNAL(pressed()), this, SLOT(openRoutingStatus()));
+  connect(ui->addFibButton, SIGNAL(pressed()), this, SLOT(showFibInputDialog()));
+  // connect(ui->deleteFibButton, SIGNAL(released()), this, SLOT(deleteFibEntry()));
+  connect(ui->hubDiscoveryCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeHubDiscovery()));
+  connect(ui->loginStartCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeLoginStart()));
+  connect(ui->tableView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectTableRow()));
+  connect(ui->openNdnCertificationButton, SIGNAL(released()), this, SLOT(openCertificationPage()));
+
+  statusUpdateThread = new QThread();
+  statusUpdateThread->start();
+
+  // daemonStatusTimer = new QTimer(statusUpdateThread);
+  // connect(daemonStatusTimer, SIGNAL(timeout()), this, SLOT(daemonStatusUpdate()));
+  // daemonStatusTimer->start(2000);
+
+  trayIcon->show();
+  model = NULL;
+  // dialog = new FibInputDialog(this);
+
+  // urlManager = new QNetworkAccessManager(this);
+  // connect(urlManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(runXmlProc(QNetworkReply*)));
+}
+
+void TrayMenu::loadSettings()
+{
+  QVariant value;
+
+  value = persistentSettings->value(ENABLE_HUB_DISCOVERY);
+  if(!value.isNull())
+    {
+      enableHubDiscovery = value.toBool();
+      ui->hubDiscoveryCheckbox->setChecked(enableHubDiscovery);
+    }
+  else
+    {
+      ui->hubDiscoveryCheckbox->setChecked(true);
+      changeHubDiscovery();
+    }
+
+  value = persistentSettings->value(ENABLE_START_ON_LOGIN);
+  if(!value.isNull())
+    {
+      enableStartOnLogin = value.toBool();
+      ui->loginStartCheckbox->setChecked(enableStartOnLogin);
+    }
+  else
+    {
+      ui->loginStartCheckbox->setChecked(false);
+      changeLoginStart();
+    }
+}
+
+void TrayMenu::changeHubDiscovery()
+{
+  if(ui->hubDiscoveryCheckbox->isChecked())
+    {
+      enableHubDiscovery = true;
+      persistentSettings->setValue(ENABLE_HUB_DISCOVERY, true);
+    }
+  else
+    {
+      enableHubDiscovery = false;
+      persistentSettings->setValue(ENABLE_HUB_DISCOVERY, false);
+    }
+}
+
+void TrayMenu::changeLoginStart()
+{
+  if(ui->loginStartCheckbox->isChecked())
+    {
+      enableStartOnLogin = true;
+      persistentSettings->setValue(ENABLE_START_ON_LOGIN, true);
+      makeAutostartDirectory();
+    }
+  else
+    {
+      enableStartOnLogin = false;
+      persistentSettings->setValue(ENABLE_START_ON_LOGIN, false);
+
+      QProcess *process = new QProcess();
+      connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
+      QStringList arguments;
+      arguments << QDir::homePath() + AUTOSTART_DIRECTORY + SHORTCUT_FILE;
+      process->start("rm", arguments);
+    }
+}
+
+void TrayMenu::makeAutostartDirectory()
+{
+  QProcess *process = new QProcess();
+  connect(process, SIGNAL(finished(int)), this, SLOT(copyFile()));
+  connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
+  QStringList arguments;
+  arguments << QDir::homePath() + AUTOSTART_DIRECTORY;
+  process->start("mkdir", arguments);
+}
+
+void TrayMenu::copyFile()
+{
+  QProcess *process = new QProcess();
+  connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
+  QStringList arguments;
+  arguments << QString(RESOURCES_DIR) + "/" + SHORTCUT_FILE << QDir::homePath() + AUTOSTART_DIRECTORY;
+  process->start("cp",arguments);
+}
+
+void TrayMenu::showFibInputDialog()
+{
+  // dialog->clear();
+  // dialog->exec();
+}
+
+void TrayMenu::openTrafficMap()
+{
+  QDesktopServices::openUrl(QUrl("http://ndnmap.arl.wustl.edu/", QUrl::TolerantMode));
+}
+
+void TrayMenu::openRoutingStatus()
+{
+  QDesktopServices::openUrl(QUrl("http://netlab.cs.memphis.edu/script/htm/status.htm", QUrl::TolerantMode));
+}
+
+void TrayMenu::openCertificationPage()
+{
+  QDesktopServices::openUrl(QUrl("http://ndncert.named-data.net", QUrl::TolerantMode));
+}
+
+void TrayMenu::createTrayIcon()
+{
+  trayIconMenu = new QMenu(this);
+
+  statusIndicator = new QAction("Inactive", this);
+  trayIconMenu->addAction(statusIndicator);
+
+  trayIconMenu->addSeparator();
+
+  displayStatus = new QAction("                           Sent / Recv   ", this);
+  trayIconMenu->addAction(displayStatus);
+  interestSentRecv = new QAction("Interests      0 / 0", this);
+  trayIconMenu->addAction(interestSentRecv);
+  dataSentRecv = new QAction("Data               0 / 0", this);
+  trayIconMenu->addAction(dataSentRecv);
+
+  trayIconMenu->addSeparator();
+
+  open = new QAction("Preferences...", this);
+  connect(open, SIGNAL(triggered()), this, SLOT(show()));
+  trayIconMenu->addAction(open);
+
+  close = new QAction("Quit", this);
+  // connect(close, SIGNAL(triggered()), this, SLOT(confirmQuit()));
+  connect(close, SIGNAL(triggered()), qApp, SLOT(quit()));
+  trayIconMenu->addAction(close);
+
+  trayIcon = new QSystemTrayIcon(this);
+  trayIcon->setContextMenu(trayIconMenu);
+
+  connect(
+          trayIcon,
+          SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
+          this,
+          SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason))
+          );
+}
+
+void TrayMenu::createToolbar()
+{
+  ui->toolBar->setFloatable(false);
+  ui->toolBar->setMovable(false);
+  ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+  ui->toolBar->setAllowedAreas(Qt::TopToolBarArea);
+  ui->toolBar->setOrientation(Qt::Horizontal);
+  ui->toolBar->setIconSize(QSize(32,32));
+  ui->toolBar->resize(this->width(), 64);
+
+  openGeneralSettings = new QAction("General", this);
+  openGeneralSettings->setIcon(QIcon(":/resource/Resources/preferences-desktop.png"));
+  connect(openGeneralSettings,SIGNAL(triggered()),this, SLOT(generalSettingsClicked()));
+
+  openForwardingSettings = new QAction("Forwarding", this);
+  openForwardingSettings->setIcon(QIcon(":/resource/Resources/emblem-web.png"));
+  connect(openForwardingSettings,SIGNAL(triggered()),this, SLOT(forwardingSettingsClicked()));
+
+  openSecuritySettings = new QAction("Security", this);
+  openSecuritySettings->setIcon(QIcon(":/resource/Resources/emblem-system.png"));
+  connect(openSecuritySettings,SIGNAL(triggered()),this, SLOT(securitySettingsClicked()));
+
+  ui->toolBar->addAction(openGeneralSettings);
+  ui->toolBar->addAction(openForwardingSettings);
+  ui->toolBar->addAction(openSecuritySettings);
+}
+
+void TrayMenu::generalSettingsClicked()
+{
+  ui->generalSettingsWidget->show();
+  ui->forwardingSettingsWidget->hide();
+  ui->securitySettingsWidget->hide();
+}
+
+void TrayMenu::forwardingSettingsClicked()
+{
+  ui->generalSettingsWidget->hide();
+  ui->forwardingSettingsWidget->show();
+  ui->securitySettingsWidget->hide();
+}
+
+void TrayMenu::securitySettingsClicked()
+{
+  ui->generalSettingsWidget->hide();
+  ui->forwardingSettingsWidget->hide();
+  ui->securitySettingsWidget->show();
+}
+
+void TrayMenu::displayPopup()
+{
+  trayIcon->showMessage("NDNx Status", statusXml);
+}
+
+void TrayMenu::addFibEntry()
+{
+  // QString name = dialog->getPrefixName();
+  // QString tunnelType = dialog->getTunnelType();
+  // QString endpoint = dialog->getEndpoint();
+
+  // QStringList arguments;
+  // arguments << "add" << name << tunnelType << endpoint;
+
+  // dialog->hide();
+
+  // QProcess *process = new QProcess();
+  // connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
+  // process->start(NDND_FIB_COMMAND, arguments);
+}
+
+void TrayMenu::closeEvent(QCloseEvent *event)
+{
+  if (trayIcon->isVisible())
+    {
+      hide();
+      event->ignore();
+    }
+}
+
+void TrayMenu::showEvent(QShowEvent * event)
+{
+  ui->generalSettingsWidget->show();
+  ui->forwardingSettingsWidget->hide();
+  ui->securitySettingsWidget->hide();
+}
+
+void TrayMenu::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
+{
+  if(reason == QSystemTrayIcon::Trigger)
+    this->show();
+}
+
+void TrayMenu::setIcon(bool isConnected)
+{
+  if(isConnected)
+    trayIcon->setIcon(QIcon(":/resource/Resources/icon-connected-white.png"));
+  else
+    trayIcon->setIcon(QIcon(":/resource/Resources/icon-disconnected-white.png"));
+}
+
+// void TrayMenu::daemonStatusUpdate()
+// {
+//   urlManager->get(QNetworkRequest(QUrl("http://localhost:6363/?f=xml")));
+// }
+
+// void TrayMenu::runXmlProc(QNetworkReply *reply)
+// {
+//   QByteArray buffer = reply->readAll();
+//   applyStatusXslt = new QProcess();
+
+//   QStringList arguments;
+//   arguments << QString(RESOURCES_DIR) + "/" + STATUS_XSLT_FILE << "-";
+//   connect(applyStatusXslt,SIGNAL(finished(int)), this, SLOT(parseStatusXml()));
+//   //connect(applyStatusXslt,SIGNAL(finished(int)), applyStatusXslt, SLOT(deleteLater()));
+//   applyStatusXslt->start(XSLTPROC,arguments);
+//   applyStatusXslt->write(buffer);
+//   applyStatusXslt->closeWriteChannel();
+
+//   applyFibXslt = new QProcess();
+//   QStringList args;
+//   args << QString(RESOURCES_DIR) + "/" + FIB_XSLT_FILE << "-";
+//   connect(applyFibXslt,SIGNAL(finished(int)), this, SLOT(parseFibXml()));
+//   //connect(applyFibXslt,SIGNAL(finished(int)), applyFibXslt, SLOT(deleteLater()));
+//   applyFibXslt->start(XSLTPROC,args);
+//   applyFibXslt->write(buffer);
+//   applyFibXslt->closeWriteChannel();
+// }
+
+// void TrayMenu::parseStatusXml()
+// {
+//   QByteArray stdout = applyStatusXslt->readAllStandardOutput();
+//   QByteArray stderr = applyStatusXslt->readAllStandardError();
+//   applyStatusXslt->deleteLater();
+
+//   statusXml = QString(stdout);
+
+//   if((statusXml == "") || (stderr.length()>0)) // there was an error during Query evaluation
+//     {
+//       daemonStarted = false;
+//       setIcon(false);
+//       statusIndicator->setText("Inactive");
+
+//       // QProcess *process = new QProcess();
+//       // if(enableHubDiscovery)
+//       //     connect(process, SIGNAL(finished(int)), networkManager, SLOT(autoconfigDaemon()));
+//       //
+//       // connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
+//       // process->start(NDND_START_COMMAND);
+//     }
+//   else
+//     {
+//       daemonStarted = true;
+//       setIcon(true);
+//       statusIndicator->setText("Active");
+
+//       QString interestIn = statusXml.mid(statusXml.indexOf("<in>")+4, statusXml.indexOf("</in>") - (statusXml.indexOf("<in>")+4));
+//       QString interestOut = statusXml.mid(statusXml.indexOf("<out>")+5, statusXml.indexOf("</out>") - (statusXml.indexOf("<out>")+5));
+//       QString dataIn = statusXml.mid(statusXml.lastIndexOf("<in>")+4, statusXml.lastIndexOf("</in>") - (statusXml.lastIndexOf("<in>")+4));
+//       QString dataOut = statusXml.mid(statusXml.lastIndexOf("<out>")+5, statusXml.lastIndexOf("</out>") - (statusXml.lastIndexOf("<out>")+5));
+
+//       int i = 0;
+//       int k = 0;
+//       if((dataOut.length() - interestOut.length()) > 0)
+//         {
+//           i = dataOut.length() - interestOut.length();
+//           i*=2; //because space takes less space than a letter
+//         }
+
+//       if((interestOut.length() - dataOut.length()) > 0)
+//         {
+//           k = interestOut.length() - dataOut.length();
+//           k*=2; //because space takes less space than a letter
+//         }
+
+//       QString interestStats = QString("%1%2%3%4").arg("Interests",-16,' ').arg(interestOut,6+i,' ').arg(" / ",3).arg(interestIn,-6,' ');
+//       QString dataStats = QString("%1%2%3%4").arg("Data",-20,' ').arg(dataOut,6+k,' ').arg(" / ",3).arg(dataIn,-6,' ');
+
+//       //Now I try to align header "Sent / Recv" centrally with the upper line
+//       QString padding;
+//       for(int j = 0; j < interestStats.indexOf(interestOut); j++)
+//         {
+//           if(interestStats.at(j)==' ')
+//             padding +=" ";
+//           else
+//             padding += "  "; //because space takes less space than a letter
+//         }
+
+//       QString header;
+//       int m = 0;
+//       if(interestOut.length() - QString("Sent").length() > 0)
+//         {
+//           m = interestOut.length() - QString("Sent").length();
+//           m *=3;
+//           header = QString("%1%2").arg(padding).arg("  Sent / Recv",QString("  Sent / Recv").length() + m,' ');
+//         }
+//       else if(interestOut.length() - QString("Sent").length() < 0)
+//         {
+//           padding.truncate(padding.length()-(QString("Sent").length() - interestOut.length()));
+//           header = padding + "Sent / Recv";
+//         }
+//       else
+//         {
+//           header = padding + "  Sent / Recv";
+//         }
+
+//       interestSentRecv->setText(interestStats);
+//       dataSentRecv->setText(dataStats);
+//       displayStatus->setText(header);
+//     }
+// }
+
+// void TrayMenu::parseFibXml()
+// {
+//   QByteArray stdout = applyFibXslt->readAllStandardOutput();
+//   QByteArray stderr = applyFibXslt->readAllStandardError();
+//   applyFibXslt->deleteLater();
+
+//   fibContentsXml = QString(stdout);
+
+//   if((stdout == "") || (stderr.length()>0))
+//     return;
+
+//   if ((enableHubDiscovery) && (fibContentsXml.indexOf("ndn:/autoconf-route",0,Qt::CaseInsensitive) == -1))
+//     {
+//       networkManager->autoconfigDaemon();
+//     }
+
+//   QDomDocument xmldoc;
+//   QDomElement root;
+
+//   xmldoc.setContent(fibContentsXml);
+//   root=xmldoc.documentElement();
+
+//   if(model != NULL)
+//     {
+//       scrollPosition = ui->tableView->verticalScrollBar()->value();
+//       model->clear();
+//       delete model;
+//     }
+
+//   model = new QStandardItemModel(root.childNodes().count(),3);
+//   model->setHorizontalHeaderItem(0, new QStandardItem("NDN prefix"));
+//   model->setHorizontalHeaderItem(1, new QStandardItem("Face ID"));
+//   model->setHorizontalHeaderItem(2, new QStandardItem("Endpoint"));
+
+//   int row = 0;
+//   QDomNode fibEntry=root.firstChild();
+
+//   while (!fibEntry.isNull())
+//     {
+//       QDomNodeList properties = fibEntry.childNodes();
+
+//       QDomNode faceID = properties.at(0);
+//       QDomNode ip =  properties.at(1);
+//       QDomNode prefix = properties.at(2);
+
+//       model->setItem(row, 0, new QStandardItem(prefix.toElement().text()));
+//       model->setItem(row, 1, new QStandardItem(faceID.toElement().text()));
+//       model->setItem(row, 2, new QStandardItem(ip.toElement().text()));
+
+//       fibEntry = fibEntry.nextSibling();
+//       row++;
+//     }
+
+//   ui->tableView->setModel(model);
+
+//   ui->tableView->setColumnWidth(0, ui->tableView->size().width() / 2 );
+//   ui->tableView->setColumnWidth(1, ui->tableView->size().width() / 6 );
+
+//   if(selectedRow >= 0)
+//     ui->tableView->selectRow(selectedRow);
+
+//   if(scrollPosition >= 0)
+//     ui->tableView->verticalScrollBar()->setValue(scrollPosition);
+// }
+
+void TrayMenu::createTableView()
+{
+  ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
+  ui->tableView->horizontalHeader()->setStretchLastSection(true);
+  ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
+  ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
+
+  selectedRow = -1;
+  scrollPosition = -1;
+
+  QHBoxLayout *hlayout = new QHBoxLayout();
+  hlayout->addWidget(ui->addFibButton,0, Qt::AlignLeft);
+  // hlayout->addWidget(ui->deleteFibButton, 20, Qt::AlignLeft);
+
+  QVBoxLayout *vlayout = new QVBoxLayout();
+  vlayout->addWidget(ui->label);
+  vlayout->addWidget(ui->tableView);
+  vlayout->addLayout(hlayout);
+
+  ui->forwardingSettingsWidget->setLayout(vlayout);
+
+  QVBoxLayout *expanding = new QVBoxLayout();
+  expanding->addWidget(ui->forwardingSettingsWidget);
+  ui->centralWidget->setLayout(expanding);
+}
+
+void TrayMenu::selectTableRow()
+{
+  selectedRow = ui->tableView->selectionModel()->selection().indexes().at(0).row();
+}
+
+// void TrayMenu::deleteFibEntry()
+// {
+//   if(selectedRow < 0)
+//     return;
+
+//   QStandardItem *prefix = model->item(selectedRow,0);
+//   if(prefix == NULL)
+//     return;
+
+//   QStandardItem *faceID = model->item(selectedRow,1);
+//   if(faceID == NULL)
+//     return;
+
+//   QStringList arguments;
+//   arguments << "del" << prefix->text() << "face" << faceID->text();
+
+//   QProcess *process = new QProcess();
+//   connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
+//   process->start(NDND_FIB_COMMAND, arguments);
+// }
+
+void TrayMenu::resizeEvent(QResizeEvent *  event)
+{
+  ui->tableView->setColumnWidth(0, ui->tableView->size().width() / 2);
+  ui->tableView->setColumnWidth(1, ui->tableView->size().width() / 6);
+}
+
+
+void TrayMenu::parseProcessLookup()
+{
+  QByteArray stdout = processLookup->readAllStandardOutput();
+  processLookup->deleteLater();
+
+  QString s = QString(stdout);
+
+  if(s == "")
+    return;
+  else if(s.indexOf("ndnx-control") != s.lastIndexOf("ndnx-control"))
+    qApp->quit();
+}
+
+TrayMenu::~TrayMenu()
+{
+  daemonStatusTimer->stop();
+  statusUpdateThread->exit(0);
+  delete ui;
+  delete trayIcon;
+  delete trayIconMenu;
+  delete open;
+  delete close;
+  delete openGeneralSettings;
+  delete openForwardingSettings;
+  delete openSecuritySettings;
+  delete statusUpdateThread;
+  // delete dialog;
+  delete networkManager;
+  delete persistentSettings;
+}
+
+#if WAF
+#include "tray-menu.moc"
+#include "tray-menu.cpp.moc"
+#endif
diff --git a/qt/tray-menu.hpp b/qt/tray-menu.hpp
new file mode 100644
index 0000000..966db12
--- /dev/null
+++ b/qt/tray-menu.hpp
@@ -0,0 +1,145 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center 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 Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR 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
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#ifndef NCC_QT_TRAY_MENU_H
+#define NCC_QT_TRAY_MENU_H
+
+#include <QMainWindow>
+#include <QWidget>
+#include <QSystemTrayIcon>
+#include <QMenu>
+#include <QTimer>
+#include <QProcess>
+#include <QThread>
+#include <QStandardItemModel>
+#include <QtXml>
+#include <QThread>
+#include <QSettings>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
+// #include "fib-input-dialog.hpp"
+#include "quit-dialog.hpp"
+#include "network-manager.hpp"
+
+#define ALLOW_SOFTWARE_UPDATES "AllowAutomaticUpdates"
+#define ENABLE_HUB_DISCOVERY "EnableHubDiscovery"
+#define ENABLE_START_ON_LOGIN "enableStartOnLogin"
+#define SHUTDOWN_ON_EXIT "ShutdownOnExit"
+
+#define AUTOSTART_DIRECTORY "/.config/autostart/"
+#define SHORTCUT_FILE "ndnxcontrolcenter.desktop"
+#define STATUS_XSLT_FILE "status.xslt"
+#define FIB_XSLT_FILE "status-to-fib.xslt"
+
+namespace Ui {
+class TrayMenu;
+}
+
+class TrayMenu : public QMainWindow
+{
+  Q_OBJECT
+
+public:
+  explicit TrayMenu(QWidget *parent = 0);
+  ~TrayMenu();
+
+private:
+  Ui::TrayMenu *ui;
+
+  void createTrayIcon();
+  void setIcon(bool isConnected);
+  void createToolbar();
+  void createTableView();
+  void closeEvent(QCloseEvent *); // Overriding the window's close event
+  void showEvent(QShowEvent * event); //Overriding the window's show event
+
+  void loadSettings();
+  void makeAutostartDirectory();
+
+  void resizeEvent (QResizeEvent * event);
+
+  bool daemonStarted;
+
+  QSettings *persistentSettings;
+
+  QSystemTrayIcon *trayIcon;
+  QMenu *trayIconMenu;
+
+  QTimer *daemonStatusTimer;
+  QThread *statusUpdateThread;
+
+  QProcess *processLookup;
+  QProcess *applyStatusXslt;
+  QProcess *applyFibXslt;
+
+  QString statusXml;
+  QString fibContentsXml;
+
+  QStandardItemModel *model;
+  int selectedRow;
+  int scrollPosition;
+
+  QAction *statusIndicator;
+  QAction *displayStatus;
+  QAction *interestSentRecv;
+  QAction *dataSentRecv;
+  QAction *open;
+  QAction *close;
+  QAction *openGeneralSettings;
+  QAction *openForwardingSettings;
+  QAction *openSecuritySettings;
+
+  // FibInputDialog *dialog;
+
+  bool enableHubDiscovery;
+  bool enableStartOnLogin;
+
+  NetworkManager *networkManager;
+  QNetworkAccessManager *urlManager;
+
+private slots:
+  void trayIconClicked(QSystemTrayIcon::ActivationReason);
+  void generalSettingsClicked();
+  void forwardingSettingsClicked();
+  void securitySettingsClicked();
+  void openTrafficMap();
+  void openRoutingStatus();
+  void openCertificationPage();
+  void displayPopup();
+  // void confirmQuit();
+  void showFibInputDialog();
+  // void terminateDaemonAndClose();
+  void addFibEntry();
+  // void daemonStatusUpdate();
+  void selectTableRow();
+  // void deleteFibEntry();
+  void changeHubDiscovery();
+  void changeLoginStart();
+  void copyFile();
+  // void runXmlProc(QNetworkReply *reply);
+  // void parseStatusXml();
+  // void parseFibXml();
+  void parseProcessLookup();
+};
+
+#endif // NCC_QT_TRAY_MENU_H
diff --git a/linux/traymenu.ui b/qt/traymenu.ui
similarity index 100%
rename from linux/traymenu.ui
rename to qt/traymenu.ui
diff --git a/qt/wscript b/qt/wscript
new file mode 100644
index 0000000..c1441e6
--- /dev/null
+++ b/qt/wscript
@@ -0,0 +1,46 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import Logs, Utils, Task, TaskGen
+
+top = '..'
+
+def configure(conf):
+    conf.load(['gnu_dirs', 'qt4'])
+
+    # conf.find_program('xsltproc', mandatory=True)
+    # conf.define('XSLTPROC', conf.env['XSLTPROC'])
+
+    conf.define('RESOURCES_DIR', Utils.subst_vars("${DATAROOTDIR}/nfd-control-center", conf.env))
+
+    if Utils.unversioned_sys_platform() == "darwin":
+        conf.define('OSX_BUILD', 1)
+
+def build(bld):
+    app = bld(
+        features=['qt4', 'cxxprogram', 'cxx'],
+        includes = ".. .",
+
+        use = "QTCORE QTGUI QTXML QTXMLPATTERNS QTDBUS",
+
+        defines = "WAF",
+        source = bld.path.ant_glob(['*.cpp', '**/*.ui', '**/*.qrc']),
+        )
+
+    if Utils.unversioned_sys_platform() != "darwin":
+        app.target = "../nfd-control-center",
+
+        bld(features = "subst",
+             source = 'nfd-control-center.desktop.in',
+             target = 'nfd-control-center.desktop',
+             BINARY = "nfd-control-center",
+             install_path = "${DATAROOTDIR}/nfd-control-center"
+            )
+
+        bld.install_files("${DATAROOTDIR}/nfd-control-center",
+                      bld.path.ant_glob(['Resources/*']))
+    else:
+        app.target = "../NFD Control Center"
+        app.mac_app = True,
+        app.mac_plist = '../osx/Info.plist',
+        app.mac_resources = [i.path_from(bld.path)
+                               for i in bld.path.ant_glob('../osx/Resources/**/*')],
diff --git a/waf-tools/sparkle.py b/waf-tools/sparkle.py
index 3d628aa..f186199 100644
--- a/waf-tools/sparkle.py
+++ b/waf-tools/sparkle.py
@@ -6,44 +6,44 @@
 
 @conf
 def check_sparkle_base (self, *k, **kw):
-  self.check_cxx (framework_name="Sparkle", header_name=["Foundation/Foundation.h", "AppKit/AppKit.h"],
-                  uselib_store='SPARKLE', define_name='HAVE_SPARKLE',
-                  compile_filename='test.mm', use="FOUNDATION APPKIT",
-                  *k,
-                  **kw
-                  )
+  self.check_cxx(framework_name="Sparkle", header_name=["Foundation/Foundation.h", "AppKit/AppKit.h"],
+                 uselib_store='SPARKLE', define_name='HAVE_SPARKLE',
+                 compile_filename='test.mm', use="FOUNDATION APPKIT",
+                 *k,
+                 **kw
+                 )
 
 @conf
-def check_sparkle (self, *k, **kw):
+def check_sparkle(self, *k, **kw):
     try:
-        self.check_sparkle_base (*k, **kw)
+        self.check_sparkle_base(*k, **kw)
     except:
         try:
             # Try local path
-            # Logs.info ("Check local version of Sparkle framework")
-            self.check_sparkle_base (cxxflags="-F%s/osx/Frameworks/" % self.path.abspath(),
-                                     linkflags="-F%s/osx/Frameworks/" % self.path.abspath())
+            # Logs.info("Check local version of Sparkle framework")
+            self.check_sparkle_base(cxxflags="-F%s/Frameworks/" % self.path.abspath(),
+                                    linkflags="-F%s/Frameworks/" % self.path.abspath())
         except:
             import urllib, subprocess, os, shutil
             if not os.path.exists('osx/Frameworks/Sparkle.framework'):
                 # Download to local path and retry
-                Logs.info ("Sparkle framework not found, trying to download it to 'build/'")
+                Logs.info("Sparkle framework not found, trying to download it to 'build/'")
 
-                urllib.urlretrieve ("http://sparkle.andymatuschak.org/files/Sparkle%201.5b6.zip", "build/Sparkle.zip")
+                urllib.urlretrieve("http://sparkle.andymatuschak.org/files/Sparkle%201.5b6.zip", "build/Sparkle.zip")
                 if os.path.exists('build/Sparkle.zip'):
-                    try:
-                        subprocess.check_call (['unzip', '-qq', 'build/Sparkle.zip', '-d', 'build/Sparkle'])
-                        os.remove ("build/Sparkle.zip")
+                    # try:
+                        subprocess.check_call(['unzip', '-qq', 'build/Sparkle.zip', '-d', 'build/Sparkle'])
+                        os.remove("build/Sparkle.zip")
                         if not os.path.exists("osx/Frameworks"):
-                            os.mkdir ("osx/Frameworks")
-                        os.rename ("build/Sparkle/Sparkle.framework", "osx/Frameworks/Sparkle.framework")
+                            os.mkdir("osx/Frameworks")
+                        os.rename("build/Sparkle/Sparkle.framework", "osx/Frameworks/Sparkle.framework")
                         shutil.rmtree("build/Sparkle", ignore_errors=True)
 
-                        self.check_sparkle_base (cxxflags="-F%s/osx/Frameworks/" % self.path.abspath(),
-                                                 linkflags="-F%s/osx/Frameworks/" % self.path.abspath())
-                    except subprocess.CalledProcessError as e:
-                        self.fatal("Cannot find Sparkle framework. Auto download failed: '%s' returned %s" % (' '.join(e.cmd), e.returncode))
-                    except:
-                        self.fatal("Unknown Error happened when auto downloading Sparkle framework")
+                        self.check_sparkle_base(cxxflags="-F%s/Frameworks/" % self.path.abspath(),
+                                                 linkflags="-F%s/Frameworks/" % self.path.abspath())
+                    # except subprocess.CalledProcessError as e:
+                    #     self.fatal("Cannot find Sparkle framework. Auto download failed: '%s' returned %s" %(' '.join(e.cmd), e.returncode))
+                    # except:
+                    #     self.fatal("Unknown Error happened when auto downloading Sparkle framework")
 def configure(conf):
-    conf.check_sparkle ()
+    conf.check_sparkle()
diff --git a/waf-tools/xcode.py b/waf-tools/xcode.py
index b3b8789..b2b3fd8 100644
--- a/waf-tools/xcode.py
+++ b/waf-tools/xcode.py
@@ -150,7 +150,7 @@
 	def add(self, root, sources):
 		folders = {}
 		def folder(n):
-			if n == root:
+			if not n.is_child_of(root):
 				return self
 			try:
 				return folders[n]
@@ -308,5 +308,3 @@
 		node.mkdir()
 		node = node.make_node('project.pbxproj')
 		p.write(open(node.abspath(), 'w'))
-
-
diff --git a/wscript b/wscript
index 7af03ca..66b998a 100644
--- a/wscript
+++ b/wscript
@@ -1,6 +1,6 @@
 # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-VERSION='1.0'
-APPNAME='ndnx-control-center'
+VERSION='0.1'
+APPNAME='nfd-control-center'
 
 from waflib import Logs, Utils, Task, TaskGen
 
@@ -8,136 +8,43 @@
     opt.load('compiler_c compiler_cxx qt4 gnu_dirs')
     opt.load('sparkle xcode', tooldir='waf-tools')
 
-    grp = opt.add_option_group ('NDNx Control Center options')
-    grp.add_option ('--ndnx', help='''Root path to NDNx installation (default: /usr/local/ndn)''',
-                    dest='ndnx_root', type=str, default='/usr/local/ndn')
+    grp = opt.add_option_group('NFD Control Center options')
+    grp.add_option('--with-nfd', dest='with_nfd', type=str, default='/usr/local',
+                   help='''Root path to NFD installation (default: /usr/local)''')
 
     if Utils.unversioned_sys_platform () == "darwin":
-        grp.add_option ('--qt4', help='''Build QT4 app, instead of native one''',
-                        action='store_true', dest='build_qt', default=False)
+        grp.add_option('--with-qt', help='''Build QT4 app, instead of native one''',
+                       action='store_true', dest='with_qt', default=False)
 
-    
 def configure(conf):
     conf.load('compiler_c compiler_cxx')
 
-    conf.start_msg('Checking for ndnd-tlv in %s' % conf.options.ndnx_root)
-    if not conf.find_file('ndnd-tlv ndnd-tlv-status ndnd-tlv-start ndnd-tlv-stop', path_list='%s/bin' % conf.options.ndnx_root, mandatory=False):
-        conf.fatal ('not found', 'RED')
+    conf.start_msg('Checking for NFD tools in %s' % conf.options.with_nfd)
+    if not conf.find_file(['nfd-start', 'nfd-stop'],
+                          path_list='%s/bin' % conf.options.with_nfd, mandatory=False):
+        conf.fatal('not found', 'RED')
     else:
-        conf.end_msg ('ok')
+        conf.end_msg('ok')
 
-    conf.define('NDNX_ROOT', conf.options.ndnx_root)
-    conf.define('NDND_STATUS_COMMAND', '%s/bin/ndndsmoketest' % conf.options.ndnx_root)
-    conf.define('NDND_FIB_COMMAND',  '%s/bin/ndndc' % conf.options.ndnx_root)
-    conf.define('NDND_AUTOCONFIG_COMMAND', '%s/bin/ndnd-autoconfig' % conf.options.ndnx_root)
-    
-    if Utils.unversioned_sys_platform () == "darwin" and not conf.options.build_qt:
-        conf.define('NDND_START_COMMAND', '%s/bin/ndnd-tlv-start' % conf.options.ndnx_root)
-        conf.define('NDND_STOP_COMMAND', '%s/bin/ndnd-tlv-stop' % conf.options.ndnx_root)
+    conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
+                   uselib_store='NDN_CXX', mandatory=True)
 
+    conf.define('NFD_ROOT', conf.options.with_nfd)
+    conf.define('NFD_START_COMMAND', '%s/bin/nfd-start' % conf.options.with_nfd)
+    conf.define('NFD_STOP_COMMAND', '%s/bin/nfd-stop' % conf.options.with_nfd)
+    conf.define('NFD_AUTOCONFIG_COMMAND', '%s/bin/ndn-autoconfig' % conf.options.with_nfd)
+
+    if not conf.options.with_qt and Utils.unversioned_sys_platform() == "darwin":
+        # conf.fatal("Native implementation of NFD Control Center is not yet available")
         conf.env.BUILD_OSX_NATIVE = 1
-        
-        conf.find_program('ibtool', var='IBTOOL', mandatory=False)
-
-        conf.check_cxx(framework_name='Foundation', uselib_store='FOUNDATION', compile_filename='test.mm')
-        conf.check_cxx(framework_name='AppKit',     uselib_store='APPKIT',     compile_filename='test.mm')
-        conf.check_cxx(framework_name='Cocoa',      uselib_store='COCOA',      compile_filename='test.mm')
-
-        conf.env.ARCH_OSX = 'x86_64'
-        conf.env.CXXFLAGS_OSX += ['-fobjc-arc', '-mmacosx-version-min=10.7']
-        conf.env.LINKFLAGS_OSX += ['-mmacosx-version-min=10.7']        
-        conf.env.MACOSX_DEPLOYMENT_TARGET = '10.7'
-        
-        conf.load('sparkle')
+        conf.recurse('osx')
     else:
-        conf.load('qt4')
-        conf.load('gnu_dirs')
-        conf.find_program('xsltproc', mandatory=True)
-        conf.define('XSLTPROC', conf.env['XSLTPROC'])
+        conf.recurse('qt')
 
-        conf.define('RESOURCES_DIR', Utils.subst_vars("${DATAROOTDIR}/ndnx-control-center", conf.env))
-        
-        if Utils.unversioned_sys_platform () == "darwin":
-            conf.define('OSX_BUILD', 1)
-        
-    conf.write_config_header('config.h')
+    conf.write_config_header('config.hpp')
 
-def build (bld):
+def build(bld):
     if bld.env.BUILD_OSX_NATIVE:
-        bld (
-            target = "NDNx Control Center",
-            features=['cxxprogram', 'cxx'],
-            includes = ". osx",
-            source = bld.path.ant_glob (['osx/**/*.mm', 'osx/MainMenu.xib']),
-            
-            mac_app = True,
-            use = "OSX COCOA FOUNDATION APPKIT SPARKLE",
-
-            mac_plist = 'osx/Info.plist',
-            mac_resources = [i.path_from(bld.path) for i in bld.path.ant_glob ('osx/Resources/**/*')],
-            mac_frameworks = "osx/Frameworks/Sparkle.framework",
-            )
+        bld.recurse('osx')
     else:
-        bld (features = "subst",
-             source = 'linux/ndnxcontrolcenter.desktop.in',
-             target = 'linux/ndnxcontrolcenter.desktop',
-             BINARY = "ndnx-control-center",
-             install_path = "${DATAROOTDIR}/ndnx-control-center"
-            )
-        bld (features = "subst",
-             source = 'linux/ndnx-control-center.desktop.in',
-             target = 'linux/ndnx-control-center.desktop',
-             BINARY = "ndnx-control-center",
-             install_path = "${DATAROOTDIR}/applications"
-            )
-        bld.install_files("${DATAROOTDIR}/ndnx-control-center",
-                          bld.path.ant_glob(['linux/Resources/*']))
-
-        bld (
-            target = "ndnx-control-center",
-            features=['qt4', 'cxxprogram', 'cxx'],
-            includes = ". linux",
-
-            use = "QTCORE QTGUI QTXML QTXMLPATTERNS QTDBUS",
-            
-            defines = "WAF",
-            source = bld.path.ant_glob (['linux/**/*.cpp', 'linux/**/*.ui', 'linux/**/*.qrc']),
-            )
-
-        
-from waflib import TaskGen
-@TaskGen.extension('.mm')
-def m_hook(self, node):
-    """Alias .mm files to be compiled the same as .cc files, gcc/clang will do the right thing."""
-    return self.create_compiled_task('cxx', node)
-
-@TaskGen.extension('.m')
-def m_hook(self, node):
-    """Alias .m files to be compiled the same as .c files, gcc/clang will do the right thing."""
-    return self.create_compiled_task('c', node)
-
-
-def bundle_name_for_output(name):
-	k = name.rfind('.')
-	if k >= 0:
-		name = name[:k] + '.app'
-	else:
-		name = name + '.app'
-	return name
-
-@TaskGen.extension('.xib')
-def xib(self,node):
-    out = node.change_ext ('.nib')
-
-    name = self.path.get_bld ().find_or_declare (bundle_name_for_output(self.target))
-    resources = name.find_or_declare(['Contents', 'Resources'])
-    resources.mkdir()
-    real_out = resources.make_node (out.name)
-
-    self.create_task('xib', node, real_out)
-    inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Contents/Resources' % name
-    self.bld.install_as (inst_to + '/%s' % real_out.name, real_out)
-        
-class xib(Task.Task):
-    color='PINK'
-    run_str = '${IBTOOL} --errors --warnings --notices --output-format human-readable-text  --compile ${TGT} ${SRC}'
+        bld.recurse('qt')
