diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..ac5a351
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,250 @@
+# Copyright (C) 2018 Open Networking Foundation
+#
+# 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/>.
+
+########################################################################
+##
+##
+## 				Config
+##
+##
+DEVICE = asfvolt16
+#
+# Three vendor proprietary source files are required to build BAL.
+# SW-BCM68620_<VER>.zip - Broadcom BAL source and Maple SDK.
+# sdk-all-<SDK_VER>.tar.gz - Broadcom Qumran SDK.
+# ACCTON_BAL_<BAL_VER>-<ACCTON_VER>.patch - Accton/Edgecore's patch.
+BAL_MAJOR_VER = 02.04
+BAL_VER = 2.4.3.6
+SDK_VER = 6.5.7
+ACCTON_VER = 201710131639
+#
+# Version of Open Network Linux (ONL).
+ONL_KERN_VER_MAJOR = 3.7
+ONL_KERN_VER_MINOR = 10
+#
+# Build directory
+BUILD_DIR = build
+
+########################################################################
+##
+##
+## 				Check
+##
+##
+HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
+SYSTEM ?= $(HOST_SYSTEM)
+CXX = g++
+CPPFLAGS += `pkg-config --cflags protobuf grpc`
+CXXFLAGS += -std=c++11 -fpermissive -Wno-literal-suffix
+ifeq ($(SYSTEM),Darwin)
+LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++ grpc`\
+           -lgrpc++_reflection\
+           -ldl
+else
+LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++ grpc`\
+           -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed\
+           -ldl
+endif
+PROTOC = protoc
+GRPC_CPP_PLUGIN = grpc_cpp_plugin
+GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
+GRPC_CPP_VER ?= `command curl -L https://grpc.io/release`
+PROTOC_CMD = which $(PROTOC)
+PROTOC_CHECK_CMD = $(PROTOC) --version | grep -q libprotoc.3
+PLUGIN_CHECK_CMD = which $(GRPC_CPP_PLUGIN)
+HAS_PROTOC = $(shell $(PROTOC_CMD) > /dev/null && echo true || echo false)
+ifeq ($(HAS_PROTOC),true)
+HAS_VALID_PROTOC = $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false)
+endif
+HAS_PLUGIN = $(shell $(PLUGIN_CHECK_CMD) > /dev/null && echo true || echo false)
+check:
+	sudo apt-get -q -y install git pkg-config build-essential autoconf libtool libgflags-dev libgtest-dev clang libc++-dev
+ifneq ($(HAS_VALID_PROTOC),true)
+	mkdir -p /tmp/$(PROTOC_NAME)
+	wget -P /tmp/$(PROTOC_NAME) $(PROTOC_DOWNLOAD_URL)/v$(PROTOC_VERSION)/$(PROTOC_NAME).zip
+	unzip -o /tmp/$(PROTOC_NAME)/$(PROTOC_NAME) -d /tmp/$(PROTOC_NAME)
+	mkdir -p $(PWD)/bin
+	cp -f /tmp/$(PROTOC_NAME)/bin/protoc $(PWD)/bin/.
+	mkdir -p $(PWD)/include
+	cp -rf /tmp/$(PROTOC_NAME)/include/* $(PWD)/include/.
+	rm -rf /tmp/$(PROTOC_NAME)
+endif
+ifneq ($(HAS_PLUGIN),true)
+	rm -rf /tmp/grpc
+	git clone -b $(GRPC_CPP_VER) https://github.com/grpc/grpc /tmp/grpc
+	cd /tmp/grpc && git submodule update --init
+	make -C /tmp/grpc
+	sudo make -C /tmp/grpc install
+	make -C /tmp/grpc/third_party/protobuf
+	sudo make -C /tmp/grpc/third_party/protobuf install
+	rm -rf /tmp/grpc
+endif
+
+########################################################################
+##
+##
+## 				ONL
+##
+##
+ONL_KERN_VER = $(ONL_KERN_VER_MAJOR).$(ONL_KERN_VER_MINOR)
+ONL_REPO = $(DEVICE)-onl
+ONL_DIR = $(BUILD_DIR)/$(ONL_REPO)
+.PHONY: onl
+onl:
+	if [ ! -d "$(ONL_DIR)/OpenNetworkLinux" ]; then \
+		mkdir -p $(ONL_DIR); \
+		git clone git@github.com:shadansari/$(ONL_REPO).git $(ONL_DIR); \
+		make -C $(ONL_DIR) $(DEVICE)-$(ONL_KERN_VER_MAJOR); \
+	fi;
+onl-force:
+	make -C $(ONL_DIR) $(DEVICE)-$(ONL_KERN_VER_MAJOR)
+clean-onl:
+distclean-onl:
+	sudo rm -rf $(ONL_DIR)
+
+########################################################################
+##
+##
+## 				BAL
+##
+##
+BAL_ZIP = SW-BCM68620_$(subst .,_,$(BAL_VER)).zip
+SDK_ZIP = sdk-all-$(SDK_VER).tar.gz
+ACCTON_PATCH = ACCTON_BAL_$(BAL_VER)-V$(ACCTON_VER).patch
+OPENOLT_BAL_PATCH = OPENOLT_BAL_$(BAL_VER).patch
+BAL_DIR = $(BUILD_DIR)/$(DEVICE)-bal
+ONL_KERNDIR = $(PWD)/$(ONL_DIR)/OpenNetworkLinux/packages/base/amd64/kernels/kernel-$(ONL_KERN_VER_MAJOR)-x86-64-all/builds
+MAPLE_KERNDIR = $(BAL_DIR)/bcm68620_release/$(DEVICE)/kernels
+BCM_SDK = $(BAL_DIR)/bal_release/3rdparty/bcm-sdk
+BALLIBDIR = $(BAL_DIR)/bal_release/build/core/lib
+BALLIBNAME = bal_api_dist
+BAL_INC = -I$(BAL_DIR)/bal_release/src/common/os_abstraction \
+	-I$(BAL_DIR)/bal_release/src/common/os_abstraction/posix \
+	-I$(BAL_DIR)/bal_release/src/common/config \
+	-I$(BAL_DIR)/bal_release/src/core/platform \
+	-I$(BAL_DIR)/bal_release/src/common/include \
+	-I$(BAL_DIR)/bal_release/src/lib/libbalapi \
+	-I$(BAL_DIR)/bal_release/3rdparty/maple/sdk/host_driver/utils \
+	-I$(BAL_DIR)/bal_release/src/balapiend \
+	-I$(BAL_DIR)/bal_release/src/common/dev_log \
+	-I$(BAL_DIR)/bal_release/src/common/bal_dist_utils  \
+	-I$(BAL_DIR)/bal_release/src/lib/libtopology \
+	-I$(BAL_DIR)/bal_release/3rdparty/maple/sdk/host_driver/model \
+	-I$(BAL_DIR)/bal_release/3rdparty/maple/sdk/host_driver/api \
+	-I$(BAL_DIR)/bal_release/src/lib/libcmdline \
+	-I$(BAL_DIR)/bal_release/src/lib/libutils \
+	-I$(BAL_DIR)/bal_release/3rdparty/maple/sdk/host_reference/cli
+CXXFLAGS += $(BAL_INC) -I $(BAL_DIR)/lib/cmdline
+.PHONY: get-$(BAL_DIR)
+get-$(BAL_DIR):
+#	if [ ! -e "download/$(BAL_ZIP)" ]; then \
+#		rm -rf /tmp/broadcom-proprietary; \
+#		git clone git@github.com:shadansari/broadcom-proprietary.git /tmp/broadcom-proprietary; \
+#		mv -f /tmp/broadcom-proprietary/$(BAL_VER)/$(BAL_ZIP) ./download; \
+#		mv -f /tmp/broadcom-proprietary/$(BAL_VER)/$(SDK_ZIP) ./download; \
+#		mv -f /tmp/broadcom-proprietary/$(BAL_VER)/$(ACCTON_PATCH) ./download; \
+#		mv -f /tmp/broadcom-proprietary/$(BAL_VER)/$(OPENOLT_BAL_PATCH) ./download; \
+#		rm -rf /tmp/broadcom-proprietary; \
+#	fi;
+.PHONY: bal
+bal: onl get-$(BAL_DIR)
+ifeq ("$(wildcard $(BAL_DIR))","")
+	mkdir $(BAL_DIR)
+	unzip download/$(BAL_ZIP) -d $(BAL_DIR)
+	cp download/$(SDK_ZIP) $(BCM_SDK)
+	chmod -R 744 $(BAL_DIR)
+	cat download/$(ACCTON_PATCH) | patch -p1 -d $(BAL_DIR)
+	mkdir -p $(MAPLE_KERNDIR)
+	ln -s $(ONL_KERNDIR)/linux-$(ONL_KERN_VER) $(MAPLE_KERNDIR)/linux-$(ONL_KERN_VER)
+	ln -s $(ONL_DIR)/OpenNetworkLinux/packages/base/any/kernels/archives/linux-$(ONL_KERN_VER).tar.xz $(MAPLE_KERNDIR)/linux-$(ONL_KERN_VER).tar.xz
+	ln -s $(ONL_DIR)/OpenNetworkLinux/packages/base/any/kernels/$(ONL_KERN_VER_MAJOR)/configs/x86_64-all/x86_64-all.config $(MAPLE_KERNDIR)/x86_64-all.config
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) maple_sdk_dir
+	cat download/$(OPENOLT_BAL_PATCH) | patch -p1 -d $(BAL_DIR)
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) maple_sdk
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) switch_sdk_dir
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) switch_sdk
+	KERNDIR=$(ONL_KERNDIR)/linux-$(ONL_KERN_VER) BOARD=$(DEVICE) ARCH=x86_64 SDKBUILD=build_bcm_user make -C $(BCM_SDK)/build-$(DEVICE)/sdk-all-$(SDK_VER)/systems/linux/user/x86-generic_64-2_6
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) bal
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) release_board
+	ln -s -f $(PWD)/$(BAL_DIR)/bcm68620_release/asfvolt16/release/release_$(DEVICE)_V$(BAL_MAJOR_VER).$(ACCTON_VER).tar.gz . 
+	ln -s -f $(PWD)/$(BAL_DIR)/bal_release/build/core/lib/libbal_api_dist.so .
+	ln -s -f $(PWD)/$(BAL_DIR)/bal_release/build/core/src/apps/bal_core_dist/bal_core_dist
+	mv -f release_$(DEVICE)_V$(BAL_MAJOR_VER).$(ACCTON_VER).tar.gz $(BUILD_DIR)
+	mv -f libbal_api_dist.so $(BUILD_DIR)
+	mv -f bal_core_dist $(BUILD_DIR)
+endif
+bal-rebuild:
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) maple_sdk
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) switch_sdk
+	KERNDIR=$(ONL_KERNDIR)/linux-$(ONL_KERN_VER) BOARD=$(DEVICE) ARCH=x86_64 SDKBUILD=build_bcm_user make -C $(BCM_SDK)/build-$(DEVICE)/sdk-all-$(SDK_VER)/systems/linux/user/x86-generic_64-2_6
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) bal
+	make -C $(BAL_DIR)/bal_release BOARD=$(DEVICE) release_board
+	ln -s -f $(PWD)/$(BAL_DIR)/bcm68620_release/asfvolt16/release/release_$(DEVICE)_V$(BAL_MAJOR_VER).$(ACCTON_VER).tar.gz .
+	ln -s -f $(PWD)/$(BAL_DIR)/bal_release/build/core/lib/libbal_api_dist.so .
+	ln -s -f $(PWD)/$(BAL_DIR)/bal_release/build/core/src/apps/bal_core_dist/bal_core_dist .
+	mv -f release_$(DEVICE)_V$(BAL_MAJOR_VER).$(ACCTON_VER).tar.gz $(BUILD_DIR)
+	mv -f libbal_api_dist.so $(BUILD_DIR)
+	mv -f bal_core_dist $(BUILD_DIR)
+clean-bal: clean-onl
+distclean-bal: distclean-onl
+	sudo rm -rf $(BAL_DIR)
+	rm -f build/release_$(DEVICE)_V$(BAL_MAJOR_VER).$(ACCTON_VER).tar.gz
+
+########################################################################
+##
+##
+## 				OpenOLT API
+##
+##
+OPENOLT_API_DIR = $(BUILD_DIR)/openolt-api
+OPENOLT_API_LIB = $(OPENOLT_API_DIR)/libopenoltapi.a
+CXXFLAGS += -I./$(OPENOLT_API_DIR) -I $(OPENOLT_API_DIR)/googleapis/gens
+.PHONY: openolt-api
+openolt-api:
+	if [ ! -e "$(OPENOLT_API_DIR)" ]; then \
+		mkdir -p $(BUILD_DIR); \
+		git clone git@github.com:shadansari/openolt-api.git $(OPENOLT_API_DIR); \
+	fi;
+	make -C $(OPENOLT_API_DIR) all
+clean-openolt-api:
+	-make -C $(OPENOLT_API_DIR) clean
+distclean-openolt-api:
+
+########################################################################
+##
+##
+## 				Main
+##
+##
+SRCS = $(wildcard src/*.cc)
+OBJS = $(SRCS:.cc=.o)
+DEPS = $(SRCS:.cc=.d)
+.DEFAULT_GOAL := all
+all: $(BUILD_DIR)/openolt
+$(BUILD_DIR)/openolt: check openolt-api bal $(OBJS)
+	$(CXX) $(OBJS) $(LDFLAGS) $(OPENOLT_API_LIB) -o $@ -L$(BALLIBDIR) -l$(BALLIBNAME)
+	ln -s $(shell ldconfig -p | grep libgrpc.so.5 | tr ' ' '\n' | grep /) $(BUILD_DIR)/libgrpc.so.5
+	ln -s $(shell ldconfig -p | grep libgrpc++.so.1 | tr ' ' '\n' | grep /) $(BUILD_DIR)/libgrpc++.so.1
+	ln -s $(shell ldconfig -p | grep libgrpc++_reflection.so.1 | tr ' ' '\n' | grep /) $(BUILD_DIR)/libgrpc++_reflection.so.1
+
+src/%.o: %.cpp
+	$(CXX) -MMD -c $< -o $@
+
+clean: clean-bal
+	rm -f $(OBJS) $(DEPS) $(BUILD_DIR)/openolt
+	rm -rf $(OPENOLT_API_DIR)
+distclean: distclean-openolt-api distclean-bal
+	rm -rf $(BUILD_DIR)
+-include $(DEPS)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6c9f7fb
--- /dev/null
+++ b/README.md
@@ -0,0 +1,86 @@
+# openolt
+
+**openolt** is an SDN Agent for white box Optical Line Terminals (OLTs). It exposes a well-documented, north-bound protobuf/gRPC [API](https://github.com/shadansari/openolt-api) for SDN controllers. [VOLTHA](https://github.com/opencord/voltha) support for **openolt** is under development. 
+
+**openolt** currently supports Broadcom's Maple/Qumran chipsets.
+
+```
+
+               +-------------------------------+
+               |         SDN Controller        |
+               |    (e.g. VOLTHA, ONOS, ODL)   |
+               +---------------+---------------+
+                               |
+              openolt gRPC API |
+                               |
+        +---------------------------------------------+
+        |                      |                      |
+        |      +---------------+---------------+      |
+        |      |            openolt            |      |
+        |      +---------------+---------------+      |
+        |                      |                      |
+        |  vendor-specific API |                      |
+        |                      |                      |
+        |      +---------------+---------------+      |
+        |      |   vendor asic/soc/fpga/...    |      |
+        |      +-------------------------------+      |
+        |                                             |
+        |                                             |
+        |                White box OLT                |
+        +---------------------------------------------+
+
+```
+## Software versions
+
+The following vendor proprietary source files are required to build **openolt**. These files can be obtained from Broadcom under NDA. Once an NDA is signed with Broadcom, these files are made available by Broadcom on their Customer Service Portal (CSP) via case CS3233745.
+
+- SW-BCM68620_<BAL_VER>.zip - Broadcom BAL source and Maple SDK.
+- sdk-all-<SDK_VER>.tar.gz - Broadcom Qumran SDK.
+- ACCTON_BAL_<BAL_VER>-<ACCTON_VER>.patch - Accton/Edgecore's patch.
+- OPENOLT_BAL_<BAL_VER>.patch - A patch to Broadcom software to allow compilation with C++ based openolt.
+
+The versions that have been tested are:
+
+- SW-BCM68620_2_4_3_6.zip
+- sdk-all-6.5.7.tar.gz
+- ACCTON_BAL_2.4.3.6-V201710131639.patch
+- OPENOLT_BAL_2.4.3.6.zip
+
+## Build
+
+Clone this repo, copy above four source code zip/patch files to the openolt/download directory, and run make:
+```shell
+git clone git@github.com:OpenOLT/openolt.git
+
+mv SW-BCM68620_2_4_3_6.zip sdk-all-6.5.7.tar.gz ACCTON_BAL_2.4.3.6-V201710131639.patch OPENOLT_BAL_2.4.3.6.zip openolt/download
+
+make
+```
+The **build** directory contains all the build artifacts:
+
+- **release_asfvolt16_V02.04.201710131639.tar.gz** - Broadcom BAL (specifically, this tar ball includes the bal_core_dist)
+- **openolt** - the **openolt** agent/driver
+- **libgrpc++_reflection.so.1  libgrpc++.so.1  libgrpc.so.5** - gRPC libraries
+
+## Copy files to target OLT
+
+1. Untar **release_asfvolt16_V02.04.201710131639.tar.gz** in the root (top level) directory
+2. Copy **openolt** to /broadcom
+3. Copy the gRPC libraries to /usr/local/lib
+
+
+## Run
+
+- Run bal_core_dist:
+```shell
+cd /broadcom
+ldconfig
+./bal_core_dist -C 10.6.0.201:40000 -A 10.6.0.201:50000
+```
+- Run openolt:
+```shell
+cd /broadcom
+ldconfig
+openolt  -C 10.6.0.201:40000 -A 10.6.0.201:50000
+```
+(Note - Substitute 10.6.0.201 with a local IP of the OLT - e.g. mgmt interface IP).
diff --git a/download/README.md b/download/README.md
new file mode 100644
index 0000000..021071d
--- /dev/null
+++ b/download/README.md
@@ -0,0 +1,10 @@
+# Broadcom proprietary src code required to build olt-brcm
+
+The following vendor proprietary source files are required to build. These files are available from Broadcom under NDA through a common CSP.
+
+- SW-BCM68620_<VER>.zip - Broadcom BAL source and Maple SDK.
+- sdk-all-<SDK_VER>.tar.gz - Broadcom Qumran SDK.
+- ACCTON_BAL_<BAL_VER>-<ACCTON_VER>.patch - Accton/Edgecore's patch.
+- OPENOLT_BAL_<BAL_VER>.patch - ONF's patch to BAL (to enable BAL to compile with C++ based openolt)
+
+Copy the above four files to this folder before running make in the top level directory.
diff --git a/src/Queue.h b/src/Queue.h
new file mode 100644
index 0000000..854851e
--- /dev/null
+++ b/src/Queue.h
@@ -0,0 +1,60 @@
+//
+// Copyright (c) 2013 Juan Palacios juan.palacios.puyana@gmail.com
+// Subject to the BSD 2-Clause License
+// - see < http://opensource.org/licenses/BSD-2-Clause>
+//
+
+#ifndef CONCURRENT_QUEUE_
+#define CONCURRENT_QUEUE_
+
+#include <queue>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+
+template <typename T>
+class Queue
+{
+ public:
+
+  T pop() 
+  {
+    std::unique_lock<std::mutex> mlock(mutex_);
+    while (queue_.empty())
+    {
+      cond_.wait(mlock);
+    }
+    auto val = queue_.front();
+    queue_.pop();
+    return val;
+  }
+
+  void pop(T& item)
+  {
+    std::unique_lock<std::mutex> mlock(mutex_);
+    while (queue_.empty())
+    {
+      cond_.wait(mlock);
+    }
+    item = queue_.front();
+    queue_.pop();
+  }
+
+  void push(const T& item)
+  {
+    std::unique_lock<std::mutex> mlock(mutex_);
+    queue_.push(item);
+    mlock.unlock();
+    cond_.notify_one();
+  }
+  Queue()=default;
+  Queue(const Queue&) = delete;            // disable copying
+  Queue& operator=(const Queue&) = delete; // disable assignment
+  
+ private:
+  std::queue<T> queue_;
+  std::mutex mutex_;
+  std::condition_variable cond_;
+};
+
+#endif
diff --git a/src/indications.cc b/src/indications.cc
new file mode 100644
index 0000000..78eb3b2
--- /dev/null
+++ b/src/indications.cc
@@ -0,0 +1,413 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation
+
+    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/>.
+*/
+#include "indications.h"
+#include "server.h"
+#include "utils.h"
+extern "C"
+{
+#include <bcmos_system.h>
+#include <bal_api.h>
+#include <bal_api_end.h>
+}
+
+using grpc::Status;
+
+Queue<openolt::Indication> oltIndQ;
+//Queue<openolt::Indication*> oltIndQ;
+
+bool subscribed = false;
+
+bcmos_errno OmciIndication(bcmbal_obj *obj);
+
+bcmos_errno OltIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::OltIndication* olt_ind = new openolt::OltIndication;
+    Status status;
+
+    bcmbal_access_terminal_ind *acc_term_ind = (bcmbal_access_terminal_ind *)obj;
+    if (acc_term_ind->data.oper_status == BCMBAL_STATUS_UP) {
+        olt_ind->set_oper_state("up");
+    } else {
+        olt_ind->set_oper_state("down");
+    }
+    ind.set_allocated_olt_ind(olt_ind);
+    std::cout << "olt indication, oper_state:" << ind.olt_ind().oper_state() << std::endl;
+    oltIndQ.push(ind);
+
+    // Enable all PON interfaces.
+    for (int i = 0; i < MAX_SUPPORTED_INTF; i++) {
+        status = EnablePonIf_(i);
+        if (!status.ok()) {
+            // FIXME - raise alarm to report error in enabling PON
+        }
+    }
+
+    /* register for omci indication */
+    {
+        bcmbal_cb_cfg cb_cfg = {};
+        uint16_t ind_subgroup;
+
+        cb_cfg.module = BCMOS_MODULE_ID_NONE;
+        cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
+        ind_subgroup = BCMBAL_IND_SUBGROUP(packet, itu_omci_channel_rx);
+        cb_cfg.p_object_key_info = NULL;
+        cb_cfg.p_subgroup = &ind_subgroup;
+        cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OmciIndication;
+        bcmbal_subscribe_ind(0, &cb_cfg);
+    }
+
+    return BCM_ERR_OK;
+}
+
+bcmos_errno LosIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "LOS indication " << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno IfIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::IntfIndication* intf_ind = new openolt::IntfIndication;
+
+    std::cout << "intf indication, intf_id:"
+              << ((bcmbal_interface_ind *)obj)->key.intf_id << std::endl;
+
+    intf_ind->set_intf_id(((bcmbal_interface_ind *)obj)->key.intf_id);
+    if (((bcmbal_interface_ind *)obj)->data.oper_status == BCMBAL_STATUS_UP) {
+        intf_ind->set_oper_state("up");
+    } else {
+        intf_ind->set_oper_state("down");
+    }
+    ind.set_allocated_intf_ind(intf_ind);
+
+    oltIndQ.push(ind);
+
+    return BCM_ERR_OK;
+}
+
+bcmos_errno IfOperIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::IntfOperIndication* intf_oper_ind = new openolt::IntfOperIndication;
+    std::cout << "intf oper state indication, intf_id:"
+              << ((bcmbal_interface_ind *)obj)->key.intf_id
+              << " type:" << ((bcmbal_interface_oper_status_change *)obj)->key.intf_type
+              << " oper_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status
+              << " admin_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.admin_state
+              << std::endl;
+
+    intf_oper_ind->set_intf_id(((bcmbal_interface_oper_status_change *)obj)->key.intf_id);
+
+    if (((bcmbal_interface_oper_status_change *)obj)->key.intf_type == BCMBAL_INTF_TYPE_NNI) {
+        intf_oper_ind->set_type("nni");
+    } else if (((bcmbal_interface_oper_status_change *)obj)->key.intf_type == BCMBAL_INTF_TYPE_PON) {
+        intf_oper_ind->set_type("pon");
+    } else {
+        intf_oper_ind->set_type("unknown");
+    }
+
+    if (((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status == BCMBAL_STATUS_UP) {
+        intf_oper_ind->set_oper_state("up");
+    } else {
+        intf_oper_ind->set_oper_state("down");
+    }
+
+    ind.set_allocated_intf_oper_ind(intf_oper_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuAlarmIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "onu alarm indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuDyingGaspIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "onu dying-gasp indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuDiscoveryIndication(bcmbal_cfg *obj) {
+    openolt::Indication ind;
+    openolt::OnuDiscIndication* onu_disc_ind = new openolt::OnuDiscIndication;
+    openolt::SerialNumber* serial_number = new openolt::SerialNumber;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->key);
+
+    bcmbal_subscriber_terminal_sub_term_disc_data *data =
+        &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->data);
+
+    bcmbal_serial_number *in_serial_number = &(data->serial_number);
+
+    std::cout << "onu discover indication, intf_id:"
+         << key->intf_id
+         << " serial_number:"
+         << serial_number_to_str(in_serial_number) << std::endl;
+
+    onu_disc_ind->set_intf_id(key->intf_id);
+    serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
+    serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
+    onu_disc_ind->set_allocated_serial_number(serial_number);
+    ind.set_allocated_onu_disc_ind(onu_disc_ind);
+
+    oltIndQ.push(ind);
+
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
+    openolt::SerialNumber* serial_number = new openolt::SerialNumber;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_ind*)obj)->key);
+
+    bcmbal_subscriber_terminal_ind_data *data =
+        &(((bcmbal_subscriber_terminal_ind*)obj)->data);
+
+    bcmbal_serial_number *in_serial_number = &(data->serial_number);
+
+    std::cout << "onu indication, intf_id:"
+         << key->intf_id
+         << " serial_number:"
+         << serial_number_to_str(in_serial_number) << std::endl;
+
+    onu_ind->set_intf_id(key->intf_id);
+    onu_ind->set_onu_id(key->sub_term_id);
+    serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
+    serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
+    onu_ind->set_allocated_serial_number(serial_number);
+    ind.set_allocated_onu_ind(onu_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuOperIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "onu oper state indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OmciIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::OmciIndication* omci_ind = new openolt::OmciIndication;
+    bcmbal_packet_itu_omci_channel_rx *omci_channel =
+        (bcmbal_packet_itu_omci_channel_rx *)obj;
+
+    std::cout << "omci indication" << std::endl;
+
+    omci_ind->set_intf_id(
+        omci_channel->key.packet_send_dest.u.itu_omci_channel.intf_id);
+    omci_ind->set_onu_id(
+        omci_channel->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
+    omci_ind->set_pkt(omci_channel->data.pkt.val, omci_channel->data.pkt.len);
+
+    ind.set_allocated_omci_ind(omci_ind);
+    oltIndQ.push(ind);
+
+    return BCM_ERR_OK;
+}
+
+bcmos_errno PacketInIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "packet-in indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno FlowOperIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "flow oper state indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno FlowIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "flow indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno TmQIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "traffic mgmt queue indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno TmSchedIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "traffic mgmt sheduler indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+bcmos_errno McastGroupIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    std::cout << "mcast group indication" << std::endl;
+    return BCM_ERR_OK;
+}
+
+Status SubscribeIndication() {
+    bcmbal_cb_cfg cb_cfg = {};
+    uint16_t ind_subgroup;
+
+    if (subscribed) {
+        return Status::OK;
+    }
+
+    cb_cfg.module = BCMOS_MODULE_ID_NONE;
+
+
+    /* OLT device indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_ACCESS_TERMINAL;
+    ind_subgroup = bcmbal_access_terminal_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OltIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Olt indication subscribe failed");
+    }
+
+    /* Interface LOS indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
+    ind_subgroup = bcmbal_interface_auto_id_los;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)LosIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "LOS indication subscribe failed");
+    }
+
+    /* Interface indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
+    ind_subgroup = bcmbal_interface_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Interface indication subscribe failed");
+    }
+
+    /* Interface operational state change indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
+    ind_subgroup = bcmbal_interface_auto_id_oper_status_change;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfOperIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Interface operations state change indication subscribe failed");
+    }
+
+    /* onu alarm indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_alarm;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuAlarmIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu alarm indication subscribe failed");
+    }
+
+    /* onu dying-gasp indication  */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_dgi;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDyingGaspIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu dying-gasp indication subscribe failed");
+    }
+
+    /* onu discovery indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_disc;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDiscoveryIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu discovery indication subscribe failed");
+    }
+
+    /* onu indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu indication subscribe failed");
+    }
+    /* onu operational state change indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_oper_status_change;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuOperIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu operational state change indication subscribe failed");
+    }
+
+    /* Packet-in indications */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
+    ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)PacketInIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Packet-in indication subscribe failed");
+    }
+
+    /* Flow Operational State Change */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
+    ind_subgroup = bcmbal_flow_auto_id_oper_status_change;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowOperIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Flow operational state change indication subscribe failed");
+    }
+    /* Flow Indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
+    ind_subgroup = bcmbal_flow_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Flow indication subscribe failed");
+    }
+
+    /* TM queue indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_QUEUE;
+    ind_subgroup = bcmbal_tm_queue_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmQIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
+    }
+
+    /* TM sched indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_SCHED;
+    ind_subgroup = bcmbal_tm_sched_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmSchedIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
+    }
+
+    /* Multicast group indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_GROUP;
+    ind_subgroup = bcmbal_group_auto_id_ind;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)McastGroupIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "Multicast group indication subscribe failed");
+    }
+
+    subscribed = true;
+
+    return Status::OK;
+}
diff --git a/src/indications.h b/src/indications.h
new file mode 100644
index 0000000..2160aa6
--- /dev/null
+++ b/src/indications.h
@@ -0,0 +1,27 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation 
+
+    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/>.
+*/
+
+#ifndef OPENASF_INDICATIONS_H_
+#define OPENASF_INDICATIONS_H_
+#include <grpc++/grpc++.h>
+#include <openolt.grpc.pb.h>
+#include "Queue.h"
+
+extern Queue<openolt::Indication> oltIndQ;
+extern grpc::Status SubscribeIndication();
+
+#endif
diff --git a/src/indications.o b/src/indications.o
new file mode 100644
index 0000000..afb1925
--- /dev/null
+++ b/src/indications.o
Binary files differ
diff --git a/src/main.cc b/src/main.cc
new file mode 100644
index 0000000..3f8fba4
--- /dev/null
+++ b/src/main.cc
@@ -0,0 +1,56 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation 
+
+    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/>.
+*/
+#include <iostream>
+
+#include "indications.h"
+#include "server.h"
+
+extern "C"
+{
+#include <bal_api.h>
+#include <bal_api_end.h>
+}
+
+int main(int argc, char** argv) {
+
+    if (argc < 5) {
+        std::cout << "Missing arguments" << std::endl;
+        exit(1);
+    }
+
+    bcmbal_init(argc, argv, NULL);
+
+    Status status = SubscribeIndication();
+    if (!status.ok()) {
+        std::cout << "ERROR: SubscribeIndication failed - "
+                  << status.error_code() << ": " << status.error_message()
+                  << std::endl;
+        return 1;
+    }
+
+    status = Enable_();
+    if (!status.ok()) {
+        std::cout << "ERROR: Enable_ failed - "
+                  << status.error_code() << ": " << status.error_message()
+                  << std::endl;
+        return 1;
+    }
+
+    RunServer();
+
+  return 0;
+}
diff --git a/src/main.o b/src/main.o
new file mode 100644
index 0000000..1098108
--- /dev/null
+++ b/src/main.o
Binary files differ
diff --git a/src/server.cc b/src/server.cc
new file mode 100644
index 0000000..25594d4
--- /dev/null
+++ b/src/server.cc
@@ -0,0 +1,478 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation 
+
+    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/>.
+*/
+
+#include <iostream>
+#include <memory>
+#include <string>
+
+#include "Queue.h"
+#include <iostream>
+#include <sstream>
+
+#include "server.h"
+#include "indications.h"
+
+extern "C"
+{
+#include <bcmos_system.h>
+#include <bal_api.h>
+#include <bal_api_end.h>
+}
+#include <openolt.grpc.pb.h>
+
+using grpc::Server;
+using grpc::ServerBuilder;
+using grpc::ServerContext;
+using grpc::ServerWriter;
+
+const char *serverPort = "0.0.0.0:9191";
+
+class OpenoltService final : public openolt::Openolt::Service {
+
+    Status ActivateOnu(
+            ServerContext* context,
+            const openolt::Onu* request,
+            openolt::Empty* response) override {
+        return ActivateOnu_(
+            request->intf_id(),
+            request->onu_id(),
+            ((request->serial_number()).vendor_id()).c_str(),
+            ((request->serial_number()).vendor_specific()).c_str());
+    }
+
+    Status OmciMsgOut(
+            ServerContext* context,
+            const openolt::OmciMsg* request,
+            openolt::Empty* response) override {
+        return OmciMsgOut_(
+            request->intf_id(),
+            request->onu_id(),
+            request->pkt());
+    }
+
+    Status FlowAdd(
+            ServerContext* context,
+            const openolt::Flow* request,
+            openolt::Empty* response) override {
+        return FlowAdd_(
+            request->onu_id(),
+            request->flow_id(),
+            request->flow_type(),
+            request->access_intf_id(),
+            request->network_intf_id(),
+            request->gemport_id(),
+            request->classifier(),
+            request->action());
+    }
+
+    Status EnableIndication(
+            ServerContext* context,
+            const ::openolt::Empty* request,
+            ServerWriter<openolt::Indication>* writer) override {
+        while (1) {
+            auto oltInd = oltIndQ.pop();
+            writer->Write(oltInd);
+            //oltInd.release_olt_ind()
+        }
+        return Status::OK;
+    }
+};
+
+void RunServer() {
+  OpenoltService service;
+  std::string server_address(serverPort);
+  ServerBuilder builder;
+
+  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
+  builder.RegisterService(&service);
+
+  std::unique_ptr<Server> server(builder.BuildAndStart());
+
+  std::cout << "Server listening on " << server_address << std::endl;
+
+  server->Wait();
+}
+
+Status Enable_() {
+    static bool enabled = false;
+    bcmbal_access_terminal_cfg acc_term_obj;
+    bcmbal_access_terminal_key key = { };
+
+    if (!enabled) {
+        std::cout << "Enable OLT" << std::endl;
+        key.access_term_id = DEFAULT_ATERM_ID;
+        BCMBAL_CFG_INIT(&acc_term_obj, access_terminal, key);
+        BCMBAL_CFG_PROP_SET(&acc_term_obj, access_terminal, admin_state, BCMBAL_STATE_UP);
+        if (bcmbal_cfg_set(DEFAULT_ATERM_ID, &(acc_term_obj.hdr))) {
+            std::cout << "ERROR: Failed to enable OLT" << std::endl;
+            return Status(grpc::StatusCode::INTERNAL, "Failed to enable OLT");
+        }
+        enabled = true;
+    }
+    return Status::OK;
+}
+
+Status EnablePonIf_(uint32_t intf_id) {
+    bcmbal_interface_cfg interface_obj;
+    bcmbal_interface_key interface_key;
+    
+    interface_key.intf_id = intf_id;
+    interface_key.intf_type = BCMBAL_INTF_TYPE_PON;
+
+    BCMBAL_CFG_INIT(&interface_obj, interface, interface_key);
+    BCMBAL_CFG_PROP_SET(&interface_obj, interface, admin_state, BCMBAL_STATE_UP);
+
+    if (bcmbal_cfg_set(DEFAULT_ATERM_ID, &(interface_obj.hdr))) {
+        std::cout << "ERROR: Failed to enable PON interface: " << intf_id << std::endl;
+        return Status(grpc::StatusCode::INTERNAL, "Failed to enable PON interface");
+    }
+
+    return Status::OK;
+}
+
+Status ActivateOnu_(uint32_t intf_id, uint32_t onu_id,
+    const char *vendor_id, const char *vendor_specific) {
+
+    bcmbal_subscriber_terminal_cfg sub_term_obj = {};
+    bcmbal_subscriber_terminal_key subs_terminal_key;
+    bcmbal_serial_number serial_num = {};
+    bcmbal_registration_id registration_id = {};
+
+    std::cout << "Enabling ONU " << onu_id << " on PON " << intf_id << std::endl;
+    std::cout << "Vendor Id " << vendor_id
+              << "Vendor Specific Id " << vendor_specific
+              << std::endl;
+
+    subs_terminal_key.sub_term_id = onu_id;
+    subs_terminal_key.intf_id = intf_id;
+    BCMBAL_CFG_INIT(&sub_term_obj, subscriber_terminal, subs_terminal_key);
+
+    memcpy(serial_num.vendor_id, vendor_id, 4);
+    memcpy(serial_num.vendor_specific, vendor_specific, 4);
+    BCMBAL_CFG_PROP_SET(&sub_term_obj, subscriber_terminal, serial_number, serial_num);
+
+    // FIXME - Use a default (all zeros) registration id.
+    memset(registration_id.arr, 0, sizeof(registration_id.arr));
+    BCMBAL_CFG_PROP_SET(&sub_term_obj, subscriber_terminal, registration_id, registration_id);
+
+    BCMBAL_CFG_PROP_SET(&sub_term_obj, subscriber_terminal, admin_state, BCMBAL_STATE_UP);
+
+    if (bcmbal_cfg_set(DEFAULT_ATERM_ID, &(sub_term_obj.hdr))) {
+        std::cout << "ERROR: Failed to enable ONU: " << std::endl;
+        return Status(grpc::StatusCode::INTERNAL, "Failed to enable ONU");
+    }
+
+    return SchedAdd_(intf_id, onu_id, mk_agg_port_id(onu_id));
+
+    //return Status::OK;
+}
+
+#define MAX_CHAR_LENGTH  20
+#define MAX_OMCI_MSG_LENGTH 44
+Status OmciMsgOut_(uint32_t intf_id, uint32_t onu_id, const std::string pkt) {
+    bcmbal_u8_list_u32_max_2048 buf; /* A structure with a msg pointer and length value */
+    bcmos_errno err = BCM_ERR_OK;
+
+    /* The destination of the OMCI packet is a registered ONU on the OLT PON interface */
+    bcmbal_dest proxy_pkt_dest;
+
+    proxy_pkt_dest.type = BCMBAL_DEST_TYPE_ITU_OMCI_CHANNEL;
+    proxy_pkt_dest.u.itu_omci_channel.sub_term_id = onu_id;
+    proxy_pkt_dest.u.itu_omci_channel.intf_id = intf_id;
+
+    // ???
+    if ((pkt.size()/2) > MAX_OMCI_MSG_LENGTH) {
+        buf.len = MAX_OMCI_MSG_LENGTH;
+    } else {
+        buf.len = pkt.size()/2;
+    }
+
+    /* Send the OMCI packet using the BAL remote proxy API */
+    uint16_t idx1 = 0;
+    uint16_t idx2 = 0;
+    uint8_t arraySend[buf.len];
+    char str1[MAX_CHAR_LENGTH];
+    char str2[MAX_CHAR_LENGTH];
+    memset(&arraySend, 0, buf.len);
+
+    std::cout << "Sending omci msg to ONU of length is "
+         << buf.len
+         << std::endl;
+
+    for (idx1=0,idx2=0; idx1<((buf.len)*2); idx1++,idx2++) {
+       sprintf(str1,"%c", pkt[idx1]);
+       sprintf(str2,"%c", pkt[++idx1]);
+       strcat(str1,str2);
+       arraySend[idx2] = strtol(str1, NULL, 16);
+    }
+
+    buf.val = (uint8_t *)malloc((buf.len)*sizeof(uint8_t));
+    memcpy(buf.val,(uint8_t *)arraySend,buf.len);
+
+    std::cout << "After converting bytes to hex "
+              << buf.val << buf.len << std::endl;
+
+    err = bcmbal_pkt_send(0, proxy_pkt_dest,
+                         (const char *)(buf.val), buf.len);
+
+    std::cout << "OMCI request msg of length " << buf.len
+              << " sent to ONU" << onu_id
+              << " through PON " << intf_id << std::endl;
+
+    free(buf.val);
+
+    return Status::OK;
+}
+
+Status FlowAdd_(uint32_t onu_id,
+                uint32_t flow_id, const std::string flow_type,
+                uint32_t access_intf_id, uint32_t network_intf_id,
+                uint32_t gemport_id,
+                const ::openolt::Classifier& classifier,
+                const ::openolt::Action& action) {
+    bcmos_errno err;
+    bcmbal_flow_cfg cfg;
+    bcmbal_flow_key key = { };
+
+    std::cout << "flow add -"
+              << " intf_id:" << access_intf_id
+              << " onu_id:" << onu_id
+              << " flow_id:" << flow_id
+              << " flow_type:" << flow_type
+              << " gemport_id:" << gemport_id
+              << " network_intf_id:" << network_intf_id
+              << std::endl;
+
+    key.flow_id = flow_id;
+    if (flow_type.compare("upstream") == 0 ) {
+        key.flow_type = BCMBAL_FLOW_TYPE_UPSTREAM;
+    } else if (flow_type.compare("downstream") == 0) {
+        key.flow_type = BCMBAL_FLOW_TYPE_DOWNSTREAM;
+    } else {
+        std::cout << "Invalid flow type " << flow_type << std::endl;
+        return Status::CANCELLED;
+    }
+
+    BCMBAL_CFG_INIT(&cfg, flow, key);
+
+    BCMBAL_CFG_PROP_SET(&cfg, flow, admin_state, BCMBAL_STATE_UP);
+    BCMBAL_CFG_PROP_SET(&cfg, flow, access_int_id, access_intf_id);
+    BCMBAL_CFG_PROP_SET(&cfg, flow, network_int_id, network_intf_id);
+    BCMBAL_CFG_PROP_SET(&cfg, flow, sub_term_id, onu_id);
+    BCMBAL_CFG_PROP_SET(&cfg, flow, svc_port_id, gemport_id);
+
+    {
+        bcmbal_classifier val = { };
+
+        if (classifier.o_tpid()) {
+            val.o_tpid = classifier.o_tpid();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_O_TPID;
+        }
+
+        if (classifier.o_vid()) {
+            val.o_vid = classifier.o_vid();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_O_VID;
+        }
+
+        if (classifier.i_tpid()) {
+            val.i_tpid = classifier.i_tpid();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_I_TPID;
+        }
+
+        if (classifier.i_vid()) {
+            val.i_vid = classifier.i_vid();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_I_VID;
+        }
+
+        if (classifier.o_pbits()) {
+            val.o_pbits = classifier.o_pbits();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_O_PBITS;
+        }
+
+        if (classifier.i_pbits()) {
+            val.i_pbits = classifier.i_pbits();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_I_PBITS;
+        }
+
+        if (classifier.eth_type()) {
+            val.ether_type = classifier.eth_type();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_ETHER_TYPE;
+        }
+
+        /*
+        if (classifier.dst_mac()) {
+            val.dst_mac = classifier.dst_mac();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_DST_MAC;
+        }
+
+        if (classifier.src_mac()) {
+            val.src_mac = classifier.src_mac();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_SRC_MAC;
+        }
+        */
+
+        if (classifier.ip_proto()) {
+            val.ip_proto = classifier.ip_proto();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_IP_PROTO;
+        }
+
+        /*
+        if (classifier.dst_ip()) {
+            val.dst_ip = classifier.dst_ip();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_DST_IP;
+        }
+
+        if (classifier.src_ip()) {
+            val.src_ip = classifier.src_ip();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_SRC_IP;
+        }
+        */
+
+        if (classifier.src_port()) {
+            val.src_port = classifier.src_port();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_SRC_PORT;
+        }
+
+        if (classifier.dst_port()) {
+            val.dst_port = classifier.dst_port();
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_DST_PORT;
+        }
+
+        if (!classifier.pkt_tag_type().empty()) {
+            if (classifier.pkt_tag_type().compare("untagged") == 0) {
+                val.pkt_tag_type = BCMBAL_PKT_TAG_TYPE_UNTAGGED;
+                val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_PKT_TAG_TYPE;
+            } else if (classifier.pkt_tag_type().compare("single_tag") == 0) {
+                val.pkt_tag_type = BCMBAL_PKT_TAG_TYPE_SINGLE_TAG;
+                val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_PKT_TAG_TYPE;
+            } else if (classifier.pkt_tag_type().compare("double_tag") == 0) {
+                val.pkt_tag_type = BCMBAL_PKT_TAG_TYPE_DOUBLE_TAG;
+                val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_PKT_TAG_TYPE;
+            }
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, flow, classifier, val);
+    }
+
+    {
+        bcmbal_action val = { };
+
+        const ::openolt::ActionCmd& cmd = action.cmd();
+
+        if (cmd.add_outer_tag()) {
+            val.cmds_bitmask |= BCMBAL_ACTION_CMD_ID_ADD_OUTER_TAG;
+            val.presence_mask |= BCMBAL_ACTION_ID_CMDS_BITMASK;
+        }
+
+        if (cmd.remove_outer_tag()) {
+            val.cmds_bitmask |= BCMBAL_ACTION_CMD_ID_REMOVE_OUTER_TAG;
+            val.presence_mask |= BCMBAL_ACTION_ID_CMDS_BITMASK;
+        }
+
+        if (cmd.trap_to_host()) {
+            val.cmds_bitmask |= BCMBAL_ACTION_CMD_ID_TRAP_TO_HOST;
+            val.presence_mask |= BCMBAL_ACTION_ID_CMDS_BITMASK;
+        }
+
+        if (action.o_vid()) {
+            val.o_vid = action.o_vid();
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_O_VID;
+        }
+
+        if (action.o_pbits()) {
+            val.o_pbits = action.o_pbits();
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_O_PBITS;
+        }
+
+        if (action.o_tpid()) {
+            val.o_tpid = action.o_tpid();
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_O_TPID;
+        }
+
+        if (action.i_vid()) {
+            val.i_vid = action.i_vid();
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_I_VID;
+        }
+
+        if (action.i_pbits()) {
+            val.i_pbits = action.i_pbits();
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_I_PBITS;
+        }
+
+        if (action.i_tpid()) {
+            val.i_tpid = action.i_tpid();
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_I_TPID;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, flow, action, val);
+    }
+
+    {
+        bcmbal_tm_sched_id val;
+        val = (bcmbal_tm_sched_id) mk_sched_id(onu_id);
+        BCMBAL_CFG_PROP_SET(&cfg, flow, dba_tm_sched_id, val);
+    }
+
+    if (bcmbal_cfg_set(DEFAULT_ATERM_ID, &(cfg.hdr))) {
+        std::cout << "ERROR: flow add failed" << std::endl;
+        return Status(grpc::StatusCode::INTERNAL, "flow add failed");
+    }
+
+    return Status::OK;
+}
+
+Status SchedAdd_(int intf_id, int onu_id, int agg_port_id) {
+    bcmbal_tm_sched_cfg cfg;
+    bcmbal_tm_sched_key key = { };
+    bcmbal_tm_sched_type sched_type;
+
+    key.id = mk_sched_id(onu_id);
+    key.dir = BCMBAL_TM_SCHED_DIR_US;
+
+    BCMBAL_CFG_INIT(&cfg, tm_sched, key);
+
+    {
+        bcmbal_tm_sched_owner val = { };
+
+        val.type = BCMBAL_TM_SCHED_OWNER_TYPE_AGG_PORT;
+        val.u.agg_port.intf_id = (bcmbal_intf_id) intf_id;
+	val.u.agg_port.presence_mask = val.u.agg_port.presence_mask | BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_INTF_ID;
+        val.u.agg_port.sub_term_id = (bcmbal_sub_id) onu_id;
+        val.u.agg_port.presence_mask = val.u.agg_port.presence_mask | BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_SUB_TERM_ID;
+
+	val.u.agg_port.agg_port_id = (bcmbal_aggregation_port_id) agg_port_id;
+	val.u.agg_port.presence_mask = val.u.agg_port.presence_mask | BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_AGG_PORT_ID;
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, owner, val);
+    }
+
+    if (bcmbal_cfg_set(DEFAULT_ATERM_ID, &(cfg.hdr))) {
+        std::cout << "ERROR: Failed to create upstream DBA sched"
+                  << " id:" << key.id
+                  << " intf_id:" << intf_id
+                  << " onu_id:" << onu_id << std::endl;
+        return Status(grpc::StatusCode::INTERNAL, "Failed to create upstream DBA sched");
+        //return 1;
+    }
+    std::cout << "create upstream DBA sched"
+              << " id:" << key.id
+              << " intf_id:" << intf_id
+              << " onu_id:" << onu_id << std::endl;
+
+    return Status::OK;
+    //return 0;
+}
diff --git a/src/server.h b/src/server.h
new file mode 100644
index 0000000..6e73d47
--- /dev/null
+++ b/src/server.h
@@ -0,0 +1,48 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation 
+
+    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/>.
+*/
+
+#ifndef OPENASF_SERVER_H_
+#define OPENASF_SERVER_H_
+
+#include <grpc++/grpc++.h>
+using grpc::Status;
+#include <openolt.grpc.pb.h>
+
+void RunServer();
+Status Enable_();
+Status ActivateOnu_(uint32_t intf_id, uint32_t onu_id,
+    const char *vendor_id, const char *vendor_specific);
+Status EnablePonIf_(uint32_t intf_id);
+Status OmciMsgOut_(uint32_t intf_id, uint32_t onu_id, const std::string pkt);
+Status FlowAdd_(uint32_t onu_id,
+                uint32_t flow_id, const std::string flow_type,
+                uint32_t access_intf_id, uint32_t network_intf_id,
+                uint32_t gemport_id,
+                const ::openolt::Classifier& classifier,
+                const ::openolt::Action& action);
+
+static Status SchedAdd_(int intf_id, int onu_id, int agg_port_id);
+
+static inline int mk_sched_id(int onu_id) {
+    return 1023 + onu_id;
+}
+
+static inline int mk_agg_port_id(int onu_id) {
+    return 1023 + onu_id;
+}
+
+#endif
diff --git a/src/server.o b/src/server.o
new file mode 100644
index 0000000..a814ddc
--- /dev/null
+++ b/src/server.o
Binary files differ
diff --git a/src/utils.cc b/src/utils.cc
new file mode 100644
index 0000000..9610cdc
--- /dev/null
+++ b/src/utils.cc
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation 
+
+    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/>.
+*/
+
+#include "utils.h"
+
+// NOTE - This function is not thread-safe.
+const char* serial_number_to_str(bcmbal_serial_number* serial_number) {
+#define SERIAL_NUMBER_SIZE 12
+    static char buff[SERIAL_NUMBER_SIZE+1];
+
+    sprintf(buff, "%c%c%c%c%1X%1X%1X%1X%1X%1X%1X%1X",
+            serial_number->vendor_id[0],
+            serial_number->vendor_id[1],
+            serial_number->vendor_id[2],
+            serial_number->vendor_id[3],
+            serial_number->vendor_specific[0]>>4 & 0x0f,
+            serial_number->vendor_specific[0] & 0x0f,
+            serial_number->vendor_specific[1]>>4 & 0x0f,
+            serial_number->vendor_specific[1] & 0x0f,
+            serial_number->vendor_specific[2]>>4 & 0x0f,
+            serial_number->vendor_specific[2] & 0x0f,
+            serial_number->vendor_specific[3]>>4 & 0x0f,
+            serial_number->vendor_specific[3] & 0x0f);
+
+    return buff;
+}
diff --git a/src/utils.h b/src/utils.h
new file mode 100644
index 0000000..a79bd55
--- /dev/null
+++ b/src/utils.h
@@ -0,0 +1,30 @@
+/*
+    Copyright (C) 2018 Open Networking Foundation
+
+    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/>.
+*/
+
+#ifndef OPENASF_UTILS_H_
+#define OPENASF_UTILS_H_
+
+extern "C"
+{
+#include <bcmos_system.h>
+#include <bal_api.h>
+#include <bal_api_end.h>
+}
+
+const char* serial_number_to_str(bcmbal_serial_number* serial_number);
+
+#endif
diff --git a/src/utils.o b/src/utils.o
new file mode 100644
index 0000000..323222c
--- /dev/null
+++ b/src/utils.o
Binary files differ
