← Back to team overview

mythbuntu-dev team mailing list archive

[Merge] lp:~tgm4883/mythbuntu/mythbuntu-common into lp:~mythbuntu-dev/mythbuntu/mythbuntu-live-autostart

 

Thomas Mashos has proposed merging lp:~tgm4883/mythbuntu/mythbuntu-common into lp:~mythbuntu-dev/mythbuntu/mythbuntu-live-autostart.

Requested reviews:
  mythbuntu-dev (mythbuntu-dev)

For more details, see:
https://code.launchpad.net/~tgm4883/mythbuntu/mythbuntu-common/+merge/85064
-- 
https://code.launchpad.net/~tgm4883/mythbuntu/mythbuntu-common/+merge/85064
Your team mythbuntu-dev is requested to review the proposed merge of lp:~tgm4883/mythbuntu/mythbuntu-common into lp:~mythbuntu-dev/mythbuntu/mythbuntu-live-autostart.
=== added file 'COPYING'
--- COPYING	1970-01-01 00:00:00 +0000
+++ COPYING	2011-12-09 05:39:36 +0000
@@ -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>.

=== renamed file 'COPYING' => 'COPYING.moved'
=== added symlink 'Changelog'
=== target is u'debian/changelog'
=== renamed symlink 'Changelog' => 'Changelog.moved'
=== added file 'Makefile'
--- Makefile	1970-01-01 00:00:00 +0000
+++ Makefile	2011-12-09 05:39:36 +0000
@@ -0,0 +1,22 @@
+update-po:
+	find -regex "./\(plugins\).*\.\(py\|glade\|ui\|in\)" \
+		| sed '/gtk\.ui/ s,^,[type: gettext/glade],' > po/POTFILES.in
+	python setup.py build_i18n --merge-po --po-dir po
+
+clean:
+	rm -rf build/*
+	find . -type f -name "*.pyo" -delete
+
+translations: po/*.po
+	# TODO evand 2009-07-28: Ideally we should build the mo files once,
+	# instead of once here and once in setup.py.
+	# Taken from Wubi.
+	rm -rf build/translations
+	mkdir -p build/translations/
+	@for po in $^; do \
+		language=`basename $$po`; \
+		language=$${language%%.po}; \
+		target="build/translations/$$language/LC_MESSAGES"; \
+		mkdir -p $$target; \
+		msgfmt --output=$$target/mythbuntu-common.mo $$po; \
+	done

=== added file 'README'
--- README	1970-01-01 00:00:00 +0000
+++ README	2011-12-09 05:39:36 +0000
@@ -0,0 +1,11 @@
+# mythbuntu-common
+# By: Mario Limonciello
+
+This package provides the basis for all plugins used in Mythbuntu.  It's
+primary purpose to reduce code duplication.  It's functions currently get
+reused in both the Mythbuntu Control Centre (MCC) and the Mythbuntu installer
+(Ubiquity).
+
+Starting with Mythbuntu 9.10 (Karmic Koala), this package breaks up mcc support
+into individual plugins.  Other packages can provide MCC plugins very similar
+to this.

=== renamed file 'README' => 'README.moved'
=== added directory 'debian'
=== renamed directory 'debian' => 'debian.moved'
=== added file 'debian/changelog'
--- debian/changelog	1970-01-01 00:00:00 +0000
+++ debian/changelog	2011-12-09 05:39:36 +0000
@@ -0,0 +1,686 @@
+mythbuntu-common (0.64ubuntu1) UNRELEASED; urgency=low
+
+  * Make sure the repos database is installed.
+  * Rename the repos database to repos.db instead (mythbuntu is implied by dir)
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Thu, 08 Dec 2011 22:44:51 -0600
+
+mythbuntu-common (0.64) precise; urgency=low
+
+  [ Thomas Mashos ]
+  * Merged mythbuntu-repos into this package
+
+  [ Mario Limonciello ]
+  * debian/control: bump standards version.
+  * debian/prerm: add missing debhelper token.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Wed, 07 Dec 2011 10:23:17 -0600
+
+mythbuntu-common (0.63) oneiric; urgency=low
+
+  * Fix hang in installer plugin myth-drivers. (LP: #867856)
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Wed, 05 Oct 2011 00:11:38 -0500
+
+mythbuntu-common (0.62) oneiric; urgency=low
+
+  * Disable encouraging fglrx in the installer.
+  * Fix cut off text in themes tab.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Fri, 09 Sep 2011 16:09:10 -0500
+
+mythbuntu-common (0.61) oneiric; urgency=low
+
+  * Convert installer plugin to pygi/gtk3.
+  * Make into a native package version instead.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Sun, 28 Aug 2011 22:02:06 -0500
+
+mythbuntu-common (0.60-0ubuntu1) oneiric; urgency=low
+
+  [ Thomas Mashos ]
+  * Removed Mythbuntu-bare, now in a separate package
+  * Fix database backup not backing up when selected
+  * Fix restore_db notifying user when not restoring db
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Mon, 08 Aug 2011 12:15:22 -0500
+
+mythbuntu-common (0.59-0ubuntu1) natty; urgency=low
+
+  * Fix some spacing problems in bare.
+  * Fix bare restore (LP: #761189)
+  * Store bare configuration in /etc/default not /etc/mythbuntu-bare.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Sun, 17 Apr 2011 16:24:58 -0500
+
+mythbuntu-common (0.58-0ubuntu1) natty; urgency=low
+
+  [ Thomas Mashos ]
+  * Fixed MCC bare plugin crash when no config file detected
+  * Fixed MCC bare plugin to show final wizard page if schedule is disabled
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Fri, 18 Mar 2011 02:22:43 -0500
+
+mythbuntu-common (0.57-0ubuntu1) natty; urgency=low
+
+  [ Thomas Mashos ]
+  * Added ability to schedule backups using the Bare MCC plugin
+  * Separated backup and restore scripts from Bare plugin code
+  * Relocated python scripts to a separate Bare directory
+  * Added checkin functionality to Bare plugin to look for config changes
+
+  [ Dave Walker (Daviey) ]
+  * debian/control: Bump to Standards-Version 3.9.1 (no changes needed).
+
+ -- Thomas Mashos <tgm4883@xxxxxxxxx>  Wed, 23 Feb 2011 17:43:23 -0800
+
+mythbuntu-common (0.56-0ubuntu1) natty; urgency=low
+
+  * Add basic support for QR codes to install Android or iOS apps for remote.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 08 Feb 2011 02:31:23 -0600
+
+mythbuntu-common (0.55-0ubuntu1) natty; urgency=low
+
+  * Fix the logic for modifying the security pin (LP: #647367)
+  * Fix the security pin check to support 0.24 backends.
+  * Rebuild for python 2.7 transition. (LP: #712021)
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Wed, 02 Feb 2011 17:55:26 -0600
+
+mythbuntu-common (0.54-0ubuntu1) maverick; urgency=low
+
+  * Fixed backup now screen doesn't let you pass without selecting it
+  * Clarify text in GUI for user
+  * Include udev rules in backup.
+
+ -- Thomas Mashos <thomas@xxxxxxxxxxxxxxxxxxxxx>  Tue, 14 Sep 2010 08:52:59 -0700
+
+mythbuntu-common (0.53-0ubuntu1) maverick; urgency=low
+
+  * Check files exist before backing up
+  * Check restore file is a valid tarfile
+  * Check backup directory exists
+  * Fixed issue with plugin not resetting to default values
+
+ -- Thomas Mashos <tgm4883@xxxxxxxxx>  Wed, 08 Sep 2010 17:50:52 -0700
+
+mythbuntu-common (0.52-0ubuntu1) maverick; urgency=low
+
+  [ Thomas Mashos ]
+  * Finished adding restore functionality
+  * Disabled scheduling options (Deferred)
+
+  [ Mario Limonciello ]
+  * Fix themes page text.
+  * Fix spacing on the remotes page.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Tue, 31 Aug 2010 10:30:17 -0500
+
+mythbuntu-common (0.51-0ubuntu2) maverick; urgency=low
+
+  [ Mario Limonciello ]
+  * Remove architecture specificities from recommends.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Sat, 14 Aug 2010 02:35:02 -0500
+
+mythbuntu-common (0.51-0ubuntu1) maverick; urgency=low
+
+  [ Thomas Mashos ]
+  * Add the mythbuntu-bare backup/restore plugin.
+
+  [ Mario Limonciello ]
+  * Shuffle the UI for the remote control page around a little bit for ubiquity.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Thu, 12 Aug 2010 13:14:56 -0500
+
+mythbuntu-common (0.50-0ubuntu1) lucid; urgency=low
+
+  * Added PATH to proprietary codecs plugin (LP: #565769)
+
+ -- Thomas Mashos <tgm4883@xxxxxxxxx>  Sun, 18 Apr 2010 16:42:31 -0700
+
+mythbuntu-common (0.49-0ubuntu2) lucid; urgency=low
+
+  * debian/control:
+    - Depends on vnc4server instead since vnc4-common has been removed
+      from the archive.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 03 Apr 2010 19:23:02 -0500
+
+mythbuntu-common (0.49-0ubuntu1) lucid; urgency=low
+
+  * debian/control:
+    - Update branches to pull from ~mythbuntu-dev
+  * debian/mythbuntu.make:
+    - Set packages to pull from ~mythbuntu-dev
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 03 Apr 2010 17:41:54 -0500
+
+mythbuntu-common (0.48-0ubuntu1) lucid; urgency=low
+
+  [ Marc Randolph ]
+  * Remove MythFlix (LP: #544521)
+  * Clean up plugins section of MCC (use just one alignment rather than 7)
+
+  [ Mario Limonciello ]
+  * Clarify what the themes actually are to reflect what we ship today.
+  * debian/control:
+    - Bump standards version.
+
+ -- Mario Limonciello <Mario_Limonciello@xxxxxxxx>  Sun, 28 Mar 2010 00:57:40 -0500
+
+mythbuntu-common (0.47-0ubuntu1) lucid; urgency=low
+
+  * Return errors on do_connection_test if there are any, None if not.
+    (LP: #527342)
+  * Fix alignment of the plugins plugin.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 06 Mar 2010 16:25:12 -0600
+
+mythbuntu-common (0.46-0ubuntu1) lucid; urgency=low
+
+  * Use SecurityKey rather than the different variables for mysql.txt
+    throughout the mysql pieces.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 21 Feb 2010 20:25:42 -0600
+
+mythbuntu-common (0.45-0ubuntu1) lucid; urgency=low
+
+  * debian/control:
+    - Drop depends on mythtv-common.
+  * Add mythnetvision to plugins dictionary as it was introduced with 0.23.
+  * Drop unused debconftalk class.
+  * Write out a config.xml as well as mysql.txt.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 21 Feb 2010 20:25:09 -0600
+
+mythbuntu-common (0.44-0ubuntu1) lucid; urgency=low
+
+  * remote: 
+    - Added enable frontend restart checkbox 
+  * debian/control: 
+    - fixed lintian warnings
+
+ -- John Baab <rhpot1991@xxxxxxxxxx>  Wed, 17 Feb 2010 14:16:10 -0500
+
+mythbuntu-common (0.43-0ubuntu1) lucid; urgency=low
+
+  * debian/control:
+    - Drop nvidia-common to recommends. (LP: #396334)
+  * mythbuntu_common/dictionaries.py:
+    - Don't fail on an import error for the nvidia detection.
+  * Convert the package to dh7.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 16 Feb 2010 00:51:30 -0600
+
+mythbuntu-common (0.42-0ubuntu1) lucid; urgency=low
+
+  * Remove Medibuntu support, use install-css.sh instead
+  * Added libdvdread4 dependency for install-css.sh (LP: #505706)
+
+ -- Thomas Mashos <tgm4883@xxxxxxxxx>  Wed, 03 Feb 2010 23:03:51 -0800
+
+mythbuntu-common (0.41-0ubuntu1) lucid; urgency=low
+
+  [ Thomas Mashos ]
+  * Fix mythexport issue (LP: #505713)
+
+  [ Mario Limonciello ]
+  * Remove references to usplash since it's no longer used in Lucid and
+    later.
+  * Add support to write out a config.xml in the mysql handler.
+  * Add a ubiquity module that includes functions used by many ubiquity
+    pages.
+  * Remove references to w32codecs and w64codecs.  We're eventually gonna
+    be dropping medibuntu support, so we'll only need to expose DVD support
+    in the UI.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 26 Jan 2010 03:29:11 -0600
+
+mythbuntu-common (0.40-0ubuntu1) karmic; urgency=low
+
+  * remote:
+    - Correct a *very* small typo that prevented only the last remote from
+      functioning.
+  * lirc:
+    - Sort the device list because we might be injecting multiple hwdb's.
+    - Filter out IR Blaster from remote types.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Fri, 16 Oct 2009 22:52:22 -0500
+
+mythbuntu-common (0.39-0ubuntu1) karmic; urgency=low
+
+  * remote:
+    - Default lirc_vbox to true so that it can still be changed in the
+      installer.
+  * system_roles:
+    - Disable the diskless plugin.  It wasn't fully finished and ready
+      to go in time for 9.10, so it's better to not offer it to avoid
+      bug reports about it.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Fri, 16 Oct 2009 01:29:20 -0500
+
+mythbuntu-common (0.38-0ubuntu1) karmic; urgency=low
+
+  * themes:
+    - Upstream decided not to support themes/ or oldthemes/ today, so we're
+      not going to either.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Wed, 14 Oct 2009 21:08:50 -0500
+
+mythbuntu-common (0.37-0ubuntu1) karmic; urgency=low
+
+  * proprietary_codecs:
+    - Request a package list update while installing the medibuntu keyring
+      to prevent errors from aptdaemon about unauthenticated packages.
+  * remote:
+    - Make this plugin optional, by being able to install/remove lirc
+      and mythbuntu-lirc-generator.
+  * debian/control:
+    - Drop lirc and mythbuntu-lirc-generator as Depends or Recommends.
+      They're seeded in the desktop package, and entirely optional/installable
+      from within MCC anyway. (LP: #133634)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Wed, 14 Oct 2009 20:38:27 -0500
+
+mythbuntu-common (0.36-0ubuntu1) karmic; urgency=low
+
+  * lirc:
+    - Source the new locations of remotes on our list.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 13 Oct 2009 23:42:45 -0500
+
+mythbuntu-common (0.35-0ubuntu1) karmic; urgency=low
+
+  * themes:
+    - Rearrange list of themes and make sure the mappings are correct.
+  * plugins:
+    - Fix mythweb password support. (LP: #445998)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 13 Oct 2009 01:54:13 -0500
+
+mythbuntu-common (0.34-0ubuntu1) karmic; urgency=low
+
+  * lirc:
+    - Use the full path for dpkg-reconfigure to prevent a crash.
+  * plugins:
+    - Set Expand property for MythNews.
+    - If mythweb isn't installed, explicitly disable sensitivity
+      of mythweb password hbox.
+  * themes:
+    - Update text to better reflect what the metas represent.
+  * properietary_codecs:
+    - Request a package list update after enabling the repo.
+    - Add support to install the keyring.
+    - Allow the keyring package to be installed. (LP: #415969)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 04 Oct 2009 04:00:52 -0500
+
+mythbuntu-common (0.33-0ubuntu1) karmic; urgency=low
+
+  [ Nick Fox ]
+  * Removed Apple Trailers and MythStream Support
+
+  [ John Baab ]
+  * Enable the mythexport plugin.
+
+  [ Mario Limonciello ]
+  * Shorten the error message for the mysql plugin when mysql.txt is
+    not accessible.
+  * mysql:
+    - Update the location of the optimize_mythdb.pl script.
+  * plugins:
+    - Drop Mythcontrols and Mythphone. (LP: #428683)
+    - Add back in Mythbrowser.
+  * debian/control:
+    - Only depends on nvidia-common for i386 or amd64. (LP: #396334)
+    - Build depends on python-distutils-extra
+  * startup_behavior:
+    - Rely on calling the external gdmsetup for configuration of
+      automatic login rather than our own scripting. (LP: #422238)
+  * themes:
+    - Drop gtk theme from here since we're not using it anymore.
+    - Only reference meta packages in themes section. (LP: #438999)
+  * Add some basic support for translation templates. (LP: #348178)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 03 Oct 2009 18:51:34 -0500
+
+mythbuntu-common (0.32-0ubuntu1) karmic; urgency=low
+
+  [ Mario Limonciello ]
+  * mythbuntu_common/mysql:
+    - Use the full path for invoke-rc.d as /usr/sbin/ isn't in PATH
+      when ran dbus activated.
+  * mythbuntu_common/dictionaries:
+    - Add an argument to the services dictionary so that a different
+      object can be specified for mysql-server.
+  * Convert from glade to gtkbuilder (LP: #403542)
+  * Remove dummy_window top level parent window from all widgets.
+    In gtk.Builder, we don't need a top level parent.
+  * services:
+    - Ignore any items in the dictionary that are None.
+  * remote:
+    - Reference builder objects rather than xml objects.
+    - Add list store objects that weren't automatically created.
+    - Add CellRenderer objects that weren't automatically created.
+  * roles:
+    - Drop references to unused 'toggled' function.
+    - Drop references to unused diskless toggle function.
+    - Hide the Appliance Frontend option since it has no code to
+      back it currently. (LP: #413008)
+    - Set diskless to be sensitive again.
+  * mysql_configuration:
+    - Drop reference to unused 'toggled' function.
+    - Remove references to 'has_default' that were causing warnings
+      about no gtk.Window object that they are within.
+  * plugins:
+    - Change the mythweb password section to be a 3 way selector
+      for en/dis/reconfigure
+    - Don't try to read the old password or username
+    - Write out the new md5 and what not.
+    - This may or may not be complete.  It will need some experimentation
+      with 0.22 and how it interacts with dpkg-reconfigure mythweb.
+
+  [ Michael Haas ]
+  * Remove plugins/ui/tab_diskless.ui as it'll be shipped in an external 
+    package
+
+  [ John Baab ]
+  * Added MythExport Plugin. 
+
+ -- John Baab <john.baab@xxxxxxxxx>  Thu, 27 Aug 2009 02:29:06 -0400
+
+mythbuntu-common (0.31-0ubuntu1) karmic; urgency=low
+
+  * startup_behavior:
+    - Adjust for changes that have happened in GDM 2.26.  Unfortunately
+      this means startup_behavior won't work on Ubuntu 9.04 and earlier
+      anymore. (LP: #403290)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Thu, 23 Jul 2009 01:48:39 -0500
+
+mythbuntu-common (0.30-0ubuntu1) karmic; urgency=low
+
+  * plugins:
+    - Check that we can actually read mythweb-digest before
+      proceeding.
+  * mythbuntu_common/vnc.py:
+    - Wait until we get a pexpect.EOF so that fast machines
+      don't kill the pexpect too early. (Race condition problem)
+  * mythbuntu_common/mysql.py:
+    - Make sure that we don't make a new file when making mcc changes. 
+      Write the changes to the old file so perms remain. (LP: #343204)
+    - Add a run_mysql_commands function for executing mysql commands
+      using the system mysql.txt.
+  * mythbuntu_common/logging.py:
+    - We should really just use python's logging module instead. Drop.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Thu, 18 Jun 2009 01:39:26 -0500
+
+mythbuntu-common (0.29-0ubuntu1) karmic; urgency=low
+
+  * startup_behavior:
+    - If only one user is avaialable(generally [DISABLED]), don't mark the plugin
+      as incomplete.  This is the case for the live CD, meaning MCC isn't usable
+      on the live CD before this change.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Wed, 10 Jun 2009 11:55:34 -0500
+
+mythbuntu-common (0.28-0ubuntu1) karmic; urgency=low
+
+  * debian/control:
+    - Clean up depends for what's part of the new plugins.
+  * mythbuntu_common/vnc.py:
+    - Create the vnc password as a user instead of root.
+  * mythbuntu_common/dictionaries.py:
+    - Drop MySQL from services dictionary.  We're moving it elsewhere.
+    - Drop XFS tweak for now.  We should hopefully be in ext4 during karmic.
+    - Merge official and community theme dictionaries.
+  * glade/tab_themes.glade:
+    - Clean up a few strings to be more clear.
+    - Merge in the artwork glade page to this one.
+    - Combine the sections for community and official themes. No need to show
+      a distinction if they all work.
+  * mythbuntu_common/lirc.py:
+    - Temporarily disable custom remote/transmitter support until we can
+      ensure it keeps ubiquity and/or mcc and/or mcc-revamp stable.
+  * Move all glade into standard plugins/glade directory
+  * Install everything into /usr/share/mythbuntu instead of
+    /usr/share/mythbuntu-common.  This will be our new Standard place.
+  * Add in all currently known mcc plugins from the mcc-revamp branch.
+    Unfortunately legacy version history isn't included since there wasn't
+    easy to bring into this branch.  It can be viewed by looking through
+    the logs of the mythbuntu-control-centre or mcc-revamp bzr branches.
+  * Update README to explain better what this package provides.
+  * Don't include the logo in this package.  It will come in mds.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 09 Jun 2009 00:39:07 -0500
+
+mythbuntu-common (0.27-0ubuntu1) karmic; urgency=low
+
+  [ Mario Limonciello ]
+  * debian/control:
+    - Drop depends on expect
+    - Add depends on python-pexpect
+  * scripts/create_vnc_passwd:
+    - Drop, now unnecessary.
+
+  [ Mike ( szczys@xxxxxxxxxxx ) ]
+  * vnc.py:
+    - Use python-pexpect instead to prevent errors from passwords that need
+      to be escaped. (LP: #363153)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 05 May 2009 01:25:27 -0500
+
+mythbuntu-common (0.26-0ubuntu1) jaunty; urgency=low
+
+  [ Nick Fox ]
+  * Fix dictionary for optimize_mythdb changes (LP: #290781)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Fri, 17 Apr 2009 01:56:34 -0500
+
+mythbuntu-common (0.25-0ubuntu1) jaunty; urgency=low
+
+  [ Mario Limonciello ]
+  * Remove mythbrowser from list of plugins (LP: #353736)
+
+  [ Nick Fox ]
+  * Add script for VNC PassWD in user HOME (LP: #336274) 
+
+ -- Nick Fox <nfox@xxxxxxxxxxxxxxxxxxx>  Fri, 10 Apr 2009 00:57:33 -0500
+
+mythbuntu-common (0.24-0ubuntu1) jaunty; urgency=low
+
+  * Added CustomLogging class
+
+ -- Nick Fox <nfox@xxxxxxxxxxxxxxxxxxx>  Thu, 12 Mar 2009 21:12:50 -0500
+
+mythbuntu-common (0.23-0ubuntu2) jaunty; urgency=low
+
+  * No change rebuild for python 2.6.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 28 Feb 2009 09:51:10 -0600
+
+mythbuntu-common (0.23-0ubuntu1) jaunty; urgency=low
+
+  * Include sample configuration files for samba and nfs.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 14 Feb 2009 13:37:07 -0600
+
+mythbuntu-common (0.22-0ubuntu1) jaunty; urgency=low
+
+  * Dynamically detect AMD/ATI or NVIDIA graphics
+    drivers for different drivers offered.
+  * debian/control:
+    - Depends on nvidia-common
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Thu, 12 Feb 2009 19:30:48 -0600
+
+mythbuntu-common (0.21-0ubuntu1) jaunty; urgency=low
+
+  * GUI tweaks to IR glade file.
+  * Add in a new dictionary to query the system's roles.
+  * Add missing import to mysql handler
+  * Default the meta checkboxes on themes pages to off.
+  * Add an artwork dictionary.
+  * Add an advanced tweak dictionary.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Fri, 30 Jan 2009 00:47:03 -0600
+
+mythbuntu-common (0.20-0ubuntu1) jaunty; urgency=low
+
+  * Now that nvidia 180 is stable, add support for installing it
+    from live disks.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Thu, 08 Jan 2009 15:25:39 -0600
+
+mythbuntu-common (0.19-0ubuntu1) intrepid; urgency=low
+
+  * Update graphics driver dictionary.
+    - Enable fglrx.  It's been fixed now.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 14 Oct 2008 18:27:43 -0500
+
+mythbuntu-common (0.18-0ubuntu2) intrepid; urgency=low
+
+  * Correct theme typo.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 14 Sep 2008 14:11:04 -0500
+
+mythbuntu-common (0.18-0ubuntu2) intrepid; urgency=low
+
+  * Add missing themes that were in the archive:
+    - Metallurgy-wide
+    - Metallurgy-osd
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 12 Sep 2008 14:11:04 -0500
+
+mythbuntu-common (0.17-0ubuntu1) intrepid; urgency=low
+
+  * Update graphics driver dictionary.
+    - Disable NVIDIA 77 (it's broke)
+    - Disable NVIDIA 96 (it's broke)
+    - Disable Fglrx (it's broke)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Fri, 05 Sep 2008 10:07:21 -0500
+
+mythbuntu-common (0.16-0ubuntu1) intrepid; urgency=low
+
+  [ Mario Limonciello ]
+  * Include a graphics driver dictionary.
+  * debian/control:
+  - Drop guidance-backends dependency.
+  - Add python-xkit dependency.
+
+  [ Alberto Milone ]
+  * Update vnc.py to use x-kit instead.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Tue, 26 Aug 2008 10:39:50 -0500
+
+mythbuntu-common (0.15-0ubuntu1) intrepid; urgency=low
+
+  * debian/control:
+  - Add guidance-backends dependency (LP: #228961)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 27 Jul 2008 11:00:40 -0500
+
+mythbuntu-common (0.14-0ubuntu1) intrepid; urgency=low
+
+  [ Mario Limonciello ]
+  * Clean up tabbing/spacing.
+  * debian/control:
+  - Update standards version.
+
+  [ Nick Fox ]
+  * Add Mythbuntu Apple Trailers support 
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 06 Jul 2008 01:31:04 -0500
+
+mythbuntu-common (0.13-0ubuntu1) hardy; urgency=low
+
+  [ Mario Limonciello ]
+  * Bump logo to new logo.
+
+  [Michael Haas]
+  * Update diskless dictionary
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Wed, 09 Apr 2008 09:55:36 -0500
+
+mythbuntu-common (0.12-0ubuntu1) hardy; urgency=low
+
+  * Catch exceptions related to debconftalk.  (LP: #201682)
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Fri, 21 Mar 2008 23:57:34 -0500
+
+mythbuntu-common (0.11-0ubuntu1) hardy; urgency=low
+
+  * Add diskless dictionary.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 08 Mar 2008 00:44:10 -0600
+
+mythbuntu-common (0.10-0ubuntu1) hardy; urgency=low
+
+  * Make new vnc passwords readable by anyone.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 02 Mar 2008 15:12:37 -0600
+
+mythbuntu-common (0.9-0ubuntu1) hardy; urgency=low
+
+  * Change vnc4server key to be x11vnc.
+  * Drop mythappearance from dictionary.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Mon, 25 Feb 2008 21:46:31 -0600
+
+mythbuntu-common (0.8-0ubuntu1) hardy; urgency=low
+
+  * Add new plugins that are available in trunk to list.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Wed, 30 Jan 2008 20:13:18 -0600
+
+mythbuntu-common (0.7-0ubuntu1) hardy; urgency=low
+
+  * Default to having all themes enabled on glade page.  They are
+    properly enabled/disabled upon install or via mcc.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sun, 27 Jan 2008 10:55:09 -0600
+
+mythbuntu-common (0.6-0ubuntu1) hardy; urgency=low
+
+  * Move themes glade file into package.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Mon, 21 Jan 2008 09:54:43 -0600
+
+mythbuntu-common (0.5-0ubuntu1) hardy; urgency=low
+
+  * Allow permission changing to be optional for lircrc generation.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Mon, 14 Jan 2008 22:49:36 -0600
+
+mythbuntu-common (0.4-0ubuntu1) hardy; urgency=low
+
+  * Correct minor typo in debconftalk.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 12 Jan 2008 13:24:27 -0600
+
+mythbuntu-common (0.3-0ubuntu1) hardy; urgency=low
+
+  * Add glade file or infrared devices.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 12 Jan 2008 09:51:31 -0600
+
+mythbuntu-common (0.2-0ubuntu1) hardy; urgency=low
+
+  * debian/control:
+    - Depend upon mythbuntu-lirc-generator.
+  * lirc.py:
+    - Revamp support for Hardy's LIRC which handles remotes
+      and transmitters independently.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Sat, 29 Dec 2007 18:58:28 -0600
+
+mythbuntu-common (0.1-0ubuntu1) hardy; urgency=low
+
+  * Initial Release.
+
+ -- Mario Limonciello <superm1@xxxxxxxxxx>  Thu, 27 Dec 2007 01:40:58 -0600

=== added file 'debian/compat'
--- debian/compat	1970-01-01 00:00:00 +0000
+++ debian/compat	2011-12-09 05:39:36 +0000
@@ -0,0 +1,1 @@
+7

=== added file 'debian/control'
--- debian/control	1970-01-01 00:00:00 +0000
+++ debian/control	2011-12-09 05:39:36 +0000
@@ -0,0 +1,34 @@
+Source: mythbuntu-common
+Section: x11
+Priority: optional
+Maintainer: Ubuntu MythTV Team <ubuntu-mythtv@xxxxxxxxxxxxxxxx>
+Build-Depends: debhelper (>=7), python-central, python, python-distutils-extra
+XS-Vcs-Bzr: http://bazaar.launchpad.net/~mythbuntu-dev/mythbuntu/mythbuntu-common
+XS-Vcs-Browser: http://codebrowse.launchpad.net/~mythbuntu-dev/mythbuntu/mythbuntu-common
+XS-Python-Version: current
+Standards-Version: 3.9.2
+
+Package: mythbuntu-common
+Architecture: all
+Depends: ${python:Depends},
+         ${misc:Depends},
+         python-pexpect,
+         python-xkit,
+         python-mysqldb,
+         vnc4server | vnc4-common,
+         python-gconf,
+         lsb-release,
+         software-properties-gtk,
+         libdvdread4,
+         python-bzrlib
+XB-Python-Version: ${python:Versions}
+Recommends: nvidia-common, mythbuntu-bare-client
+Suggests: mythbuntu-bare-console
+Conflicts: mythbuntu-repos
+Replaces: mythbuntu-repos
+Description: Mythbuntu application support functions
+ This library is used by multiple mythbuntu applications to provide a common
+ interface for several very commonly used functions.
+ .
+ Depending upon the usage, this application may also be useful by other
+ projects needing to accomplish similar tasks.

=== added file 'debian/copyright'
--- debian/copyright	1970-01-01 00:00:00 +0000
+++ debian/copyright	2011-12-09 05:39:36 +0000
@@ -0,0 +1,34 @@
+This package was debianized by Mario Limonciello <superm1@xxxxxxxxxx> on
+Tue, 3 Jan 2008 16:41:23 -0500
+
+This original source for this package was obtained via the upstream
+bzr branch at http://bazaar.launchpad.net/~mythbuntu/mythbuntu/mythbuntu-common
+
+You can grab the version currently in use by this revision by
+running 'debian/rules get-orig-source'.
+
+Author & Copyright: 
+	© 2010 John Baab <rhpot1991@xxxxxxxxxx>
+	© 2007-2008 Mario Limonciello <superm1@xxxxxxxxxxxxx>
+
+License:
+
+ This Package 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 package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+On Debian & Ubuntu systems, a complete copy of the GPL can be found under
+/usr/share/common-licenses/GPL
+
+The Debian packaging is © 2008, Mario Limonciello <superm1@xxxxxxxxxx> and is
+also licensed under the GPL.

=== added file 'debian/install'
--- debian/install	1970-01-01 00:00:00 +0000
+++ debian/install	2011-12-09 05:39:36 +0000
@@ -0,0 +1,1 @@
+debian/mythbuntu.make usr/share/mythbuntu

=== added file 'debian/mythbuntu.make'
--- debian/mythbuntu.make	1970-01-01 00:00:00 +0000
+++ debian/mythbuntu.make	2011-12-09 05:39:36 +0000
@@ -0,0 +1,14 @@
+#Common Mythbuntu makefile
+
+DEB_SOURCE_PACKAGE+=$(shell egrep '^Source: ' debian/control | cut -f2 -d ' ')
+DEB_UPSTREAM_VERSION+=$(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ' | cut -d: -f2- | sed 's/-[^-]*$$//')
+BZR_BRANCH+=http://bazaar.launchpad.net/~mythbuntu-dev/mythbuntu/$(DEB_SOURCE_PACKAGE)
+TARFILE+=$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.tar.gz
+
+get-orig-source:
+	bzr export -r $(BZR_REVISION) $(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) $(BZR_BRANCH)
+	tar czf $(CURDIR)/../$(TARFILE) $(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) --exclude debian
+	rm -rf $(CURDIR)/$(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION)
+
+%:
+	dh $@

=== added file 'debian/prerm'
--- debian/prerm	1970-01-01 00:00:00 +0000
+++ debian/prerm	2011-12-09 05:39:36 +0000
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+case "$1" in
+    remove|purge)
+	release=$(lsb_release -c -s)
+	RMBLDS="`cat /usr/share/mythbuntu/plugins/mythbuntu-repos.db | grep $release | cut -f 2`"
+	for version in $RMBLDS
+	do
+		## Fixes for 0.21 and 0.22 PPA's
+	        if [ "$version" = "0.21" ]; then
+	          version="fixes-0.21"
+	        elif [ "$version" = "0.22" ]; then
+	          version="trunk-0.22"
+	        elif [ "$version" = "0.24.x" ]; then
+	          version="0.24"
+	        fi
+		apt-add-repository -r -y ppa:mythbuntu/$version || true
+	done
+	apt-add-repository -r -y ppa:mythbuntu/testing || true
+    apt-add-repository -r -y ppa:mythbuntu/xmltv || true
+	;;
+esac
+
+#DEBHELPER#
+

=== added file 'debian/pycompat'
--- debian/pycompat	1970-01-01 00:00:00 +0000
+++ debian/pycompat	2011-12-09 05:39:36 +0000
@@ -0,0 +1,1 @@
+2

=== added file 'debian/rules'
--- debian/rules	1970-01-01 00:00:00 +0000
+++ debian/rules	2011-12-09 05:39:36 +0000
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+
+#We can't use the one from mythbuntu.make because it likes Makefiles more than setup.py
+%:
+	dh -Spython_distutils $@

=== added directory 'examples'
=== renamed directory 'examples' => 'examples.moved'
=== added file 'examples/exports.dist'
--- examples/exports.dist	1970-01-01 00:00:00 +0000
+++ examples/exports.dist	2011-12-09 05:39:36 +0000
@@ -0,0 +1,4 @@
+/var/lib/mythtv/recordings    *(ro,async,no_root_squash,no_subtree_check)
+/var/lib/mythtv/videos    *(ro,async,no_root_squash,no_subtree_check)
+/var/lib/mythtv/music    *(ro,async,no_root_squash,no_subtree_check)
+/var/lib/mythtv/pictures    *(ro,async,no_root_squash,no_subtree_check)

=== added file 'examples/mythtv-tweaks.dist'
--- examples/mythtv-tweaks.dist	1970-01-01 00:00:00 +0000
+++ examples/mythtv-tweaks.dist	2011-12-09 05:39:36 +0000
@@ -0,0 +1,13 @@
+[mysqld]
+# The following values were partly taken from:
+# http://www.gossamer-threads.com/lists/mythtv/users/90942#90942
+# key_buffer = 48M
+# max_allowed_packet = 8M
+table_cache = 128
+sort_buffer_size = 48M
+net_buffer_length = 8M
+# thread_cache_size = 4
+query_cache_type = 1
+query_cache_size = 32M
+# don't do binary logs for mythconverg
+binlog_ignore_db = mythconverg

=== added file 'examples/smb.conf.dist'
--- examples/smb.conf.dist	1970-01-01 00:00:00 +0000
+++ examples/smb.conf.dist	2011-12-09 05:39:36 +0000
@@ -0,0 +1,50 @@
+[global]
+workgroup = MSHOME
+server string = %h server (Samba, Mythbuntu)
+log file = /var/log/samba/log.%m
+max log size = 1000
+syslog = 0
+panic action = /usr/share/samba/panic-action %d
+dns proxy = no
+security = share
+
+[recordings]
+comment = TV Recordings
+path = /var/lib/mythtv/recordings
+public = yes
+writable = no
+create mask = 0777
+directory mask = 0777
+force user = nobody
+force group = nogroup
+
+[videos]
+comment = Videos
+path = /var/lib/mythtv/videos
+public = yes
+writable = yes
+create mask = 0660
+directory mask = 0770
+force user = mythtv
+force group = mythtv
+
+[music]
+comment = Music
+path = /var/lib/mythtv/music
+public = yes
+writable = yes
+create mask = 0660
+directory mask = 0770
+force user = mythtv
+force group = mythtv
+
+[pictures]
+comment = Pictures
+path = /var/lib/mythtv/pictures
+public = yes
+writable = yes
+create mask = 0660
+directory mask = 0770
+force user = mythtv
+force group = mythtv
+

=== added directory 'mythbuntu_common'
=== added file 'mythbuntu_common/__init__.py'
=== added file 'mythbuntu_common/dictionaries.py'
--- mythbuntu_common/dictionaries.py	1970-01-01 00:00:00 +0000
+++ mythbuntu_common/dictionaries.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+#
+# «dictionaries» - Manage list of all widget -> package matching
+#
+# This script:
+# Copyright (C) 2008, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu 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 application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import string
+import subprocess
+
+####################
+# Type dictionaries: different installation types possible
+def get_install_type_dictionary(self):
+    list= {
+        "Master Backend/Frontend" : self.master_be_fe,                         \
+        "Slave Backend/Frontend"  : self.slave_be_fe,                          \
+        "Master Backend"          : self.master_be,                            \
+        "Slave Backend"           : self.slave_be,                             \
+        "Frontend"                : self.fe,                                   \
+        "Set Top Box"             : self.stb }
+    return list
+
+####################
+#Theme dictionaries: these are for managing a list of all possible themes
+####################
+def get_theme_dictionary(self):
+    list= {
+	"mythtv-themes": self.supported_themes,                                \
+	"mythtv-theme-mythbuntu": self.mythbuntu_theme }
+    return list
+
+####################
+#Plugin dictionaries: these are for managing a list of all possible plugins
+####################
+def get_frontend_plugin_dictionary(self):
+    list = {
+        "mytharchive": self.mytharchive_checkbox,                              \
+        "mythbrowser": self.mythbrowser_checkbox,                              \
+        "mythgame": self.mythgame_checkbox,                                    \
+        "mythgallery": self.mythgallery_checkbox,                              \
+        "mythmusic": self.mythmusic_checkbox,                                  \
+        "mythmovies": self.mythmovies_checkbox,                                \
+        "mythnews": self.mythnews_checkbox,                                    \
+        "mythnetvision": self.mythnetvision_checkbox,                          \
+        "mythvideo": self.mythvideo_checkbox,                                  \
+        "mythweather": self.mythweather_checkbox }
+    return list
+
+def get_backend_plugin_dictionary(self):
+    return { "mythweb": self.mythweb_checkbox }
+
+####################
+#Other dictionaries: these are for managing a list of all other apps
+####################
+def get_role_dictionary(self):
+    list = {
+        "mythtv-backend-master": self.primary_backend_radio,                   \
+        "mythtv-backend":        self.secondary_backend_radio,                 \
+        "mythtv-frontend":       self.frontend_radio }
+    return list
+
+def get_desktop_dictionary(self):
+    list = {
+        "ubuntu-desktop": self.ubuntu_desk_check,                              \
+        "xubuntu-desktop": self.xubuntu_desk_check,                            \
+        "kubuntu-desktop": self.kubuntu_desk_check }
+    return list
+
+def get_media_app_dictionary(self):
+    list = {
+        "mplayer": self.mplayer_checkbox,                                      \
+        "xine-ui": self.xine_checkbox,                                         \
+        "vlc":  self.vlc_checkbox }
+    return list
+
+def get_nonfree_dictionary(self):
+    list = {
+#        "medibuntu-keyring": self.medibuntu_keyring,                           \
+        "libdvdcss2": self.enable_libdvdcss2 }
+    return list
+
+def get_services_dictionary(self,sql_object=None):
+    list = {
+        "x11vnc": self.enablevnc,                                              \
+        "samba": self.enablesamba,                                             \
+        "nfs-kernel-server": self.enablenfs,                                   \
+        "openssh-server": self.enablessh,                                      \
+        "mysql-server": sql_object }
+    return list
+
+def get_diskless_dictionary(self):
+    list = {
+        "mythbuntu-diskless-server": self.diskless_server_install,             \
+        "dhcp3-server": self.diskless_server_dhcp }
+    return list
+
+def get_artwork_dictionary(self):
+    list = {
+        "mythbuntu-gdm-theme": self.gdm_theme,                                 \
+        "mythbuntu-default-settings": self.xfce_theme }
+    return list
+
+def get_graphics_dictionary():
+    list = {}
+    ##AMD graphics detection
+    #output=string.split(subprocess.Popen(['lspci'],stdout=subprocess.PIPE).communicate()[0],'\n')
+    #for line in output:
+    #    if line and 'VGA' in line and ('AMD' in line or 'ATI' in line):
+    #        list["AMD Graphics"]="fglrx"
+    #        break
+
+    #NVIDIA Graphics detection
+    try:
+        from NvidiaDetector.nvidiadetector import NvidiaDetection
+    except ImportError:
+        return list
+
+    nv = NvidiaDetection().selectDriver()
+    if nv is not None:
+        list["NVIDIA Graphics"]=nv
+    return list
+
+def get_tweak_dictionary(self):
+    list = {
+        "/etc/mysql/conf.d/mythtv-tweaks.cnf": self.enable_mysql_tweaks, \
+#        "/etc/cron.daily/mythtv-xfs-defrag": self.enable_nightly_defrag, \
+        "/etc/cron.daily/optimize_mythdb": self.enable_mysql_repair}
+    return list

=== added file 'mythbuntu_common/installer.py'
--- mythbuntu_common/installer.py	1970-01-01 00:00:00 +0000
+++ mythbuntu_common/installer.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+#
+# installer - Functions for use in Mythbuntu ubiquity plugins
+#
+# Copyright (C) 2010, Mario Limonciello, for Mythbuntu
+#
+# Mythbuntu 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 application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from ubiquity.plugin import *
+from ubiquity.misc import create_bool
+from gi.repository import Gtk
+import string
+
+class MythPageGtk(PluginUI):
+    def __init__(self, controller, *args, **kwargs):
+        def add_widget(plugin, widget):
+            """Make a widget callable by a plugin."""
+            if not isinstance(widget, Gtk.Widget):
+                return
+            widget.set_name(Gtk.Buildable.get_name(widget))
+            setattr(plugin, widget.get_name(), widget)
+            if isinstance(widget, Gtk.Label):
+                widget.set_property('can-focus', False)
+
+        self.controller=controller
+        try:
+            builder = Gtk.Builder()
+            builder.add_from_file('/usr/share/ubiquity/gtk/%s.ui' % self.ui_file)
+            builder.connect_signals(self)
+            for widget in builder.get_objects():
+                add_widget(self, widget)
+            self.plugin_widgets = builder.get_object(self.ui_file)
+            self.controller.add_builder(builder)
+        except Exception, e:
+            self.debug('Could not create mythbuntu page: %s', e)
+            self.plugin_widgets = None
+
+def preseed_list(lists,names,value):
+    """Helper function for preseeding dictionary based lists"""
+    new_value = create_bool(value)
+    for list in lists:
+        for item in list:
+            for name in string.split(names):
+                if item == name:
+                    #be careful what type of item we are dealing with
+                    if type(list[item]) == Gtk.CheckButton:
+                        list[item].set_active(new_value)
+                    elif type(list[item]) == Gtk.Entry:
+                        list[item].set_text(new_value)
+                    elif type(list[item]) == Gtk.ComboBox:
+                        model = list[item].get_model()
+                        for iteration in range(len(list[item]),0):
+                            list[item].set_active(iteration)
+                            iterator = list[item].get_active_iter()
+                            active = model.get_value(iterator, 0)
+                            if active == new_value:
+                                break
+                    else:
+                        list[item].set_active_text(new_value)
+
+def build_static_list(lists):
+    """Creates a flat list"""
+    total_list= {}
+    for list in lists:
+        for item in list:
+            if type(list[item]) == str:
+                total_list[item]=list[item]
+            elif type(list[item]) == Gtk.CheckButton:
+                total_list[item]=list[item].get_active()
+            elif type(list[item]) == Gtk.Entry:
+                total_list[item]=list[item].get_text()
+            else:
+                model = list[item].get_model()
+                iterator = list[item].get_active_iter()
+                active = model.get_value(iterator, 0)
+                total_list[item]=active
+    return total_list

=== added file 'mythbuntu_common/lirc.py'
--- mythbuntu_common/lirc.py	1970-01-01 00:00:00 +0000
+++ mythbuntu_common/lirc.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,351 @@
+# -*- coding: utf-8 -*-
+#
+# «lirc» - libmythbuntu class for lirc modifications
+#
+# This script:
+# Copyright (C) 2010, John Baab, for Mythbuntu
+# Copyright (C) 2007-2008, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu 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 application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import re
+import string
+import subprocess
+import os
+import shutil
+
+#default remote hwdb
+REMOTE_HWDB="/usr/share/lirc/lirc.hwdb"
+EXTRA_REMOTE_HWDB="/usr/share/lirc/extras/more_remotes.hwdb"
+TRANSMITTER_HWDB="/usr/share/lirc/extras/transmitter.hwdb"
+
+#path to hardware.conf
+HARDWARE_CONF="/etc/lirc/hardware.conf"
+
+#Path to remotes
+REMOTE_PATH="/usr/share/lirc/remotes/"
+
+#path to main lircd.conf
+LIRCD_CONF="/etc/lirc/lircd.conf"
+
+class LircHandler:
+
+    def __init__(self,hw_conf=HARDWARE_CONF):
+        #initialize all lists
+        self.remote_list=[]
+        self.remote="None"
+        self.remote_modules=""
+        self.remote_device=""
+        self.remote_driver=""
+        self.remote_lircd_conf=""
+        self.remote_count=0
+        self.transmitter_list=[]
+        self.transmitter="None"
+        self.transmitter_modules=""
+        self.transmitter_device=""
+        self.transmitter_driver=""
+        self.transmitter_lircd_conf=""
+        self.transmitter_count=0
+        self.populate_devices("remote",REMOTE_HWDB)
+        self.populate_devices("remote",EXTRA_REMOTE_HWDB)
+        self.populate_devices("transmitter",TRANSMITTER_HWDB)
+        self.sort_devices()
+        #load our current data
+        self.read_hardware_conf(hw_conf)
+
+    def sort_devices(self):
+        """Sorts the device list for a type"""
+        self.remote_list.sort()
+        self.transmitter_list.sort()
+        self.remote_list.insert(0,"None")
+        self.transmitter_list.insert(0,"None")
+
+    def populate_devices(self,type,file):
+        """Populates all possible remotes from a hwdb.  Accepts either 'remote' or 'transmitter' for possible types"""
+        try:
+            hwdb = open(file).readlines()
+            hwdb.sort()
+            #Filter out uncessary lines
+            filter = "^\#|^\["
+            #Filter out the /dev/input/eventX remote
+            filter += "|http"
+            #Filter blaster if we are in remote
+            if type == 'remote':
+                filter += "|Blaster"
+            pattern = re.compile(filter)
+            for line in hwdb:
+                if pattern.search(line) is None:
+                    list = string.split(line, ";")
+                    if len(list) > 1:
+                        #Make sure we have a config file before including
+                        if list[4] != "":
+                            if type == "remote":
+                                self.remote_list.append(list[0].translate(string.maketrans('',''),','))
+                                self.remote_count = self.remote_count + 1
+                            elif type == "transmitter":
+                                self.transmitter_list.append(list[0].translate(string.maketrans('',''),','))
+                                self.transmitter_count = self.transmitter_count + 1
+        except IOError:
+            print "Error reading " + file + " to parse remote listing."
+        #if type == "remote":
+        #    self.remote_list.append("Custom") 
+        #    self.remote_count = self.remote_count + 1
+        #elif type == "transmitter":
+        #    self.transmitter_list.append("Custom") 
+        #    self.transmitter_count = self.transmitter_count + 1
+
+    def set_device(self,device,type):
+        """Sets an active remote control or transmitter"""
+        if type == "remote":
+            count=self.remote_count
+            list=self.remote_list
+        elif type == "transmitter":
+            count=self.transmitter_count
+            list=self.transmitter_list
+        else:
+            print "Invalid device type: " + type
+            return
+
+        found = False
+        for item in range(count):
+            if list[item] == device[type]:
+                if type == "remote":
+                    self.remote = list[item]
+                elif type == "transmitter":
+                    self.transmitter = list[item]
+                found = True
+                break
+        if device[type] == "Custom":
+            if type == "remote":
+                self.remote=device[type]
+                self.remote_modules=device["remote_modules"]
+                self.remote_driver=device["remote_driver"]
+                self.remote_device=device["remote_device"]
+                self.remote_lircd_conf=device["remote_lircd_conf"]
+            elif type == "transmitter":
+                self.transmitter=device[type]
+                self.transmitter_modules=device["transmitter_modules"]
+                self.transmitter_driver=device["transmitter_driver"]
+                self.transmitter_device=device["transmitter_device"]
+                self.transmitter_lircd_conf=device["transmitter_lircd_conf"]
+
+    def get_device_dictionary(self,type):
+        """Returns a dictionary of all the info for a given device type"""
+        if type == "remote":
+            return {"remote":self.remote, "remote_modules":self.remote_modules, "remote_device": self.remote_device, "remote_driver":self.remote_driver, "remote_lircd_conf":self.remote_lircd_conf}
+        elif type == "transmitter":
+            return {"transmitter":self.transmitter, "transmitter_modules":self.transmitter_modules, "transmitter_device": self.transmitter_device, "transmitter_driver":self.transmitter_driver, "transmitter_lircd_conf":self.transmitter_lircd_conf}
+
+    def get_possible_devices(self,type):
+        """Returns all the possible remotes or transmitters"""
+        if type == "remote":
+            return self.remote_list
+        elif type == "transmitter":
+            return self.transmitter_list
+        else:
+            print "Invalid type: " + type
+            return None
+
+    def read_hardware_conf(self,file=HARDWARE_CONF):
+        """Reads in a lirc hardware configuration"""
+        try:
+            in_f=open(file)
+            remote_pattern=re.compile("^REMOTE=")
+            found_remote=False
+            remote_modules_pattern=re.compile("^REMOTE_MODULES=")
+            remote_device_pattern=re.compile("^REMOTE_DEVICE=")
+            remote_driver_pattern=re.compile("^REMOTE_DRIVER=")
+            remote_lircd_conf_pattern=re.compile("^REMOTE_LIRCD_CONF=")
+            transmitter_pattern=re.compile("^TRANSMITTER=")
+            found_transmitter=False
+            transmitter_modules_pattern=re.compile("^TRANSMITTER_MODULES=")
+            transmitter_device_pattern=re.compile("^TRANSMITTER_DEVICE=")
+            transmitter_driver_pattern=re.compile("^TRANSMITTER_DRIVER=")
+            transmitter_lircd_conf_pattern=re.compile("^TRANSMITTER_LIRCD_CONF=")
+
+            for line in in_f:
+                if remote_pattern.search(line) and not found_remote:
+                    for item in range(self.remote_count):
+                        if (not found_remote) and (self.remote_list[item] == string.split(line,'"')[1]):
+                            found_remote = True
+                            self.remote = string.split(line,'"')[1]
+                elif remote_modules_pattern.search(line):
+                    self.remote_modules = string.split(line,'"')[1]
+                elif remote_device_pattern.search(line):
+                    self.remote_device = string.split(line,'"')[1]
+                elif remote_driver_pattern.search(line):
+                    self.remote_driver = string.split(line,'"')[1]
+                elif remote_lircd_conf_pattern.search(line):
+                    self.remote_lircd_conf = string.split(line,'"')[1]
+                elif transmitter_pattern.search(line) and not found_transmitter:
+                    for item in range(self.transmitter_count):
+                        if (not found_transmitter) and (self.transmitter_list[item] == string.split(line,'"')[1]):
+                            found_transmitter = True
+                            self.transmitter = string.split(line,'"')[1]
+                elif transmitter_modules_pattern.search(line):
+                    self.transmitter_modules = string.split(line,'"')[1]
+                elif transmitter_device_pattern.search(line):
+                    self.transmitter_device = string.split(line,'"')[1]
+                elif transmitter_driver_pattern.search(line):
+                    self.transmitter_driver = string.split(line,'"')[1]
+                elif transmitter_lircd_conf_pattern.search(line):
+                    self.transmitter_lircd_conf = string.split(line,'"')[1]
+            if not found_remote:
+                self.remote=""
+            if not found_transmitter:
+                self.transmitter=""
+            in_f.close()
+        except IOError:
+            print "Error opening " + file
+
+    def write_hardware_conf(self,file=HARDWARE_CONF):
+        """Writes out a hardware.conf"""
+        patternline="^REMOTE="
+        patternline+="|^TRANSMITTER="
+        patternline+="|^FORCE_NONINTERACTIVE_RECONFIGURATION="
+        #If we are known to be a custom remote, then write out other stuff too
+        if self.remote == "Custom":
+            custom_remote = True
+            patternline+="|^REMOTE_MODULES="
+            patternline+="|^REMOTE_DRIVER="
+            patternline+="|^REMOTE_LIRCD_CONF="
+        else:
+            custom_remote = False
+        if self.transmitter == "Custom":
+            custom_transmitter = True
+            patternline+="|^TRANSMITTER_MODULES="
+            patternline+="|^TRANSMITTER_DRIVER="
+            patternline+="|^TRANSMITTER_LIRCD_CONF="
+        else:
+            custom_transmitter = False
+        pattern=re.compile(patternline)
+        found_remote=False
+        found_transmitter=False
+        lines = None
+        try:
+            in_f = open(file)
+            lines = in_f.readlines()
+            in_f.close()
+        except IOError:
+            print "Unable to find " + file
+        out_f = open(file, 'w')
+        for line in lines:
+            if pattern.search(line) is None:
+                out_f.write(line)
+                continue
+            else:
+                if not found_remote and re.compile("^REMOTE=").search(line):
+                    out_f.write("REMOTE=\"" + self.remote + "\"\n")
+                    found_remote = True
+                    continue
+                elif not found_transmitter and re.compile("^TRANSMITTER=").search(line):
+                    out_f.write("TRANSMITTER=\"" + self.transmitter + "\"\n")
+                    found_transmitter = True
+                    continue
+                if re.compile("^FORCE_NONINTERACTIVE_RECONFIGURATION=").search(line):
+                    #a reconfigure of lirc will be necessary after writing this hardware conf
+                    out_f.write("FORCE_NONINTERACTIVE_RECONFIGURATION=\"" + "true" + "\"\n")
+                if custom_remote:
+                    if re.compile("^REMOTE_MODULES=").search(line):
+                        out_f.write("REMOTE_MODULES=\"" + self.remote_modules + "\"\n")
+                        continue
+                    elif re.compile("^REMOTE_DRIVER=").search(line):
+                        out_f.write("REMOTE_DRIVER=\"" + self.remote_driver + "\"\n")
+                        continue
+                    elif re.compile("^REMOTE_DEVICE=").search(line):
+                        out_f.write("REMOTE_DEVICE=\"" + self.remote_device + "\"\n")
+                        continue
+                    elif re.compile("^REMOTE_LIRCD_CONF=").search(line):
+                        out_f.write("REMOTE_LIRCD_CONF=\"" + self.remote_lircd_conf + "\"\n")
+                        continue
+                if custom_transmitter:
+                    if re.compile("^TRANSMITTER_MODULES=").search(line):
+                        out_f.write("TRANSMITTER_MODULES=\"" + self.transmitter_modules + "\"\n")
+                        continue
+                    elif re.compile("^TRANSMITTER_DRIVER=").search(line):
+                        out_f.write("TRANSMITTER_DRIVER=\"" + self.transmitter_driver + "\"\n")
+                        continue
+                    elif re.compile("^TRANSMITTER_DEVICE=").search(line):
+                        out_f.write("TRANSMITTER_DEVICE=\"" + self.transmitter_device + "\"\n")
+                        continue
+                    elif re.compile("^TRANSMITTER_LIRCD_CONF=").search(line):
+                        out_f.write("TRANSMITTER_LIRCD_CONF=\"" + self.transmitter_lircd_conf + "\"\n")
+                        continue
+        if not found_remote:
+            out_f.write("REMOTE=\"" + self.remote + "\"\n")
+        if not found_transmitter:
+            out_f.write("TRANSMITTER=\"" + self.transmitter + "\"\n")
+        out_f.close()
+
+    def reconfigure_lirc(self,interactive=False):
+        """Restarts & Reconfigures LIRC"""
+        if interactive:
+            os.putenv('DEBIAN_FRONTEND','gnome')
+        else:
+            os.putenv('DEBIAN_FRONTEND','noninteractive')
+        lirc_command = subprocess.Popen(["/usr/sbin/dpkg-reconfigure", "lirc"],stdout=subprocess.PIPE).communicate()[0]
+        print lirc_command
+
+    def query_advanced(self,remote_hwdb_file=REMOTE_HWDB,transmitter_hwdb_file=TRANSMITTER_HWDB):
+        """Determine if this remote requires interactive configuration"""
+
+        advanced_driver_pattern=re.compile("devinput")
+        advanced_modules_pattern=re.compile("serial")
+
+        remote_hwdb = open(remote_hwdb_file).readlines()
+        transmitter_hwdb = open(transmitter_hwdb_file).readlines()
+
+        #Filter out uncessary lines
+        filter = "^\#|^\["
+        pattern = re.compile(filter)
+        #search advanced remotes
+        for line in remote_hwdb:
+            if pattern.search(line) is None:
+                list = string.split(line, ";")
+                if len(list) > 1 and list[0].translate(string.maketrans('',''),',') == self.remote:
+                    if advanced_driver_pattern.search(list[1]) or advanced_modules_pattern.search(list[2]):
+                        return True
+        #search advanced transmitters
+        for line in transmitter_hwdb:
+            if pattern.search(line) is None:
+                list = string.split(line, ";")
+                if len(list) > 1 and list[0].translate(string.maketrans('',''),',') == self.remote:
+                    if advanced_driver_pattern.search(list[1]) or advanced_modules_pattern.search(list[2]):
+                        return True
+        return False
+    def create_lircrc(self,file=LIRCD_CONF,change_permissions=True,irexec=False,irexec_only=False):
+        """Generates lircrc files for all possible applications"""
+
+        command = "mythbuntu-lircrc-generator"
+
+        if file != LIRCD_CONF:
+            command = command + " -L " + file
+        
+        if irexec == True:
+            command = command + " --irexec 1"
+
+        if irexec_only == True:
+            command = command + " --mythtv 0 --mplayer 0 --totem 0 --elisa 0 --xine 0 --vlc 0 --xmame 0 --xmess 0"
+
+        if change_permissions:
+            uid = os.getenv('SUDO_UID')
+            if uid != None:
+                in_f=open("/etc/passwd")
+                for line in in_f:
+                    fields = string.split(line,":")
+                    if fields[2] == uid:
+                        command = "su " + fields[0] + " -c " + command
+        os.system(command)

=== added file 'mythbuntu_common/mysql.py'
--- mythbuntu_common/mysql.py	1970-01-01 00:00:00 +0000
+++ mythbuntu_common/mysql.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,272 @@
+# -*- coding: utf-8 -*-
+#
+# «mysql» - mythbuntu class for mysql mangling
+#
+# This script:
+# Copyright (C) 2007-2010, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu 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 application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import shutil
+import os
+import subprocess
+import re
+import string
+import xml.dom.minidom
+
+
+#MySQL testing support
+import MySQLdb
+
+class MySQLHandler:
+    """MySQL configuration, mangling, and activation class"""
+
+    def __init__(self,config={"user":"mythtv","password":"mythtv","server":"localhost","database":"mythconverg","securitypin":"0000"}):
+        self.user=config["user"]
+        self.password=config["password"]
+        self.server=config["server"]
+        self.database=config["database"]
+        self.securitypin=config["securitypin"]
+
+    def _config_xml(self, file=None):
+        """Reads in and parses and writes a config.xml from a number of places:
+           1) /etc/mythtv/config.xml
+           2) /usr/share/mythtv/config.xml
+           Returns a dictionary filled with references that can be parsed or processed
+        """
+        dictionary={"doc": None, 'DBHostName': None, 'DBUserName': None, 'DBPassword': None, 'DBName': None, 'SecurityPin' : None}
+        for file in [file, '/etc/mythtv/config.xml', '/usr/share/mythtv/config.xml' ]:
+            if file and os.path.exists(file):
+                dictionary["doc"]=xml.dom.minidom.parse(file)
+                for tag in dictionary:
+                    elements=dictionary["doc"].getElementsByTagName(tag)
+                    if elements:
+                        dictionary[tag]=elements[0]
+                    elif tag != "doc":
+                        dictionary[tag]=dictionary["doc"].createElement(tag)
+                break
+        return dictionary
+
+    def write_xml(self,file):
+        """Writes XML to a file"""
+        dict=self._config_xml(file)
+        if dict['DBHostName'].hasChildNodes():
+            dict['DBHostName'].childNodes[0].replaceWholeText(self.server)
+        else:
+            node = dom.xml.minidom.createTextNode(self.server)
+            dict['DBHostName'].appendChild(node)
+        if dict['DBUserName'].hasChildNodes():
+            dict['DBUserName'].childNodes[0].replaceWholeText(self.user)
+        else:
+            node = dom.xml.minidom.createTextNode(self.user)
+            dict['DBUserName'].appendChild(node)
+        if dict['DBPassword'].hasChildNodes():
+            dict['DBPassword'].childNodes[0].replaceWholeText(self.password)
+        else:
+            node = dom.xml.minidom.createTextNode(self.password)
+            dict['DBPassword'].appendChild(node)
+        if dict['DBName'].hasChildNodes():
+            dict['DBName'].childNodes[0].replaceWholeText(self.database)
+        else:
+            node = dom.xml.minidom.createTextNode(self.database)
+            dict['DBName'].appendChild(node)
+        if dict['SecurityPin'].hasChildNodes():
+            dict['SecurityPin'].childNodes[0].replaceWholeText(self.securitypin)
+        else:
+            node = dom.xml.minidom.createTextNode(self.securitypin)
+            dict['SecurityPin'].appendChild(node)
+
+        dict["doc"].writexml(open(file, 'w'))
+
+    def read_xml(self,file):
+        dict=self._config_xml(file)
+        if dict['DBHostName'].hasChildNodes():
+            self.server = dict['DBHostName'].childNodes[0].data
+        if dict['DBUserName'].hasChildNodes():
+            self.user = dict['DBUserName'].childNodes[0].data
+        if dict['DBPassword'].hasChildNodes():
+            self.password = dict['DBPassword'].childNodes[0].data
+        if dict['DBName'].hasChildNodes():
+            self.database = dict['DBName'].childNodes[0].data
+        if dict['SecurityPin'].hasChildNodes():
+            self.securitypin = dict['SecurityPin'].childNodes[0].data
+
+    def read_mysql_txt(self,file):
+        """Reads in file to setup stored mysql information"""
+        try:
+            in_f=open(file)
+            for line in in_f:
+                if re.compile("^DBHostName").search(line):
+                    text=string.split(string.split(line,"=")[1],'\n')[0]
+                    self.server = text
+                elif re.compile("^DBUserName").search(line):
+                    text=string.split(string.split(line,"=")[1],'\n')[0]
+                    self.user = text
+                elif re.compile("^DBName").search(line):
+                    text=string.split(string.split(line,"=")[1],'\n')[0]
+                    self.database = text
+                elif re.compile("^DBPassword").search(line):
+                    text=string.split(string.split(line,"=")[1],'\n')[0]
+                    self.password= text
+            in_f.close()
+        except IOError:
+            print "Error reading %s" % file
+
+    def write_mysql_txt(self,file,debug=False):
+        """Writes mysql.txt to a given file name"""
+        f_host = False
+        f_user = False
+        f_pass = False
+        f_db = False
+        if os.path.exists(file):
+            print "Copying %s to %s~" % (file,file)
+            shutil.copy(file, file + "~")
+            in_f = open(file + "~", 'r')
+            out_f = open(file, "w")
+            for line in in_f:
+                if line.startswith("DBHostName"):
+                    if not f_host:
+                        out_f.write("DBHostName=" + self.server + "\n")
+                        f_host = True
+                elif line.startswith("DBUserName"):
+                    if not f_user:
+                        out_f.write("DBUserName=" + self.user + "\n")
+                        f_user = True
+                elif line.startswith("DBName"):
+                    if not f_db:
+                        out_f.write("DBName=" + self.database + "\n")
+                        f_db = True
+                elif line.startswith("DBPassword"):
+                    if not f_pass:
+                        out_f.write("DBPassword=" + self.password + "\n")
+                        f_pass = True
+                else:
+                    out_f.write(line)
+            in_f.close()
+            if not debug:
+                os.remove(file + "~")
+        else:
+            out_f = open(file, "w")
+        if not f_host:
+            out_f.write("DBHostName=" + self.server + "\n")
+        if not f_user:
+            out_f.write("DBUserName=" + self.user + "\n")
+        if not f_db:
+            out_f.write("DBName=" + self.database + "\n")
+        if not f_pass:
+            out_f.write("DBPassword=" + self.password + "\n")
+        out_f.close()
+
+    def toggle_mysql_service_config(self,enable):
+        """Enables and disables the mysql service on all interfaces"""
+        if not os.path.exists("/etc/mysql/conf.d"):
+            os.mkdir("/etc/mysql/conf.d")
+        lines = None
+        out_f = None
+        found = False
+        pattern = re.compile("^bind-address|^#bind-address")
+        try:
+            in_f = open("/etc/mysql/conf.d/mythtv.cnf")
+            lines = in_f.readlines()
+            in_f.close()
+            out_f=open("/etc/mysql/conf.d/mythtv.cnf","w")
+            for line in lines:
+                if pattern.search(line) is None:
+                    out_f.write(line)
+                elif not found:
+                    if enable:
+                        out_f.write("bind-address=0.0.0.0\n")
+                    else:
+                        out_f.write("#bind-address=0.0.0.0\n")
+                    found = True
+            if not found:
+                if enable:
+                    out_f.write("bind-address=0.0.0.0\n")
+                else:
+                    out_f.write("#bind-address=0.0.0.0\n")
+        except IOError:
+            print "/etc/mysql/conf.d/mythtv.cnf not found"
+            out_f=open("/etc/mysql/conf.d/mythtv.cnf","w")
+            out_f.write("[mysqld]\n")
+            if enable:
+                out_f.write("bind-address=0.0.0.0\n")
+            else:
+                out_f.write("#bind-address=0.0.0.0\n")
+        out_f.close()
+
+    def restart_mysql_service(self):
+        """Restarts MySQL service"""
+        start_mysql = subprocess.Popen(["/usr/sbin/invoke-rc.d", "mysql", "restart"],stdout=subprocess.PIPE).communicate()[0]
+        print start_mysql
+
+    def update_config(self,config):
+        """Sets up a new configuration based on the dict {user,pass,server,db,securitypin}"""
+        self.user=config["user"]
+        self.password=config["password"]
+        self.server=config["server"]
+        self.database=config["database"]
+        self.securitypin=config["securitypin"]
+
+    def get_config(self):
+        """Returns our currently stored configuration"""
+        return {"user":self.user,"password":self.password,"server":self.server,"database":self.database,"securitypin":self.securitypin}
+
+    def reset_user_password(self,admin_pass,password):
+        """Resets a user's password if it was forgotten"""
+        commands = ["UPDATE user SET Password=PASSWORD('"+password+"') WHERE user=mythtv')",
+        "FLUSH PRIVILEGES"]
+        if self.run_mysql_commands(commands,mysql_user="root"):
+            return "Successful"
+        else:
+            return "Failure"
+
+    def run_mysql_commands(self,commands,mysql_user=None):
+        """Runs mysql command(s) and returns the response"""
+        if mysql_user is None:
+            mysql_user = self.user
+        try:
+            db = MySQLdb.connect(host=self.server, user=mysql_user, passwd=self.password,db=self.database)
+            cursor = db.cursor()
+            if type(commands) is list:
+                for command in commands:
+                    cursor.execute(command)
+                    result = cursor.fetchone()
+            elif type(commands) is str:
+                result = cursor.execute(commands)
+            else:
+                print "Unknown type"
+            cursor.close()
+            db.close()
+        except:
+            result = False
+        return result
+
+    def do_connection_test(self, pin):
+        """Tests to make sure that the backend is accessible"""
+        try:
+            import MythTV
+        except ImportError:
+            return False
+        args = { 'SecurityPin' : pin }
+        #figure out whether 0.24+ or 0.23
+        try:
+            method = getattr(MythTV, "MythDBBase")
+        except AttributeError:
+            method = getattr(MythTV, "MythDB")
+        try:
+            db_base = method(args=args)
+        except Exception, e:
+            return str(e)

=== added file 'mythbuntu_common/vnc.py'
--- mythbuntu_common/vnc.py	1970-01-01 00:00:00 +0000
+++ mythbuntu_common/vnc.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+#
+# «vnc» - libmythbuntu class for adding/removing VNC from configuration
+#
+# This script:
+# Copyright (C) 2007-2008, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu 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 application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import os
+import sys
+import shutil
+import pexpect
+
+#import xorgconfig
+import XKit
+from XKit import xutils
+
+#Script Directory
+SCRIPTDIR = '/usr/share/mythbuntu-common/scripts'
+
+class VNCHandler:
+    """Used to properly enable VNC in a target configuration"""
+
+    def __init__(self,root=''):
+        self.add_modules = ["vnc"]
+        self.add_screen = [ ['SecurityTypes', 'VncAuth'], ['UserPasswdVerifier', 'VncAuth'], ['PasswordFile', '/root/.vnc/passwd']]
+        self.root = root
+        
+        self.xorg_conf_path = '/etc/X11/xorg.conf'
+        
+        try:
+            self.xorg_conf = xutils.XUtils(self.xorg_conf_path)
+        except(IOError, XKit.xorgparser.ParseException):#if xorg.conf is missing or broken
+            self.xorg_conf = xutils.XUtils()
+
+    def create_password(self,password):
+        home = os.environ['HOME']
+        if not os.path.exists(home + "/.vnc"):
+            os.mkdir(home + "/.vnc")
+        elif os.path.exists(home + "/.vnc/passwd"):
+            print "Copying ~/.vnc/passwd to ~/.vnc/passwd.old"
+            shutil.copy(home + "/.vnc/passwd",home + "/.vnc/passwd.old")
+        #Create password using pexpect
+	command_handler = pexpect.spawn('vncpasswd ' + home + '/.vnc/passwd')
+	command_handler.expect('Password:',timeout=-1)
+	command_handler.sendline(password)
+	command_handler.expect('Verify:',timeout=-1)
+	command_handler.sendline(password)
+	command_handler.expect(pexpect.EOF,timeout=-1)
+	command_handler.close()
+
+    def toggle_xorg(self,enable):
+        """Adds necessary lines for enabling VNC upon the next boot"""
+
+        # backup the current xorg.conf
+        open(os.path.join(self.root + self.xorg_conf_path + ".old"), "w").write(open(self.root + self.xorg_conf_path).read())
+        
+        
+        #Revert any existing settings first
+        have_modules = len(self.xorg_conf.globaldict["Module"]) > 0
+        have_screens = len(self.xorg_conf.globaldict["Screen"]) > 0
+              
+        if have_modules:
+            for m in self.add_modules:
+                self.xorg_conf.removeOption("Module", "Load", value=m, position=0)
+        
+        if have_screens:
+            for item in self.add_screen:
+                self.xorg_conf.removeOption("Screen", item[0], position=0)
+        
+
+        #Now re-enable if we want to
+        if enable:
+            if self.add_modules:
+                if not have_modules:
+                    self.xorg_conf.makeSection("Module")
+                for m in self.add_modules:
+                    self.xorg_conf.addOption("Module", "Load", m, position=0)
+            
+            if not have_screens:
+                self.xorg_conf.makeSection("Screen", identifier="Default Screen")
+            for item in self.add_screen:
+                self.xorg_conf.addOption("Screen", item[0], item[1], optiontype="Option", position=0)
+        
+        self.xorg_conf.writeFile(self.root + self.xorg_conf_path)
+        

=== added directory 'plugins'
=== added directory 'plugins/python'
=== added file 'plugins/python/graphics_drivers.py'
--- plugins/python/graphics_drivers.py	1970-01-01 00:00:00 +0000
+++ plugins/python/graphics_drivers.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,63 @@
+## -*- coding: utf-8 -*-
+#
+# «restrcited_drivers» - MCC Restricted Drivers launcher plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import os
+
+class RestrictedDriversPlugin(MCCPlugin):
+    """A plugin for launching tools related to proprietary drivers"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Graphics Drivers"
+        information["icon"] = "jockey"
+        information["ui"] = "tab_graphics_drivers"
+        MCCPlugin.__init__(self,information)
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        self.en_nvidia=os.path.exists('/usr/bin/nvidia-settings')
+        self.en_amd=os.path.exists('/usr/bin/amdcccle')
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        #Load the detected dictionary
+        self.nvidia_vbox.set_sensitive(self.en_nvidia)
+        self.amd_vbox.set_sensitive(self.en_amd)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        return
+
+    #Callbacks
+    def launch_app(self,widget):
+        """Launches an external application"""
+        if widget is not None:
+            if widget.get_name() == "restricted_drivers_button":
+                MCCPlugin.launch_app(self,widget,"jockey-gtk")
+            elif widget.get_name() == "nvidia_settings_button":
+                MCCPlugin.launch_app(self,widget,"nvidia-settings")
+            elif widget.get_name() == "amdcccle_button":
+                MCCPlugin.launch_app(self,widget,"amdcccle")

=== added file 'plugins/python/mysql_configuration.py'
--- plugins/python/mysql_configuration.py	1970-01-01 00:00:00 +0000
+++ plugins/python/mysql_configuration.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,190 @@
+## -*- coding: utf-8 -*-
+#
+# «mysql_configuration» - MCC MysQL Related configuration plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import os
+import re
+import logging
+
+from mythbuntu_common.mysql import MySQLHandler
+from mythbuntu_common.dictionaries import get_tweak_dictionary
+
+MYSQL_TXT='/etc/mythtv/mysql.txt'
+
+MYTHTV_SETUP='/usr/bin/mythtv-setup'
+OPTIMIZE_DATABASE="/usr/bin/x-terminal-emulator -e perl /usr/share/doc/mythtv-backend/contrib/optimize_mythdb.pl"
+
+class MySQLConfigurationPlugin(MCCPlugin):
+    """A configuration tool for MySQL Related Connectivity"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "MySQL"
+        information["icon"] = "gtk-network"
+        information["ui"] = "tab_mysql_configuration"
+        MCCPlugin.__init__(self,information)
+        self.mysql=MySQLHandler()
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+
+        #Roles
+        self.frontend=False
+        self.mysql_service=False
+        if self.query_installed('mythtv-backend-master'):
+            #enable master backend and backend, disable frontend
+            self.master=True
+            self.backend=True
+            if os.path.exists("/etc/mysql/conf.d/mythtv.cnf"):
+                in_f=open("/etc/mysql/conf.d/mythtv.cnf")
+                for line in in_f:
+                    if re.compile("^bind-address").search(line):
+                        self.mysql_service=True
+                        break
+                in_f.close()
+        else:
+            self.master=False
+            self.backend=self.query_installed('mythtv-backend')
+
+        if os.path.exists(os.path.join(os.environ['HOME'], '.mythtv', 'config.xml')):
+            self.mysql.read_xml(os.path.join(os.environ['HOME'], '.mythtv', 'config.xml'))
+
+        #Dictionaries
+        self.dictionary_state={}
+        list=get_tweak_dictionary(self)
+        for item in list:
+            self.dictionary_state[list[item]]=os.path.exists(item)
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+
+        #Master
+        if self.master:
+            self.master_backend_vbox.show()
+            if self.mysql_service:
+                self.enablemysql.set_active(1)
+            else:
+                self.enablemysql.set_active(0)
+        else:
+            self.master_backend_vbox.hide()
+
+        #Backend
+        if self.backend:
+            self.backend_vbox.show()
+        else:
+            self.backend_vbox.hide()
+
+        #Connectivity
+        config=self.mysql.get_config()
+        self.security_entry.set_text(config["securitypin"])
+        self.mysql_test_hbox.hide()
+
+        #Dictionaries
+        for item in self.dictionary_state:
+            item.set_active(self.dictionary_state[item])
+
+        self._incomplete=False
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        list=get_tweak_dictionary(self)
+        for item in list:
+            if list[item].get_active() != self.dictionary_state[list[item]]:
+                self._markReconfigureRoot(item,list[item].get_active())
+
+        if self.master:
+            if self.mysql_service and self.enablemysql.get_active_text() == "Disable":
+                #disable service
+                self._markReconfigureRoot("mysql_service",False)
+            if not self.mysql_service and self.enablemysql.get_active_text() == "Enable":
+                #enable service
+                self._markReconfigureRoot("mysql_service",True)
+        else:
+            config=self.mysql.get_config()
+            if self.security_entry.get_text() != config["securitypin"]:
+                self._markReconfigureUser("securitypin",self.security_entry.get_text())
+
+
+    def root_scripted_changes(self,reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+        for item in reconfigure:
+            if item == "mysql_service":
+                self.mysql.toggle_mysql_service_config(reconfigure[item])
+                self.mysql.restart_mysql_service()
+            elif item == "/etc/mysql/conf.d/mythtv-tweaks.cnf" or\
+                 item == "/etc/cron.daily/optimize_mythdb":
+                if reconfigure[item]:
+                    import shutil
+                    try:
+                        if os.path.exists(item):
+                            os.remove(item)
+                        if item == "/etc/mysql/conf.d/mythtv-tweaks.cnf":
+                            shutil.copy('/usr/share/mythbuntu/examples/mythtv-tweaks.dist',item)
+                        else:
+                            shutil.copy('/usr/share/doc/mythtv-backend/contrib/maintenance/optimize_mythdb.pl',item)
+                            os.chmod(item,0755)
+                    except Exception, msg:
+                        logging.warning("Exception when enabling %s, %s" % (item,msg))
+                else:
+                    try:
+                        os.remove(item)
+                    except Exception, msg:
+                        logging.warning("Exception when disabling item %s, %s" % (item,msg))
+
+    def user_scripted_changes(self, reconfigure):
+        for item in reconfigure:
+            if item == "securitypin":
+                logging.debug("Updating MySQL config")
+                #We don't actually have to modify this - if it was successful, it would have happened from the test.
+                self.mysql.read_xml()
+                if not os.path.exists(os.path.join(os.environ['HOME'],'.mythtv')):
+                    os.makedirs(os.path.join(os.environ['HOME'],'.mythtv'))
+                self.mysql.write_mysql_txt(os.path.join(os.environ['HOME'],'.mythtv','mysql.txt'))
+
+    def do_connection_test(self,widget):
+        """Performs a connectivity test to the backend's mysql server"""
+        if widget is not None:
+            self.mysql_test_hbox.show()
+            result = self.mysql.do_connection_test(self.security_entry.get_text())
+            if not result:
+                self.pass_mysql.show()
+                self.fail_mysql.hide()
+                self._incomplete=False
+                return
+            self.pass_mysql.hide()
+            self.fail_mysql.show()
+            self._incomplete=True
+
+
+    def launch_app(self,widget):
+        """Launches an app defined in the glade file"""
+        if widget.get_name() == 'mysql_tweak_button':
+            MCCPlugin.launch_app(self,widget,OPTIMIZE_DATABASE)
+        elif widget.get_name() == 'mythtv_setup_button':
+            MCCPlugin.launch_app(self,widget,MYTHTV_SETUP)

=== added file 'plugins/python/mythbuntu_repos.py'
--- plugins/python/mythbuntu_repos.py	1970-01-01 00:00:00 +0000
+++ plugins/python/mythbuntu_repos.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,253 @@
+## -*- coding: utf-8 -*-
+#
+# «Mythbuntu Repos» - A Plugin for adding Mythbuntu Repos. (ie. -testing and
+# Auto-Builds)
+#
+# Copyright (C) 2009, Thomas Mashos, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import os
+import re
+import commands
+import urllib2
+import shutil
+import subprocess
+import ConfigParser
+from bzrlib.plugin import load_plugins
+from bzrlib import branch, tree
+
+class MythbuntuReposPlugin(MCCPlugin):
+    """A Plugin for adding Mythbuntu Repos"""
+    #
+    #Load GUI & Calculate Changes
+    #
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Repositories"
+        information["icon"] = "emblem-downloads"
+        information["ui"] = "tab_repos"
+        MCCPlugin.__init__(self, information)
+        self.CONFIGFILE = "/etc/default/mythbuntu-repos"
+        self.USERHOME = os.path.expanduser("~")
+        if not os.path.isdir(self.USERHOME+"/.mythbuntu"):
+            os.mkdir(self.USERHOME+"/.mythbuntu")
+        if not os.path.isfile(self.USERHOME+"/.mythbuntu/repos.db"):
+            try:
+                self.downloadFile()
+            except:
+                shutil.copy("/usr/share/mythbuntu/repos.db", self.USERHOME+"/.mythbuntu/")
+        self.config = ConfigParser.ConfigParser()
+
+    #Set mythtv versions
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        self.versions = []
+        for line in open("/etc/lsb-release").xreadlines():
+            if "DISTRIB_CODENAME" in line:
+                line = line.strip("\n")
+                throwaway, distro = line.split("=")
+        NumRepos = 0
+        dbfiles=[
+        "/usr/share/mythbuntu/repos.db",
+        self.USERHOME+"/.mythbuntu/repos.db"
+        ]
+        for f in dbfiles:
+            for line in open(f).xreadlines():
+                if distro in line:
+                    line = line.strip("\n")
+                    release, version = line.split("\t")
+                    if not version in self.versions:
+                        self.versions.append(version)
+                    NumRepos += 1
+                elif "MYTHTV_RELEASE" in line:
+                    line = line.strip("\n")
+                    VerName, self.CurVer = line.split("\t")
+                elif "TRUNKPASS" in line:
+                    line = line.strip("\n")
+                    discard, self.TRUNKPASS = line.split("\t")
+        self.changes = {}
+        rei = 0
+        while (rei <= NumRepos):
+            self.builder.get_object('repobox').remove_text(0)
+            rei = rei+1
+        for item in self.versions:
+            self.builder.get_object('repobox').append_text(item)
+        if os.path.exists(self.CONFIGFILE):
+            self.config.read(self.CONFIGFILE)
+        try:
+            self.changes['MythTVUpdatesActivated'] = self.config.getboolean("cfg", "ActivateMythTVUpdates")
+        except:
+            self.changes['MythTVUpdatesActivated'] = False
+        try:
+            self.changes['MythTVUpdatesRepo'] = self.config.get("cfg", "MythTVRepo")
+        except:            
+            self.changes['MythTVUpdatesRepo'] = self.versions[0]
+        try:
+            self.changes['ActivateMythbuntuUpdates'] = self.config.getboolean("cfg", "ActivateMythbuntuUpdates")
+        except:
+            self.changes['ActivateMythbuntuUpdates'] = False
+        try:
+            self.changes['ActivateXMLTVUpdates'] = self.config.getboolean("cfg", "ActivateXMLTVUpdates")
+        except:
+            self.changes['ActivateXMLTVUpdates'] = False
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        self.mythtv_updates_checkbox.set_active(self.changes['MythTVUpdatesActivated'])
+        self.repobox.set_sensitive(self.changes['MythTVUpdatesActivated'])
+        try:
+            self.repobox.set_active(self.versions.index(self.changes['MythTVUpdatesRepo']))
+        except ValueError:
+            self.repobox.set_active(0)
+        self.mythbuntu_updates_checkbox.set_active(self.changes['ActivateMythbuntuUpdates'])
+        self.xmltv_updates_checkbox.set_active(self.changes['ActivateXMLTVUpdates'])
+        self.trunk_pass_ok.hide()
+
+    def on_mythtv_updates_checkbox_toggled(self, widget, data=None):
+        """Show the repobox if this is checked"""
+        widget_was_visible = self.mythtv_updates_checkbox.get_active()
+        if widget_was_visible:
+            self.repobox.set_sensitive(True)
+        else:
+            self.repobox.set_sensitive(False)
+
+    def on_dev_password_entry_changed(self, widget, data=None):
+        """Require a password for using trunk"""
+        if self.dev_password_entry.get_text() == self.TRUNKPASS:
+            self.trunk_pass_error.hide()
+            self.trunk_pass_ok.show()
+        else:
+            self.trunk_pass_error.show()
+            self.trunk_pass_ok.hide()
+
+    def on_repobox_changed(self, widget, data=None):
+        """Check the version to know if it's trunk"""
+        if not self.repobox.get_active_text() == None:
+            SELVER = self.convertVersion(self.repobox.get_active_text())
+            if SELVER > self.CurVer:
+                self.trunk_block.show()
+            else:
+                self.trunk_block.hide()
+
+    def convertVersion(self, VERSION):
+        """Remove the trailing .x if it exists"""
+        if VERSION.endswith(".x"):
+            VERSION = VERSION.strip(".x")
+        return VERSION
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        MCCPlugin.clearParentState(self)
+        SENDLIST = False
+        SELVER = self.convertVersion(self.repobox.get_active_text())
+        if self.mythtv_updates_checkbox.get_active() != self.changes['MythTVUpdatesActivated'] and self.mythtv_updates_checkbox.get_active() == False:
+            self._markReconfigureRoot('MythTV-Updates-Activated', self.mythtv_updates_checkbox.get_active())
+            SENDLIST = True
+        if self.repobox.get_sensitive() == True:
+            if self.repobox.get_active_text() != self.changes['MythTVUpdatesRepo'] or self.mythtv_updates_checkbox.get_active() != self.changes['MythTVUpdatesActivated']:
+                if (SELVER > self.CurVer and self.dev_password_entry.get_text() == self.TRUNKPASS) or SELVER <= self.CurVer:
+                    self._markReconfigureRoot('MythTV-Updates-Repo', self.repobox.get_active_text())
+                    self._markReconfigureRoot('MythTV-Updates-Activated', self.mythtv_updates_checkbox.get_active())
+                    SENDLIST = True
+                elif self.mythtv_updates_checkbox.get_active() == False:
+                    self._markReconfigureRoot('MythTV-Updates-Activated', self.mythtv_updates_checkbox.get_active())
+        if self.mythbuntu_updates_checkbox.get_active() != self.changes['ActivateMythbuntuUpdates']:
+            self._markReconfigureRoot('Mythbuntu-Updates-Activated', self.mythbuntu_updates_checkbox.get_active())
+        if self.xmltv_updates_checkbox.get_active() != self.changes['ActivateXMLTVUpdates']:
+            self._markReconfigureRoot('XMLTV-Updates-Activated', self.xmltv_updates_checkbox.get_active())
+        if SENDLIST == True:
+            self._markReconfigureRoot('Repo-list', self.versions)
+
+    def refresh_button_clicked(self, widget, data=None):
+        """Download a new db file if requested"""
+        self.downloadFile()
+        self.captureState()
+        self.applyStateToGUI()
+
+    def downloadFile(self):
+        """Download files"""
+        # Load the bzr plugins - the "launchpad" plugin provides support for the "lp:" shortcut
+        load_plugins()
+
+        b = branch.Branch.open('lp:~mythbuntu-dev/mythbuntu/mythbuntu-common')
+
+        revision_number, revision_id = b.last_revision_info()
+
+        repo = b.repository
+        revision = repo.get_revision(revision_id)
+
+        ## Get a revisiontree (needed to get the file)
+        revtree = repo.revision_tree(revision_id)
+
+        ## Download and save file
+        b.lock_read()
+        fileid = revtree.path2id('repos.db')
+        dbfile = open(self.USERHOME+"/.mythbuntu/repos.db", "w")
+        dbfile.write(revtree.get_file(fileid).read())
+        dbfile.close()
+        b.unlock()
+        
+
+    #
+    # Process selected activities
+    #
+
+    def root_scripted_changes(self, reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+        if os.path.exists(self.CONFIGFILE):
+            self.config.read("/etc/default/mythbuntu-repos")
+        else:
+            self.config.add_section("cfg")
+        if "Repo-list" in reconfigure:
+            for item in reconfigure["Repo-list"]:
+                if item.endswith(".x"):
+                    item = item.strip(".x")
+                    subprocess.call(["apt-add-repository", "-r", "-y", "ppa:mythbuntu/"+item])
+        if "MythTV-Updates-Activated" in reconfigure:
+            if reconfigure["MythTV-Updates-Activated"]:
+                repo = reconfigure["MythTV-Updates-Repo"]
+                self.config.set("cfg", "ActivateMythTVUpdates", True)
+                self.config.set("cfg", "MythTVRepo", repo)
+                if repo.endswith(".x"):
+                    repo = repo.strip(".x")
+                subprocess.call(["apt-add-repository", "-y", "ppa:mythbuntu/"+repo])
+            else:
+                self.config.set("cfg", "ActivateMythTVUpdates", False)
+        if "Mythbuntu-Updates-Activated" in reconfigure:
+            if reconfigure["Mythbuntu-Updates-Activated"]:
+                subprocess.call(["apt-add-repository", "-y", "ppa:mythbuntu/testing"])
+                self.config.set("cfg", "ActivateMythbuntuUpdates", True)
+            else:
+                subprocess.call(["apt-add-repository", "-r", "-y", "ppa:mythbuntu/testing"])
+                self.config.set("cfg", "ActivateMythbuntuUpdates", False)
+        if "XMLTV-Updates-Activated" in reconfigure:
+            if reconfigure["XMLTV-Updates-Activated"]:
+                subprocess.call(["apt-add-repository", "-y", "ppa:mythbuntu/xmltv"])
+                self.config.set("cfg", "ActivateXMLTVUpdates", True)
+            else:
+                subprocess.call(["apt-add-repository", "-r", "-y", "ppa:mythbuntu/xmltv"])
+                self.config.set("cfg", "ActivateXMLTVUpdates", False)
+        with open('/etc/default/mythbuntu-repos', 'wb') as configfile:
+            self.config.write(configfile)
+        

=== added file 'plugins/python/mythexport.py'
--- plugins/python/mythexport.py	1970-01-01 00:00:00 +0000
+++ plugins/python/mythexport.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,99 @@
+## -*- coding: utf-8 -*-
+#
+# «MythExport» - A MythExport Plugin for MCC
+#
+# Copyright (C) 2009, John Baab, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import gtk
+import os
+
+class MythExportPlugin(MCCPlugin):
+    """A plugin to enable or disable mythexport"""
+    #
+    #Load GUI & Calculate Changes
+    #
+    CONFIGFILE = "/etc/default/mythexport-install"
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "MythExport"
+        information["icon"] = "gtk-leave-fullscreen"
+        information["ui"] = "tab_mythexport"
+        MCCPlugin.__init__(self,information)
+        import ConfigParser
+        self.config = ConfigParser.ConfigParser()
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        import os
+        self.changes = {}
+        self.changes['mythexport'] = self.query_installed('mythexport')
+
+        if os.path.exists(self.CONFIGFILE):
+            self.config.read(self.CONFIGFILE)
+            self.changes['dir'] = self.config.get("cfg", "dir")
+        else:
+            self.changes['dir'] = "/var/lib/mythtv/"
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        self.mythexport_checkbox.set_active(self.changes['mythexport'])
+        self.export_dir.set_current_folder(self.changes['dir'])
+        if self.changes['mythexport']:
+            self.configuration_linkbutton.show()
+            self.export_dir.set_sensitive(True);
+        else:
+            self.configuration_linkbutton.hide()
+            self.export_dir.set_sensitive(False);
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        MCCPlugin.clearParentState(self)
+        if self.mythexport_checkbox.get_active() != self.changes['mythexport']:
+            if self.mythexport_checkbox.get_active():
+                self._markInstall('mythexport') 
+                self._markReconfigureRoot('dir',self.export_dir.get_filename())            
+            else:
+                self._markRemove('mythexport')
+        elif self.mythexport_checkbox.get_active() == True and self.export_dir.get_filename() != self.changes['dir']:
+            self._markReconfigureRoot('dir',self.export_dir.get_filename())
+
+    #
+    # Process selected activities
+    #
+
+    def root_scripted_changes(self,reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+        if os.path.exists(self.CONFIGFILE):
+          self.config.read(self.CONFIGFILE)
+        else:
+          self.config.add_section("cfg")
+        for item in reconfigure:
+            self.config.set("cfg", item, reconfigure[item]) 
+
+        with open(self.CONFIGFILE, 'wb') as configfile:
+          self.config.write(configfile)
+        os.system("DEBIAN_FRONTEND=noninteractive dpkg-reconfigure mythexport")
+
+

=== added file 'plugins/python/plugins.py'
--- plugins/python/plugins.py	1970-01-01 00:00:00 +0000
+++ plugins/python/plugins.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,190 @@
+## -*- coding: utf-8 -*-
+#
+# «plugins» - MCC & MythTV Plugin enablement plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+from gtk import SENSITIVE
+import os
+import string
+import logging
+import ConfigParser
+
+from mythbuntu_common.dictionaries import *
+
+class MythPluginsPlugin(MCCPlugin):
+    """A tool for enabling different MythTV plugins"""
+
+    CONFIGFILE = "/etc/default/mythweb"
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Plugins"
+        information["icon"] = "gtk-add"
+        information["ui"] = "tab_plugins"
+        self.config = ConfigParser.ConfigParser()
+        MCCPlugin.__init__(self,information)
+
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        #Dictionaries
+        self.dictionary_state={}
+        for list in get_frontend_plugin_dictionary(self), \
+                    get_backend_plugin_dictionary(self):
+            for item in list:
+                self.dictionary_state[list[item]]=self.query_installed(item)
+
+        #Mythweb auth
+        self.mythweb_auth={}
+        found_cfg=False
+        if os.path.exists(self.CONFIGFILE):
+            self.config.read(self.CONFIGFILE)
+            try:
+                self.mythweb_auth['enable'] = self.config.getboolean("cfg", "enable")
+                self.mythweb_auth['user'] = self.config.getboolean("cfg", "username")
+                self.mythweb_auth['pass'] = self.config.getboolean("cfg", "password")
+                found_cfg=True
+            except Exception:
+                pass
+        if not found_cfg:
+            self.mythweb_auth['enable'] = os.path.exists('/etc/mythtv/mythweb-digest')
+            self.mythweb_auth['user'] = ""
+            self.mythweb_auth['pass'] = ""
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+
+        #Load the detected dictionary
+        for item in self.dictionary_state:
+            item.set_active(self.dictionary_state[item])
+
+        #Mythweb auth
+        self.password_table.hide()
+        self.mythweb_username.set_text("")
+        self.mythweb_password.set_text("")
+        self.mythweb_password_combobox.remove_text(2)
+        if self.mythweb_auth['enable']:
+            self.mythweb_password_combobox.set_active(1)
+            self.mythweb_password_combobox.append_text("Reconfigure")
+        else:
+            self.mythweb_password_combobox.set_active(0)
+
+        self.toggle_plugins(self.mythweb_checkbox)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        #Installable items
+        for list in get_frontend_plugin_dictionary(self), \
+                    get_backend_plugin_dictionary(self):
+            for item in list:
+                if list[item].get_active() != self.dictionary_state[list[item]]:
+                    if list[item].get_active():
+                        self._markInstall(item)
+                    else:
+                        self._markRemove(item)
+
+        #Mythweb auth
+        if self.mythweb_password_combobox.get_active() != self.mythweb_auth['enable']:
+            self._markReconfigureRoot("mythweb_auth",self.mythweb_password_combobox.get_active() > 0)
+        if self.mythweb_password_combobox.get_active():
+            if self.mythweb_username.get_text() != self.mythweb_auth['user']:
+                self._markReconfigureRoot("mythweb_user",self.mythweb_username.get_text())
+            if self.mythweb_password.get_text() != self.mythweb_auth['pass']:
+                self._markReconfigureRoot("mythweb_password",self.mythweb_password.get_text())
+
+    def toggle_plugins(self,widget):
+        if widget is not None:
+            if widget.get_name() == 'selectall_plugins_checkbox':
+                toggle=widget.get_active()
+                for list in get_frontend_plugin_dictionary(self), get_backend_plugin_dictionary(self):
+                    for item in list:
+                        if list[item].flags() & SENSITIVE:
+                            list[item].set_active(toggle)
+
+            elif widget.get_name() == "mythweb_checkbox":
+                self.mythweb_password_combobox.set_sensitive(widget.get_active())
+                if not widget.get_active():
+                    self.mythweb_password_combobox.set_active(0)
+
+            elif widget.get_name() == "mythweb_username" or \
+                 widget.get_name() == "mythweb_password":
+                username = self.mythweb_username.get_text().split(' ')[0]
+                password = self.mythweb_password.get_text().split(' ')[0]
+                if self.mythweb_password_combobox.get_active() != 2 or \
+                   (len(username) > 0 and len(password) > 0):
+                    self._incomplete=False
+                else:
+                    self._incomplete=True
+
+            elif widget.get_name() == "mythweb_password_combobox":
+                iteration=1
+                if self.mythweb_auth['enable']:
+                    iteration = 2
+                if widget.get_active() == iteration:
+                    self.password_table.show()
+                    self._incomplete=True
+                else:
+                    self.mythweb_username.set_text("")
+                    self.mythweb_password.set_text("")
+                    self.password_table.hide()
+                    self._incomplete=False
+
+    def root_scripted_changes(self,reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+
+        found_cfg = False
+        if os.path.exists(self.CONFIGFILE):
+            try:
+                self.config.read(self.CONFIGFILE)
+                found_cfg = True
+            except Exception:
+                pass
+        if not found_cfg:
+            self.config.add_section("cfg")
+            self.config.set("cfg", "enable", "false")
+            self.config.set("cfg", "only", "false")
+            self.config.set("cfg", "username", "")
+            self.config.set("cfg", "password", "")
+
+        for item in reconfigure:
+            if item == "mythweb_auth":
+                if not reconfigure[item]:
+                    if os.path.exists('/etc/mythtv/mythweb-digest'):
+                        os.remove('/etc/mythtv/mythweb-digest')
+                    self.config.set("cfg", "enable", "false")
+                else:
+                    self.config.set("cfg", "enable", "true")
+            elif item == "mythweb_user":
+                self.config.set("cfg", "username", reconfigure[item])
+            elif item == "mythweb_password":
+                self.config.set("cfg", "password", reconfigure[item])
+
+        with open(self.CONFIGFILE, 'wb') as configfile:
+            self.config.write(configfile)
+        os.system("dpkg-reconfigure -fnoninteractive mythweb")
+

=== added file 'plugins/python/proprietary_codecs.py'
--- plugins/python/proprietary_codecs.py	1970-01-01 00:00:00 +0000
+++ plugins/python/proprietary_codecs.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,88 @@
+## -*- coding: utf-8 -*-
+#
+# «proprietary_codecs» - MCC Proprietary Codecs enablement plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import commands
+import re
+import os
+import logging
+from mythbuntu_common.dictionaries import *
+
+class ProprietaryCodecsPlugin(MCCPlugin):
+    """Proprietary Codec Enablement"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Proprietary Codecs"
+        information["icon"] = "gtk-dialog-warning"
+        information["ui"] = "tab_proprietary_codecs"
+        MCCPlugin.__init__(self,information)
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        #Dictionaries
+        self.dictionary_state={}
+        list=get_nonfree_dictionary(self)
+        for item in list:
+            self.dictionary_state[list[item]]=self.query_installed(item)
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        #Load the detected dictionary
+        for item in self.dictionary_state:
+            item.set_active(self.dictionary_state[item])
+
+        self.proprietary_codecs.set_sensitive(True)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        #Installable items
+        list=get_nonfree_dictionary(self)
+        for item in list:
+            if list[item].get_active() != self.dictionary_state[list[item]]:
+                if list[item].get_active():
+                    self._markReconfigureRoot("DVD Support",self.enable_libdvdcss2.get_active())
+                else:
+                    self._markRemove(item)
+
+
+    def search(self,path, filename):
+        for root, dirs, files in os.walk(path):
+            if filename in files:
+                rootpath = root
+        return rootpath
+
+    def root_scripted_changes(self,reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+        os.environ['PATH']='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
+        for item in reconfigure:
+            if item == "DVD Support":
+                csspath = self.search("/usr/share/doc/", "install-css.sh")
+                run = subprocess.Popen([csspath+'/install-css.sh'])
+                run.communicate()

=== added file 'plugins/python/remote.py'
--- plugins/python/remote.py	1970-01-01 00:00:00 +0000
+++ plugins/python/remote.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,305 @@
+## -*- coding: utf-8 -*-
+#
+# «remote» - MCC Infrared device selection plugin
+#
+# Copyright (C) 2010, John Baab, for Mythbuntu
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+
+from mythbuntu_common.lirc import LircHandler
+import gtk
+import os
+import subprocess
+import logging
+
+class RemotePlugin(MCCPlugin):
+    """A GUI configuration tool for LIRC"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Infrared"
+        information["icon"] = "gtk-media-record"
+        information["ui"] = "tab_remote_control"
+        MCCPlugin.__init__(self,information)
+
+        self.count={}
+        self.count["remote"]=0
+        self.count["transmitter"]=0
+
+    #Helper functions
+    def populate_lirc(self):
+        """Fills the lirc pages with the appropriate data"""
+        def fill_array(list,possible_items):
+            """Fills an individual array up"""
+            count=0
+            for item in possible_items:
+                list.append_text(item)
+                count = count + 1
+            list.set_active(0)
+            return count
+
+        for type in ('remote','transmitter'):
+            self.count[type]=fill_array(self.builder.get_object(type + '_list'), \
+                                        self.lirc.get_possible_devices(type))
+
+    def find_lircrc(self):
+        """Determines if there is current a lircrc for the current user"""
+        return os.path.exists(os.getenv('HOME') + '/.lircrc')
+
+    #Inherited, overridden functions
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin"""
+        #Parent functionality for state capturing
+        MCCPlugin.clearParentState(self)
+        #If this is a first run of capturing, we might need to fill
+        #in our remote_count
+        self.state = {}
+        for item in ['lirc','mythbuntu-lirc-generator']:
+            self.state[item] = self.query_installed(item)
+
+        #TODO, detect smartphone type somehow.
+        self.state['type'] = 'native'
+
+        if self.state['lirc']:
+            self.state['type'] = 'lirc'
+            if self.count["remote"] is 0:
+                self.lirc=LircHandler()
+                self.populate_lirc()
+            #Read in our /etc/lirc/hardware.conf
+            self.lirc.read_hardware_conf()
+
+
+
+    def applyStateToGUI(self):
+        """Takes the current state in formation and sets the GUI"""
+
+        def match_object(saved_setting,list,count):
+            """Attempts to match a saved object to a GTK list of objects"""
+            if saved_setting is "Custom":
+                return True
+            elif saved_setting != "None":
+                for item in range(count):
+                    list.set_active(item)
+                    if list.get_active_text() == saved_setting:
+                        return True
+            return False
+
+        def load_custom(type,dictionary):
+            """Loads a custom remote or transmitter into the GUI"""
+            modules=self.builder.get_object(type + '_modules')
+            device=self.builder.get_object(type + '_device')
+            driver=self.builder.get_object(type + '_driver')
+            conf=self.builder.get_object('browse_' + type + '_lircd_conf')
+            modules.set_text(dictionary[type + "_modules"])
+            driver.set_text(dictionary[type + "_driver"])
+            device.set_text(dictionary[type + "_device"])
+            conf.select_filename("/usr/share/lirc/" + type )
+            if os.path.exists("/usr/share/lirc/" + type + '/' + dictionary[type + "_lircd_conf"]):
+                conf.select_filename("/usr/share/lirc/" + type + '/' + dictionary[type + "_lircd_conf"])
+
+        if self.state['type'] == 'lirc':
+            self.smartphone_vbox.set_sensitive(False)
+            self.lirc_vbox.set_sensitive(True)
+            self.lirc_support.set_active(True)
+            for type in ('remote','transmitter'):
+                dict=self.lirc.get_device_dictionary(type)
+                list=self.builder.get_object(type + '_list')
+                checkbox=self.builder.get_object(type + 'control')
+                found=match_object(dict[type],list,self.count[type])
+                checkbox.set_active(found)
+                self.toggle_ir(checkbox,True)
+
+                #"Custom" support
+                load_custom(type,dict)
+        elif self.state['type'] == 'native':
+            self.lirc_vbox.set_sensitive(False)
+            self.smartphone_vbox.set_sensitive(False)
+        else:
+            self.lirc_vbox.set_sensitive(False)
+            self.smartphone_vbox.set_sensitive(True)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        def test_basic_changes(type):
+            """Test for changes in a regular remote or transmitter"""
+            old=self.lirc.get_device_dictionary(type)[type]
+            current=self.builder.get_object(type + '_list').get_active_text()
+            if old != current:
+                self._markReconfigureRoot(type,current)
+            return current
+
+        def test_custom_changes(type):
+            """Tests for changes in a custom remote or transmitter"""
+            old={}
+            new={}
+            old['modules']=self.lirc.get_device_dictionary(type)[type + "_modules"]
+            old['device']=self.lirc.get_device_dictionary(type)[type + "_device"]
+            old['driver']=self.lirc.get_device_dictionary(type)[type + "_driver"]
+            old['lircd_conf']=self.lirc.get_device_dictionary(type)[type + "_lircd_conf"]
+            new['modules']=self.builder.get_object(type + '_modules').get_text()
+            new['device']=self.builder.get_object(type + '_device').get_text()
+            new['driver']=self.builder.get_object(type + '_driver').get_text()
+            new['lircd_conf']=self.builder.get_object('browse_' + type + '_lircd_conf').get_filename()
+            for item in old:
+                if old[item] != new[item]:
+                    self._markReconfigureRoot(type + '_'+ item,new[item])
+
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        #check for type changes
+        if self.native_support.get_active():
+            radio = 'native'
+        elif self.lirc_support.get_active():
+            radio = 'lirc'
+        else:
+            radio = 'smartphone'
+
+        #figure out if we are installing lirc or removing it
+        if self.state['type'] != radio:
+                if radio == 'lirc' and not self.state['lirc']:
+                    self._markInstall('lirc')
+                elif self.state['lirc']:
+                    self._markRemove('lirc')
+
+        if self.state['lirc']:
+            for type in ('remote','transmitter'):
+                value = test_basic_changes(type)
+                if value == 'Custom':
+                    test_custom_changes(type)
+
+            if self.generate_lircrc_checkbox.get_active():
+                if not self.state['mythbuntu-lirc-generator']:
+                    self._markInstall('mythbuntu-lirc-generator')
+                if self.enable_irexec_checkbox.get_active():
+                    self._markReconfigureUser("generate_lircrc_irexec", True)
+                else:
+                    self._markReconfigureUser("generate_lircrc",True)
+            elif self.enable_irexec_checkbox.get_active():
+                if not self.state['mythbuntu-lirc-generator']:
+                    self._markInstall('mythbuntu-lirc-generator')
+                self._markReconfigureUser("generate_lircrc_irexec_only", True)
+
+    def toggle_ir(self,widget,internal=False):
+        """Callback used for any widgets in the remote plugin"""
+
+        def toggle_active_section(widget,type):
+            """Turns on or off an IR remote"""
+            hbox=self.builder.get_object(type + '_hbox')
+            list=self.builder.get_object(type + '_list')
+            hbox.set_sensitive(widget.get_active())
+            if widget.get_active():
+                if list.get_active() == 0:
+                    list.set_active(1)
+            else:
+                list.set_active(0)
+
+        def toggle_active_object_selection(widget,type):
+            """Toggles the active device selection and related items"""
+            control=self.builder.get_object(type + 'control')
+            list=self.builder.get_object(type + '_list')
+            driver=self.builder.get_object(type + '_driver_hbox')
+            modules=self.builder.get_object(type + '_modules_hbox')
+            device=self.builder.get_object(type + '_device_hbox')
+            config=self.builder.get_object(type + '_configuration_hbox')
+
+            if list.get_active_text() == "Custom":
+                custom = True
+            else:
+                custom = False
+                if list.get_active() == 0:
+                    control.set_active(False)
+                    return False
+
+            for item in (driver, modules, device, config):
+                if custom:
+                    item.show()
+                else:
+                    item.hide()
+            return True
+
+        if internal and self.find_lircrc():
+            self.generate_lircrc_checkbox.set_active(False)
+            self.enable_irexec_checkbox.set_active(False)
+
+        if widget is not None:
+            #toggle types on the page
+            if type(widget) is gtk.RadioButton:
+                #they all have callbacks, only use the active one
+                if widget.get_active():
+                    name = widget.get_name()
+                    if name == 'native_support':
+                        self.smartphone_vbox.set_sensitive(False)
+                        self.lirc_vbox.set_sensitive(False)
+                    elif name == 'smartphone_support':
+                        self.smartphone_vbox.set_sensitive(True)
+                        self.lirc_vbox.set_sensitive(False)
+                    #the lirc package needs to be installed to show this
+                    elif self.state['lirc']:
+                        self.smartphone_vbox.set_sensitive(False)
+                        self.lirc_vbox.set_sensitive(True)
+
+            #turn on/off IR remote
+            elif widget.get_name() == 'remotecontrol':
+                toggle_active_section(widget,"remote")
+
+            #turn on/off IR transmitter
+            elif widget.get_name() == "transmittercontrol":
+                toggle_active_section(widget,"transmitter")
+
+            #if our selected remote itself changed
+            elif widget.get_name() == 'remote_list':
+                if toggle_active_object_selection(widget,"remote"):
+                    self.generate_lircrc_checkbox.set_active(True)
+                else:
+                    self.generate_lircrc_checkbox.set_active(False)
+
+            #if our selected transmitter itself changed
+            elif widget.get_name() == 'transmitter_list':
+                toggle_active_object_selection(widget,"transmitter")
+
+    def user_scripted_changes(self,reconfigure):
+        """Local changes that can be performed by the user account.
+           This function will be ran by the frontend."""
+        for item in reconfigure:
+            if item == "generate_lircrc":
+                self.lirc.create_lircrc(change_permissions=False)
+            elif item == "generate_lircrc_irexec":
+                self.lirc.create_lircrc(change_permissions=False,irexec=True)
+            elif item == "generate_lircrc_irexec_only":
+                self.lirc.create_lircrc(change_permissions=False,irexec=True,irexec_only=True)
+
+    def root_scripted_changes(self,reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+        lirc=LircHandler()
+        found = False
+        for item in reconfigure:
+            if item == "remote" or item == "transmitter":
+                logging.debug("Setting item %s to %s." % (item,reconfigure[item]))
+                lirc.set_device({item:reconfigure[item]},item)
+                found = True
+        if found:
+            logging.debug("Writing out /etc/lirc/hardware.conf")
+            lirc.write_hardware_conf()
+            logging.debug("Reconfiguring LIRC package")
+            lirc.reconfigure_lirc(interactive=False)
+        return found

=== added file 'plugins/python/services.py'
--- plugins/python/services.py	1970-01-01 00:00:00 +0000
+++ plugins/python/services.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,146 @@
+## -*- coding: utf-8 -*-
+#
+# «services» - MCC Services enablement plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+from mythbuntu_common.dictionaries import get_services_dictionary
+from mythbuntu_common.vnc import VNCHandler
+from mythbuntu_common.mysql import MySQLHandler
+import re
+import shutil
+import os
+
+class MCCServices(MCCPlugin):
+    """Services enablement plugin"""
+
+    def __init__(self):
+        information = {}
+        information["name"] = "Services"
+        information["icon"] = "gnome-settings"
+        information["ui"] = "tab_services"
+        MCCPlugin.__init__(self,information)
+        self.vnc=VNCHandler()
+        self.mysql=MySQLHandler()
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        #Most services meet this category
+        self.dictionary_state={}
+        list = get_services_dictionary(self)
+        for item in list:
+            if list[item] is not None:     
+                self.dictionary_state[list[item]]=self.query_installed(item)
+
+        #VNC password
+        self.vnc_pass=''
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        #from previous runs
+        self.vnc_pass_hbox.hide()
+
+        #Load the detected dictionary
+        for item in self.dictionary_state:
+            item.remove_text(2)
+            if self.dictionary_state[item]:
+                item.set_active(1)
+                item.append_text("Reconfigure")
+            else:
+                item.set_active(0)
+
+        #Corner cases that don't need reconfiguring
+        self.enablessh.remove_text(2)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        list=get_services_dictionary(self)
+        for item in list:
+            if list[item] is not None and \
+               list[item].get_active() != self.dictionary_state[list[item]]:
+                #Installable items
+                if list[item].get_active() == 1:
+                    self._markInstall(item)
+                #Removable items
+                elif list[item].get_active() == 0:
+                    self._markRemove(item)
+
+                #Reconfigurable items:
+                if list[item].get_active() > 0  and \
+                   item != 'openssh-server'     and \
+                   item != 'x11vnc':
+                    self._markReconfigureRoot(item,list[item].get_active())
+
+        #VNC password
+        if self.vnc_pass != self.vnc_password.get_text():
+            self._markReconfigureUser("x11vnc_password",self.vnc_password.get_text())
+
+    def toggle_vnc(self,widget):
+        """Called whenever VNC service is toggled"""
+        if (widget is not None and widget.get_name() == 'enablevnc'):
+            iteration=1
+            if self.dictionary_state[self.enablevnc]:
+                iteration = 2
+            if widget.get_active() == iteration:
+                self.vnc_pass_hbox.show()
+                self.vnc_error_image.show()
+                self._incomplete=True
+            else:
+                self.vnc_password.set_text("")
+                self.vnc_pass_hbox.hide()
+                self.vnc_error_image.hide()
+                self._incomplete=False
+
+    def toggle_vnc_password(self,widget):
+        if (widget is not None and widget.get_name() == 'vnc_password'):
+            password= widget.get_text().split(' ')[0]
+            if len(password) >= 6:
+                self.vnc_error_image.hide()
+                self._incomplete=False
+            else:
+                self.vnc_error_image.show()
+                self._incomplete=True
+
+    def root_scripted_changes(self,reconfigure):
+        """System-wide changes that need root access to be applied.
+           This function is ran by the dbus backend"""
+        for item in reconfigure:
+            if item == "samba":
+                if os.path.exists('/etc/samba/smb.conf'):
+                    shutil.copy('/etc/samba/smb.conf','/etc/samba/smb.conf.dpkg-dist')
+                shutil.copy('/usr/share/mythbuntu/examples/smb.conf.dist',
+                            '/etc/samba/smb.conf')
+            elif item == "nfs-kernel-server":
+                if os.path.exists('/etc/exports'):
+                    shutil.copy('/etc/exports','/etc/exports.dpkg-dist')
+                shutil.copy('/usr/share/mythbuntu/examples/exports.dist',
+                            '/etc/exports')
+
+    def user_scripted_changes(self,reconfigure):
+        """Local changes that can be performed by the user account.
+           This function will be ran by the frontend"""
+        for item in reconfigure:
+            if item == "x11vnc_password":
+                self.vnc.create_password(reconfigure[item])

=== added file 'plugins/python/startup_behavior.py'
--- plugins/python/startup_behavior.py	1970-01-01 00:00:00 +0000
+++ plugins/python/startup_behavior.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,83 @@
+## -*- coding: utf-8 -*-
+#
+# «startup_behavior» - MCC Automatic Login enablement plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import os
+import string
+import re
+
+class LoginPlugin(MCCPlugin):
+    """A plugin for setting up automatic login"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Startup Behavior"
+        information["icon"] = "emblem-desktop"
+        information["ui"] = "tab_startup_behavior"
+        self.user_count=0
+        MCCPlugin.__init__(self,information)
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        self.en_gdm=os.path.exists('/usr/bin/gdmsetup')
+        self.autostart_state=os.path.exists(os.environ['HOME'] + '/.config/autostart/mythtv.desktop')
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        self.gdmsetup_button.set_sensitive(self.en_gdm)
+        self.enableautostartup.set_active(self.autostart_state)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        if self.autostart_state != self.enableautostartup.get_active():
+            self._markReconfigureUser("autostartup",self.enableautostartup.get_active())
+
+    def launch_app(self,widget):
+        """Launches an external application"""
+        if widget is not None:
+            if widget.get_name() == "gdmsetup_button":
+                MCCPlugin.launch_app(self,widget,"gdmsetup")
+
+
+    def user_scripted_changes(self,reconfigure):
+        """Local changes that can be performed by the user account.
+           This function will be ran by the frontend"""
+        for item in reconfigure:
+            if item == 'autostartup':
+                home = os.environ['HOME']
+                if reconfigure[item]:
+                    if not os.path.exists(home + '/.config/autostart'):
+                        os.makedirs(home + '/.config/autostart')
+                    if not os.path.exists(home + '/.config/autostart/mythtv.desktop'):
+                        try:
+                            os.symlink('/usr/share/applications/mythtv.desktop',home + '/.config/autostart/mythtv.desktop')
+                        except OSError:
+                            os.unlink(home + '/.config/autostart/mythtv.desktop')
+                            os.symlink('/usr/share/applications/mythtv.desktop',home + '/.config/autostart/mythtv.desktop')
+                elif os.path.exists(home + '/.config/autostart/mythtv.desktop'):
+                    os.remove(home + '/.config/autostart/mythtv.desktop')

=== added file 'plugins/python/system_roles.py'
--- plugins/python/system_roles.py	1970-01-01 00:00:00 +0000
+++ plugins/python/system_roles.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,109 @@
+## -*- coding: utf-8 -*-
+#
+# «roles» - MCC System Role selector plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+from gtk import RadioButton
+
+from mythbuntu_common.dictionaries import *
+
+class SystemRolesPlugin(MCCPlugin):
+    """A tool for adjusting the role of a system"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "System Roles"
+        information["icon"] = "gnome-monitor"
+        information["ui"] = "tab_system_roles"
+        MCCPlugin.__init__(self,information)
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        #We can't really represent no backend or no frontend well yet
+        self.no_back=True
+        self.no_front=True
+
+        #Dictionaries
+        self.dictionary_state={}
+        for list in get_role_dictionary(self), \
+                    get_diskless_dictionary(self), \
+                    get_desktop_dictionary(self):
+            for item in list:
+                self.dictionary_state[list[item]]=self.query_installed(item)
+                if "backend" in item and self.dictionary_state[list[item]]:
+                    self.no_back=False
+                elif "frontend" in item and self.dictionary_state[list[item]]:
+                    self.no_front=False
+
+        #corner case
+        if self.dictionary_state[self.primary_backend_radio]:
+            self.dictionary_state[self.secondary_backend_radio]=False
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        #Load the detected dictionary
+        for item in self.dictionary_state:
+            if self.dictionary_state[item]:
+                item.set_active(True)
+
+        #In case we don't have a front or back role
+        self.no_backend_radio.set_active(self.no_back)
+        self.no_frontend_radio.set_active(self.no_front)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        #Installable items
+        for list in get_diskless_dictionary(self), \
+                    get_desktop_dictionary(self):
+            for item in list:
+                if list[item].get_active() != self.dictionary_state[list[item]]:
+                    if list[item].get_active():
+                        self._markInstall(item)
+                    else:
+                        self._markRemove(item)
+
+        #backend unfortunately totally a corner case
+        if self.primary_backend_radio.get_active() != self.dictionary_state[self.primary_backend_radio]:
+            if self.primary_backend_radio.get_active():
+                self._markInstall('mythtv-backend-master')
+            else:
+                self._markRemove('mythtv-backend-master')
+                if not self.secondary_backend_radio.get_active():
+                    self._markRemove('mythtv-backend')
+        elif self.secondary_backend_radio.get_active() != self.dictionary_state[self.secondary_backend_radio]:
+            if self.secondary_backend_radio.get_active():
+                self._markInstall('mythtv-backend')
+            else:
+                self._markRemove('mythtv-backend')
+
+        if self.frontend_radio.get_active() != self.dictionary_state[self.frontend_radio]:
+            if self.frontend_radio.get_active():
+                self._markInstall('mythtv-frontend')
+            else:
+                self._markRemove('mythtv-frontend')
+
+

=== added file 'plugins/python/system_updates.py'
--- plugins/python/system_updates.py	1970-01-01 00:00:00 +0000
+++ plugins/python/system_updates.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,88 @@
+## -*- coding: utf-8 -*-
+#
+# «system_updates» - MCC Plugin for administration of updates
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+import os
+import gconf
+import gobject
+
+UPDATE_NOTIFIER_KEY="/apps/update-notifier/auto_launch"
+
+class SystemUpdatesPlugin(MCCPlugin):
+    """A plugin for performing a series of updates"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "System Updates"
+        information["icon"] = "update-manager"
+        information["ui"] = "tab_system_updates"
+        self.user_count=0
+        self.gconfclient = gconf.client_get_default()
+        MCCPlugin.__init__(self,information)
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        #Check packages installed for turning on a few buttons
+        self.synaptic=self.query_installed('synaptic')
+        self.updatemanager=self.query_installed('update-manager')
+        try:
+            self.update_manager_background = self.gconfclient.get_bool(UPDATE_NOTIFIER_KEY)
+        except gobject.GError, e:
+            logging.warning(_("Error pulling gconf status for update notifier"))
+            self.update_manager_background = True
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        self.synaptic_button.set_sensitive(self.synaptic)
+        self.updatemanager_button.set_sensitive(self.updatemanager)
+        if self.update_manager_background:
+            self.background_radio.set_active(True)
+        else:
+            self.notification_icon_radio.set_active(True)
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        if self.update_manager_background != self.background_radio.get_active():
+            self._markReconfigureUser("update_manager_background",self.background_radio.get_active())
+
+    def launch_app(self,widget):
+        """Launches an application"""
+        if widget is not None:
+            if widget.get_name() == 'updatemanager_button':
+                MCCPlugin.launch_app(self,widget,"update-manager")
+            elif widget.get_name() == 'synaptic_button':
+                MCCPlugin.launch_app(self,widget,"gksudo synaptic")
+            elif widget.get_name() == 'terminal_button':
+                MCCPlugin.launch_app(self,widget,"x-terminal-emulator")
+
+    def user_scripted_changes(self,reconfigure):
+        """Local changes that can be performed by the user account.
+           This function will be ran by the frontend."""
+        for item in reconfigure:
+            if item == "update_manager_background":
+                self.gconfclient.set_bool(UPDATE_NOTIFIER_KEY,reconfigure[item])

=== added file 'plugins/python/themes.py'
--- plugins/python/themes.py	1970-01-01 00:00:00 +0000
+++ plugins/python/themes.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,78 @@
+## -*- coding: utf-8 -*-
+#
+# «themes» - MCC Themes enablement plugin
+#
+# Copyright (C) 2009, Mario Limonciello, for Mythbuntu
+#
+#
+# Mythbuntu is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this application; if not, write to the Free Software Foundation, Inc., 51
+# Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##################################################################################
+
+from MythbuntuControlCentre.plugin import MCCPlugin
+from gtk import SENSITIVE
+
+from mythbuntu_common.dictionaries import *
+
+class ThemesPlugin(MCCPlugin):
+    """Theme enablement"""
+
+    def __init__(self):
+        #Initialize parent class
+        information = {}
+        information["name"] = "Themes"
+        information["icon"] = "gtk-select-color"
+        information["ui"] = "tab_themes"
+        MCCPlugin.__init__(self,information)
+
+    def captureState(self):
+        """Determines the state of the items on managed by this plugin
+           and stores it into the plugin's own internal structures"""
+        #Dictionaries
+        self.dictionary_state={}
+        for list in get_theme_dictionary(self), \
+                    get_artwork_dictionary(self):
+            for item in list:
+                self.dictionary_state[list[item]]=self.query_installed(item)
+
+    def applyStateToGUI(self):
+        """Takes the current state information and sets the GUI
+           for this plugin"""
+        #Load the detected dictionary
+        for item in self.dictionary_state:
+            item.set_active(self.dictionary_state[item])
+
+    def compareState(self):
+        """Determines what items have been modified on this plugin"""
+        #Prepare for state capturing
+        MCCPlugin.clearParentState(self)
+
+        #Installable items
+        for list in get_theme_dictionary(self), \
+                    get_artwork_dictionary(self):
+            for item in list:
+                if list[item].get_active() != self.dictionary_state[list[item]]:
+                    if list[item].get_active():
+                        self._markInstall(item)
+                    else:
+                        self._markRemove(item)
+
+    def toggle_meta(self,widget):
+        """Toggles a large set of options at once"""
+        if widget is not None:
+            list=get_theme_dictionary(self)
+            toggle=widget.get_active()
+            for item in list:
+                if list[item].flags() & SENSITIVE:
+                    list[item].set_active(toggle)

=== added directory 'plugins/ui'
=== added file 'plugins/ui/tab_graphics_drivers.ui'
--- plugins/ui/tab_graphics_drivers.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_graphics_drivers.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,300 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_graphics_drivers">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="graphics_drivers_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Graphics Drivers&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator6">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox11">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="graphics_drivers_description">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Restricted Graphics Drivers can provide enhanced performance during High Definition Video playback and Menu Effects.  They are also required for TV-Output.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="graphics_drivers_vbox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Restricted Drivers Manager&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="restricted_drivers_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment10">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox11">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image10">
+                                <property name="visible">True</property>
+                                <property name="icon_name">jockey</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label10">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Launch Restricted Drivers Manager</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="nvidia_vbox">
+            <property name="visible">True</property>
+            <property name="sensitive">False</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label6">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;NVIDIA Driver Configuration Utility&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment6">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="nvidia_settings_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment7">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox3">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image3">
+                                <property name="visible">True</property>
+                                <property name="icon_name">gnome-settings-theme</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label7">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Launch NVIDIA Settings</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="amd_vbox">
+            <property name="visible">True</property>
+            <property name="sensitive">False</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label8">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;AMD Catalyst Control Center&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment8">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="amdcccle_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment9">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox4">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image4">
+                                <property name="visible">True</property>
+                                <property name="stock">gtk-index</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label9">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Launch AMDCCCLE</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_mysql_configuration.ui'
--- plugins/ui/tab_mysql_configuration.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_mysql_configuration.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,473 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkListStore" id="model1">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Disable</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Enable</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkVBox" id="tab_mysql_configuration">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="mysql_configuration_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;MySQL Configuration&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator6">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox11">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkVBox" id="master_backend_vbox">
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="master_backend_role">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Master Backend Role&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment6">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkHBox" id="mysql_option_hbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment8">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="yalign">0</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkComboBox" id="enablemysql">
+                            <property name="width_request">110</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="model">model1</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer1"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="enablemysql_label">
+                        <property name="width_request">375</property>
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">MySQL service on ethernet interfaces (required for remote Frontend or Backend)</property>
+                        <property name="use_markup">True</property>
+                        <property name="wrap">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="padding">32</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment13">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="mysql_tweak_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment14">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox12">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image11">
+                                <property name="visible">True</property>
+                                <property name="stock">gtk-properties</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label13">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Optimize Tables</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment4">
+                <property name="visible">True</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="enable_mysql_repair">
+                    <property name="label" translatable="yes">Enable daily MySQL DB Optimize/Repair cron job</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment3">
+                <property name="visible">True</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="enable_mysql_tweaks">
+                    <property name="label" translatable="yes">Enable MySQL performance tweaks</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">4</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="backend_vbox">
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Backend Role&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="mythtv_setup_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment10">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox11">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image10">
+                                <property name="visible">True</property>
+                                <property name="icon_name">gnome-settings-theme</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label10">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Launch MythTV Setup</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="connectivity_vbox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Remote Connectivity&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">In order to connect remotely, your backend must have a 4 digit security key set.  You can view this key in mythtv-setup on the backend.</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkLabel" id="label4">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Security Key:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="security_entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">&#x25CF;</property>
+                    <property name="width_chars">4</property>
+                    <property name="text" translatable="yes">0000</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment5">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <child>
+                  <object class="GtkButton" id="connection_test">
+                    <property name="label" translatable="yes">Test Connection</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <property name="use_underline">True</property>
+                    <signal name="clicked" handler="do_connection_test"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="mysql_test_hbox">
+                <child>
+                  <object class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="left_padding">25</property>
+                    <property name="right_padding">25</property>
+                    <child>
+                      <object class="GtkLabel" id="connection_results_label">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">Test Results:</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkImage" id="pass_mysql">
+                    <property name="stock">gtk-yes</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkImage" id="fail_mysql">
+                    <property name="stock">gtk-no</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="connection_results">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">4</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_mythexport.ui'
--- plugins/ui/tab_mythexport.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_mythexport.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,190 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_mythexport">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="graphics_drivers_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;MythExport&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator6">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox11">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="label4">
+            <property name="width_request">525</property>
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">MythExport is a Perl daemon that can be used with MythTV to export recordings into a format playable on portable devices such as iPod Video, iPod Touch, PSP, and other devices.  For more information, or to see a full feature list, please use the 'Help / More Information' link below.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label8">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;b&gt;Available Actions&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment3">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="xscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkCheckButton" id="mythexport_checkbox">
+                <property name="label" translatable="yes">Enable MythExport</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="draw_indicator">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;b&gt;Required Installation Inputs&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment1">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="xscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="xpad">13</property>
+                <property name="label" translatable="yes">Choose a directory where you would like MythExport to store files:</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment5">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="xscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkFileChooserButton" id="export_dir">
+                <property name="visible">True</property>
+                <property name="action">select-folder</property>
+                <property name="show_hidden">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">5</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label3">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;b&gt;Additional Information&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="position">6</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment2">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="xscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkLinkButton" id="configuration_linkbutton">
+                <property name="label" translatable="yes">Launch Configuration Site</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="relief">none</property>
+                <property name="uri">http://localhost/mythexport</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">7</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment4">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="xscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkLinkButton" id="moreinfo_linkbutton">
+                <property name="label" translatable="yes">Help / More Informtion</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="relief">none</property>
+                <property name="uri">https://help.ubuntu.com/community/MythExport</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">8</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_plugins.ui'
--- plugins/ui/tab_plugins.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_plugins.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,477 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_plugins">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="plugins_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Plugins&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator27">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox32">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="plugins_description">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Plugins can be used to futher extend functionality of a Mythbuntu box.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;MythTV Plugins&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkVBox" id="vbox3">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">10</property>
+                    <child>
+                      <object class="GtkCheckButton" id="selectall_plugins_checkbox">
+                        <property name="label" translatable="yes">Enable/Disable All MythTV Plugins</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="toggle_plugins"/>
+                      </object>
+                      <packing>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkTable" id="table1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="n_rows">4</property>
+                        <property name="n_columns">3</property>
+                        <child>
+                          <object class="GtkCheckButton" id="mythweb_checkbox">
+                            <property name="label" translatable="yes">MythWeb</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                            <signal name="toggled" handler="toggle_plugins"/>
+                          </object>
+                          <packing>
+                            <property name="left_attach">2</property>
+                            <property name="right_attach">3</property>
+                            <property name="top_attach">2</property>
+                            <property name="bottom_attach">3</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythweather_checkbox">
+                            <property name="label" translatable="yes">MythWeather</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">2</property>
+                            <property name="right_attach">3</property>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythvideo_checkbox">
+                            <property name="label" translatable="yes">MythVideo</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">2</property>
+                            <property name="right_attach">3</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythmusic_checkbox">
+                            <property name="label" translatable="yes">MythMusic</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythmovies_checkbox">
+                            <property name="label" translatable="yes">MythMovies</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythnews_checkbox">
+                            <property name="label" translatable="yes">MythNews</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                            <property name="top_attach">3</property>
+                            <property name="bottom_attach">4</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythnetvision_checkbox">
+                            <property name="label" translatable="yes">MythNetvision</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                            <property name="top_attach">2</property>
+                            <property name="bottom_attach">3</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythgame_checkbox">
+                            <property name="label" translatable="yes">MythGame</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="top_attach">3</property>
+                            <property name="bottom_attach">4</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythgallery_checkbox">
+                            <property name="label" translatable="yes">MythGallery</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="top_attach">2</property>
+                            <property name="bottom_attach">3</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mythbrowser_checkbox">
+                            <property name="label" translatable="yes">MythBrowser</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="mytharchive_checkbox">
+                            <property name="label" translatable="yes">MythArchive</property>
+                            <property name="width_request">175</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="hbox1">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkComboBox" id="mythweb_password_combobox">
+                            <property name="visible">True</property>
+                            <property name="model">liststore1</property>
+                            <signal name="changed" handler="toggle_plugins"/>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer1"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="label3">
+                            <property name="visible">True</property>
+                            <property name="xpad">25</property>
+                            <property name="label" translatable="yes">Password Protect Mythweb</property>
+                          </object>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkTable" id="password_table">
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="n_rows">2</property>
+                        <property name="n_columns">2</property>
+                        <child>
+                          <object class="GtkLabel" id="mythweb_username_label">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Username</property>
+                          </object>
+                          <packing>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="x_padding">25</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="mythweb_password_label">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Password</property>
+                          </object>
+                          <packing>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="x_padding">25</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkAlignment" id="alignment2">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="xscale">0</property>
+                            <property name="yscale">0</property>
+                            <child>
+                              <object class="GtkEntry" id="mythweb_username">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                                <signal name="changed" handler="toggle_plugins"/>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkAlignment" id="alignment10">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="xscale">0</property>
+                            <property name="yscale">0</property>
+                            <child>
+                              <object class="GtkEntry" id="mythweb_password">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="visibility">False</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                                <signal name="changed" handler="toggle_plugins"/>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options"></property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox2">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Mythbuntu Control Centre (MCC) Plugins&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+  <object class="GtkListStore" id="liststore1">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Disable</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Enable</col>
+      </row>
+    </data>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_proprietary_codecs.ui'
--- plugins/ui/tab_proprietary_codecs.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_proprietary_codecs.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,134 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_proprietary_codecs">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="proprietary_codecs_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Proprietary Codec Support&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator27">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox32">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="proprietary_codec_warning">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;b&gt;NOTE&lt;/b&gt;: The packages installable on this page are not officially supported by Mythbuntu or Ubuntu  for legal reasons.  The Medibuntu team is responsible for them.  They are only provided here for convenience to Mythbuntu and Ubuntu users.</property>
+            <property name="use_markup">True</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">For more information, you can visit the Medibuntu website.</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="xscale">0</property>
+                <property name="yscale">0</property>
+                <property name="left_padding">25</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="proprietary_codecs">
+                <property name="visible">True</property>
+                <property name="sensitive">False</property>
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment3">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="xscale">0</property>
+                    <property name="yscale">0</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkCheckButton" id="enable_libdvdcss2">
+                        <property name="label" translatable="yes">Enable DVD Support (libdvdcss2)</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_remote_control.ui'
--- plugins/ui/tab_remote_control.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_remote_control.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,882 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_remote_control">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="spacing">3</property>
+    <child>
+      <object class="GtkVBox" id="remote_control_title">
+        <property name="visible">True</property>
+        <property name="spacing">3</property>
+        <child>
+          <object class="GtkLabel" id="remote_control_title_label">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Infrared Remotes and Transmitters&lt;/b&gt;&lt;/big&gt;</property>
+            <property name="use_markup">True</property>
+            <property name="single_line_mode">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHSeparator" id="hseparator1">
+            <property name="visible">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkRadioButton" id="native_support">
+        <property name="label" translatable="yes">No Additional Remote Support</property>
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="receives_default">False</property>
+        <property name="active">True</property>
+        <property name="draw_indicator">True</property>
+        <signal name="toggled" handler="toggle_ir"/>
+      </object>
+      <packing>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkAlignment" id="alignment10">
+        <property name="visible">True</property>
+        <property name="xalign">0</property>
+        <property name="left_padding">20</property>
+        <child>
+          <object class="GtkLabel" id="label4">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">If you don't have a remote right now, or it's supported natively.</property>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="position">2</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkRadioButton" id="smartphone_support">
+        <property name="label" translatable="yes">Use Android or iOS phone as a remote</property>
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="receives_default">False</property>
+        <property name="active">True</property>
+        <property name="draw_indicator">True</property>
+        <property name="group">native_support</property>
+        <signal name="toggled" handler="toggle_ir"/>
+      </object>
+      <packing>
+        <property name="position">3</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkAlignment" id="alignment15">
+        <property name="visible">True</property>
+        <property name="xalign">0</property>
+        <property name="left_padding">20</property>
+        <child>
+          <object class="GtkVBox" id="smartphone_vbox">
+            <property name="visible">True</property>
+            <property name="sensitive">False</property>
+            <child>
+              <object class="GtkLabel" id="label6">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Use your phone to scan the appropriate QR code to install the application on the phone.</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkTable" id="table1">
+                <property name="visible">True</property>
+                <property name="n_rows">2</property>
+                <property name="n_columns">2</property>
+                <child>
+                  <object class="GtkImage" id="mythmote">
+                    <property name="visible">True</property>
+                    <property name="pixbuf">/usr/share/mythbuntu/qr/mythmote.png</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkImage" id="mymote">
+                    <property name="visible">True</property>
+                    <property name="pixbuf">/usr/share/mythbuntu/qr/mymote.png</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label7">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Android Phones (Mythmote)</property>
+                    <property name="justify">center</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label8">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">iOS Phones (Mymote)</property>
+                    <property name="justify">center</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="position">4</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkRadioButton" id="lirc_support">
+        <property name="label" translatable="yes">USB &amp; Serial Remote support via LIRC (Linux Infrared Remote Control)</property>
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="receives_default">False</property>
+        <property name="active">True</property>
+        <property name="draw_indicator">True</property>
+        <property name="group">native_support</property>
+        <signal name="toggled" handler="toggle_ir"/>
+      </object>
+      <packing>
+        <property name="position">5</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkAlignment" id="alignment1">
+        <property name="visible">True</property>
+        <property name="left_padding">20</property>
+        <child>
+          <object class="GtkVBox" id="lirc_vbox">
+            <property name="visible">True</property>
+            <property name="sensitive">False</property>
+            <child>
+              <object class="GtkVBox" id="vbox11">
+                <property name="visible">True</property>
+                <property name="spacing">5</property>
+                <child>
+                  <object class="GtkLabel" id="label1">
+                    <property name="width_request">555</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Choose your remote control from the list of supported remotes below.  
+A standard (but further customizable) configuration will be loaded for you.</property>
+                    <property name="wrap">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkVBox" id="remote_vbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkCheckButton" id="remotecontrol">
+                        <property name="label" translatable="yes">Enable a Remote Control</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="toggle_ir"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkVBox" id="remote_hbox">
+                        <property name="visible">True</property>
+                        <property name="sensitive">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox400">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment4">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="remote_control_label1">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Remote:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBox" id="remote_list">
+                                <property name="width_request">400</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="model">remote_list_store</property>
+                                <signal name="changed" handler="toggle_ir"/>
+                                <child>
+                                  <object class="GtkCellRendererText" id="renderer1"/>
+                                  <attributes>
+                                    <attribute name="text">0</attribute>
+                                  </attributes>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="remote_driver_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment2">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="remote_driver_label1">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Driver:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="remote_driver">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">•</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="remote_modules_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment5">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="remote_modules_label1">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Module(s):</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="remote_modules">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">•</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="remote_configuration_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment6">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="remote_rc_label1">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Configuration:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkFileChooserButton" id="browse_remote_lircd_conf">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="create_folders">False</property>
+                                <property name="title" translatable="yes">Select Remote lircd.conf</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="remote_device_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment7">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="remote_device_label">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Device:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="remote_device">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">•</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkAlignment" id="alignment3">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="left_padding">25</property>
+                            <child>
+                              <object class="GtkCheckButton" id="generate_lircrc_checkbox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="draw_indicator">True</property>
+                                <child>
+                                  <object class="GtkLabel" id="label2">
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Generate dynamic button mappings</property>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">5</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkAlignment" id="alignment8">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="left_padding">25</property>
+                            <child>
+                              <object class="GtkCheckButton" id="enable_irexec_checkbox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="draw_indicator">True</property>
+                                <child>
+                                  <object class="GtkLabel" id="label3">
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Generate frontend restart mapping (Power followed by Clear)</property>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">6</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">6</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="transmitter_vbox">
+                <property name="visible">True</property>
+                <property name="spacing">5</property>
+                <child>
+                  <object class="GtkLabel" id="label5">
+                    <property name="width_request">555</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Choose your IR transmitter from the list of supported blasters below.</property>
+                    <property name="wrap">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkVBox" id="vbox4">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkCheckButton" id="transmittercontrol">
+                        <property name="label" translatable="yes">Enable an IR Transmitter</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="toggle_ir"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkVBox" id="transmitter_hbox">
+                        <property name="visible">True</property>
+                        <property name="sensitive">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox53">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment11">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="transmitter_control_label3">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Transmitters:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBox" id="transmitter_list">
+                                <property name="width_request">400</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="model">transmitter_list_store</property>
+                                <signal name="changed" handler="toggle_ir"/>
+                                <child>
+                                  <object class="GtkCellRendererText" id="renderer2"/>
+                                  <attributes>
+                                    <attribute name="text">0</attribute>
+                                  </attributes>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="transmitter_driver_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment12">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="transmitter_driver_label3">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Driver:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="transmitter_driver">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">•</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="transmitter_modules_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment13">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="transmitter_modules_label3">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Module(s):</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="transmitter_modules">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">•</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="transmitter_configuration_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment14">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="transmitter_rc_label3">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Configuration:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkFileChooserButton" id="browse_transmitter_lircd_conf">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="create_folders">False</property>
+                                <property name="title" translatable="yes">Select Transmitter lircd.conf</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="transmitter_device_hbox">
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <child>
+                              <object class="GtkAlignment" id="alignment9">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="left_padding">25</property>
+                                <child>
+                                  <object class="GtkLabel" id="transmitter_device_label">
+                                    <property name="width_request">100</property>
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Device:</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="transmitter_device">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="invisible_char">•</property>
+                                <property name="width_chars">30</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">6</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="position">6</property>
+      </packing>
+    </child>
+  </object>
+  <object class="GtkListStore" id="remote_list_store">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="transmitter_list_store">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_repos.ui'
--- plugins/ui/tab_repos.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_repos.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,472 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <object class="GtkListStore" id="model1">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="model2">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkVBox" id="tab_repos">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <child>
+      <object class="GtkLabel" id="graphics_drivers_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0.46000000834465027</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Repositories&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator6">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox11">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkAlignment" id="alignment5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">The MythTV Updates repo will contain updated MythTV software for
+   the version selected below. It is automatically built each day when
+   there are upstream fixes available.</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment8">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="xscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkCheckButton" id="mythtv_updates_checkbox">
+                <property name="label" translatable="yes">Activate MythTV Updates repository</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="draw_indicator">True</property>
+                <signal name="toggled" handler="on_mythtv_updates_checkbox_toggled" swapped="no"/>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="label" translatable="yes">   Select which version of MythTV you want to receive updates for.</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="hbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">2.2351741291171123e-10</property>
+                <property name="xscale">0</property>
+                <property name="yscale">0</property>
+                <property name="left_padding">50</property>
+                <property name="right_padding">25</property>
+                <child>
+                  <object class="GtkComboBox" id="repobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">model1</property>
+                    <signal name="changed" handler="on_repobox_changed" swapped="no"/>
+                    <child>
+                      <object class="GtkCellRendererText" id="renderer1"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="xscale">0</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkButton" id="refreshbutton">
+                    <property name="label" translatable="yes">Refresh</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="clicked" handler="refresh_button_clicked" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="trunk_block">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkAlignment" id="alignment7">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="trunk_warning">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Warning: You have selected the MythTV version currently in development!!
+   If you select this version, it is recommended that you subscribe to the
+   &lt;a href="http://www.mythtv.org/mailman/listinfo/mythtv-dev/"&gt;mythtv developer&lt;/a&gt; and &lt;a href="http://www.mythtv.org/mailman/listinfo/mythtv-commits/"&gt;mythtv commits&lt;/a&gt; mailing lists and be prepared for
+   severe breakage. If you wish to continue please enter
+   YouMustBeThisTallToRide below for the development version password.</property>
+                    <property name="use_markup">True</property>
+                    <property name="track_visited_links">False</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment9">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkHBox" id="hbox2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment10">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="xscale">0</property>
+                        <property name="right_padding">10</property>
+                        <child>
+                          <object class="GtkLabel" id="label4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">MythTV Development Version Password</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkAlignment" id="alignment11">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="xscale">0</property>
+                        <child>
+                          <object class="GtkEntry" id="dev_password_entry">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="invisible_char">●</property>
+                            <signal name="changed" handler="on_dev_password_entry_changed" swapped="no"/>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkImage" id="trunk_pass_ok">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="xpad">5</property>
+                        <property name="stock">gtk-ok</property>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkImage" id="trunk_pass_error">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="xpad">5</property>
+                        <property name="stock">gtk-dialog-error</property>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHSeparator" id="hseparator3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">6</property>
+            <property name="position">5</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment4">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">The Mythbuntu Updates repo provides updates for Mythbuntu specific
+   software such as Mythbuntu Bare and Mythbuntu Log Grabber. It does not
+   contain MythTV updates.</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">6</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment12">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkCheckButton" id="mythbuntu_updates_checkbox">
+                <property name="label" translatable="yes">Activate Mythbuntu Updates repository</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="xalign">0</property>
+                <property name="draw_indicator">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">7</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHSeparator" id="hseparator4">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">6</property>
+            <property name="position">8</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
+            <child>
+              <object class="GtkLabel" id="label5">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">The XMLTV Updates repo provides daily builds of XMLTV for schedule data.
+   If you do not know what XMLTV is you probably don't need to enable this.</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">9</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment13">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
+            <property name="left_padding">25</property>
+            <child>
+              <object class="GtkCheckButton" id="xmltv_updates_checkbox">
+                <property name="label" translatable="yes">Activate XMLTV Updates repository</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="xalign">0</property>
+                <property name="draw_indicator">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">10</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHSeparator" id="hseparator5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">6</property>
+            <property name="position">11</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment6">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkLabel" id="complete_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">After hitting apply, to complete the transition to the Updates repositories,
+   please open update-manager (or synaptic) and click Check (or Reload) and
+   then install updates as you normally would.</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">12</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_services.ui'
--- plugins/ui/tab_services.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_services.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,581 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkListStore" id="model1">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Disable</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Enable</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkListStore" id="model2">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Disable</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Enable</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkListStore" id="model3">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Disable</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Enable</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkListStore" id="model4">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Disable</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Enable</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkVBox" id="tab_services">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="services_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Services&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator23">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox15">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkLabel" id="application_description">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">These services are typically used by people setting up a Mythbuntu box.
+Applicable services that are already installed can be reconfigured by selecting &lt;b&gt;Reconfigure&lt;/b&gt;.</property>
+            <property name="use_markup">True</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="ssh_vbox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;SSH Service&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment3">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkHBox" id="ssh_option_hbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment9">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="yalign">0</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkComboBox" id="enablessh">
+                            <property name="width_request">110</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="model">model1</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer1"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="enablessh_label">
+                        <property name="width_request">375</property>
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">SSH is a very commonly used protocol for console based remote administration of a machine.</property>
+                        <property name="wrap">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="padding">32</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="samba_vbox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label5">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Samba Service&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment4">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkHBox" id="samba_option_hbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment7">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="yalign">0</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkComboBox" id="enablesamba">
+                            <property name="width_request">110</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="model">model2</property>
+                            <property name="focus_on_click">False</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer2"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="enablesamba_label">
+                        <property name="width_request">375</property>
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">Samba provides Windows File Sharing services.  These can then be accessed via Windows or any Samba client.</property>
+                        <property name="wrap">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="padding">32</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="nfs_vbox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label7">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;NFS Service&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment5">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkHBox" id="nfs_option_hbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment11">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="yalign">0</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkComboBox" id="enablenfs">
+                            <property name="width_request">110</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="model">model3</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer3"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="enablenfs_label">
+                        <property name="width_request">375</property>
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">NFS provides filesharing to other Unix &amp; Linux clients.</property>
+                        <property name="wrap">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="padding">32</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vnc_vbox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;VNC Service&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkHBox" id="vnc_option_hbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment10">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="yalign">0</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkComboBox" id="enablevnc">
+                            <property name="width_request">110</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="model">model4</property>
+                            <signal name="changed" handler="toggle_vnc"/>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer4"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="enablevnc_label">
+                        <property name="width_request">375</property>
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">VNC is a very commonly used protocol for graphical remote administration and control.</property>
+                        <property name="wrap">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="padding">32</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkHBox" id="vnc_pass_hbox">
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="orientation">vertical</property>
+                        <child>
+                          <object class="GtkLabel" id="vnc_pass_label">
+                            <property name="width_request">350</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Enter a password to be used: </property>
+                            <property name="use_markup">True</property>
+                            <property name="wrap">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="vnc_pass_warning">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">&lt;b&gt;Note&lt;/b&gt;: Pass must be &gt;= 6 characters.</property>
+                            <property name="use_markup">True</property>
+                            <property name="wrap">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="vnc_password">
+                        <property name="width_request">150</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="visibility">False</property>
+                        <property name="invisible_char">&#x25CF;</property>
+                        <signal name="changed" handler="toggle_vnc_password"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkImage" id="vnc_error_image">
+                        <property name="visible">True</property>
+                        <property name="stock">gtk-dialog-error</property>
+                        <property name="icon-size">5</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_startup_behavior.ui'
--- plugins/ui/tab_startup_behavior.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_startup_behavior.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,171 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkListStore" id="model1">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">[Disabled]</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkVBox" id="tab_startup_behavior">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="startup_behavior_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Startup Behavior&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator27">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox32">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="startup_behavior_description">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">If this box is going to be used like an appliance in Frontend mode, you will likely want the system to automatically login.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="automatic_login_vbox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Automatic Login&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="gdmsetup_button">
+                    <property name="label" translatable="yes">Automagic Login Configuration</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="image">image1</property>
+                    <signal name="clicked" handler="launch_app"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="automatic_startup_vbox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Automatic MythTV Frontend Startup&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment3">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="enableautostartup">
+                    <property name="label" translatable="yes">Automatically start MythTV Frontend</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="icon_name">gdm-setup</property>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_system_roles.ui'
--- plugins/ui/tab_system_roles.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_system_roles.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,457 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_system_roles">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="system_roles_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;System Roles&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator27">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox32">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="system_roles_description">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="label" translatable="yes">Active Mythbuntu roles may be added, removed, or modified at any time.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Backend Role&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label8">
+                <property name="width_request">525</property>
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">A machine containing a this role will schedule and record TV shows.  Also, it is needed on a network for a frontend role to connect to.</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkRadioButton" id="no_backend_radio">
+                        <property name="label" translatable="yes">No Backend</property>
+                        <property name="width_request">200</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" id="primary_backend_radio">
+                    <property name="label" translatable="yes">Primary Backend</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">no_backend_radio</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox6">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment6">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkRadioButton" id="secondary_backend_radio">
+                        <property name="label" translatable="yes">Secondary Backend</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                        <property name="group">no_backend_radio</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox2">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Frontend Role&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label7">
+                <property name="width_request">525</property>
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">A frontend role will connect to a backend to obtain content.</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment3">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkRadioButton" id="no_frontend_radio">
+                        <property name="label" translatable="yes">No Frontend</property>
+                        <property name="width_request">200</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" id="frontend_radio">
+                    <property name="label" translatable="yes">Desktop Frontend</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">no_frontend_radio</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox5">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkRadioButton" id="appliance_radio">
+                        <property name="label" translatable="yes">Appliance Frontend</property>
+                        <property name="sensitive">False</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                        <property name="group">no_frontend_radio</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox3">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="label4">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Desktop Role&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label5">
+                <property name="width_request">525</property>
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">If you would like to use this machine as a desktop, it can be converted at anytime.</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox3">
+                <property name="visible">True</property>
+                <property name="spacing">29</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment4">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkCheckButton" id="ubuntu_desk_check">
+                        <property name="label" translatable="yes">Ubuntu Desktop</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="xubuntu_desk_check">
+                    <property name="label" translatable="yes">Xubuntu Desktop</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="kubuntu_desk_check">
+                    <property name="label" translatable="yes">Kubuntu Desktop</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox4">
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="label9">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Diskless Server&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label11">
+                <property name="width_request">525</property>
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">A system role that will allow you to operate additional Frontend clients without installation.</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox4">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment5">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkCheckButton" id="diskless_server_install">
+                        <property name="label" translatable="yes">Diskless Server</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment7">
+                    <property name="visible">True</property>
+                    <property name="left_padding">25</property>
+                    <child>
+                      <object class="GtkCheckButton" id="diskless_server_dhcp">
+                        <property name="label" translatable="yes">Add DHCP server</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_system_updates.ui'
--- plugins/ui/tab_system_updates.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_system_updates.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,315 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_system_updates">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkLabel" id="system_updates_drivers_title">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;System Updates&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator6">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox11">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="system_updates_description">
+            <property name="width_request">555</property>
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">These tools can be used for performing updates that are regularly released for Mythbuntu and changing update behaviors.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="update_vbox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;System Update Tools&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="updatemanager_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment10">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox11">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image10">
+                                <property name="visible">True</property>
+                                <property name="icon_name">update-manager</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label10">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Update Manager</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment6">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="synaptic_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment7">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox3">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image3">
+                                <property name="visible">True</property>
+                                <property name="icon_name">system-upgrade</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label7">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Synaptic Package Manager</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment8">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkButton" id="terminal_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="can_default">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">half</property>
+                    <signal name="clicked" handler="launch_app"/>
+                    <child>
+                      <object class="GtkAlignment" id="alignment9">
+                        <property name="visible">True</property>
+                        <property name="xalign">0.019999999552965164</property>
+                        <property name="xscale">0</property>
+                        <property name="yscale">0</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox4">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkImage" id="image4">
+                                <property name="visible">True</property>
+                                <property name="stock">gtk-index</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label9">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Terminal</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="behavior_vbox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">10</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Update Manager Behavior&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkRadioButton" id="background_radio">
+                    <property name="label" translatable="yes">Launch in the background</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">notification_icon_radio</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment3">
+                <property name="visible">True</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkRadioButton" id="notification_icon_radio">
+                    <property name="label" translatable="yes">Notification icon in panel</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added file 'plugins/ui/tab_themes.ui'
--- plugins/ui/tab_themes.ui	1970-01-01 00:00:00 +0000
+++ plugins/ui/tab_themes.ui	2011-12-09 05:39:36 +0000
@@ -0,0 +1,207 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkVBox" id="tab_themes">
+    <property name="visible">True</property>
+    <property name="border_width">6</property>
+    <child>
+      <object class="GtkLabel" id="theme_heading_label">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Themes and Artwork&lt;/b&gt;&lt;/big&gt;</property>
+        <property name="use_markup">True</property>
+        <property name="single_line_mode">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator23">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox15">
+        <property name="visible">True</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkLabel" id="theme_description">
+            <property name="width_request">600</property>
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Themes can improve the appeal of a MythBuntu box.  Post-installation, the active theme can be set from the "Settings-&gt; Appearance"  menu in your Frontend.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;b&gt;MythTV Themes&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkCheckButton" id="themes_meta">
+                <property name="label" translatable="yes">Enable/Disable all</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="draw_indicator">True</property>
+                <signal name="toggled" handler="toggle_meta"/>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment15">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="mythbuntu_theme">
+                    <property name="label" translatable="yes">Mythbuntu Theme</property>
+                    <property name="width_request">175</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment21">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="supported_themes">
+                    <property name="label" translatable="yes">Supported Themes</property>
+                    <property name="width_request">200</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label4">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">&lt;b&gt;Mythbuntu Artwork&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox2">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkAlignment" id="alignment18">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="xfce_theme">
+                    <property name="label" translatable="yes">Session</property>
+                    <property name="width_request">175</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment19">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="xalign">0</property>
+                <property name="xscale">0</property>
+                <property name="left_padding">25</property>
+                <child>
+                  <object class="GtkCheckButton" id="gdm_theme">
+                    <property name="label" translatable="yes">Login (GDM)</property>
+                    <property name="width_request">175</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">4</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="padding">6</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>

=== added directory 'po'
=== added file 'po/POTFILES.in'
--- po/POTFILES.in	1970-01-01 00:00:00 +0000
+++ po/POTFILES.in	2011-12-09 05:39:36 +0000
@@ -0,0 +1,22 @@
+./plugins/ui/tab_themes.ui
+./plugins/ui/tab_system_roles.ui
+./plugins/ui/tab_proprietary_codecs.ui
+./plugins/ui/tab_remote_control.ui
+./plugins/ui/tab_system_updates.ui
+./plugins/ui/tab_startup_behavior.ui
+./plugins/ui/tab_mythexport.ui
+./plugins/ui/tab_mysql_configuration.ui
+./plugins/ui/tab_plugins.ui
+./plugins/ui/tab_services.ui
+./plugins/ui/tab_graphics_drivers.ui
+./plugins/python/mythexport.py
+./plugins/python/graphics_drivers.py
+./plugins/python/mysql_configuration.py
+./plugins/python/themes.py
+./plugins/python/remote.py
+./plugins/python/services.py
+./plugins/python/plugins.py
+./plugins/python/startup_behavior.py
+./plugins/python/proprietary_codecs.py
+./plugins/python/system_updates.py
+./plugins/python/system_roles.py

=== added file 'po/mythbuntu-common.pot'
--- po/mythbuntu-common.pot	1970-01-01 00:00:00 +0000
+++ po/mythbuntu-common.pot	2011-12-09 05:39:36 +0000
@@ -0,0 +1,22 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-28 22:01-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@xxxxxx>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: .././plugins/python/system_updates.py:52
+msgid "Error pulling gconf status for update notifier"
+msgstr ""

=== added directory 'qr'
=== added file 'qr/mymote.png'
Binary files qr/mymote.png	1970-01-01 00:00:00 +0000 and qr/mymote.png	2011-12-09 05:39:36 +0000 differ
=== added file 'qr/mythmote.png'
Binary files qr/mythmote.png	1970-01-01 00:00:00 +0000 and qr/mythmote.png	2011-12-09 05:39:36 +0000 differ
=== added file 'repos.db'
--- repos.db	1970-01-01 00:00:00 +0000
+++ repos.db	2011-12-09 05:39:36 +0000
@@ -0,0 +1,18 @@
+MYTHTV_RELEASE	0.24.1
+TRUNKPASS	YouMustBeThisTallToRide
+
+karmic	0.22
+karmic	0.23
+karmic	0.23.1
+lucid	0.23
+lucid	0.23.1
+lucid	0.24.x
+lucid	0.25
+maverick	0.23.1
+maverick	0.24.x
+natty	0.24.x
+natty	0.25
+oneiric	0.24.x
+oneiric	0.25
+precise 0.24.x
+precise 0.25

=== added file 'setup.cfg'
--- setup.cfg	1970-01-01 00:00:00 +0000
+++ setup.cfg	2011-12-09 05:39:36 +0000
@@ -0,0 +1,5 @@
+[build]
+i18n = True
+
+[build_i18n]
+domain = mythbuntu-common

=== added file 'setup.py'
--- setup.py	1970-01-01 00:00:00 +0000
+++ setup.py	2011-12-09 05:39:36 +0000
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+# mythbuntu-common install script
+# Copyright (C) 2007-2009, Mario Limonciello <superm1@xxxxxxxxxxxxx>
+#
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from distutils.core import setup
+from DistUtilsExtra.command import *
+
+import glob, os.path
+
+setup(
+    name="mythbuntu-common",
+    author="Mario Limonciello",
+    author_email="superm1@xxxxxxxxxxxxx",
+    maintainer="Ubuntu MythTV Team",
+    maintainer_email="ubuntu-mythtv@xxxxxxxxxxxxxxxx",
+    url="http://www.mythbuntu.org";,
+    license="gpl",
+    description="commonly used mythbuntu functions",
+    packages=['mythbuntu_common'],
+    data_files=[("share/mythbuntu/examples", glob.glob("examples/*")),
+                ("share/mythbuntu/plugins/python", glob.glob("plugins/python/*")),
+                ("share/mythbuntu/qr", glob.glob("qr/*")),
+                ("share/mythbuntu/", glob.glob("*.db")),
+                ("share/mythbuntu/plugins/ui", glob.glob("plugins/ui/*"))],
+    scripts=[],
+    cmdclass = { "build" : build_extra.build_extra,
+        "build_i18n" : build_i18n.build_i18n,
+        "clean" : clean_i18n.clean_i18n
+        }
+)

=== renamed file 'setup.py' => 'setup.py.moved'