src: Initial reorganization for NFD Control Center

Change-Id: Ic8bc4b9168df83bd706f780187a5993292565f95
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')