Index: /trunk/documentation/License/gpl-3.0.htm
===================================================================
--- /trunk/documentation/License/gpl-3.0.htm	(revision 2)
+++ /trunk/documentation/License/gpl-3.0.htm	(revision 2)
@@ -0,0 +1,692 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>GNU General Public License - GNU Project - Free Software Foundation (FSF)</title>
+</head>
+<body>
+<h3 style="text-align: center;">GNU GENERAL PUBLIC LICENSE</h3>
+<p style="text-align: center;">Version 3, 29 June 2007</p>
+
+<p>Copyright &copy; 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</p><p>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<h3><a name="preamble"></a>Preamble</h3>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<h3><a name="terms"></a>TERMS AND CONDITIONS</h3>
+
+<h4><a name="section0"></a>0. Definitions.</h4>
+
+<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>
+
+<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+ 
+<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and
+&ldquo;recipients&rdquo; may be individuals or organizations.</p>
+
+<p>To &ldquo;modify&rdquo; 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 &ldquo;modified version&rdquo; of the
+earlier work or a work &ldquo;based on&rdquo; the earlier work.</p>
+
+<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To &ldquo;propagate&rdquo; 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.</p>
+
+<p>To &ldquo;convey&rdquo; 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.</p>
+
+<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;
+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.</p>
+
+<h4><a name="section1"></a>1. Source Code.</h4>
+
+<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work
+for making modifications to it.  &ldquo;Object code&rdquo; means any non-source
+form of a work.</p>
+
+<p>A &ldquo;Standard Interface&rdquo; 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.</p>
+
+<p>The &ldquo;System Libraries&rdquo; 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
+&ldquo;Major Component&rdquo;, 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.</p>
+
+<p>The &ldquo;Corresponding Source&rdquo; 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.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<h4><a name="section2"></a>2. Basic Permissions.</h4>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<h4><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h4>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<h4><a name="section4"></a>4. Conveying Verbatim Copies.</h4>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<h4><a name="section5"></a>5. Conveying Modified Source Versions.</h4>
+
+<p>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:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>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
+    &ldquo;keep intact all notices&rdquo;.</li>
+
+<li>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.</li>
+
+<li>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.</li>
+</ul>
+
+<p>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
+&ldquo;aggregate&rdquo; 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.</p>
+
+<h4><a name="section6"></a>6. Conveying Non-Source Forms.</h4>
+
+<p>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:</p>
+
+<ul>
+<li>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.</li>
+
+<li>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.</li>
+
+<li>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.</li>
+
+<li>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.</li>
+
+<li>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.</li>
+</ul>
+
+<p>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.</p>
+
+<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, 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, &ldquo;normally used&rdquo; 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.</p>
+
+<p>&ldquo;Installation Information&rdquo; 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.</p>
+
+<p>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).</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<h4><a name="section7"></a>7. Additional Terms.</h4>
+
+<p>&ldquo;Additional permissions&rdquo; 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.</p>
+
+<p>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.</p>
+
+<p>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:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>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</li>
+
+<li>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</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>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.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered &ldquo;further
+restrictions&rdquo; 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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<h4><a name="section8"></a>8. Termination.</h4>
+
+<p>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).</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<h4><a name="section9"></a>9. Acceptance Not Required for Having Copies.</h4>
+
+<p>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.</p>
+
+<h4><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</h4>
+
+<p>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.</p>
+
+<p>An &ldquo;entity transaction&rdquo; 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.</p>
+
+<p>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.</p>
+
+<h4><a name="section11"></a>11. Patents.</h4>
+
+<p>A &ldquo;contributor&rdquo; 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 &ldquo;contributor version&rdquo;.</p>
+
+<p>A contributor's &ldquo;essential patent claims&rdquo; 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, &ldquo;control&rdquo; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>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.</p>
+
+<p>In the following three paragraphs, a &ldquo;patent license&rdquo; 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 &ldquo;grant&rdquo; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>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.  &ldquo;Knowingly relying&rdquo; 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.</p>
+  
+<p>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.</p>
+
+<p>A patent license is &ldquo;discriminatory&rdquo; 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.</p>
+
+<p>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.</p>
+
+<h4><a name="section12"></a>12. No Surrender of Others' Freedom.</h4>
+
+<p>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.</p>
+
+<h4><a name="section13"></a>13. Use with the GNU Affero General Public License.</h4>
+
+<p>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.</p>
+
+<h4><a name="section14"></a>14. Revised Versions of this License.</h4>
+
+<p>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.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License &ldquo;or any later version&rdquo; 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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<h4><a name="section15"></a>15. Disclaimer of Warranty.</h4>
+
+<p>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 &ldquo;AS IS&rdquo; 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.</p>
+
+<h4><a name="section16"></a>16. Limitation of Liability.</h4>
+
+<p>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.</p>
+
+<h4><a name="section17"></a>17. Interpretation of Sections 15 and 16.</h4>
+
+<p>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.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<h3><a name="howto"></a>How to Apply These Terms to Your New Programs</h3>
+
+<p>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.</p>
+
+<p>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 &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.</p>
+
+<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    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 &lt;http://www.gnu.org/licenses/&gt;.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+    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.
+</pre>
+
+<p>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 &ldquo;about box&rdquo;.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
+<p>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
+&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>
+
+
+</body></html>
Index: /trunk/documentation/License/gpl-3.0.txt
===================================================================
--- /trunk/documentation/License/gpl-3.0.txt	(revision 2)
+++ /trunk/documentation/License/gpl-3.0.txt	(revision 2)
@@ -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>.
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.Designer.cs	(revision 2)
@@ -0,0 +1,117 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  partial class AboutDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.okButton = new System.Windows.Forms.Button();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.textBox1 = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(295, 147);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.pictureBox.Image = global::HeuristicLab.AdvancedOptimizationFrontend.Properties.Resources.Logo_gray;
+      this.pictureBox.Location = new System.Drawing.Point(12, 12);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(159, 158);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+      this.pictureBox.TabIndex = 1;
+      this.pictureBox.TabStop = false;
+      // 
+      // textBox1
+      // 
+      this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.textBox1.Location = new System.Drawing.Point(177, 57);
+      this.textBox1.Multiline = true;
+      this.textBox1.Name = "textBox1";
+      this.textBox1.ReadOnly = true;
+      this.textBox1.Size = new System.Drawing.Size(193, 60);
+      this.textBox1.TabIndex = 3;
+      this.textBox1.Text = "HeuristicLab\r\nv. 3.0.0.0\r\n\r\n(c) 2002-2008 HEAL";
+      // 
+      // AboutDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(382, 182);
+      this.Controls.Add(this.textBox1);
+      this.Controls.Add(this.pictureBox);
+      this.Controls.Add(this.okButton);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "AboutDialog";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "About HeuristicLab";
+      this.TopMost = true;
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.TextBox textBox1;
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.cs	(revision 2)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  public partial class AboutDialog : Form {
+    public AboutDialog() {
+      InitializeComponent();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AboutDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.Designer.cs	(revision 2)
@@ -0,0 +1,316 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  partial class AvailableOperatorsForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AvailableOperatorsForm));
+      this.builtinOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.builtinOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.builtinOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorLibrariesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorLibraryTextBox = new System.Windows.Forms.TextBox();
+      this.operatorLibraryLabel = new System.Windows.Forms.Label();
+      this.operatorLibraryOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorLibraryOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.operatorLibraryOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.loadButton = new System.Windows.Forms.Button();
+      this.builtinTabPage = new System.Windows.Forms.TabPage();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.builtinOperatorsGroupBox.SuspendLayout();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.operatorLibrariesTabPage.SuspendLayout();
+      this.operatorLibraryOperatorsGroupBox.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.builtinTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // builtinOperatorsGroupBox
+      // 
+      this.builtinOperatorsGroupBox.Controls.Add(this.splitContainer2);
+      this.builtinOperatorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.builtinOperatorsGroupBox.Name = "builtinOperatorsGroupBox";
+      this.builtinOperatorsGroupBox.Size = new System.Drawing.Size(594, 390);
+      this.builtinOperatorsGroupBox.TabIndex = 0;
+      this.builtinOperatorsGroupBox.TabStop = false;
+      this.builtinOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.builtinOperatorsTreeView);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.builtinOperatorsDescriptionTextBox);
+      this.splitContainer2.Size = new System.Drawing.Size(588, 371);
+      this.splitContainer2.SplitterDistance = 272;
+      this.splitContainer2.TabIndex = 2;
+      // 
+      // builtinOperatorsTreeView
+      // 
+      this.builtinOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsTreeView.HideSelection = false;
+      this.builtinOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsTreeView.Name = "builtinOperatorsTreeView";
+      this.builtinOperatorsTreeView.Size = new System.Drawing.Size(588, 272);
+      this.builtinOperatorsTreeView.TabIndex = 0;
+      this.builtinOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.builtinOperatorsTreeView_AfterSelect);
+      this.builtinOperatorsTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.builtinOperatorsTreeView_ItemDrag);
+      // 
+      // builtinOperatorsDescriptionTextBox
+      // 
+      this.builtinOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.builtinOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsDescriptionTextBox.Multiline = true;
+      this.builtinOperatorsDescriptionTextBox.Name = "builtinOperatorsDescriptionTextBox";
+      this.builtinOperatorsDescriptionTextBox.ReadOnly = true;
+      this.builtinOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.builtinOperatorsDescriptionTextBox.Size = new System.Drawing.Size(588, 95);
+      this.builtinOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.operatorLibrariesTabPage);
+      this.tabControl.Controls.Add(this.builtinTabPage);
+      this.tabControl.Location = new System.Drawing.Point(12, 12);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(608, 422);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorLibrariesTabPage
+      // 
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryTextBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryLabel);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryOperatorsGroupBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.loadButton);
+      this.operatorLibrariesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorLibrariesTabPage.Name = "operatorLibrariesTabPage";
+      this.operatorLibrariesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorLibrariesTabPage.Size = new System.Drawing.Size(600, 396);
+      this.operatorLibrariesTabPage.TabIndex = 0;
+      this.operatorLibrariesTabPage.Text = "Operator Libraries";
+      this.operatorLibrariesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorLibraryTextBox
+      // 
+      this.operatorLibraryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryTextBox.Location = new System.Drawing.Point(97, 8);
+      this.operatorLibraryTextBox.Name = "operatorLibraryTextBox";
+      this.operatorLibraryTextBox.ReadOnly = true;
+      this.operatorLibraryTextBox.Size = new System.Drawing.Size(416, 20);
+      this.operatorLibraryTextBox.TabIndex = 2;
+      // 
+      // operatorLibraryLabel
+      // 
+      this.operatorLibraryLabel.AutoSize = true;
+      this.operatorLibraryLabel.Location = new System.Drawing.Point(6, 11);
+      this.operatorLibraryLabel.Name = "operatorLibraryLabel";
+      this.operatorLibraryLabel.Size = new System.Drawing.Size(85, 13);
+      this.operatorLibraryLabel.TabIndex = 1;
+      this.operatorLibraryLabel.Text = "&Operator Library:";
+      // 
+      // operatorLibraryOperatorsGroupBox
+      // 
+      this.operatorLibraryOperatorsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryOperatorsGroupBox.Controls.Add(this.splitContainer1);
+      this.operatorLibraryOperatorsGroupBox.Enabled = false;
+      this.operatorLibraryOperatorsGroupBox.Location = new System.Drawing.Point(6, 35);
+      this.operatorLibraryOperatorsGroupBox.Name = "operatorLibraryOperatorsGroupBox";
+      this.operatorLibraryOperatorsGroupBox.Size = new System.Drawing.Size(588, 355);
+      this.operatorLibraryOperatorsGroupBox.TabIndex = 3;
+      this.operatorLibraryOperatorsGroupBox.TabStop = false;
+      this.operatorLibraryOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorLibraryOperatorsTreeView);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.operatorLibraryOperatorsDescriptionTextBox);
+      this.splitContainer1.Size = new System.Drawing.Size(582, 336);
+      this.splitContainer1.SplitterDistance = 237;
+      this.splitContainer1.TabIndex = 1;
+      // 
+      // operatorLibraryOperatorsTreeView
+      // 
+      this.operatorLibraryOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsTreeView.HideSelection = false;
+      this.operatorLibraryOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsTreeView.Name = "operatorLibraryOperatorsTreeView";
+      this.operatorLibraryOperatorsTreeView.ShowNodeToolTips = true;
+      this.operatorLibraryOperatorsTreeView.Size = new System.Drawing.Size(582, 237);
+      this.operatorLibraryOperatorsTreeView.TabIndex = 0;
+      this.operatorLibraryOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.operatorsTreeView_AfterSelect);
+      this.operatorLibraryOperatorsTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.operatorLibraryOperatorsTreeView_ItemDrag);
+      // 
+      // operatorLibraryOperatorsDescriptionTextBox
+      // 
+      this.operatorLibraryOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.operatorLibraryOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsDescriptionTextBox.Multiline = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.Name = "operatorLibraryOperatorsDescriptionTextBox";
+      this.operatorLibraryOperatorsDescriptionTextBox.ReadOnly = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.operatorLibraryOperatorsDescriptionTextBox.Size = new System.Drawing.Size(582, 95);
+      this.operatorLibraryOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // loadButton
+      // 
+      this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.loadButton.Location = new System.Drawing.Point(519, 6);
+      this.loadButton.Name = "loadButton";
+      this.loadButton.Size = new System.Drawing.Size(75, 23);
+      this.loadButton.TabIndex = 0;
+      this.loadButton.Text = "&Load...";
+      this.loadButton.UseVisualStyleBackColor = true;
+      this.loadButton.Click += new System.EventHandler(this.loadButton_Click);
+      // 
+      // builtinTabPage
+      // 
+      this.builtinTabPage.Controls.Add(this.builtinOperatorsGroupBox);
+      this.builtinTabPage.Location = new System.Drawing.Point(4, 22);
+      this.builtinTabPage.Name = "builtinTabPage";
+      this.builtinTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.builtinTabPage.Size = new System.Drawing.Size(600, 396);
+      this.builtinTabPage.TabIndex = 1;
+      this.builtinTabPage.Text = "Built-In";
+      this.builtinTabPage.UseVisualStyleBackColor = true;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "library";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Open file ...";
+      // 
+      // AvailableOperatorsForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(632, 446);
+      this.Controls.Add(this.tabControl);
+      this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)(((((WeifenLuo.WinFormsUI.Docking.DockAreas.Float | WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft)
+                  | WeifenLuo.WinFormsUI.Docking.DockAreas.DockRight)
+                  | WeifenLuo.WinFormsUI.Docking.DockAreas.DockTop)
+                  | WeifenLuo.WinFormsUI.Docking.DockAreas.DockBottom)));
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "AvailableOperatorsForm";
+      this.ShowHint = WeifenLuo.WinFormsUI.Docking.DockState.DockLeft;
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.TabText = "Available Operators";
+      this.Text = "Available Operators";
+      this.builtinOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      this.splitContainer2.Panel2.PerformLayout();
+      this.splitContainer2.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.operatorLibrariesTabPage.ResumeLayout(false);
+      this.operatorLibrariesTabPage.PerformLayout();
+      this.operatorLibraryOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.Panel2.PerformLayout();
+      this.splitContainer1.ResumeLayout(false);
+      this.builtinTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox builtinOperatorsGroupBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorLibrariesTabPage;
+    private System.Windows.Forms.TabPage builtinTabPage;
+    private System.Windows.Forms.TextBox operatorLibraryTextBox;
+    private System.Windows.Forms.Label operatorLibraryLabel;
+    private System.Windows.Forms.GroupBox operatorLibraryOperatorsGroupBox;
+    private System.Windows.Forms.TreeView operatorLibraryOperatorsTreeView;
+    private System.Windows.Forms.Button loadButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.TreeView builtinOperatorsTreeView;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private System.Windows.Forms.TextBox builtinOperatorsDescriptionTextBox;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.TextBox operatorLibraryOperatorsDescriptionTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.cs	(revision 2)
@@ -0,0 +1,165 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  public partial class AvailableOperatorsForm : DockContent {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    private IOperatorLibrary operatorLibrary;
+
+    public AvailableOperatorsForm() {
+      InitializeComponent();
+      operatorLibrary = null;
+      TreeNodeSorter nodeSorter = new TreeNodeSorter();
+      operatorLibraryOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+      builtinOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      PluginInfo[] plugins = discoveryService.Plugins;
+      foreach(PluginInfo plugin in plugins) {
+        TreeNode pluginItem = new TreeNode();
+        pluginItem.Text = plugin.Name;
+        pluginItem.Tag = plugin;
+
+        Type[] operators = discoveryService.GetTypes(typeof(IOperator), plugin);
+        foreach(Type type in operators) {
+          if(!type.IsAbstract) {
+            TreeNode operatorItem = new TreeNode();
+            operatorItem.Text = type.Name;
+            operatorItem.Tag = type;
+            pluginItem.Nodes.Add(operatorItem);
+          }
+        }
+        // add plugin node only if it contains operators
+        if(pluginItem.Nodes.Count > 0) {
+          builtinOperatorsTreeView.Nodes.Add(pluginItem);
+        }
+      }
+      if (builtinOperatorsTreeView.Nodes.Count == 0) {
+        builtinOperatorsTreeView.Enabled = false;
+        builtinOperatorsTreeView.Nodes.Add("No operators available");
+      }
+      builtinOperatorsTreeView.Sort();
+    }
+
+    private void UpdateOperatorsTreeView() {
+      operatorLibraryOperatorsTreeView.Nodes.Clear();
+      operatorLibraryOperatorsTreeView.Nodes.Add(CreateTreeNode(operatorLibrary.Group));
+      operatorLibraryOperatorsTreeView.Sort();
+    }
+
+    private TreeNode CreateTreeNode(IOperatorGroup group) {
+      TreeNode node = new TreeNode();
+      node.Text = group.Name;
+      node.ForeColor = Color.LightGray;
+      node.Tag = group;
+
+      foreach (IOperator op in group.Operators)
+        node.Nodes.Add(CreateTreeNode(op));
+      foreach (IOperatorGroup subGroup in group.SubGroups)
+        node.Nodes.Add(CreateTreeNode(subGroup));
+      return node;
+    }
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.ToolTipText = op.GetType().Name;
+      node.Tag = op;
+      return node;
+    }
+
+    #region Selection Events
+    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      operatorLibraryOperatorsDescriptionTextBox.Text = "";
+      if ((operatorLibraryOperatorsTreeView.SelectedNode != null) && (operatorLibraryOperatorsTreeView.SelectedNode.Tag is IOperator))
+        operatorLibraryOperatorsDescriptionTextBox.Text = ((IOperator)operatorLibraryOperatorsTreeView.SelectedNode.Tag).Description;
+    }
+    private void builtinOperatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      builtinOperatorsDescriptionTextBox.Text = "";
+      if ((builtinOperatorsTreeView.SelectedNode != null) && (builtinOperatorsTreeView.SelectedNode.Tag is Type))
+        builtinOperatorsDescriptionTextBox.Text = ((IOperator)Activator.CreateInstance((Type)builtinOperatorsTreeView.SelectedNode.Tag)).Description;
+    }
+    #endregion
+
+    #region Click Events
+    private void loadButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        operatorLibrary = (IOperatorLibrary)PersistenceManager.Load(openFileDialog.FileName);
+        operatorLibraryTextBox.Text = openFileDialog.FileName;
+        toolTip.SetToolTip(operatorLibraryTextBox, openFileDialog.FileName);
+        operatorLibraryOperatorsGroupBox.Enabled = true;
+        UpdateOperatorsTreeView();
+      }
+    }
+    private void closeButton_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void operatorLibraryOperatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = e.Item as TreeNode;
+      if ((node != null) && (node.Tag is IOperator)) {
+        IOperator op = (IOperator)node.Tag;
+        op = (IOperator)op.Clone();
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", operatorLibraryOperatorsTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    private void builtinOperatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = e.Item as TreeNode;
+      if ((node != null) && (node.Tag is Type)) {
+        IOperator op = (IOperator)Activator.CreateInstance((Type)node.Tag);
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", builtinOperatorsTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/AvailableOperatorsForm.resx	(revision 2)
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>141, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAQAEBAQAAAABAAoAQAARgAAACAgEAAAAAQA6AIAAG4BAAAQEAAAAAAYAGgDAABWBAAAICAAAAAA
+        GACoDAAAvgcAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+        AAAAAHZgAREQAAAAeGAJERAAAAB4YAkREAAAAHhwBxEQAAAAeHAHERAAAAd4dwd3EAAAdwCHeHcQAACA
+        hwh4iBAAAICAeHF3EAAAeICHcIYAAAAAAAhwhwBwAAAACIeHd3AAAAAIBwiHgAAAAAiAd3gAAAAAAAAA
+        AAD//wAA8YcAAPGHAADxhwAA8YcAAPGHAADghwAAzAcAANIHAADUBwAAxE8AAP5FAAD+AQAA/qEAAP5D
+        AAD//wAAKAAAACAAAABAAAAAAQAEAAAAAAAAAgAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAIAAAIAAAACA
+        gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3AAAREREAAAAAAAAAAAcIhgAAkRERAAAAAAAAAAAHCI
+        YAAJeZEQAAAAAAAAAABwiGAACXmREAAAAAAAAAAAcIhwAAl5kRAAAAAAAAAAAHCIcAAJeZEQAAAAAAAA
+        AACAiHAACXmREAAAAAAAAAAAgIhwAAd5mRAAAAAAAAAAAICIcAAHd3cQAAAAAAAAAACAiHAAB4d3EAAA
+        AAAAAAAHgIh3AAeHdxAAAAAAAAAAd4CId3AHh3cQAAAAAAAAB3iACIdnB4h3UAAAAAAAAAeAAAAIdweI
+        h3AAAAAAAAAIAId3AHYIiIdwAAAAAAAACAh3B4CGCIiHcAAAAAAAAAgIcACAhwgACHAAAAAAAAAIAIcH
+        AIcId3RwAAAAAAAACIAHAAh3CHh0gAAAAAAAAAB4dwh3cAh4dIAAAAAAAAAAAAAAAAAAeHYAAGAAAAAA
+        AAAAAHd3BniHYGZgAAAAAAAAAAB4h3eIh3d3cAAAAAAAAAAAcIiIiId3h3AAAAAAAAAAAHAIiACIiHdw
+        AAAAAAAAAABwCIgAAAd3AAAAAAAAAAAAd3d4d3d3cAAAAAAAAAAAAAAAB3d3dwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////weB//9Hgf//R4H//0eB//9Hgf//R4H//0eB//9H
+        gf//R4H//0eB//5Dgf/8QYH/+GCB//n4gf/7DIH/+iSB//p0uf/7LIH/+biB//whgf///8Pf//CBH//w
+        AB//9AAf//YwH//2Pj//8AB///+A////////////KAAAABAAAAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAALVxT7FgOaVYMgAAAAAAAC8UjigRgCgRgC8UjgAAAAAAAAAAAAAAAAAAAAAAAAAAALtw
+        TP+zi6pdOAAAAAAAACwyzi0Tjy0Tjy4TjgAAAAAAAAAAAAAAAAAAAAAAAAAAAMR2Uf+4lK9iPAAAAAAA
+        AD9F0zMgnjMgni4TjgAAAAAAAAAAAAAAAAAAAAAAAAAAAMp9WP++nrZoQwAAAAAAAFJY2DgurTgurS4T
+        jgAAAAAAAAAAAAAAAAAAAAAAAAAAAM+DX/7Gqb5xSwAAAAAAAGds3z49vz49vy4TjgAAAAAAAAAAAAAA
+        AAAAAAAAALhvTdWKZv/NtLd0U7hvTQAAAHuA5ENMzkNMzjMgngAAAAAAAAAAAAAAAAAAALhvTdyTcf3h
+        0v3h0v3Uvq1pSLhvTY6T6UhZ3UhZ3TMgngAAAAAAAAAAAAAAAAAAAOagfv3y6/bVxNGLa/vu5v3Yw7hv
+        TZ6j7sPK+KGt9DMgngAAAAAAAAAAAAAAAAAAAOGff/vu5uGaeAAAANWLZ+XEs793Vi8UjntvZWNTQy8U
+        jgAAAAAAAAAAAAAAAAAAALhvTemhf+effQAAAOCZeL55WLhvTQAAAMG5sVlLPAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAK+jmX1tXwAAALSpoWNTQyojHAAAAG5cSwAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAMnAuLaqmmNTQ7a5spyUiVpVUW5cS6OalAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMnAuPTw
+        6XxyaOrs5dHLwq2nonp1cb6soQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnSzby0rAAAAKegl5CKgm1o
+        Yr6soQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        AADxhwAA8YcAAPGHAADxhwAA8YcAAOCHAADABwAAwAcAAMQHAADETwAA/kUAAP4BAAD+AQAA/kMAAP//
+        AAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAoYh4eWBNdlxIclhEoYh4AAAAAAAAAAAAAAAAGR+sLyVtKyFqKR5oJhtk
+        HBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIFv7eXi
+        08K4vKSVZEk0AAAAAAAAAAAAAAAAISfKGR+sGB2rFxyqFhuqHBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoYd1AAAA08G5vKSVZ0w4AAAAAAAAAAAAAAAAJyzL
+        TFHWFx3HFBnGGiCtHBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAp418AAAA08G4vKOWalA8AAAAAAAAAAAAAAAALDLNU1fYHiTKGiDIICWwHBBaAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArpSEAAAA08G4vKOVb1RBAAAA
+        AAAAAAAAAAAAMzjPWl7ZJi3LISfKJiu0HBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAtZuMAAAA08K4vKOWdFpGAAAAAAAAAAAAAAAAOkDRYmbcMDbPKjDNLDK4
+        HhNcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKOXAAAA
+        08K4vKOWeGBMAAAAAAAAAAAAAAAAQUfTam/eOkDRNDnPNDm9IhdgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwqygAAAA08G5u6SWf2VSAAAAAAAAAAAAAAAASE7V
+        dHjhRkvVP0XTOj/BJxxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAybSpAAAA08G4vKOVg2tZAAAAAAAAAAAAAAAAUFXXfIDjUVfYS1DWQUfFLCNrAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0L20AAAA08G5vKOWinFgAAAA
+        AAAAAAAAAAAAV1zahormXmPbVlzaSU7KMilxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAoYh42Mi/AAAA2srDvKOVkHlnoYh4AAAAAAAAAAAAX2TckJPnaW/fY2jdUFXO
+        ODF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoYh4l39u2Mi/AAAA
+        4NLMxrGml39ufmNRoYh4AAAAAAAAZmzemp3rdnrjb3TgVlvTPzh/AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAoYh4l39uzLet2snDAAAA6+Lf39XQ1srDoIt8Y0gznIJwAAAAb3Th
+        oqbtgYbmeoDkW2HXRkCGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp5WJ
+        yLeu7+nlAAAAAAAAAAAAAAAA7+nl0sa+n4h6jnprAAAAdnvjrK7vjJHphovoYGbaTUiOAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwK6k7eXiAAAA08G4iXNiiXNirZyP/Pz87+nl
+        qZOGaEw4AAAAfYPltLfylpvskJXqZWvcVVGWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAx7OpAAAA3tTPdVtHoYh4AAAAoYh44NfTAAAAtaCUblRAAAAAhYrnvL/0ubvytLfxZWvc
+        XFqeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzLmvAAAA2M3HdVtHAAAA
+        AAAAAAAAzsG4AAAAtaCUd11KAAAAhYrn7Oz74uP62tv4tLfxXFqeAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAxbClAAAAAAAAtaCUdVtHAAAAk3xrAAAAAAAAtaCUo5GDAAAAo6bu
+        jHt3qZ2WjIF7TD83fXy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuqKV
+        y7itAAAAAAAAdVtHAAAAAAAAAAAAxLetqZSGm4JxAAAAubvyh3Rp2NTRloyHTD83ubvyAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoYh4xrKnsZqNpIt7AAAAxrKnsZqNo4p6
+        oYh4AAAAAAAAubvyl4aC3NfVm5GKTEA5ubvyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouA4dvao5iQVEdA
+        AAAAAAAAAAAAAAAAT0I5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAnouAhHFlfWlfnouAAAAAT0I5ppOJz8bDrKCYYVNLT0I5AAAAT0I5T0I5WEk/AAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouA2tHNxr+5o46EkH1xp5iQ
+        sZ+U2M/JvK+pe2phW01EW01EW01EW01EXE9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAnouAAAAA5d7a0MS94dXOx7eu5tzX283G0L61o46EkH1xhHFlv7axZ1xV
+        XVZTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouAAAAA
+        7ejm4tzZ0MS94dXO/fz79fDu3tHKy7etv6ea49vXi3tydWpmbmZiAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouAAAAAAAAArKShwrm03c/H+/n5/f388+/s8ezp
+        6+TgloqDkoR+fnVxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAnouAnouAnouAlI2KlY6K3dTQpZ6apJyYoZiUnpWRloyJiYF9hX15AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlY6L
+        lo+LlY6LlI2KkoqHj4eEi4N/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+        ////B4H//weB//9Hgf//R4H//0eB//9Hgf//R4H//0eB//9Hgf//R4H//kOB//xBgf/4QIH/+PCB//kA
+        gf/6JIH/+nSB//ssgf/5uIH//CGB////w9//8IEf//AAH//0AB//9AAf//YAP//wAH///4D/////////
+        //8=
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.Designer.cs	(revision 2)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  partial class EditorForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (Editor != null) {
+        Editor.CaptionChanged -= new System.EventHandler(Editor_CaptionChanged);
+        Editor.FilenameChanged -= new System.EventHandler(Editor_FilenameChanged);
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditorForm));
+      this.editorPanel = new System.Windows.Forms.Panel();
+      this.SuspendLayout();
+      // 
+      // editorPanel
+      // 
+      this.editorPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.editorPanel.Location = new System.Drawing.Point(12, 12);
+      this.editorPanel.Name = "editorPanel";
+      this.editorPanel.Size = new System.Drawing.Size(608, 422);
+      this.editorPanel.TabIndex = 0;
+      // 
+      // EditorForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(632, 446);
+      this.Controls.Add(this.editorPanel);
+      this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)((WeifenLuo.WinFormsUI.Docking.DockAreas.Float | WeifenLuo.WinFormsUI.Docking.DockAreas.Document)));
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "EditorForm";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.TabText = "Editor";
+      this.Text = "Editor";
+      this.TextChanged += new System.EventHandler(this.EditorForm_TextChanged);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Panel editorPanel;
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.cs	(revision 2)
@@ -0,0 +1,86 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  public partial class EditorForm : DockContent {
+    private IEditor myEditor;
+    public IEditor Editor {
+      get { return myEditor; }
+    }
+
+    public EditorForm() {
+      InitializeComponent();
+    }
+    public EditorForm(IEditor editor)
+      : this() {
+      myEditor = editor;
+      if (Editor != null) {
+        Control control = (Control)Editor;
+        control.Dock = DockStyle.Fill;
+        editorPanel.Controls.Add(control);
+        Editor.CaptionChanged += new EventHandler(Editor_CaptionChanged);
+        Editor.FilenameChanged += new EventHandler(Editor_FilenameChanged);
+        UpdateText();
+      } else {
+        Label errorLabel = new Label();
+        errorLabel.Name = "errorLabel";
+        errorLabel.Text = "No editor available";
+        errorLabel.AutoSize = false;
+        errorLabel.Dock = DockStyle.Fill;
+        editorPanel.Controls.Add(errorLabel);
+      }
+    }
+
+    private void UpdateText() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateText));
+      else {
+        if (Editor.Filename == null)
+          Text = "Untitled - " + Editor.Caption;
+        else
+          Text = Editor.Filename + " - " + Editor.Caption;
+      }
+    }
+
+    private void EditorForm_TextChanged(object sender, EventArgs e) {
+      TabText = Text;
+    }
+
+    #region Editor Events
+    private void Editor_FilenameChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    private void Editor_CaptionChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/EditorForm.resx	(revision 2)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLab.AdvancedOptimizationFrontend.csproj
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLab.AdvancedOptimizationFrontend.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLab.AdvancedOptimizationFrontend.csproj	(revision 2)
@@ -0,0 +1,142 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{74752FCD-9E10-48DB-9AF2-AF5518B62807}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.AdvancedOptimizationFrontend</RootNamespace>
+    <AssemblyName>HeuristicLab.AdvancedOptimizationFrontend</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.AdvancedOptimizationFrontend.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.2.2864.18696, Culture=neutral, PublicKeyToken=d481317c817cec47, processorArchitecture=MSIL" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AboutDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AboutDialog.Designer.cs">
+      <DependentUpon>AboutDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="AvailableOperatorsForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AvailableOperatorsForm.Designer.cs">
+      <DependentUpon>AvailableOperatorsForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EditorForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="EditorForm.Designer.cs">
+      <DependentUpon>EditorForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabAdvancedOptimizationFrontendApplication.cs" />
+    <Compile Include="HeuristicLabAdvancedOptimizationFrontendPlugin.cs" />
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ViewForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ViewForm.Designer.cs">
+      <DependentUpon>ViewForm.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\HeuristicLab.ico" />
+    <Content Include="Resources\Logo_gray.gif" />
+    <Content Include="Resources\New.png" />
+    <Content Include="Resources\Open.png" />
+    <Content Include="Resources\Save.png" />
+    <Content Include="Resources\SaveAll.png" />
+    <Content Include="Resources\Tools.ico" />
+    <Content Include="WeifenLuo.WinFormsUI.Docking.dll" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AboutDialog.resx">
+      <DependentUpon>AboutDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AvailableOperatorsForm.resx">
+      <DependentUpon>AvailableOperatorsForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditorForm.resx">
+      <DependentUpon>EditorForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ViewForm.resx">
+      <DependentUpon>ViewForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLabAdvancedOptimizationFrontendApplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLabAdvancedOptimizationFrontendApplication.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLabAdvancedOptimizationFrontendApplication.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  [ClassInfo(Name = "HeuristicLab 3.0 (dockable)", Description="Next generation heuristic optimization environment.")]
+  class HeuristicLabAdvancedOptimizationFrontendApplication : ApplicationBase {
+    public override void Run() {
+      Form mainForm = new MainForm();
+      PluginManager.ControlManager = (IControlManager)mainForm;
+      Application.Run(mainForm);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLabAdvancedOptimizationFrontendPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLabAdvancedOptimizationFrontendPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/HeuristicLabAdvancedOptimizationFrontendPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  [ClassInfo(Name = "HeuristicLab.AdvancedOptimizationFrontend")]
+  [PluginFile(Filename = "HeuristicLab.AdvancedOptimizationFrontend.dll", Filetype = PluginFileType.Assembly)]
+  [PluginFile(Filename = "WeifenLuo.WinFormsUI.Docking.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  public class HeuristicLabAdvancedOptimizationFrontendPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.Designer.cs	(revision 2)
@@ -0,0 +1,364 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  partial class MainForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+      this.menuStrip = new System.Windows.Forms.MenuStrip();
+      this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.closeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+      this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.availableOperatorsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collectGarbageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.statusStrip = new System.Windows.Forms.StatusStrip();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.toolStrip = new System.Windows.Forms.ToolStrip();
+      this.newToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
+      this.openToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.saveToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.saveAllToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.dockPanel = new WeifenLuo.WinFormsUI.Docking.DockPanel();
+      this.menuStrip.SuspendLayout();
+      this.toolStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // menuStrip
+      // 
+      this.menuStrip.AllowMerge = false;
+      this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileToolStripMenuItem,
+            this.viewToolStripMenuItem,
+            this.toolsToolStripMenuItem,
+            this.helpToolStripMenuItem});
+      this.menuStrip.Location = new System.Drawing.Point(0, 0);
+      this.menuStrip.Name = "menuStrip";
+      this.menuStrip.ShowItemToolTips = true;
+      this.menuStrip.Size = new System.Drawing.Size(1016, 24);
+      this.menuStrip.TabIndex = 0;
+      // 
+      // fileToolStripMenuItem
+      // 
+      this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripMenuItem,
+            this.openToolStripMenuItem,
+            this.saveToolStripMenuItem,
+            this.saveAsToolStripMenuItem,
+            this.saveAllToolStripMenuItem,
+            this.closeToolStripMenuItem,
+            this.closeAllToolStripMenuItem,
+            this.toolStripMenuItem1,
+            this.exitToolStripMenuItem});
+      this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+      this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20);
+      this.fileToolStripMenuItem.Text = "&File";
+      // 
+      // newToolStripMenuItem
+      // 
+      this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+      this.newToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.newToolStripMenuItem.Text = "&New";
+      // 
+      // openToolStripMenuItem
+      // 
+      this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+      this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+      this.openToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.openToolStripMenuItem.Text = "&Open...";
+      this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+      // 
+      // saveToolStripMenuItem
+      // 
+      this.saveToolStripMenuItem.Enabled = false;
+      this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+      this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+      this.saveToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveToolStripMenuItem.Text = "&Save";
+      this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+      // 
+      // saveAsToolStripMenuItem
+      // 
+      this.saveAsToolStripMenuItem.Enabled = false;
+      this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+      this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveAsToolStripMenuItem.Text = "Save &As...";
+      this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
+      // 
+      // saveAllToolStripMenuItem
+      // 
+      this.saveAllToolStripMenuItem.Enabled = false;
+      this.saveAllToolStripMenuItem.Name = "saveAllToolStripMenuItem";
+      this.saveAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+                  | System.Windows.Forms.Keys.S)));
+      this.saveAllToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveAllToolStripMenuItem.Text = "Save Al&l";
+      this.saveAllToolStripMenuItem.Click += new System.EventHandler(this.saveAllToolStripMenuItem_Click);
+      // 
+      // closeToolStripMenuItem
+      // 
+      this.closeToolStripMenuItem.Enabled = false;
+      this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
+      this.closeToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.closeToolStripMenuItem.Text = "&Close";
+      this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
+      // 
+      // closeAllToolStripMenuItem
+      // 
+      this.closeAllToolStripMenuItem.Enabled = false;
+      this.closeAllToolStripMenuItem.Name = "closeAllToolStripMenuItem";
+      this.closeAllToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.closeAllToolStripMenuItem.Text = "Clos&e All";
+      this.closeAllToolStripMenuItem.Click += new System.EventHandler(this.closeAllToolStripMenuItem_Click);
+      // 
+      // toolStripMenuItem1
+      // 
+      this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(188, 6);
+      // 
+      // exitToolStripMenuItem
+      // 
+      this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.exitToolStripMenuItem.Text = "E&xit";
+      this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.availableOperatorsToolStripMenuItem});
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(41, 20);
+      this.viewToolStripMenuItem.Text = "&View";
+      // 
+      // availableOperatorsToolStripMenuItem
+      // 
+      this.availableOperatorsToolStripMenuItem.Name = "availableOperatorsToolStripMenuItem";
+      this.availableOperatorsToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+      this.availableOperatorsToolStripMenuItem.Text = "Available &Operators...";
+      this.availableOperatorsToolStripMenuItem.Click += new System.EventHandler(this.availableOperatorsToolStripMenuItem_Click);
+      // 
+      // toolsToolStripMenuItem
+      // 
+      this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.collectGarbageToolStripMenuItem});
+      this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem";
+      this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+      this.toolsToolStripMenuItem.Text = "&Tools";
+      // 
+      // collectGarbageToolStripMenuItem
+      // 
+      this.collectGarbageToolStripMenuItem.Name = "collectGarbageToolStripMenuItem";
+      this.collectGarbageToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+      this.collectGarbageToolStripMenuItem.Text = "Collect &Garbage";
+      this.collectGarbageToolStripMenuItem.Click += new System.EventHandler(this.collectGarbageToolStripMenuItem_Click);
+      // 
+      // helpToolStripMenuItem
+      // 
+      this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.aboutToolStripMenuItem});
+      this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+      this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20);
+      this.helpToolStripMenuItem.Text = "&Help";
+      // 
+      // aboutToolStripMenuItem
+      // 
+      this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+      this.aboutToolStripMenuItem.Text = "&About";
+      this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+      // 
+      // statusStrip
+      // 
+      this.statusStrip.Location = new System.Drawing.Point(0, 712);
+      this.statusStrip.Name = "statusStrip";
+      this.statusStrip.Size = new System.Drawing.Size(1016, 22);
+      this.statusStrip.TabIndex = 3;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "item";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Open file ...";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.DefaultExt = "hl";
+      this.saveFileDialog.FileName = "item";
+      this.saveFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.saveFileDialog.Title = "Save file as ...";
+      // 
+      // toolStrip
+      // 
+      this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripDropDownButton,
+            this.openToolStripButton,
+            this.saveToolStripButton,
+            this.saveAllToolStripButton});
+      this.toolStrip.Location = new System.Drawing.Point(0, 24);
+      this.toolStrip.Name = "toolStrip";
+      this.toolStrip.Size = new System.Drawing.Size(1016, 25);
+      this.toolStrip.TabIndex = 1;
+      this.toolStrip.Text = "toolStrip";
+      // 
+      // newToolStripDropDownButton
+      // 
+      this.newToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.newToolStripDropDownButton.Image = global::HeuristicLab.AdvancedOptimizationFrontend.Properties.Resources.New;
+      this.newToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.newToolStripDropDownButton.Name = "newToolStripDropDownButton";
+      this.newToolStripDropDownButton.Size = new System.Drawing.Size(29, 22);
+      this.newToolStripDropDownButton.Text = "New...";
+      // 
+      // openToolStripButton
+      // 
+      this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.openToolStripButton.Image = global::HeuristicLab.AdvancedOptimizationFrontend.Properties.Resources.Open;
+      this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.openToolStripButton.Name = "openToolStripButton";
+      this.openToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.openToolStripButton.Text = "Open...";
+      this.openToolStripButton.Click += new System.EventHandler(this.openToolStripButton_Click);
+      // 
+      // saveToolStripButton
+      // 
+      this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.saveToolStripButton.Enabled = false;
+      this.saveToolStripButton.Image = global::HeuristicLab.AdvancedOptimizationFrontend.Properties.Resources.Save;
+      this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.saveToolStripButton.Name = "saveToolStripButton";
+      this.saveToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.saveToolStripButton.Text = "Save";
+      this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripButton_Click);
+      // 
+      // saveAllToolStripButton
+      // 
+      this.saveAllToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.saveAllToolStripButton.Enabled = false;
+      this.saveAllToolStripButton.Image = global::HeuristicLab.AdvancedOptimizationFrontend.Properties.Resources.SaveAll;
+      this.saveAllToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.saveAllToolStripButton.Name = "saveAllToolStripButton";
+      this.saveAllToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.saveAllToolStripButton.Text = "Save all";
+      this.saveAllToolStripButton.Click += new System.EventHandler(this.saveAllToolStripButton_Click);
+      // 
+      // dockPanel
+      // 
+      this.dockPanel.ActiveAutoHideContent = null;
+      this.dockPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.dockPanel.DockBottomPortion = 0.33;
+      this.dockPanel.DockLeftPortion = 0.33;
+      this.dockPanel.DockRightPortion = 0.33;
+      this.dockPanel.DockTopPortion = 0.33;
+      this.dockPanel.Location = new System.Drawing.Point(0, 49);
+      this.dockPanel.Name = "dockPanel";
+      this.dockPanel.RightToLeftLayout = true;
+      this.dockPanel.Size = new System.Drawing.Size(1016, 663);
+      this.dockPanel.TabIndex = 2;
+      // 
+      // MainForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(1016, 734);
+      this.Controls.Add(this.dockPanel);
+      this.Controls.Add(this.toolStrip);
+      this.Controls.Add(this.statusStrip);
+      this.Controls.Add(this.menuStrip);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.IsMdiContainer = true;
+      this.MainMenuStrip = this.menuStrip;
+      this.Name = "MainForm";
+      this.Text = "HeuristicLab";
+      this.MdiChildActivate += new System.EventHandler(this.MainForm_MdiChildActivate);
+      this.menuStrip.ResumeLayout(false);
+      this.menuStrip.PerformLayout();
+      this.toolStrip.ResumeLayout(false);
+      this.toolStrip.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.MenuStrip menuStrip;
+    private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+    private System.Windows.Forms.StatusStrip statusStrip;
+    private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+    private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem closeAllToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem saveAllToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem collectGarbageToolStripMenuItem;
+    private System.Windows.Forms.ToolStrip toolStrip;
+    private System.Windows.Forms.ToolStripDropDownButton newToolStripDropDownButton;
+    private System.Windows.Forms.ToolStripButton openToolStripButton;
+    private System.Windows.Forms.ToolStripButton saveToolStripButton;
+    private System.Windows.Forms.ToolStripButton saveAllToolStripButton;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem availableOperatorsToolStripMenuItem;
+    private WeifenLuo.WinFormsUI.Docking.DockPanel dockPanel;
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.cs	(revision 2)
@@ -0,0 +1,287 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Threading;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  public partial class MainForm : Form, IControlManager {
+    #region Inner Types
+    private class Task {
+      public string filename;
+      public IStorable storable;
+      public IEditor editor;
+
+      private Task() { }
+      public Task(string filename, IStorable storable, IEditor editor) {
+        this.filename = filename;
+        this.storable = storable;
+        this.editor = editor;
+      }
+    }
+    #endregion
+
+    private object locker;
+    private int runningTasks;
+
+    public MainForm() {
+      InitializeComponent();
+
+      locker = new object();
+      runningTasks = 0;
+
+      AvailableOperatorsForm form = new AvailableOperatorsForm();
+      form.Show(dockPanel);
+
+      DiscoveryService discoveryService = new DiscoveryService();
+
+      // discover creatable items
+      Type[] creatables = discoveryService.GetTypes(typeof(IEditable));
+      string[] names = new string[creatables.Length];
+      for (int i = 0; i < creatables.Length; i++)
+        names[i] = creatables[i].Name;
+      Array.Sort(names, creatables);
+      foreach (Type type in creatables) {
+        if (!type.IsAbstract) {
+          ToolStripMenuItem item = new ToolStripMenuItem();
+          item.Tag = type;
+          item.Text = "&" + type.Name + "...";
+          item.Click += new EventHandler(newToolStripMenuItem_Click);
+          newToolStripMenuItem.DropDownItems.Add(item);
+
+          item = new ToolStripMenuItem();
+          item.Tag = type;
+          item.Text = "&" + type.Name + "...";
+          item.Click += new EventHandler(newToolStripMenuItem_Click);
+          newToolStripDropDownButton.DropDownItems.Add(item);
+        }
+      }
+    }
+
+    #region IControlManager Members
+    public void ShowControl(IControl control) {
+      DockContent content;
+      if (control is IEditor)
+        content = new EditorForm((IEditor)control);
+      else if (control is IView)
+        content = new ViewForm((IView)control);
+      else
+        throw new InvalidOperationException("Control is neither a view nor an editor.");
+
+      content.TabText = content.Text;
+      content.Show(dockPanel);
+    }
+    #endregion
+
+    private void EnableDisableItems() {
+      closeToolStripMenuItem.Enabled = false;
+      closeAllToolStripMenuItem.Enabled = false;
+      saveToolStripMenuItem.Enabled = false;
+      saveToolStripButton.Enabled = false;
+      saveAsToolStripMenuItem.Enabled = false;
+      saveAllToolStripMenuItem.Enabled = false;
+      saveAllToolStripButton.Enabled = false;
+
+      if (ActiveMdiChild != null) {
+        closeToolStripMenuItem.Enabled = true;
+        closeAllToolStripMenuItem.Enabled = true;
+        saveAllToolStripMenuItem.Enabled = true;
+        saveAllToolStripButton.Enabled = true;
+        EditorForm form = ActiveMdiChild as EditorForm;
+        if (form != null){
+          if (((Control)form.Editor).Enabled) {
+            saveToolStripMenuItem.Enabled = true;
+            saveToolStripButton.Enabled = true;
+            saveAsToolStripMenuItem.Enabled = true;
+          } else {
+            closeToolStripMenuItem.Enabled = false;
+            closeAllToolStripMenuItem.Enabled = false;
+          }
+        }
+      }
+    }
+
+    #region Open and Save Methods
+    private void Open() {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        lock (locker) runningTasks++;
+        Cursor = Cursors.AppStarting;
+        Task task = new Task(openFileDialog.FileName, null, null);
+        ThreadPool.QueueUserWorkItem(new WaitCallback(AsynchronousLoad), task);
+      }
+    }
+    private void AsynchronousLoad(object state) {
+      Task task = (Task)state;
+      task.storable = PersistenceManager.Load(task.filename);
+      LoadFinished(task);
+    }
+    private delegate void TaskFinishedDelegate(Task task);
+    private void LoadFinished(Task task) {
+      if (InvokeRequired)
+        Invoke(new TaskFinishedDelegate(LoadFinished), task);
+      else {
+        IEditor editor = null;
+        if (task.storable != null) {
+          IEditable editable = task.storable as IEditable;
+          if (editable != null)
+            editor = editable.CreateEditor();
+        }
+        if (editor == null)
+          MessageBox.Show("Could not open item. The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        else {
+          editor.Filename = task.filename;
+          PluginManager.ControlManager.ShowControl(editor);
+        }
+        lock (locker) {
+          runningTasks--;
+          if (runningTasks == 0)
+            Cursor = Cursors.Default;
+        }
+      }
+    }
+    private void Save(EditorForm form) {
+      if (form.Editor.Filename == null)
+        SaveAs(form);
+      else {
+        lock (locker) runningTasks++;
+        Cursor = Cursors.AppStarting;
+        ((Control)form.Editor).Enabled = false;
+        EnableDisableItems();
+        Task task = new Task(form.Editor.Filename, form.Editor.Item, form.Editor);
+        ThreadPool.QueueUserWorkItem(new WaitCallback(AsynchronousSave), task);
+      }
+    }
+    private void SaveAs(EditorForm form) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        form.Editor.Filename = saveFileDialog.FileName;
+        Save(form);
+      }
+    }
+    private void AsynchronousSave(object state) {
+      Task task = (Task)state;
+      PersistenceManager.Save(task.storable, task.filename);
+      SaveFinished(task);
+    }
+    private void SaveFinished(Task task) {
+      if (InvokeRequired)
+        Invoke(new TaskFinishedDelegate(SaveFinished), task);
+      else {
+        ((Control)task.editor).Enabled = true;
+        EnableDisableItems();
+        lock (locker) {
+          runningTasks--;
+          if (runningTasks == 0)
+            Cursor = Cursors.Default;
+        }
+      }
+    }
+    #endregion
+
+    private void MainForm_MdiChildActivate(object sender, EventArgs e) {
+      EnableDisableItems();
+    }
+
+    #region Menu Events
+    private void newToolStripMenuItem_Click(object sender, EventArgs e) {
+      ToolStripItem item = (ToolStripItem)sender;
+      Type type = (Type)item.Tag;
+      IEditable editable = (IEditable)Activator.CreateInstance(type);
+      if (editable == null) {
+        MessageBox.Show("The selected item is not editable.", "Editable Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+      } else {
+        IEditor editor = editable.CreateEditor();
+        if (editor == null) {
+          MessageBox.Show("The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        } else {
+          PluginManager.ControlManager.ShowControl(editor);
+          EnableDisableItems();
+        }
+      }
+    }
+    private void openToolStripMenuItem_Click(object sender, EventArgs e) {
+      Open();
+    }
+    private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
+      EditorForm form = ActiveMdiChild as EditorForm;
+      Save(form);
+    }
+    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) {
+      EditorForm form = ActiveMdiChild as EditorForm;
+      SaveAs(form);
+    }
+    private void saveAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      for (int i = 0; i < MdiChildren.Length; i++) {
+        EditorForm form = MdiChildren[i] as EditorForm;
+        if (((Control)form.Editor).Enabled) Save(form);
+      }
+    }
+    private void closeToolStripMenuItem_Click(object sender, EventArgs e) {
+      ActiveMdiChild.Close();
+      EnableDisableItems();
+    }
+    private void closeAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      while (MdiChildren.Length > 0)
+        MdiChildren[0].Close();
+      EnableDisableItems();
+    }
+    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
+      Application.Exit();
+    }
+    private void availableOperatorsToolStripMenuItem_Click(object sender, EventArgs e) {
+      AvailableOperatorsForm form = new AvailableOperatorsForm();
+      form.Show(dockPanel);
+    }
+    private void collectGarbageToolStripMenuItem_Click(object sender, EventArgs e) {
+      GC.Collect();
+    }
+    private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
+      AboutDialog dialog = new AboutDialog();
+      dialog.ShowDialog(this);
+      dialog.Dispose();
+    }
+    #endregion
+
+    #region ToolStrip Events
+    private void openToolStripButton_Click(object sender, EventArgs e) {
+      Open();
+    }
+    private void saveToolStripButton_Click(object sender, EventArgs e) {
+      EditorForm form = ActiveMdiChild as EditorForm;
+      Save(form);
+    }
+    private void saveAllToolStripButton_Click(object sender, EventArgs e) {
+      for (int i = 0; i < MdiChildren.Length; i++) {
+        EditorForm form = MdiChildren[i] as EditorForm;
+        if (((Control)form.Editor).Enabled) Save(form);
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.resx	(revision 2)
@@ -0,0 +1,449 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>212, 17</value>
+  </metadata>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>316, 17</value>
+  </metadata>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>440, 17</value>
+  </metadata>
+  <metadata name="toolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>119, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.AdvancedOptimizationFrontend")]
+[assembly: AssemblyDescription("HeuristicLab advanced user interface for heuristic optimization")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9e8c630f-f39d-42ae-97fd-2184b680db31")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/Resources.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/Resources.Designer.cs	(revision 2)
@@ -0,0 +1,119 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.AdvancedOptimizationFrontend.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.AdvancedOptimizationFrontend.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Logo_gray {
+            get {
+                object obj = ResourceManager.GetObject("Logo_gray", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap New {
+            get {
+                object obj = ResourceManager.GetObject("New", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Open {
+            get {
+                object obj = ResourceManager.GetObject("Open", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Save {
+            get {
+                object obj = ResourceManager.GetObject("Save", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap SaveAll {
+            get {
+                object obj = ResourceManager.GetObject("SaveAll", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/Resources.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/Properties/Resources.resx	(revision 2)
@@ -0,0 +1,136 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Logo_gray" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Logo_gray.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="New" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\New.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Open" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Open.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Save" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SaveAll" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\SaveAll.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.Designer.cs	(revision 2)
@@ -0,0 +1,86 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  partial class ViewForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (View != null)
+        View.CaptionChanged -= new System.EventHandler(View_CaptionChanged);
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ViewForm));
+      this.viewPanel = new System.Windows.Forms.Panel();
+      this.SuspendLayout();
+      // 
+      // viewPanel
+      // 
+      this.viewPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewPanel.Location = new System.Drawing.Point(12, 12);
+      this.viewPanel.Name = "viewPanel";
+      this.viewPanel.Size = new System.Drawing.Size(608, 422);
+      this.viewPanel.TabIndex = 0;
+      // 
+      // ViewForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(632, 446);
+      this.Controls.Add(this.viewPanel);
+      this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)((WeifenLuo.WinFormsUI.Docking.DockAreas.Float | WeifenLuo.WinFormsUI.Docking.DockAreas.Document)));
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "ViewForm";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.TabText = "View";
+      this.Text = "View";
+      this.TextChanged += new System.EventHandler(this.ViewForm_TextChanged);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Panel viewPanel;
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.AdvancedOptimizationFrontend {
+  public partial class ViewForm : DockContent {
+    private IView myView;
+    public IView View {
+      get { return myView; }
+    }
+
+    public ViewForm() {
+      InitializeComponent();
+    }
+    public ViewForm(IView view)
+      : this() {
+      myView = view;
+      if (View != null) {
+        Control control = (Control)View;
+        control.Dock = DockStyle.Fill;
+        viewPanel.Controls.Add(control);
+        View.CaptionChanged += new EventHandler(View_CaptionChanged);
+        UpdateText();
+      } else {
+        Label errorLabel = new Label();
+        errorLabel.Name = "errorLabel";
+        errorLabel.Text = "No view available";
+        errorLabel.AutoSize = false;
+        errorLabel.Dock = DockStyle.Fill;
+        viewPanel.Controls.Add(errorLabel);
+      }
+    }
+
+    private void UpdateText() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateText));
+      else
+        Text = View.Caption;
+    }
+
+    private void ViewForm_TextChanged(object sender, EventArgs e) {
+      TabText = Text;
+    }
+
+    #region View Events
+    private void View_CaptionChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/ViewForm.resx	(revision 2)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.BitVector/BitVectorCrossoverBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/BitVectorCrossoverBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/BitVectorCrossoverBase.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.BitVector {
+  public abstract class BitVectorCrossoverBase : CrossoverBase {
+    public BitVectorCrossoverBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("BitVector", "Parent and child bit vector", typeof(BoolArrayData), VariableKind.In | VariableKind.New));
+    }
+
+    protected sealed override void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child) {
+      IVariableInfo bitVectorInfo = GetVariableInfo("BitVector");
+      BoolArrayData vector1 = parent1.GetVariableValue<BoolArrayData>(bitVectorInfo.ActualName, false);
+      BoolArrayData vector2 = parent2.GetVariableValue<BoolArrayData>(bitVectorInfo.ActualName, false);
+
+      if (vector1.Data.Length != vector2.Data.Length) throw new InvalidOperationException("Cannot apply crossover to bit vectors of different length.");
+
+      bool[] result = Cross(scope, random, vector1.Data, vector2.Data);
+      child.AddVariable(new Variable(bitVectorInfo.ActualName, new BoolArrayData(result)));
+    }
+
+    protected abstract bool[] Cross(IScope scope, IRandom random, bool[] parent1, bool[] parent2);
+  }
+}
Index: /trunk/sources/HeuristicLab.BitVector/BitVectorManipulatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/BitVectorManipulatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/BitVectorManipulatorBase.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.BitVector {
+  public abstract class BitVectorManipulatorBase : OperatorBase {
+    public BitVectorManipulatorBase() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BitVector", "Bit vector to manipulate", typeof(BoolArrayData), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      BoolArrayData vector = GetVariableValue<BoolArrayData>("BitVector", scope, false);
+      vector.Data = Manipulate(scope, random, vector.Data);
+      return null;
+    }
+
+    protected abstract bool[] Manipulate(IScope scope, IRandom random, bool[] vector);
+  }
+}
Index: /trunk/sources/HeuristicLab.BitVector/FlipManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/FlipManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/FlipManipulator.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.BitVector {
+  public class FlipManipulator : BitVectorManipulatorBase {
+    public override string Description {
+      get { return "Single bit flip manipulation for bit vectors."; }
+    }
+
+    public static bool[] Apply(IRandom random, bool[] vector) {
+      bool[] result = (bool[])vector.Clone();
+      int index = random.Next(result.Length);
+      result[index] = !result[index];
+      return result;
+    }
+
+    protected override bool[] Manipulate(IScope scope, IRandom random, bool[] vector) {
+      return Apply(random, vector);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.BitVector/HeuristicLab.BitVector.csproj
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/HeuristicLab.BitVector.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/HeuristicLab.BitVector.csproj	(revision 2)
@@ -0,0 +1,79 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6D9564BB-956D-4808-8F92-AA7F776F90A5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.BitVector</RootNamespace>
+    <AssemblyName>HeuristicLab.BitVector</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.BitVector.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="RandomBitVectorGenerator.cs" />
+    <Compile Include="HeuristicLabBitVectorPlugin.cs" />
+    <Compile Include="BitVectorCrossoverBase.cs" />
+    <Compile Include="BitVectorManipulatorBase.cs" />
+    <Compile Include="SinglePointCrossover.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="FlipManipulator.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Evolutionary\HeuristicLab.Evolutionary.csproj">
+      <Project>{F5614C53-153C-4A37-A608-121E1C087F07}</Project>
+      <Name>HeuristicLab.Evolutionary</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.BitVector/HeuristicLabBitVectorPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/HeuristicLabBitVectorPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/HeuristicLabBitVectorPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.BitVector {
+  [ClassInfo(Name = "HeuristicLab.BitVector")]
+  [PluginFile(Filename = "HeuristicLab.BitVector.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Evolutionary")]
+  public class HeuristicLabBitVectorPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.BitVector/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.BitVector")]
+[assembly: AssemblyDescription("HeuristicLab bit vector operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c414ca27-8027-4ed7-a08b-420485c6392d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.BitVector/RandomBitVectorGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/RandomBitVectorGenerator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/RandomBitVectorGenerator.cs	(revision 2)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.BitVector
+{
+    public class RandomBitVectorGenerator : OperatorBase
+    {
+        public override string Description
+        {
+            get { return "Operator generating a new random bit vector."; }
+        }
+
+        public RandomBitVectorGenerator()
+        {
+            AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+            AddVariableInfo(new VariableInfo("Length", "Vector length", typeof(IntData), VariableKind.In));
+            AddVariableInfo(new VariableInfo("BitVector", "Created random bit vector", typeof(BoolArrayData), VariableKind.New));
+        }
+
+        public static bool[] Apply(IRandom random, int length)
+        {
+            bool[] result = new bool[length];
+            for (int i = 0; i < length; i++)
+                result[i] = random.Next() < 0.5;
+            return result;
+        }
+
+        public override IOperation Apply(IScope scope)
+        {
+            IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+            int length = GetVariableValue<IntData>("Length", scope, true).Data;
+
+            bool[] vector = Apply(random, length);
+            scope.AddVariable(new Variable(GetVariableInfo("BitVector").ActualName, new BoolArrayData(vector)));
+
+            return null;
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.BitVector/SinglePointCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.BitVector/SinglePointCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.BitVector/SinglePointCrossover.cs	(revision 2)
@@ -0,0 +1,50 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.BitVector {
+  public class SinglePointCrossover : BitVectorCrossoverBase {
+    public override string Description {
+      get { return "Single point crossover for bit vectors."; }
+    }
+
+    public static bool[] Apply(IRandom random, bool[] parent1, bool[] parent2) {
+      int length = parent1.Length;
+      bool[] result = new bool[length];
+      int breakPoint = random.Next(1, length);
+
+      for (int i = 0; i < breakPoint; i++)
+        result[i] = parent1[i];
+      for (int i = breakPoint; i < length; i++)
+        result[i] = parent2[i];
+
+      return result;
+    }
+
+    protected override bool[] Cross(IScope scope, IRandom random, bool[] parent1, bool[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.Designer.cs	(revision 2)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Charting.Data {
+  partial class DataChartControl {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DataChartControl));
+      this.titleLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox.Image")));
+      this.pictureBox.Location = new System.Drawing.Point(0, 33);
+      this.pictureBox.Size = new System.Drawing.Size(300, 230);
+      // 
+      // titleLabel
+      // 
+      this.titleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.titleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.titleLabel.Location = new System.Drawing.Point(3, 0);
+      this.titleLabel.Name = "titleLabel";
+      this.titleLabel.Size = new System.Drawing.Size(294, 30);
+      this.titleLabel.TabIndex = 2;
+      this.titleLabel.Text = "Title";
+      this.titleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      // 
+      // DataChartControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.titleLabel);
+      this.Name = "DataChartControl";
+      this.Size = new System.Drawing.Size(300, 263);
+      this.Controls.SetChildIndex(this.titleLabel, 0);
+      this.Controls.SetChildIndex(this.pictureBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Label titleLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.cs	(revision 2)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.Charting.Data {
+  public partial class DataChartControl : ChartControl {
+    public new Datachart Chart {
+      get { return (Datachart)base.Chart; }
+      set {
+        if (Chart != null) {
+          Chart.Update -= new EventHandler(Chart_Update);
+        }
+        base.Chart = value;
+        if (Chart != null) {
+          Chart.Update += new EventHandler(Chart_Update);
+        }
+      }
+    }
+
+    public DataChartControl() {
+      InitializeComponent();
+    }
+
+    private void Chart_Update(object sender, EventArgs e) {
+      titleLabel.Text = Chart.Title;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.resx
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/DataChartControl.resx	(revision 2)
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="pictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAASwAAADmCAYAAABvebgTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABMxJREFUeF7t0AEN
+        AAAAwqD3T20ON4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+        DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+        DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+        DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+        DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+        DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+        DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+        AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+        YMCAAQMGDBgwYMCAAQMGXgYGN0IAAaJ0SPsAAAAASUVORK5CYII=
+</value>
+  </data>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>210, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Charting.Data/DataRowType.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/DataRowType.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/DataRowType.cs	(revision 2)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Charting.Data {
+  public enum DataRowType {
+    Lines,
+    Bars,
+    Points
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Data/Datachart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/Datachart.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/Datachart.cs	(revision 2)
@@ -0,0 +1,99 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.Charting.Data {
+  public class Datachart : Chart {
+    private IList<DataRowType> dataRowTypes;
+
+    private string myTitle;
+    public string Title {
+      get { return myTitle; }
+      set {
+        if (myTitle != value) {
+          myTitle = value;
+          OnUpdate();
+        }
+      }
+    }
+
+    public Datachart(PointD lowerLeft, PointD upperRight)
+      : base(lowerLeft, upperRight) {
+      dataRowTypes = new List<DataRowType>();
+    }
+    public Datachart(double x1, double y1, double x2, double y2)
+      : this(new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+
+    public void AddDataRow(DataRowType dataRowType, Pen pen, Brush brush) {
+      Group group = new Group(this);
+      group.Pen = pen;
+      group.Brush = brush;
+      Group.Add(group);
+      dataRowTypes.Add(dataRowType);
+      if (dataRowType == DataRowType.Lines) {
+        Group lines = new Group(this);
+        group.Add(lines);
+        Group points = new Group(this);
+        group.Add(points);
+      }
+    }
+    public void RemoveDataRow(int index) {
+      Group.Remove(Group.Primitives[index]);
+      dataRowTypes.RemoveAt(index);
+    }
+
+    public void AddDataPoint(int dataRowIndex, PointD point) {
+      DataRowType dataRowType = dataRowTypes[dataRowIndex];
+      Group group = (Group)Group.Primitives[dataRowIndex];
+
+      switch (dataRowType) {
+        case DataRowType.Lines:
+          Group lines = (Group)group.Primitives[1];
+          Group points = (Group)group.Primitives[0];
+          if (points.Primitives.Count > 0) {
+            FixedSizeRectangle lastRect = (FixedSizeRectangle)points.Primitives[0];
+            Line line = new Line(this, lastRect.Point, point, group.Pen);
+            lines.Add(line);
+          }
+          FixedSizeRectangle rect = new FixedSizeRectangle(this, point, new Size(5, 5), group.Pen, group.Brush);
+          rect.ToolTipText = "(" + point.X.ToString() + " ; " + point.Y.ToString() + ")";
+          points.Add(rect);
+          break;
+        case DataRowType.Bars:
+          break;
+        case DataRowType.Points:
+          FixedSizeRectangle p = new FixedSizeRectangle(this, point, new Size(5, 5), group.Pen, group.Brush);
+          p.ToolTipText = "(" + point.X.ToString() + " ; " + point.Y.ToString() + ")";
+          group.Add(p);
+          break;
+      }
+    }
+    public void AddDataPoint(int dataRowIndex, double x, double y) {
+      AddDataPoint(dataRowIndex, new PointD(x, y));
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Data/HeuristicLab.Charting.Data.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/HeuristicLab.Charting.Data.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/HeuristicLab.Charting.Data.csproj	(revision 2)
@@ -0,0 +1,86 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Charting.Data</RootNamespace>
+    <AssemblyName>HeuristicLab.Charting.Data</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Charting.Data.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Datachart.cs" />
+    <Compile Include="DataChartControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DataChartControl.Designer.cs">
+      <DependentUpon>DataChartControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DataRowType.cs" />
+    <Compile Include="HeuristicLabChartingDataPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Charting\HeuristicLab.Charting.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataChartControl.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>DataChartControl.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Charting.Data/HeuristicLabChartingDataPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/HeuristicLabChartingDataPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/HeuristicLabChartingDataPlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Charting.Data {
+  [ClassInfo(Name = "HeuristicLab.Charting.Data")]
+  [PluginFile(Filename = "HeuristicLab.Charting.Data.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Charting")]
+  public class HeuristicLabChartingDataPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Data/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Data/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Data/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Charting.Data")]
+[assembly: AssemblyDescription("Data charts (line charts, bar charts, etc.) of the HeuristicLab charting framework")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("be8e26f9-5234-4554-894d-3edc19917a38")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Charting.Gantt {
+  partial class GanttControl {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.gridChartControl1 = new HeuristicLab.Charting.Grid.GridChartControl();
+      this.SuspendLayout();
+      // 
+      // gridChartControl1
+      // 
+      this.gridChartControl1.BackColor = System.Drawing.SystemColors.Control;
+      this.gridChartControl1.Chart = null;
+      this.gridChartControl1.Location = new System.Drawing.Point(12, 12);
+      this.gridChartControl1.Name = "gridChartControl1";
+      this.gridChartControl1.ScaleOnResize = true;
+      this.gridChartControl1.Size = new System.Drawing.Size(654, 351);
+      this.gridChartControl1.TabIndex = 0;
+      // 
+      // TestControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(669, 367);
+      this.Controls.Add(this.gridChartControl1);
+      this.Name = "Gantt Chart";
+      this.Text = "Gantt Chart";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Charting.Grid.GridChartControl gridChartControl1;
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Scheduling.JSSP;
+using HeuristicLab.Charting.Grid; 
+
+namespace HeuristicLab.Charting.Gantt {
+  public partial class GanttControl : Form {
+    public GanttControl() {
+      InitializeComponent();
+      int timespan = 50;
+      Schedule sched = new Schedule(3, timespan);
+      JSSPParser parser = new JSSPParser("C:\\Documents and Settings\\Monika Kofler\\Desktop\\ft3.jssp");
+      parser.Parse();
+      ItemList ops = parser.Operations;
+      while (ops.Count > 0) {
+        Operation op = getNextToSchedule(ops);
+        if(op != null) {
+          sched.ScheduleOperation(op);
+          UpdatePredecessors(ops, op); 
+        }
+      }
+      Ganttchart g = new Ganttchart(sched, 0, 0, 5, 5);
+      // g.DragDropEnabled = false; 
+      gridChartControl1.Chart = g; 
+    }
+
+    private void UpdatePredecessors(ItemList ops, Operation scheduled) {
+      int job = scheduled.Job;
+      int opIndex = scheduled.OperationIndex;
+      foreach(Operation op in ops) {
+        if((op.Job == job) && (op.Predecessors.Count > 0) && (((IntData)op.Predecessors[0]).Data == opIndex)) {
+          op.Predecessors.Clear();
+          op.Start = scheduled.Start + scheduled.Duration; 
+        }
+      }
+    }
+
+    private Operation getNextToSchedule(ItemList ops) {
+      Operation op = null;
+      for(int i = 0; i < ops.Count; i++) {
+        if(((Operation)ops[i]).Predecessors.Count == 0) {
+          op = (Operation)ops[i];
+          ops.RemoveAt(i);
+          return op;
+        }
+      }
+      return op; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.resx
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/GanttControl.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Charting.Gantt/Ganttchart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/Ganttchart.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/Ganttchart.cs	(revision 2)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Scheduling.JSSP; 
+using HeuristicLab.Charting.Grid;
+using System.Drawing; 
+
+namespace HeuristicLab.Charting.Gantt {
+  public class Ganttchart : Gridchart {
+    private Schedule schedule;
+    public Schedule Schedule {
+      get { return schedule; }
+      set { schedule = value; DisplaySchedule(); }
+    }
+
+    private List<Color> colors; 
+
+    public Ganttchart(Schedule s, PointD lowerLeft, PointD upperRight) 
+      : base(lowerLeft, upperRight) {
+      schedule = s;
+      colors = new List<Color>(); 
+      DisplaySchedule(); 
+    }
+
+    public Ganttchart(Schedule s, double x1, double y1, double x2, double y2)
+      : base(x1, y1, x2, y2) {
+      schedule = s;
+      colors = new List<Color>();
+      DisplaySchedule();   
+    }
+
+    private void DisplaySchedule() {
+      Random rand = new Random();
+      if((schedule != null) && (schedule.Machines > 0)) {
+        // delete all primitives except the grid 
+        Grid.Grid grid = (Grid.Grid) Group.Primitives[Group.Primitives.Count - 1];
+        Group.Clear();
+        Group.Add(grid); 
+
+        this.Redim(schedule.Machines, schedule.GetMachineSchedule(0).Timespan);
+        for(int i = 0; i < schedule.Machines; i++) {
+          ScheduleTree tree = schedule.GetMachineSchedule(i);
+          foreach(ScheduleTreeNode node in tree.InOrder) {
+            if(tree.IsLeaf(node) && (node.Data.job != -1)) {
+              OperationCell s = new OperationCell(this);
+              s.Value = node.Data.job;
+              s.SetSpan(1, node.Data.end - node.Data.start);
+              while(node.Data.job >= colors.Count) {
+                colors.Add(Color.Empty);
+              }
+              if(colors[node.Data.job].IsEmpty) {
+                colors[node.Data.job] = Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255));
+              }
+              s.Brush = new SolidBrush(colors[node.Data.job]);
+              this[i, node.Data.start] = s;
+            }
+          }
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Gantt/HeuristicLab.Charting.Gantt.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/HeuristicLab.Charting.Gantt.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/HeuristicLab.Charting.Gantt.csproj	(revision 2)
@@ -0,0 +1,103 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5D2521D9-AD86-4B3F-9532-06F4C0F49D1B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Charting.Gantt</RootNamespace>
+    <AssemblyName>HeuristicLab.Charting.Gantt</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Charting.Gantt.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Ganttchart.cs" />
+    <Compile Include="HeuristicLabChartingGanttPlugin.cs" />
+    <Compile Include="OperationCell.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="GanttControl.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="GanttControl.Designer.cs">
+      <DependentUpon>GanttControl.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Charting.Grid\HeuristicLab.Charting.Grid.csproj">
+      <Project>{36BADE08-A7C2-42C1-A57B-5EE31C431C36}</Project>
+      <Name>HeuristicLab.Charting.Grid</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Charting\HeuristicLab.Charting.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Scheduling.JSSP\HeuristicLab.Scheduling.JSSP.csproj">
+      <Project>{4C0EF782-CC94-4A94-BC3E-661D2600559B}</Project>
+      <Name>HeuristicLab.Scheduling.JSSP</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="GanttControl.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>GanttControl.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Charting.Gantt/HeuristicLabChartingGanttPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/HeuristicLabChartingGanttPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/HeuristicLabChartingGanttPlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Charting.Gantt {
+  [ClassInfo(Name = "HeuristicLab.Charting.Gantt")]
+  [PluginFile(Filename = "HeuristicLab.Charting.Gantt.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Charting")]
+  public class HeuristicLabChartingGanttPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Gantt/OperationCell.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/OperationCell.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/OperationCell.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Charting.Grid;
+using System.Drawing;
+using HeuristicLab.Scheduling.JSSP;
+
+namespace HeuristicLab.Charting.Gantt {
+  public class OperationCell : SimpleCell {
+    private Brush textBrush;
+
+    public OperationCell(Gridchart chart) : base(chart) { 
+      Value = "";
+      textBrush = Brushes.Black;
+    }
+
+    public override void RenderCell(PointD lowerLeft, PointD upperRight) {
+      Rectangle rect;
+      Text t; 
+      PointD ur = upperRight;
+      PointD ll = lowerLeft;
+      double height = (upperRight.Y - lowerLeft.Y) * Rowspan;
+      ur.X += (upperRight.X - lowerLeft.X) * (Colspan - 1);
+      ll.Y = ur.Y - height * 0.8;
+      ur.Y -= height * 0.2; 
+      if(this.Primitives.Count == 0) {
+        rect = new Rectangle(Chart, ll, ur, Pen, Brush);
+        t = new Text(Chart, ll, ur);
+        t.Brush = textBrush; 
+        t.String = Value.ToString();
+      } else {
+        rect = (Rectangle)this.Primitives[1];
+        t = (Text) this.Primitives[0];
+        rect.SetPosition(ll, ur);
+        t.SetPosition(ll, ur);
+        t.Brush = textBrush; 
+        t.String = Value.ToString();
+      }
+      rect.Group = this;
+      t.Group = this; 
+      this.Clear();
+      this.lowerLeft = lowerLeft;
+      this.upperRight = upperRight;
+      if((bool) this.Display) {
+        this.Add(rect);
+        this.Add(t);
+        t.IntoForeground(); 
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Gantt/Program.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/Program.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/Program.cs	(revision 2)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting.Gantt {
+  static class Program {
+    /// <summary>
+    /// The main entry point for the application.
+    /// </summary>
+    [STAThread]
+    static void Main() {
+      Application.EnableVisualStyles();
+      Application.SetCompatibleTextRenderingDefault(false);
+      Application.Run(new GanttControl());
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Gantt/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Gantt/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Gantt/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Charting.Gantt")]
+[assembly: AssemblyDescription("Gantt charts of the HeuristicLab charting framework")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ec80f3c3-a30c-422b-97ea-0a679a7b43bd")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Charting.Grid/CellBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/CellBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/CellBase.cs	(revision 2)
@@ -0,0 +1,129 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.Charting.Grid {
+  public class CellBase : Group, ICell {
+    #region ICell Members
+    int rowspan;
+    public int Rowspan {
+      get { return rowspan; }
+    }
+
+    int colspan;
+    public int Colspan {
+      get { return colspan; }
+    }
+
+    object val;
+    public object Value {
+      get { return val; }
+      set { val = value; }
+    }
+
+    bool display;
+    public object Display {
+      get { return display; }
+      set { 
+        display = (bool) value;
+        RenderCell(lowerLeft, upperRight);
+      }
+    }
+
+    public PointD lowerLeft;
+    public PointD upperRight; 
+
+    public override Pen Pen {
+      get { return base.Pen; }
+      set {
+        base.Pen = value;
+        foreach(IPrimitive p in Primitives) {
+          p.Pen = base.Pen; 
+        }
+        OnUpdate();
+      }
+    }
+
+    public override Brush Brush {
+      get { return base.Brush; }
+      set {
+        base.Brush = value;
+        foreach(IPrimitive p in Primitives) {
+          p.Brush = base.Brush;
+        }
+        OnUpdate();
+      }
+    }
+    #endregion 
+
+    private bool dragDropEnabled;
+    public bool DragDropEnabled {
+      get { return dragDropEnabled; }
+      set { dragDropEnabled = (bool)value; }
+    }
+
+    public override void Move(Offset delta) {
+      if (dragDropEnabled) {
+        base.Move(delta); 
+      }
+    }
+
+    public CellBase(Gridchart chart) : base(chart) {
+      Chart.Group.Add(this);
+      display = true; 
+      rowspan = 1;
+      colspan = 1;
+      dragDropEnabled = true; 
+    }
+
+    public void SetSpan(int rowspan, int colspan) {
+      this.rowspan = Math.Max(rowspan, 1);
+      this.colspan = Math.Max(colspan, 1);
+      RenderCell(lowerLeft, upperRight); 
+    }
+
+    public virtual void RenderCell(PointD lowerLeft, PointD upperRight) {
+      Rectangle rect;
+      PointD ur = upperRight;
+      PointD ll = lowerLeft; 
+      ur.X += (upperRight.X - lowerLeft.X) * (colspan - 1);
+      ll.Y -= (upperRight.Y - lowerLeft.Y) * (rowspan - 1); 
+      if (this.Primitives.Count == 0) {
+        rect = new Rectangle(Chart, ll, ur, Pen, Brush);
+      } else {
+        rect = (Rectangle) this.Primitives[0];
+        rect.SetPosition(ll, ur);
+      }
+      rect.Group = this;
+      this.Clear();
+      this.lowerLeft = lowerLeft;
+      this.upperRight = upperRight;
+      if(display) {
+        this.Add(rect);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/EmptyCell.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/EmptyCell.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/EmptyCell.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting.Grid {
+  public class EmptyCell : CellBase {
+    public EmptyCell(Gridchart chart) 
+      : base(chart) {
+      Pen = Pens.Gray;
+      Brush = Brushes.DarkGray;
+      DragDropEnabled = false; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/Grid.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/Grid.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/Grid.cs	(revision 2)
@@ -0,0 +1,111 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting.Grid {
+  public class Grid : Group {
+    private int rows;
+    public int RowCount {
+      get { return rows; }
+    }
+
+    private int columns;
+    public int ColumnCount {
+      get { return columns; }
+    }
+
+    private PointD myLowerLeft;
+    public virtual PointD LowerLeft {
+      get { return myLowerLeft; }
+    }
+
+    private PointD myUpperRight;
+    public virtual PointD UpperRight {
+      get { return myUpperRight; }
+    }
+
+    public virtual SizeD Size {
+      get { return new SizeD(UpperRight.X - LowerLeft.X, UpperRight.Y - LowerLeft.Y); }
+    }
+
+    private void UpdateLines() {
+      if (Primitives.Count > 0) {
+        this.Clear(); 
+      }
+      if ((rows == 0) || (columns == 0)) {
+        return; 
+      }
+      double width = Size.Width / ColumnCount;
+      double height = Size.Height / RowCount;
+      PointD ll = LowerLeft;
+      PointD ur = UpperRight;
+      for(int col = 0; col <= ColumnCount; col++) {
+        ur.X = ll.X;
+        this.Add(new Line(Chart, ll, ur, this.Pen));
+        ll.X += width;
+      }
+      ll = LowerLeft;
+      ur = UpperRight;
+      for(int row = 0; row <= RowCount; row++) {
+        ur.Y = ll.Y;
+        this.Add(new Line(Chart, ll, ur, this.Pen));
+        ll.Y += height;
+      }
+    }
+
+    public Grid(IChart chart, PointD lowerLeft, PointD upperRight, int rows, int cols) : base(chart) {
+      SetPosition(lowerLeft, upperRight);
+      this.rows = rows;
+      this.columns = cols;
+      UpdateLines(); 
+      // UpdateEnabled = false; // vielleicht doch besser net? 
+    }
+
+    public virtual void SetPosition(PointD lowerLeft, PointD upperRight) {
+      if((lowerLeft.X > upperRight.X) || (lowerLeft.Y > upperRight.Y))
+        throw new ArgumentException("Lower left point is greater than upper right point");
+      myLowerLeft = lowerLeft;
+      myUpperRight = upperRight;
+      UpdateLines(); 
+      OnUpdate();
+    }
+
+    public virtual void SetRowsCols(int rows, int columns) {
+      this.rows = rows;
+      this.columns = columns;
+      UpdateLines();
+      OnUpdate(); 
+    }
+
+    public override void Move(Offset delta) {
+      // do nothing
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      // throw new Exception("The method or operation is not implemented.");
+      return false; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/GridChartControl.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/GridChartControl.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/GridChartControl.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Charting.Grid {
+  partial class GridChartControl {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/GridChartControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/GridChartControl.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/GridChartControl.cs	(revision 2)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting.Grid {
+  public partial class GridChartControl : ChartControl {
+    public GridChartControl() : base() {
+      InitializeComponent();
+      base.pictureBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
+    }
+
+    private void pictureBox_MouseUp(object sender, MouseEventArgs e) {
+      SimpleCell b = null; 
+      EmptyCell empty = null;
+      PointD position = Chart.TransformPixelToWorld(e.Location); 
+      if(e.Button == MouseButtons.Left) {
+        if(Chart.Mode == ChartMode.Select) {
+          IList<IPrimitive> primitives = Chart.Group.GetAllPrimitives(position);
+          foreach(IPrimitive p in primitives) {
+            if(p is SimpleCell) {
+              b = (SimpleCell)p;
+            }
+            if(p is EmptyCell) {
+              empty = (EmptyCell)p;
+            }
+          }
+          if((empty != null) && (b != null)) {
+            // if cell spans across more than one cell
+            // --> determine position of mouse pointer
+            int[] index = b.GetSubCell(position);
+            Offset diff = new Offset(index[0] * (empty.upperRight.X - empty.lowerLeft.X), -index[1] * (empty.upperRight.Y - empty.lowerLeft.Y)); 
+            b.Snap(empty.lowerLeft - diff, empty.upperRight - diff);
+          }
+        }
+      }
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/Gridchart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/Gridchart.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/Gridchart.cs	(revision 2)
@@ -0,0 +1,165 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Charting;
+using System.Drawing;
+using System.Collections; 
+
+namespace HeuristicLab.Charting.Grid {
+  public class Gridchart : Chart {
+    private int rows;
+    public int RowCount {
+      get { return rows; }
+      set { rows = value; }
+    }
+
+    private int columns;
+    public int ColumnCount {
+      get { return columns; }
+      set { columns = value; }
+    }
+
+    private Dictionary<string, ICell> myCells;
+    public ICollection<ICell> Cells {
+      get { return myCells.Values; }
+    }
+
+    private bool dragDropEnabled;
+    public bool DragDropEnabled {
+      get { return dragDropEnabled; }
+      set {
+        if(dragDropEnabled != (bool)value) {
+          dragDropEnabled = (bool)value;
+          foreach(IPrimitive cell in this.Group.Primitives) {
+            if(cell is CellBase) {
+              CellBase b = (CellBase)cell;
+              b.DragDropEnabled = dragDropEnabled;
+            }
+          }
+        }
+      }
+    }
+
+    private bool displayEmptyCells;
+    public bool DisplayEmptyCells {
+      get { return displayEmptyCells; }
+      set {
+        if(displayEmptyCells != (bool)value) {
+          displayEmptyCells = (bool)value;
+          foreach(IPrimitive cell in this.Group.Primitives) {
+            if (cell is EmptyCell) {
+              EmptyCell e = (EmptyCell)cell;
+              e.Display = displayEmptyCells;
+            } 
+          }
+          DragDropEnabled = displayEmptyCells; 
+        }
+      }
+    }
+
+    public Gridchart(PointD lowerLeft, PointD upperRight)
+      : base(lowerLeft, upperRight) {
+      myCells = new Dictionary<string, ICell>();
+      Mode = ChartMode.Select;
+      displayEmptyCells = true;
+      dragDropEnabled = true; 
+      this.Group.Add(new Grid(this, lowerLeft, upperRight, 0, 0));
+    }
+
+    public Gridchart(double x1, double y1, double x2, double y2)
+      : this(new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+
+    public void Redim(int rows, int cols) {
+      int oldRowCount = RowCount;
+      int oldColumnCount = ColumnCount; 
+      RowCount = rows;
+      ColumnCount = cols;
+      ((Grid)Group.Primitives[Group.Primitives.Count - 1]).SetRowsCols(rows, cols);
+      if(rows < oldRowCount) {
+        for(int i = rows; i < oldRowCount; i++) {
+          for(int j = 0; j < oldColumnCount; j++) {
+            myCells.Remove(GenerateKey(i, j));
+          }
+        }
+      }
+      if(cols < oldColumnCount) {
+        for(int i = cols; i < oldColumnCount; i++) {
+          for(int j = 0; j < Math.Min(oldRowCount, rows); j++) {
+            myCells.Remove(GenerateKey(j, i));
+          }
+        }
+      }
+
+      for(int i = oldRowCount; i < rows; i++) {
+        for(int j = 0; j < cols; j++) {
+          this[i, j] = new EmptyCell(this);
+          if(!DisplayEmptyCells)
+            this[i, j].Display = false; 
+        }
+      }
+
+      for(int i = oldColumnCount; i < cols; i++) {
+        for(int j = 0; j < oldRowCount; j++) {
+          this[j, i] = new EmptyCell(this);
+          if(!DisplayEmptyCells)
+            this[i, j].Display = false; 
+        }
+      }
+    }
+
+    private string GenerateKey(int row, int col) {
+      return (row.ToString() + ";" + col.ToString()); 
+    }
+
+    public ICell this[int row, int col] {
+      get {
+        ICell cell;
+        if(myCells.TryGetValue(GenerateKey(row, col), out cell)) {
+          return cell; 
+        } else {
+          return null; 
+        }
+      }
+      set {
+        string key = GenerateKey(row, col);
+        if (myCells.ContainsKey(key)) {
+          myCells.Remove(key);
+        }
+        myCells.Add(key, value);
+        PointD ll = this.LowerLeft; 
+        SizeD s = this.Size;
+        double w = s.Width / ColumnCount;
+        double h = s.Width / RowCount;
+        if ((bool) value.Display) {
+          value.RenderCell(new PointD(ll.X + col*w, ll.Y + (RowCount - row - 1)*h), new PointD(ll.X +(col+1)*w, ll.Y + (RowCount - row)*h));
+        }
+      }
+    }
+
+    public override void Render(Graphics graphics, int width, int height) {
+      base.Render(graphics, width, height);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/HeuristicLab.Charting.Grid.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/HeuristicLab.Charting.Grid.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/HeuristicLab.Charting.Grid.csproj	(revision 2)
@@ -0,0 +1,98 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{36BADE08-A7C2-42C1-A57B-5EE31C431C36}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Charting.Grid</RootNamespace>
+    <AssemblyName>HeuristicLab.Charting.Grid</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Charting.Grid.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CellBase.cs" />
+    <Compile Include="EmptyCell.cs" />
+    <Compile Include="Grid.cs" />
+    <Compile Include="Gridchart.cs" />
+    <Compile Include="HeuristicLabChartingGridPlugin.cs" />
+    <Compile Include="ICell.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SimpleCell.cs" />
+    <Compile Include="TestControl.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TestControl.Designer.cs">
+      <DependentUpon>TestControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="GridChartControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GridChartControl.Designer.cs">
+      <DependentUpon>GridChartControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Text.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Charting\HeuristicLab.Charting.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="TestControl.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>TestControl.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Charting.Grid/HeuristicLabChartingGridPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/HeuristicLabChartingGridPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/HeuristicLabChartingGridPlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Charting.Grid {
+  [ClassInfo(Name = "HeuristicLab.Charting.Grid")]
+  [PluginFile(Filename = "HeuristicLab.Charting.Grid.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Charting")]
+  public class HeuristicLabChartingGridPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/ICell.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/ICell.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/ICell.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Charting; 
+
+namespace HeuristicLab.Charting.Grid {
+  public interface ICell : IPrimitive {
+    object Value { get; set; }
+    object Display { get; set; }
+    void RenderCell(PointD lowerLeft, PointD upperRight);
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/Program.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/Program.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/Program.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting.Grid {
+  public class Program {
+    [STAThread]
+    static void Main() {
+      Application.EnableVisualStyles();
+      Application.SetCompatibleTextRenderingDefault(false);
+      Application.Run(new TestControl());
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Charting.Grid")]
+[assembly: AssemblyDescription("Grid charts of the HeuristicLab charting framework")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e1729ef2-5915-4dd3-8008-a0761fe20a90")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Charting.Grid/SimpleCell.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/SimpleCell.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/SimpleCell.cs	(revision 2)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+
+namespace HeuristicLab.Charting.Grid {
+  public class SimpleCell : CellBase {
+    
+    public SimpleCell(Gridchart chart)
+      : base(chart) {
+      DragDropEnabled = true; 
+    }
+
+    public override void Move(Offset delta) {
+      if (DragDropEnabled) {
+        base.Move(delta);
+        SetPosition(lowerLeft + delta, upperRight + delta);
+      }
+    }
+
+    public int[] GetSubCell(PointD point) {
+      Offset diff = lowerLeft - point;
+      diff.DX /= Math.Abs(lowerLeft.X - upperRight.X);
+      diff.DY = (upperRight.Y - point.Y) / Math.Abs(lowerLeft.Y - upperRight.Y); 
+      int[] result = new int[]{(int) Math.Floor(Math.Abs(diff.DX)), (int) Math.Floor(Math.Abs(diff.DY))}; 
+      return result; 
+    }
+
+    public virtual void SetPosition(PointD lowerLeft, PointD upperRight) {
+      if((lowerLeft.X > upperRight.X) || (lowerLeft.Y > upperRight.Y))
+        throw new ArgumentException("Lower left point is greater than upper right point");
+      RenderCell(lowerLeft, upperRight); 
+      OnUpdate();
+    }
+
+    public override void MouseDrag(PointD point, Offset offset, MouseButtons button) {
+      if(button == MouseButtons.Left) {
+        Move(offset);
+      }
+    }
+
+    public void Snap(PointD ll, PointD ur) {
+      this.SetPosition(ll, ur);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/TestControl.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/TestControl.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/TestControl.Designer.cs	(revision 2)
@@ -0,0 +1,75 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Charting.Grid {
+  partial class TestControl {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.chartControl1 = new GridChartControl();
+      this.SuspendLayout();
+      // 
+      // chartControl1
+      // 
+      this.chartControl1.BackColor = System.Drawing.SystemColors.Control;
+      this.chartControl1.Chart = null;
+      this.chartControl1.Location = new System.Drawing.Point(3, 3);
+      this.chartControl1.Name = "chartControl1";
+      this.chartControl1.ScaleOnResize = true;
+      this.chartControl1.Size = new System.Drawing.Size(286, 260);
+      this.chartControl1.TabIndex = 0;
+      // 
+      // TestControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(292, 266);
+      this.Controls.Add(this.chartControl1);
+      this.Name = "TestControl";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private GridChartControl chartControl1;
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/TestControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/TestControl.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/TestControl.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.Charting.Grid {
+  public partial class TestControl : Form {
+    public TestControl() {
+      InitializeComponent();
+      Gridchart c = new Gridchart(0, 0, 3, 3); 
+      chartControl1.Chart = c;
+      c.Redim(5, 5);
+      CellBase cell = new SimpleCell(c);
+      cell.Brush = Brushes.Crimson;
+      cell.SetSpan(2, 2); 
+      c[3, 3] = cell;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting.Grid/TestControl.resx
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/TestControl.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/TestControl.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Charting.Grid/Text.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting.Grid/Text.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting.Grid/Text.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Charting;
+using System.Drawing; 
+
+namespace HeuristicLab.Charting.Grid {
+  public class Text : RectangularPrimitiveBase {
+    private string text;
+    public string String {
+      get { return text; }
+      set { 
+        text = value;
+        OnUpdate();
+      }
+    }
+
+    private Font font;
+    public Font Font {
+      get { return font; }
+      set { font = value; }
+    }
+
+    public Text(IChart chart, PointD lowerLeft, PointD upperRight)
+      : base(chart, lowerLeft, upperRight) {
+      font = new Font("Verdana", 10);
+      text = "";
+      Pen = Pens.Black; 
+    }
+    public Text(IChart chart, double x1, double y1, double x2, double y2)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+    public Text(IChart chart, PointD lowerLeft, PointD upperRight, Pen pen, Brush brush)
+      : base(chart, lowerLeft, upperRight, pen, brush) {
+      font = new Font("Verdana", 10);
+      text = ""; 
+      
+    }
+    public Text(IChart chart, double x1, double y1, double x2, double y2, Pen pen, Brush brush)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen, brush) {
+    }
+
+    public override void Draw(Graphics graphics) {
+      Point p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+      Size s = Chart.TransformWorldToPixel(Size);
+      if(Brush != null)
+        graphics.DrawString(String, Font, Brush, p);
+      base.Draw(graphics);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/AxisType.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/AxisType.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/AxisType.cs	(revision 2)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Charting {
+  [FlagsAttribute]
+  public enum AxisType {
+    None = 0,
+    Horizontal = 1,
+    Vertical = 2,
+    Both = Horizontal | Vertical
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Chart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Chart.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Chart.cs	(revision 2)
@@ -0,0 +1,279 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public class Chart : IChart {
+    private PointD originalLowerLeft;
+    private PointD originalUpperRight;
+    private List<Offset> zoomHistory;
+
+    private ChartMode myMode;
+    public virtual ChartMode Mode {
+      get { return myMode; }
+      set {
+        myMode = value;
+        OnUpdate();
+      }
+    }
+
+    private PointD myLowerLeft;
+    public virtual PointD LowerLeft {
+      get { return myLowerLeft; }
+    }
+    private PointD myUpperRight;
+    public virtual PointD UpperRight {
+      get { return myUpperRight; }
+    }
+    public virtual SizeD Size {
+      get { return new SizeD(UpperRight.X - LowerLeft.X, UpperRight.Y - LowerLeft.Y); }
+    }
+    private Size mySizeInPixels;
+    public Size SizeInPixels {
+      get { return mySizeInPixels; }
+    }
+    public SizeD PixelToWorldRatio {
+      get { return new SizeD(Size.Width / SizeInPixels.Width, Size.Height / SizeInPixels.Height); }
+    }
+    public SizeD WorldToPixelRatio {
+      get { return new SizeD(SizeInPixels.Width / Size.Width, SizeInPixels.Height / Size.Height); }
+    }
+
+    private IGroup myGroup;
+    public IGroup Group {
+      get { return myGroup; }
+    }
+
+    private bool myUpdateEnabled;
+    public bool UpdateEnabled {
+      get { return myUpdateEnabled; }
+      set { myUpdateEnabled = value; }
+    }
+
+    public Chart(PointD lowerLeft, PointD upperRight) {
+      myUpdateEnabled = false;
+      zoomHistory = new List<Offset>();
+      myMode = ChartMode.Move;
+      SetPosition(lowerLeft, upperRight);
+      mySizeInPixels = new Size(100, 100);
+      myGroup = new Group(this);
+      Group.Update += new EventHandler(Group_Update);
+      myUpdateEnabled = true;
+    }
+    public Chart(double x1, double y1, double x2, double y2)
+      : this(new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+
+    public PointD TransformPixelToWorld(Point point) {
+      double x = LowerLeft.X + point.X * PixelToWorldRatio.Width;
+      double y = LowerLeft.Y + (SizeInPixels.Height - point.Y) * PixelToWorldRatio.Height;
+      return new PointD(x, y);
+    }
+    public SizeD TransformPixelToWorld(Size size) {
+      double width = size.Width * PixelToWorldRatio.Width;
+      double height = size.Height * PixelToWorldRatio.Height;
+      return new SizeD(width, height);
+    }
+    public Point TransformWorldToPixel(PointD point) {
+      int x = (int)((point.X - LowerLeft.X) * WorldToPixelRatio.Width);
+      int y = (int)((UpperRight.Y - point.Y) * WorldToPixelRatio.Height);
+      return new Point(x, y);
+    }
+    public Size TransformWorldToPixel(SizeD size) {
+      int width = (int)(size.Width * WorldToPixelRatio.Width);
+      int height = (int)(size.Height * WorldToPixelRatio.Height);
+      return new Size(width, height);
+    }
+
+    public virtual void SetPosition(PointD lowerLeft, PointD upperRight) {
+      if ((lowerLeft.X >= upperRight.X) || (lowerLeft.Y >= upperRight.Y))
+        throw new ArgumentException("Lower left point is greater or equal than upper right point");
+
+      originalLowerLeft = lowerLeft;
+      originalUpperRight = upperRight;
+      if (zoomHistory != null) zoomHistory.Clear();
+      myLowerLeft = lowerLeft;
+      myUpperRight = upperRight;
+      OnUpdate();
+    }
+    public void SetPosition(double x1, double y1, double x2, double y2) {
+      SetPosition(new PointD(x1, y1), new PointD(x2, y2));
+    }
+    public virtual void Move(Offset delta) {
+      myLowerLeft += delta;
+      myUpperRight += delta;
+      OnUpdate();
+    }
+    public void Move(double dx, double dy) {
+      Move(new Offset(dx, dy));
+    }
+
+    public virtual void ZoomIn(PointD lowerLeft, PointD upperRight) {
+      zoomHistory.Insert(0, LowerLeft - lowerLeft);
+      zoomHistory.Insert(0, UpperRight - upperRight);
+      myLowerLeft = lowerLeft;
+      myUpperRight = upperRight;
+      OnUpdate();
+    }
+    public void ZoomIn(double x1, double y1, double x2, double y2) {
+      ZoomIn(new PointD(x1, y1), new PointD(x2, y2));
+    }
+    public virtual void ZoomIn(Point lowerLeft, Point upperRight) {
+      ZoomIn(TransformPixelToWorld(lowerLeft), TransformPixelToWorld(upperRight));
+    }
+    public void ZoomIn(int x1, int y1, int x2, int y2) {
+      ZoomIn(new Point(x1, y1), new Point(x2, y2));
+    }
+    public virtual void ZoomOut() {
+      if (zoomHistory.Count > 0) {
+        Offset upperRight = zoomHistory[0];
+        zoomHistory.RemoveAt(0);
+        Offset lowerLeft = zoomHistory[0];
+        zoomHistory.RemoveAt(0);
+        myLowerLeft = LowerLeft + lowerLeft;
+        myUpperRight = UpperRight + upperRight;
+        OnUpdate();
+      } else {
+        myLowerLeft.X -= Size.Width / 4;
+        myLowerLeft.Y -= Size.Height / 4;
+        myUpperRight.X += Size.Width / 4;
+        myUpperRight.Y += Size.Height / 4;
+        OnUpdate();
+      }
+    }
+    public virtual void Unzoom() {
+      SetPosition(originalLowerLeft, originalUpperRight);
+    }
+
+    public virtual IPrimitive GetPrimitive(Point point) {
+      return Group.GetPrimitive(TransformPixelToWorld(point));
+    }
+    public IPrimitive GetPrimitive(int x, int y) {
+      return GetPrimitive(new Point(x, y));
+    }
+    public virtual IList<IPrimitive> GetAllPrimitives(Point point) {
+      return Group.GetAllPrimitives(TransformPixelToWorld(point));
+    }
+    public IList<IPrimitive> GetAllPrimitives(int x, int y) {
+      return GetAllPrimitives(new Point(x, y));
+    }
+
+    public virtual Cursor GetCursor(Point point) {
+      Cursor cursor = Group.GetCursor(TransformPixelToWorld(point));
+      if (cursor != null) return cursor;
+
+      if (Mode == ChartMode.Move) return Cursors.Hand;
+      if (Mode == ChartMode.Select) return Cursors.Arrow;
+      if (Mode == ChartMode.Zoom) return Cursors.Arrow;
+      return Cursors.Default;
+    }
+    public Cursor GetCursor(int x, int y) {
+      return GetCursor(new Point(x, y));
+    }
+    public virtual string GetToolTipText(Point point) {
+      return Group.GetToolTipText(TransformPixelToWorld(point));
+    }
+    public string GetToolTipText(int x, int y) {
+      return GetToolTipText(new Point(x, y));
+    }
+
+    public virtual void MouseClick(Point point, MouseButtons button) {
+      if (Mode == ChartMode.Select) {
+        if (button == MouseButtons.Left) {
+          IPrimitive clicked = GetPrimitive(point);
+          UpdateEnabled = false;
+          foreach (IPrimitive primitive in Group.SelectedPrimitives)
+            primitive.Selected = false;
+          UpdateEnabled = true;
+          if (clicked != null) {
+            PointD p = TransformPixelToWorld(point);
+            clicked.MouseClick(p, button);
+          } else OnUpdate();
+        }
+      } else if (Mode == ChartMode.Move) {
+        if (button == MouseButtons.Middle) {
+          PointD center = LowerLeft + new Offset(Size.Width / 2, Size.Height / 2);
+          Move(TransformPixelToWorld(point) - center);
+        }
+      }
+    }
+    public void MouseClick(int x, int y, MouseButtons button) {
+      MouseClick(new Point(x, y), button);
+    }
+    public virtual void MouseDoubleClick(Point point, MouseButtons button) {
+    }
+    public void MouseDoubleClick(int x, int y, MouseButtons button) {
+      MouseDoubleClick(new Point(x, y), button);
+    }
+    public virtual void MouseMove(Point start, Point end) {
+    }
+    public void MouseMove(int x1, int y1, int x2, int y2) {
+      MouseMove(new Point(x1, y1), new Point(x2, y2));
+    }
+    public virtual void MouseDrag(Point start, Point end, MouseButtons button) {
+      PointD p1 = TransformPixelToWorld(start);
+      PointD p2 = TransformPixelToWorld(end);
+      Offset offset = p2 - p1;
+      if (Mode == ChartMode.Move) {
+        Move(-1 * offset.DX, -1 * offset.DY);
+      } else if (Mode == ChartMode.Select) {
+        if (button == MouseButtons.Left) {
+          IList<IPrimitive> selected = Group.SelectedPrimitives;
+          UpdateEnabled = false;
+          foreach (IPrimitive primitive in selected)
+            primitive.MouseDrag(p1, offset, button);
+          UpdateEnabled = true;
+          OnUpdate();
+        }
+      }
+    }
+    public void MouseDrag(int x1, int y1, int x2, int y2, MouseButtons button) {
+      MouseDrag(new Point(x1, y1), new Point(x2, y2), button);
+    }
+
+    public virtual void Render(Graphics graphics, int width, int height) {
+      mySizeInPixels = new Size(width, height);
+      Group.PreDraw(graphics);
+      Group.Draw(graphics);
+      Group.PostDraw(graphics);
+    }
+
+    public event EventHandler Update;
+    public void EnforceUpdate() {
+      if (Update != null) {
+        Update(this, new EventArgs());
+      }
+    }
+    protected virtual void OnUpdate() {
+      if ((UpdateEnabled) && (Update != null)) {
+        Update(this, new EventArgs());
+      }
+    }
+    private void Group_Update(object sender, EventArgs e) {
+      OnUpdate();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/ChartControl.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/ChartControl.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/ChartControl.Designer.cs	(revision 2)
@@ -0,0 +1,205 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Charting {
+  partial class ChartControl {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.pictureBoxContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.moveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.zoomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.selectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+      this.oneLayerUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.oneLayerDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.intoForegroundToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.intoBackgroundToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+      this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.pictureBoxContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pictureBox.BackColor = System.Drawing.Color.White;
+      this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.pictureBox.ContextMenuStrip = this.pictureBoxContextMenuStrip;
+      this.pictureBox.Location = new System.Drawing.Point(0, 0);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(266, 236);
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      this.pictureBox.VisibleChanged += new System.EventHandler(this.pictureBox_VisibleChanged);
+      this.pictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);
+      this.pictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
+      this.pictureBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
+      this.pictureBox.SizeChanged += new System.EventHandler(this.pictureBox_SizeChanged);
+      // 
+      // pictureBoxContextMenuStrip
+      // 
+      this.pictureBoxContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.moveToolStripMenuItem,
+            this.zoomToolStripMenuItem,
+            this.selectToolStripMenuItem,
+            this.toolStripMenuItem1,
+            this.oneLayerUpToolStripMenuItem,
+            this.oneLayerDownToolStripMenuItem,
+            this.intoForegroundToolStripMenuItem,
+            this.intoBackgroundToolStripMenuItem,
+            this.toolStripMenuItem2,
+            this.propertiesToolStripMenuItem});
+      this.pictureBoxContextMenuStrip.Name = "pictureBoxContextMenuStrip";
+      this.pictureBoxContextMenuStrip.Size = new System.Drawing.Size(165, 192);
+      // 
+      // moveToolStripMenuItem
+      // 
+      this.moveToolStripMenuItem.Checked = true;
+      this.moveToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.moveToolStripMenuItem.Name = "moveToolStripMenuItem";
+      this.moveToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.moveToolStripMenuItem.Text = "&Move";
+      this.moveToolStripMenuItem.Click += new System.EventHandler(this.moveToolStripMenuItem_Click);
+      // 
+      // zoomToolStripMenuItem
+      // 
+      this.zoomToolStripMenuItem.Name = "zoomToolStripMenuItem";
+      this.zoomToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.zoomToolStripMenuItem.Text = "&Zoom";
+      this.zoomToolStripMenuItem.Click += new System.EventHandler(this.zoomToolStripMenuItem_Click);
+      // 
+      // selectToolStripMenuItem
+      // 
+      this.selectToolStripMenuItem.Name = "selectToolStripMenuItem";
+      this.selectToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.selectToolStripMenuItem.Text = "&Select";
+      this.selectToolStripMenuItem.Click += new System.EventHandler(this.selectToolStripMenuItem_Click);
+      // 
+      // toolStripMenuItem1
+      // 
+      this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(161, 6);
+      // 
+      // oneLayerUpToolStripMenuItem
+      // 
+      this.oneLayerUpToolStripMenuItem.Enabled = false;
+      this.oneLayerUpToolStripMenuItem.Name = "oneLayerUpToolStripMenuItem";
+      this.oneLayerUpToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.oneLayerUpToolStripMenuItem.Text = "One Layer &Up";
+      this.oneLayerUpToolStripMenuItem.Click += new System.EventHandler(this.oneLayerUpToolStripMenuItem_Click);
+      // 
+      // oneLayerDownToolStripMenuItem
+      // 
+      this.oneLayerDownToolStripMenuItem.Enabled = false;
+      this.oneLayerDownToolStripMenuItem.Name = "oneLayerDownToolStripMenuItem";
+      this.oneLayerDownToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.oneLayerDownToolStripMenuItem.Text = "OneLayer &Down";
+      this.oneLayerDownToolStripMenuItem.Click += new System.EventHandler(this.oneLayerDownToolStripMenuItem_Click);
+      // 
+      // intoForegroundToolStripMenuItem
+      // 
+      this.intoForegroundToolStripMenuItem.Enabled = false;
+      this.intoForegroundToolStripMenuItem.Name = "intoForegroundToolStripMenuItem";
+      this.intoForegroundToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.intoForegroundToolStripMenuItem.Text = "Into &Foreground";
+      this.intoForegroundToolStripMenuItem.Click += new System.EventHandler(this.intoForegroundToolStripMenuItem_Click);
+      // 
+      // intoBackgroundToolStripMenuItem
+      // 
+      this.intoBackgroundToolStripMenuItem.Enabled = false;
+      this.intoBackgroundToolStripMenuItem.Name = "intoBackgroundToolStripMenuItem";
+      this.intoBackgroundToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.intoBackgroundToolStripMenuItem.Text = "Into &Background";
+      this.intoBackgroundToolStripMenuItem.Click += new System.EventHandler(this.intoBackgroundToolStripMenuItem_Click);
+      // 
+      // toolStripMenuItem2
+      // 
+      this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+      this.toolStripMenuItem2.Size = new System.Drawing.Size(161, 6);
+      // 
+      // propertiesToolStripMenuItem
+      // 
+      this.propertiesToolStripMenuItem.Enabled = false;
+      this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem";
+      this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+      this.propertiesToolStripMenuItem.Text = "&Properties";
+      this.propertiesToolStripMenuItem.Click += new System.EventHandler(this.propertiesToolStripMenuItem_Click);
+      // 
+      // ChartControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.BackColor = System.Drawing.SystemColors.Control;
+      this.Controls.Add(this.pictureBox);
+      this.Name = "ChartControl";
+      this.Size = new System.Drawing.Size(266, 236);
+      this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChartControl_KeyDown);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.pictureBoxContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.PictureBox pictureBox;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.ContextMenuStrip pictureBoxContextMenuStrip;
+    protected System.Windows.Forms.ToolStripMenuItem moveToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem zoomToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem selectToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+    protected System.Windows.Forms.ToolStripMenuItem propertiesToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem oneLayerUpToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem oneLayerDownToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem intoForegroundToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem intoBackgroundToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/ChartControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/ChartControl.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/ChartControl.cs	(revision 2)
@@ -0,0 +1,224 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public partial class ChartControl : UserControl {
+    private Bitmap bitmap;
+    private bool renderingRequired;
+    private Point buttonDownPoint;
+    private Point mousePosition;
+    private int mouseClickCount;
+
+    private Chart myChart;
+    public Chart Chart {
+      get { return myChart; }
+      set {
+        if (myChart != null) myChart.Update -= new EventHandler(myChart_Update);
+        myChart = value;
+        if (myChart != null) {
+          myChart.Update += new EventHandler(myChart_Update);
+          SetMode(Chart.Mode);
+        }
+        GenerateImage();
+      }
+    }
+    private bool myScaleOnResize;
+    public bool ScaleOnResize {
+      get { return myScaleOnResize; }
+      set { myScaleOnResize = value; }
+    }
+
+    public ChartControl() {
+      InitializeComponent();
+      myScaleOnResize = true;
+      GenerateImage();
+    }
+
+    private void myChart_Update(object sender, EventArgs e) {
+      GenerateImage();
+    }
+    private void pictureBox_SizeChanged(object sender, EventArgs e) {
+      if (ScaleOnResize) {
+        if ((pictureBox.Width > 0) && (pictureBox.Height > 0) && (Chart != null)) {
+          PointD point = Chart.TransformPixelToWorld(new Point(pictureBox.Width, Chart.SizeInPixels.Height - pictureBox.Height));
+          Chart.SetPosition(Chart.LowerLeft, point);
+        }
+      }
+      GenerateImage();
+    }
+    private void pictureBox_VisibleChanged(object sender, EventArgs e) {
+      if (pictureBox.Visible && renderingRequired) {
+        GenerateImage();
+      }
+    }
+
+    private void pictureBox_MouseDown(object sender, MouseEventArgs e) {
+      buttonDownPoint = e.Location;
+      mouseClickCount = e.Clicks;
+    }
+    private void pictureBox_MouseUp(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Left) {
+        if (Chart.Mode == ChartMode.Zoom) {
+          pictureBox.Refresh();
+          Point lowerLeft = new Point(Math.Min(e.X, buttonDownPoint.X),
+                                      Math.Max(e.Y, buttonDownPoint.Y));
+          Point upperRight = new Point(Math.Max(e.X, buttonDownPoint.X),
+                                       Math.Min(e.Y, buttonDownPoint.Y));
+          if ((lowerLeft.X != upperRight.X) && (lowerLeft.Y != upperRight.Y)) {
+            Chart.ZoomIn(lowerLeft, upperRight);
+          }
+        }
+      } else if (e.Button == MouseButtons.Right) {
+        propertiesToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count == 1;
+        oneLayerUpToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count == 1;
+        oneLayerDownToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count == 1;
+        intoForegroundToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count == 1;
+        intoBackgroundToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count == 1;
+      } else if (e.Button == MouseButtons.Middle) {
+        if (Chart.Mode == ChartMode.Zoom) {
+          if (mouseClickCount == 1) Chart.ZoomOut();
+          else if (mouseClickCount == 2) Chart.Unzoom();
+        }
+      }
+      if (buttonDownPoint == e.Location) {
+        if (mouseClickCount == 1)
+          Chart.MouseClick(e.Location, e.Button);
+        else if (mouseClickCount == 2)
+          Chart.MouseDoubleClick(e.Location, e.Button);
+      }
+    }
+    private void pictureBox_MouseMove(object sender, MouseEventArgs e) {
+      toolTip.SetToolTip(pictureBox, Chart.GetToolTipText(e.Location));
+      Cursor cursor = Chart.GetCursor(e.Location);
+      if (cursor != null) pictureBox.Cursor = cursor;
+      else pictureBox.Cursor = Cursors.Default;
+
+      if (e.Button != MouseButtons.None) {
+        if ((Chart.Mode == ChartMode.Zoom) && (e.Button == MouseButtons.Left)) {
+          pictureBox.Refresh();
+          Graphics graphics = pictureBox.CreateGraphics();
+          Pen pen = new Pen(Color.Gray);
+          pen.DashStyle = DashStyle.Dash;
+          graphics.DrawRectangle(pen,
+                                 Math.Min(e.X, buttonDownPoint.X),
+                                 Math.Min(e.Y, buttonDownPoint.Y),
+                                 Math.Abs(e.X - buttonDownPoint.X),
+                                 Math.Abs(e.Y - buttonDownPoint.Y));
+          pen.Dispose();
+          graphics.Dispose();
+        }
+        Chart.MouseDrag(mousePosition, e.Location, e.Button);
+      } else {
+        Chart.MouseMove(mousePosition, e.Location);
+      }
+      mousePosition = e.Location;
+    }
+
+    private void ChartControl_KeyDown(object sender, KeyEventArgs e) {
+      if (Chart.Mode == ChartMode.Select) {
+        if (e.KeyCode == Keys.Delete) {
+          IList<IPrimitive> selected = Chart.Group.SelectedPrimitives;
+          Chart.UpdateEnabled = false;
+          foreach (IPrimitive primitive in selected)
+            Chart.Group.Remove(primitive);
+          Chart.UpdateEnabled = true;
+          Chart.EnforceUpdate();
+        }
+      }
+    }
+
+    private void moveToolStripMenuItem_Click(object sender, EventArgs e) {
+      SetMode(ChartMode.Move);
+    }
+    private void zoomToolStripMenuItem_Click(object sender, EventArgs e) {
+      SetMode(ChartMode.Zoom);
+    }
+    private void selectToolStripMenuItem_Click(object sender, EventArgs e) {
+      SetMode(ChartMode.Select);
+    }
+    private void oneLayerUpToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (Chart.Group.SelectedPrimitives.Count == 1) {
+        Chart.Group.SelectedPrimitives[0].OneLayerUp();
+      }
+    }
+    private void oneLayerDownToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (Chart.Group.SelectedPrimitives.Count == 1) {
+        Chart.Group.SelectedPrimitives[0].OneLayerDown();
+      }
+    }
+    private void intoForegroundToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (Chart.Group.SelectedPrimitives.Count == 1) {
+        Chart.Group.SelectedPrimitives[0].IntoForeground();
+      }
+    }
+    private void intoBackgroundToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (Chart.Group.SelectedPrimitives.Count == 1) {
+        Chart.Group.SelectedPrimitives[0].IntoBackground();
+      }
+    }
+    private void propertiesToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (Chart.Group.SelectedPrimitives.Count == 1) {
+        PropertiesDialog dialog = new PropertiesDialog(Chart.Group.SelectedPrimitives[0]);
+        dialog.ShowDialog(this);
+        dialog.Dispose();
+      }
+    }
+
+    private void GenerateImage() {
+      if (!Visible) {
+        renderingRequired = true;
+      } else {
+        if ((pictureBox.Width == 0) || (pictureBox.Height == 0)) {
+          bitmap = null;
+        } else {
+          bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
+          if (Chart != null) {
+            Graphics graphics = Graphics.FromImage(bitmap);
+            graphics.SetClip(new System.Drawing.Rectangle(0, 0, pictureBox.Width, pictureBox.Height));
+            Chart.Render(graphics, pictureBox.Width, pictureBox.Height);
+            graphics.Dispose();
+          }
+        }
+        pictureBox.Image = bitmap;
+        renderingRequired = false;
+      }
+    }
+
+    private void SetMode(ChartMode mode) {
+      moveToolStripMenuItem.Checked = false;
+      zoomToolStripMenuItem.Checked = false;
+      selectToolStripMenuItem.Checked = false;
+      if (mode == ChartMode.Move) moveToolStripMenuItem.Checked = true;
+      else if (mode == ChartMode.Zoom) zoomToolStripMenuItem.Checked = true;
+      else if (mode == ChartMode.Select) selectToolStripMenuItem.Checked = true;
+      Chart.Mode = mode;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/ChartControl.resx
===================================================================
--- /trunk/sources/HeuristicLab.Charting/ChartControl.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/ChartControl.resx	(revision 2)
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="pictureBoxContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>102, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Charting/ChartMode.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/ChartMode.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/ChartMode.cs	(revision 2)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Charting {
+  public enum ChartMode {
+    Move,
+    Zoom,
+    Select
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/ClassDiagram.cd
===================================================================
--- /trunk/sources/HeuristicLab.Charting/ClassDiagram.cd	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/ClassDiagram.cd	(revision 2)
@@ -0,0 +1,154 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="FullSignature">
+  <Font Name="Tahoma" Size="8.25" />
+  <Class Name="HeuristicLab.Charting.Chart" Collapsed="true" BaseTypeListCollapsed="true">
+    <Position X="36.75" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Chart.cs</FileName>
+      <HashCode>IAQAhGIABIACwAKAFAAAAAAiEAMBAgCEABgYARGAAAA=</HashCode>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Charting.ChartControl" Collapsed="true">
+    <Position X="38.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>ChartControl.cs</FileName>
+      <HashCode>AgLgCIQBECBAogCCDCCACgBuEKAAAgAEASAAAACAAiA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.Ellipse">
+    <Position X="6.5" Y="14.5" Width="5.25" />
+    <TypeIdentifier>
+      <FileName>Primitives\Ellipse.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.FixedSizeCircle">
+    <Position X="25" Y="13.75" Width="5" />
+    <TypeIdentifier>
+      <FileName>Primitives\FixedSizeCircle.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.FixedSizePrimitiveBase">
+    <Position X="27.75" Y="9.5" Width="5.25" />
+    <TypeIdentifier>
+      <FileName>Primitives\FixedSizePrimitiveBase.cs</FileName>
+      <HashCode>AAAAABAAAIAAgAAAAAAAAAAAAIAAAgAAAAAAAAAAABA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.FixedSizeRectangle">
+    <Position X="30.75" Y="13.75" Width="5" />
+    <TypeIdentifier>
+      <FileName>Primitives\FixedSizeRectangle.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.Group">
+    <Position X="2" Y="9.5" Width="3.75" />
+    <TypeIdentifier>
+      <FileName>Primitives\Group.cs</FileName>
+      <HashCode>AAIAAAAAAIAABgAAAAAABBACAAIACEAAgAIQAABWABo=</HashCode>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Charting.Line">
+    <Position X="19.25" Y="14.75" Width="4.25" />
+    <TypeIdentifier>
+      <FileName>Primitives\Line.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.LinearPrimitiveBase">
+    <Position X="18.5" Y="9.5" Width="5.75" />
+    <TypeIdentifier>
+      <FileName>Primitives\LinearPrimitiveBase.cs</FileName>
+      <HashCode>AAIAEAAAAKAEggIAAAAAAABAAACAAgAAAAAQAAAAABA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.PrimitiveBase">
+    <Position X="16.5" Y="0.5" Width="5" />
+    <TypeIdentifier>
+      <FileName>Primitives\PrimitiveBase.cs</FileName>
+      <HashCode>AAQADEIAAIAiiiJAAAAAABAAEAIASgAAAAoYAAGCARI=</HashCode>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Charting.Rectangle">
+    <Position X="12.5" Y="14.5" Width="5.25" />
+    <TypeIdentifier>
+      <FileName>Primitives\Rectangle.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.RectangularPrimitiveBase">
+    <Position X="9" Y="9.5" Width="6.25" />
+    <TypeIdentifier>
+      <FileName>Primitives\RectangularPrimitiveBase.cs</FileName>
+      <HashCode>AAAAECAABIAAggKAAAAAAAAAAAAAAgAAAAAQAQAAABA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.SelectionRectangle">
+    <Position X="31.25" Y="16.25" Width="4" />
+    <TypeIdentifier>
+      <FileName>Primitives\SelectionRectangle.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAAEAAIAAAAAAAAAAAAAAAAAQAAAAAAA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Charting.PropertiesDialog" Collapsed="true">
+    <Position X="36.75" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>PropertiesDialog.cs</FileName>
+      <HashCode>AAAAAAAAACAAAAAAAACAAAACGAAAEAAAAAAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Struct Name="HeuristicLab.Charting.Offset" Collapsed="true">
+    <Position X="36.75" Y="2.75" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Structs\Offset.cs</FileName>
+      <HashCode>AAJABAAAAAAAQAAEwAMCAABAAAAYAIgAAAAAAAAAAiA=</HashCode>
+    </TypeIdentifier>
+  </Struct>
+  <Struct Name="HeuristicLab.Charting.PointD" Collapsed="true">
+    <Position X="38.5" Y="2.75" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Structs\PointD.cs</FileName>
+      <HashCode>AAJABAAAAAAAAgAEwBMCAAAAAAAAAIAAAAAAAAAAYiA=</HashCode>
+    </TypeIdentifier>
+  </Struct>
+  <Struct Name="HeuristicLab.Charting.SizeD" Collapsed="true">
+    <Position X="36.75" Y="3.75" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Structs\SizeD.cs</FileName>
+      <HashCode>AAJABAAABAAAAkAEwAMCAEAAAAAAAIAAAgAAAAAAAiA=</HashCode>
+    </TypeIdentifier>
+  </Struct>
+  <Interface Name="HeuristicLab.Charting.IChart" Collapsed="true">
+    <Position X="36.75" Y="5" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Interfaces\IChart.cs</FileName>
+      <HashCode>IAQABEIAAIAAgAKAEAAAAAAiEAIBAgCEABAYAQCAAAA=</HashCode>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Charting.IGroup">
+    <Position X="1.25" Y="24.5" Width="3.75" />
+    <TypeIdentifier>
+      <FileName>Interfaces\IGroup.cs</FileName>
+      <HashCode>AAIAAAAAAAAABAAAAAAABBACAAAACEAAAAIAAABWAAA=</HashCode>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Charting.IPrimitive">
+    <Position X="0.5" Y="17.5" Width="5" />
+    <TypeIdentifier>
+      <FileName>Interfaces\IPrimitive.cs</FileName>
+      <HashCode>AAQABEIAAIAgiiIAAAAAABAAEAIACAAAAAIYAACCABI=</HashCode>
+    </TypeIdentifier>
+  </Interface>
+  <Enum Name="HeuristicLab.Charting.ChartMode" Collapsed="true">
+    <Position X="36.75" Y="6" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>ChartMode.cs</FileName>
+      <HashCode>AAAAAAAAAIAAAAAAEAAAAAAAAAAAAAAAAAAAQAAAAAA=</HashCode>
+    </TypeIdentifier>
+  </Enum>
+</ClassDiagram>
Index: /trunk/sources/HeuristicLab.Charting/HeuristicLab.Charting.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Charting/HeuristicLab.Charting.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/HeuristicLab.Charting.csproj	(revision 2)
@@ -0,0 +1,113 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B462D3CC-8866-42F0-9832-AD0967613B72}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Charting</RootNamespace>
+    <AssemblyName>HeuristicLab.Charting</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Charting.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Chart.cs" />
+    <Compile Include="ChartControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ChartControl.designer.cs">
+      <DependentUpon>ChartControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ChartMode.cs" />
+    <Compile Include="AxisType.cs" />
+    <Compile Include="HeuristicLabChartingPlugin.cs" />
+    <Compile Include="Interfaces\IGroup.cs" />
+    <Compile Include="Interfaces\IChart.cs" />
+    <Compile Include="Interfaces\IPrimitive.cs" />
+    <Compile Include="Primitives\Axis.cs" />
+    <Compile Include="Primitives\AxisPrimitiveBase.cs" />
+    <Compile Include="Primitives\LinearPrimitiveBase.cs" />
+    <Compile Include="Primitives\RectangularPrimitiveBase.cs" />
+    <Compile Include="Primitives\Ellipse.cs" />
+    <Compile Include="Primitives\FixedSizeCircle.cs" />
+    <Compile Include="Primitives\FixedSizePrimitiveBase.cs" />
+    <Compile Include="Primitives\FixedSizeRectangle.cs" />
+    <Compile Include="Primitives\Group.cs" />
+    <Compile Include="Primitives\Line.cs" />
+    <Compile Include="Primitives\PrimitiveBase.cs" />
+    <Compile Include="Primitives\Rectangle.cs" />
+    <Compile Include="Primitives\SelectionRectangle.cs" />
+    <Compile Include="PropertiesDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PropertiesDialog.designer.cs">
+      <DependentUpon>PropertiesDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Structs\Offset.cs" />
+    <Compile Include="Structs\PointD.cs" />
+    <Compile Include="Structs\SizeD.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ChartControl.resx">
+      <DependentUpon>ChartControl.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PropertiesDialog.resx">
+      <DependentUpon>PropertiesDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ClassDiagram.cd" />
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Charting/HeuristicLabChartingPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/HeuristicLabChartingPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/HeuristicLabChartingPlugin.cs	(revision 2)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Charting {
+  [ClassInfo(Name = "HeuristicLab.Charting")]
+  [PluginFile(Filename = "HeuristicLab.Charting.dll", Filetype = PluginFileType.Assembly)]
+  public class HeuristicLabChartingPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Interfaces/IChart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Interfaces/IChart.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Interfaces/IChart.cs	(revision 2)
@@ -0,0 +1,81 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public interface IChart {
+    ChartMode Mode { get; set; }
+    PointD LowerLeft { get; }
+    PointD UpperRight { get; }
+    SizeD Size { get; }
+    Size SizeInPixels { get; }
+    SizeD PixelToWorldRatio { get; }
+    SizeD WorldToPixelRatio { get; }
+    IGroup Group { get; }
+    bool UpdateEnabled { get; }
+
+    PointD TransformPixelToWorld(Point point);
+    SizeD TransformPixelToWorld(Size size);
+    Point TransformWorldToPixel(PointD point);
+    Size TransformWorldToPixel(SizeD size);
+
+    void SetPosition(PointD lowerLeft, PointD upperRight);
+    void SetPosition(double x1, double y1, double x2, double y2);
+    void Move(Offset delta);
+    void Move(double dx, double dy);
+
+    void ZoomIn(PointD lowerLeft, PointD upperRight);
+    void ZoomIn(double x1, double y1, double x2, double y2);
+    void ZoomIn(Point lowerLeft, Point upperRight);
+    void ZoomIn(int x1, int y1, int x2, int y2);
+    void ZoomOut();
+    void Unzoom();
+
+    IPrimitive GetPrimitive(Point point);
+    IPrimitive GetPrimitive(int x, int y);
+    IList<IPrimitive> GetAllPrimitives(Point point);
+    IList<IPrimitive> GetAllPrimitives(int x, int y);
+
+    Cursor GetCursor(Point point);
+    Cursor GetCursor(int x, int y);
+    string GetToolTipText(Point point);
+    string GetToolTipText(int x, int y);
+
+    void MouseClick(Point point, MouseButtons button);
+    void MouseClick(int x, int y, MouseButtons button);
+    void MouseDoubleClick(Point point, MouseButtons button);
+    void MouseDoubleClick(int x, int y, MouseButtons button);
+    void MouseMove(Point start, Point end);
+    void MouseMove(int x1, int y1, int x2, int y2);
+    void MouseDrag(Point start, Point end, MouseButtons button);
+    void MouseDrag(int x1, int y1, int x2, int y2, MouseButtons button);
+
+    void Render(Graphics graphics, int width, int height);
+
+    event EventHandler Update;
+    void EnforceUpdate();
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Interfaces/IGroup.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Interfaces/IGroup.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Interfaces/IGroup.cs	(revision 2)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Text;
+
+namespace HeuristicLab.Charting {
+  public interface IGroup : IPrimitive {
+    ReadOnlyCollection<IPrimitive> Primitives { get; }
+    ReadOnlyCollection<IPrimitive> SelectedPrimitives { get; }
+
+    void Add(IPrimitive primitive);
+    void AddRange(IEnumerable<IPrimitive> primitives);
+    bool Contains(IPrimitive primitive);
+    bool Remove(IPrimitive primitive);
+    void Clear();
+
+    IPrimitive GetPrimitive(PointD point);
+    IPrimitive GetPrimitive(double x, double y);
+    IList<IPrimitive> GetAllPrimitives(PointD point);
+    IList<IPrimitive> GetAllPrimitives(double x, double y);
+
+    void OneLayerUp(IPrimitive primitive);
+    void OneLayerDown(IPrimitive primitive);
+    void IntoForeground(IPrimitive primitive);
+    void IntoBackground(IPrimitive primitive);
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Interfaces/IPrimitive.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Interfaces/IPrimitive.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Interfaces/IPrimitive.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public interface IPrimitive {
+    IChart Chart { get; }
+    IGroup Group { get; set; }
+    Pen Pen { get; set; }
+    Brush Brush { get; set; }
+    bool UpdateEnabled { get; }
+    bool Selected { get; set; }
+    string ToolTipText { get; set; }
+    object Tag { get; set; }
+
+    void Move(Offset delta);
+    void Move(double dx, double dy);
+
+    bool ContainsPoint(PointD point);
+    bool ContainsPoint(double x, double y);
+
+    Cursor GetCursor(PointD point);
+    Cursor GetCursor(double x, double y);
+    string GetToolTipText(PointD point);
+    string GetToolTipText(double x, double y);
+
+    void OneLayerUp();
+    void OneLayerDown();
+    void IntoForeground();
+    void IntoBackground();
+
+    void MouseClick(PointD point, MouseButtons button);
+    void MouseClick(double x, double y, MouseButtons button);
+    void MouseDoubleClick(PointD point, MouseButtons button);
+    void MouseDoubleClick(double x, double y, MouseButtons button);
+    void MouseMove(PointD point, Offset offset);
+    void MouseMove(double x, double y, double dx, double dy);
+    void MouseDrag(PointD point, Offset offset, MouseButtons button);
+    void MouseDrag(double x, double y, double dx, double dy, MouseButtons button);
+
+    void PreDraw(Graphics graphics);
+    void Draw(Graphics graphics);
+    void PostDraw(Graphics graphics);
+
+    event EventHandler Update;
+    void EnforceUpdate();
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/Axis.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/Axis.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/Axis.cs	(revision 2)
@@ -0,0 +1,132 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public class Axis : AxisPrimitiveBase {
+    public Axis(IChart chart, PointD point, AxisType axisType)
+      : base(chart, point, axisType) {
+    }
+    public Axis(IChart chart, double x, double y, AxisType axisType)
+      : this(chart, new PointD(x, y), axisType) {
+    }
+    public Axis(IChart chart, PointD point, AxisType axisType, Pen pen, Brush brush)
+      : base(chart, point, axisType, pen, brush) {
+    }
+    public Axis(IChart chart, double x, double y, AxisType axisType, Pen pen, Brush brush)
+      : this(chart, new PointD(x, y), axisType, pen, brush) {
+    }
+
+    public override void Draw(Graphics graphics) {
+      int pixelsPerInterval = 100;
+      Font axisValuesFont = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular, GraphicsUnit.Pixel);
+      Font axisLabelsFont = new Font(FontFamily.GenericSansSerif, 14, FontStyle.Regular, GraphicsUnit.Pixel);
+
+      if ((AxisType & AxisType.Horizontal) == AxisType.Horizontal) {
+        int intervals = Chart.SizeInPixels.Width / pixelsPerInterval;
+
+        if (intervals > 0) {
+          double step = (Chart.UpperRight.X - Chart.LowerLeft.X) / intervals;
+          step = Math.Pow(10, Math.Floor(Math.Log10(step)));
+          if ((Chart.UpperRight.X - Chart.LowerLeft.X) / (step * 5) > intervals)
+            step = step * 5;
+          else if ((Chart.UpperRight.X - Chart.LowerLeft.X) / (step * 2) > intervals)
+            step = step * 2;
+
+          double x = Math.Floor(Chart.LowerLeft.X / step) * step;
+          PointD current = new PointD(x, Point.Y);
+          while (current.X <= Chart.UpperRight.X) {
+            Point p = Chart.TransformWorldToPixel(current);
+            if (ShowGrid)
+              graphics.DrawLine(Pens.LightGray, p.X, 0, p.X, Chart.SizeInPixels.Height);
+            graphics.DrawLine(Pen, p.X, p.Y - 3, p.X, p.Y + 3);
+            graphics.DrawString(current.X.ToString(),
+                                axisValuesFont,
+                                Brush,
+                                p.X,
+                                p.Y + 5,
+                                StringFormat.GenericDefault);
+            current.X = current.X + step;
+          }
+          if ((HorizontalLabel != null) && (HorizontalLabel != "")) {
+            Point p = Chart.TransformWorldToPixel(Point);
+            graphics.DrawString(HorizontalLabel,
+                                axisLabelsFont,
+                                Brush,
+                                Chart.SizeInPixels.Width - 20,
+                                p.Y + 20,
+                                new StringFormat(StringFormatFlags.DirectionRightToLeft));
+          }
+        }
+      }
+      if ((AxisType & AxisType.Vertical) == AxisType.Vertical) {
+        int intervals = Chart.SizeInPixels.Height / pixelsPerInterval;
+
+        if (intervals > 0) {
+          double step = (Chart.UpperRight.Y - Chart.LowerLeft.Y) / intervals;
+          step = Math.Pow(10, Math.Floor(Math.Log10(step)));
+          if ((Chart.UpperRight.Y - Chart.LowerLeft.Y) / (step * 5) > intervals)
+            step = step * 5;
+          else if ((Chart.UpperRight.Y - Chart.LowerLeft.Y) / (step * 2) > intervals)
+            step = step * 2;
+
+          double y = Math.Floor(Chart.LowerLeft.Y / step) * step;
+          PointD current = new PointD(Point.X, y);
+          while (current.Y <= Chart.UpperRight.Y) {
+            Point p = Chart.TransformWorldToPixel(current);
+            if (ShowGrid)
+              graphics.DrawLine(Pens.LightGray, 0, p.Y, Chart.SizeInPixels.Width, p.Y);
+            graphics.DrawLine(Pen, p.X - 3, p.Y, p.X + 3, p.Y);
+            graphics.DrawString(current.Y.ToString(),
+                                axisValuesFont,
+                                Brush,
+                                p.X + 5,
+                                p.Y,
+                                StringFormat.GenericDefault);
+            current.Y = current.Y + step;
+          }
+          if ((VerticalLabel != null) && (VerticalLabel != "")) {
+            Point p = Chart.TransformWorldToPixel(Point);
+            graphics.DrawString(VerticalLabel,
+                                axisLabelsFont,
+                                Brush,
+                                p.X - 20,
+                                20,
+                                new StringFormat(StringFormatFlags.DirectionRightToLeft | StringFormatFlags.DirectionVertical));
+          }
+        }
+      }
+      if ((AxisType & AxisType.Horizontal) == AxisType.Horizontal) {
+        Point p = Chart.TransformWorldToPixel(Point);
+        graphics.DrawLine(Pen, 0, p.Y, Chart.SizeInPixels.Width, p.Y);
+      }
+      if ((AxisType & AxisType.Vertical) == AxisType.Vertical) {
+        Point p = Chart.TransformWorldToPixel(Point);
+        graphics.DrawLine(Pen, p.X, 0, p.X, Chart.SizeInPixels.Height);
+      }
+      base.Draw(graphics);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/AxisPrimitiveBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/AxisPrimitiveBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/AxisPrimitiveBase.cs	(revision 2)
@@ -0,0 +1,109 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public abstract class AxisPrimitiveBase : PrimitiveBase {
+    private AxisType myAxisType;
+    public AxisType AxisType {
+      get { return myAxisType; }
+    }
+    private PointD myPoint;
+    public virtual PointD Point {
+      get { return myPoint; }
+    }
+    private bool myShowGrid;
+    public bool ShowGrid {
+      get { return myShowGrid; }
+      set {
+        if (value != myShowGrid) {
+          myShowGrid = value;
+          OnUpdate();
+        }
+      }
+    }
+    private string myHorizontalLabel;
+    public string HorizontalLabel {
+      get { return myHorizontalLabel; }
+      set {
+        if (value != myHorizontalLabel) {
+          myHorizontalLabel = value;
+          OnUpdate();
+        }
+      }
+    }
+    private string myVerticalLabel;
+    public string VerticalLabel {
+      get { return myVerticalLabel; }
+      set {
+        if (value != myVerticalLabel) {
+          myVerticalLabel = value;
+          OnUpdate();
+        }
+      }
+    }
+
+    protected AxisPrimitiveBase(IChart chart, PointD point, AxisType axisType)
+      : base(chart) {
+      Brush = Brushes.Black;
+      myPoint = point;
+      myAxisType = axisType;
+      myShowGrid = true;
+    }
+    protected AxisPrimitiveBase(IChart chart, double x, double y, AxisType axisType)
+      : this(chart, new PointD(x, y), axisType) {
+    }
+    protected AxisPrimitiveBase(IChart chart, PointD point, AxisType axisType, Pen pen, Brush brush)
+      : base(chart, pen, brush) {
+      myPoint = point;
+      myAxisType = axisType;
+      myShowGrid = true;
+    }
+    protected AxisPrimitiveBase(IChart chart, double x, double y, AxisType axisType, Pen pen, Brush brush)
+      : this(chart, new PointD(x, y), axisType, pen, brush) {
+    }
+
+    public virtual void SetPosition(PointD point) {
+      myPoint = point;
+      OnUpdate();
+    }
+    public void SetPosition(double x, double y) {
+      SetPosition(new PointD(x, y));
+    }
+    public override void Move(Offset delta) {
+      SetPosition(Point + delta);
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      SizeD size = Chart.TransformPixelToWorld(new Size(5, 5));
+      bool result = false;
+      if ((AxisType & AxisType.Horizontal) == AxisType.Horizontal)
+        result = result || (point.Y >= Point.Y - (size.Height / 2)) && (point.Y <= Point.Y + (size.Height / 2));
+      if ((AxisType & AxisType.Vertical) == AxisType.Vertical)
+        result = result || (point.X >= Point.X - (size.Height / 2)) && (point.X <= Point.X + (size.Height / 2));
+      return result;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/Ellipse.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/Ellipse.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/Ellipse.cs	(revision 2)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public class Ellipse : RectangularPrimitiveBase {
+    public Ellipse(IChart chart, PointD lowerLeft, PointD upperRight)
+      : base(chart, lowerLeft, upperRight) {
+    }
+    public Ellipse(IChart chart, double x1, double y1, double x2, double y2)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+    public Ellipse(IChart chart, PointD lowerLeft, PointD upperRight, Pen pen, Brush brush)
+      : base(chart, lowerLeft, upperRight, pen, brush) {
+    }
+    public Ellipse(IChart chart, double x1, double y1, double x2, double y2, Pen pen, Brush brush)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen, brush) {
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      if (base.ContainsPoint(point)) return true;
+
+      PointD midpoint;
+      PointD focus1;
+      PointD focus2;
+      Offset focus1_point;
+      Offset focus2_point;
+
+      double a = Size.Width / 2;   // half length of horizontal axis
+      double b = Size.Height / 2;  // half length of vertical axis
+      midpoint = LowerLeft + new Offset(a, b);
+
+      if (a >= b) {
+        double e = Math.Sqrt(a * a - b * b);  // linear eccentricity
+        focus1 = new PointD(midpoint.X - e, midpoint.Y);
+        focus2 = new PointD(midpoint.X + e, midpoint.Y);
+      } else {
+        double e = Math.Sqrt(b * b - a * a);  // linear eccentricity
+        focus1 = new PointD(midpoint.X, midpoint.Y - e);
+        focus2 = new PointD(midpoint.X, midpoint.Y + e);
+      }
+      focus1_point = focus1 - point;
+      focus2_point = focus2 - point;
+
+      return focus1_point.Length + focus2_point.Length <= 2 * Math.Max(a, b);
+    }
+
+    public override void Draw(Graphics graphics) {
+      Point p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+      Size s = Chart.TransformWorldToPixel(Size);
+      if (Brush != null)
+        graphics.FillEllipse(Brush, p.X, p.Y, s.Width, s.Height);
+      graphics.DrawEllipse(Pen, p.X, p.Y, s.Width, s.Height);
+      base.Draw(graphics);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizeCircle.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizeCircle.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizeCircle.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public class FixedSizeCircle : FixedSizePrimitiveBase {
+    public FixedSizeCircle(IChart chart, PointD point, int diameter)
+      : base(chart, point, new Size(diameter, diameter)) {
+    }
+    public FixedSizeCircle(IChart chart, double x, double y, int diameter)
+      : this(chart, new PointD(x, y), diameter) {
+    }
+    public FixedSizeCircle(IChart chart, PointD point, int diameter, Pen pen, Brush brush)
+      : base(chart, point, new Size(diameter, diameter), pen, brush) {
+    }
+    public FixedSizeCircle(IChart chart, double x, double y, int diameter, Pen pen, Brush brush)
+      : this(chart, new PointD(x, y), diameter, pen, brush) {
+    }
+
+    public override void Draw(Graphics graphics) {
+      Point p = Chart.TransformWorldToPixel(Point);
+
+      graphics.FillEllipse(Brush,
+                           p.X - (Size.Width / 2),
+                           p.Y - (Size.Height / 2),
+                           Size.Width,
+                           Size.Height);
+      graphics.DrawEllipse(Pen,
+                           p.X - (Size.Width / 2),
+                           p.Y - (Size.Height / 2),
+                           Size.Width,
+                           Size.Height);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizePrimitiveBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizePrimitiveBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizePrimitiveBase.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public abstract class FixedSizePrimitiveBase : PrimitiveBase {
+    private PointD myPoint;
+    public virtual PointD Point {
+      get { return myPoint; }
+    }
+    private Size mySize;
+    public virtual Size Size {
+      get { return mySize; }
+    }
+
+    protected FixedSizePrimitiveBase(IChart chart, PointD point, Size size)
+      : base(chart) {
+      myPoint = point;
+      mySize = size;
+    }
+    protected FixedSizePrimitiveBase(IChart chart, double x, double y, Size size)
+      : this(chart, new PointD(x, y), size) {
+    }
+    protected FixedSizePrimitiveBase(IChart chart, PointD point, Size size, Pen pen, Brush brush)
+      : base(chart, pen, brush) {
+      myPoint = point;
+      mySize = size;
+    }
+    protected FixedSizePrimitiveBase(IChart chart, double x, double y, Size size, Pen pen, Brush brush)
+      : this(chart, new PointD(x, y), size, pen, brush) {
+    }
+
+    public virtual void SetPosition(PointD point) {
+      myPoint = point;
+      OnUpdate();
+    }
+    public void SetPosition(double x, double y) {
+      SetPosition(new PointD(x, y));
+    }
+    public override void Move(Offset delta) {
+      SetPosition(Point + delta);
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      SizeD size = Chart.TransformPixelToWorld(Size);
+      return (point.X >= Point.X - (size.Width / 2)) && (point.X <= Point.X + (size.Width / 2)) &&
+             (point.Y >= Point.Y - (size.Height / 2)) && (point.Y <= Point.Y + (size.Height / 2));
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizeRectangle.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizeRectangle.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/FixedSizeRectangle.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public class FixedSizeRectangle : FixedSizePrimitiveBase {
+    public FixedSizeRectangle(IChart chart, PointD point, Size size)
+      : base(chart, point, size) {
+    }
+    public FixedSizeRectangle(IChart chart, double x, double y, Size size)
+      : this(chart, new PointD(x, y), size) {
+    }
+    public FixedSizeRectangle(IChart chart, PointD point, Size size, Pen pen, Brush brush)
+      : base(chart, point, size, pen, brush) {
+    }
+    public FixedSizeRectangle(IChart chart, double x, double y, Size size, Pen pen, Brush brush)
+      : this(chart, new PointD(x, y), size, pen, brush) {
+    }
+
+    public override void Draw(Graphics graphics) {
+      Point p = Chart.TransformWorldToPixel(Point);
+
+      graphics.FillRectangle(Brush,
+                             p.X - (Size.Width / 2),
+                             p.Y - (Size.Height / 2),
+                             Size.Width,
+                             Size.Height);
+      graphics.DrawRectangle(Pen,
+                             p.X - (Size.Width / 2),
+                             p.Y - (Size.Height / 2),
+                             Size.Width,
+                             Size.Height);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/Group.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/Group.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/Group.cs	(revision 2)
@@ -0,0 +1,204 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public class Group : PrimitiveBase, IGroup {
+    private IList<IPrimitive> myPrimitives;
+    public virtual ReadOnlyCollection<IPrimitive> Primitives {
+      get { return new ReadOnlyCollection<IPrimitive>(myPrimitives); }
+    }
+    public virtual ReadOnlyCollection<IPrimitive> SelectedPrimitives {
+      get {
+        List<IPrimitive> selected = new List<IPrimitive>();
+        foreach (IPrimitive primitive in myPrimitives) {
+          if (primitive.Selected) selected.Add(primitive);
+        }
+        return new ReadOnlyCollection<IPrimitive>(selected);
+      }
+    }
+    public override bool Selected {
+      get { return base.Selected; }
+      set {
+        bool updateEnabled = UpdateEnabled;
+        UpdateEnabled = false;
+        foreach (IPrimitive primitive in myPrimitives)
+          primitive.Selected = value;
+        UpdateEnabled = updateEnabled;
+        base.Selected = value;
+      }
+    }
+
+    public Group(IChart chart)
+      : base(chart) {
+      myPrimitives = new List<IPrimitive>();
+    }
+
+    public virtual void Add(IPrimitive primitive) {
+      if (Contains(primitive))
+        throw new ArgumentException("Primitive already added");
+
+      myPrimitives.Insert(0, primitive);
+      primitive.Group = this;
+      primitive.Update += new EventHandler(primitive_Update);
+      OnUpdate();
+    }
+    public virtual void AddRange(IEnumerable<IPrimitive> primitives) {
+      foreach (IPrimitive primitive in primitives) {
+        if (Contains(primitive))
+          throw new ArgumentException("Primitive already added");
+
+        myPrimitives.Insert(0, primitive);
+        primitive.Group = this;
+        primitive.Update += new EventHandler(primitive_Update);
+      }
+      OnUpdate();
+    }
+    public virtual bool Contains(IPrimitive primitive) {
+      return myPrimitives.Contains(primitive);
+    }
+    public virtual bool Remove(IPrimitive primitive) {
+      if (myPrimitives.Remove(primitive)) {
+        primitive.Group = null;
+        primitive.Update -= new EventHandler(primitive_Update);
+        OnUpdate();
+        return true;
+      } else {
+        return false;
+      }
+    }
+    public virtual void Clear() {
+      foreach (IPrimitive primitive in myPrimitives) {
+        primitive.Group = null;
+        primitive.Update -= new EventHandler(primitive_Update);
+      }
+      myPrimitives.Clear();
+      OnUpdate();
+    }
+
+    public virtual IPrimitive GetPrimitive(PointD point) {
+      int i = 0;
+      while ((i < myPrimitives.Count) && (!myPrimitives[i].ContainsPoint(point)))
+        i++;
+      if (i == myPrimitives.Count) return null;
+      else return myPrimitives[i];
+    }
+    public IPrimitive GetPrimitive(double x, double y) {
+      return GetPrimitive(new PointD(x, y));
+    }
+    public virtual IList<IPrimitive> GetAllPrimitives(PointD point) {
+      List<IPrimitive> primitives = new List<IPrimitive>();
+      for (int i = 0; i < myPrimitives.Count; i++) {
+        if (myPrimitives[i].ContainsPoint(point)) {
+          primitives.Add(myPrimitives[i]);
+          if (myPrimitives[i] is IGroup) {
+            primitives.AddRange(((IGroup)myPrimitives[i]).Primitives);
+          }
+        }
+      }
+      return primitives;
+    }
+    public IList<IPrimitive> GetAllPrimitives(double x, double y) {
+      return GetAllPrimitives(new PointD(x, y));
+    }
+
+    public override void Move(Offset delta) {
+      bool updateEnabled = UpdateEnabled;
+      UpdateEnabled = false;
+      foreach (IPrimitive primitive in myPrimitives)
+        primitive.Move(delta);
+      UpdateEnabled = updateEnabled;
+      OnUpdate();
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      return GetPrimitive(point) != null;
+    }
+
+    public override Cursor GetCursor(PointD point) {
+      IPrimitive primitive = GetPrimitive(point);
+      if (primitive != null) return primitive.GetCursor(point);
+      else return base.GetCursor(point);
+    }
+    public override string GetToolTipText(PointD point) {
+      IPrimitive primitive = GetPrimitive(point);
+      if (primitive != null) return primitive.GetToolTipText(point);
+      else return base.GetToolTipText(point);
+    }
+
+    public void OneLayerUp(IPrimitive primitive) {
+      if (!Contains(primitive))
+        throw new ArgumentException("Primitive not found");
+
+      int index = myPrimitives.IndexOf(primitive);
+      if (index > 0) {
+        myPrimitives.Remove(primitive);
+        myPrimitives.Insert(index - 1, primitive);
+        OnUpdate();
+      }
+    }
+    public void OneLayerDown(IPrimitive primitive) {
+      if (!Contains(primitive))
+        throw new ArgumentException("Primitive not found");
+
+      int index = myPrimitives.IndexOf(primitive);
+      if (index < myPrimitives.Count - 1) {
+        myPrimitives.Remove(primitive);
+        myPrimitives.Insert(index + 1, primitive);
+        OnUpdate();
+      }
+    }
+    public void IntoForeground(IPrimitive primitive) {
+      if (!Contains(primitive))
+        throw new ArgumentException("Primitive not found");
+
+      myPrimitives.Remove(primitive);
+      myPrimitives.Insert(0, primitive);
+      OnUpdate();
+    }
+    public void IntoBackground(IPrimitive primitive) {
+      if (!Contains(primitive))
+        throw new ArgumentException("Primitive not found");
+
+      myPrimitives.Remove(primitive);
+      myPrimitives.Add(primitive);
+      OnUpdate();
+    }
+
+    public override void Draw(Graphics graphics) {
+      for (int i = myPrimitives.Count - 1; i >= 0; i--) {
+        myPrimitives[i].PreDraw(graphics);
+        myPrimitives[i].Draw(graphics);
+        myPrimitives[i].PostDraw(graphics);
+      }
+    }
+
+    private void primitive_Update(object sender, EventArgs e) {
+      OnUpdate();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/Line.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/Line.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/Line.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public class Line : LinearPrimitiveBase {
+    public Line(IChart chart, PointD start, PointD end)
+      : base(chart, start, end) {
+    }
+    public Line(IChart chart, double x1, double y1, double x2, double y2)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+    public Line(IChart chart, PointD start, PointD end, Pen pen)
+      : base(chart, start, end, pen, null) {
+    }
+    public Line(IChart chart, double x1, double y1, double x2, double y2, Pen pen)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen) {
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      if (base.ContainsPoint(point)) return true;
+
+      double penWidthX = Chart.PixelToWorldRatio.Width * (Pen.Width + 1);
+      double penWidthY = Chart.PixelToWorldRatio.Height * (Pen.Width + 1);
+
+      if ((point.X < (Math.Min(Start.X, End.X) - (penWidthX / 2))) ||
+          (point.Y < (Math.Min(Start.Y, End.Y) - (penWidthY / 2))) ||
+          (point.X > (Math.Max(Start.X, End.X) + (penWidthX / 2))) ||
+          (point.Y > (Math.Max(Start.Y, End.Y) + (penWidthY / 2)))) {
+        return false;
+      }
+
+      // calculate distance between point P(X,Y) and line
+      // d(P,g) = |AP.n|/|n|
+      Offset start_end = End - Start;
+      Offset n = new Offset(start_end.DY, -1 * start_end.DX);
+      Offset start_point = point - Start;
+      double d = Math.Abs(start_point.DX * n.DX + start_point.DY * n.DY) / n.Length;
+
+      return d <= Math.Max(penWidthX, penWidthY) / 2;
+    }
+
+    public override void Draw(Graphics graphics) {
+      graphics.DrawLine(Pen, Chart.TransformWorldToPixel(Start), Chart.TransformWorldToPixel(End));
+      base.Draw(graphics);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/LinearPrimitiveBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/LinearPrimitiveBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/LinearPrimitiveBase.cs	(revision 2)
@@ -0,0 +1,126 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public abstract class LinearPrimitiveBase : PrimitiveBase {
+    protected IGroup selectionRectangles;
+
+    private PointD myStart;
+    public virtual PointD Start {
+      get { return myStart; }
+    }
+    private PointD myEnd;
+    public virtual PointD End {
+      get { return myEnd; }
+    }
+    public virtual SizeD Size {
+      get { return new SizeD(End.X - Start.X, End.Y - Start.Y); }
+    }
+    public virtual double Length {
+      get { return (Start - End).Length; }
+    }
+
+    protected LinearPrimitiveBase(IChart chart, PointD start, PointD end)
+      : base(chart) {
+      selectionRectangles = new Group(chart);
+      myStart = start;
+      myEnd = end;
+    }
+    protected LinearPrimitiveBase(IChart chart, double x1, double y1, double x2, double y2)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+    protected LinearPrimitiveBase(IChart chart, PointD start, PointD end, Pen pen, Brush brush)
+      : base(chart, pen, brush) {
+      selectionRectangles = new Group(chart);
+      myStart = start;
+      myEnd = end;
+    }
+    protected LinearPrimitiveBase(IChart chart, double x1, double y1, double x2, double y2, Pen pen, Brush brush)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen, brush) {
+    }
+
+    public virtual void SetPosition(PointD start, PointD end) {
+      myStart = start;
+      myEnd = end;
+      OnUpdate();
+    }
+    public void SetPosition(double x1, double y1, double x2, double y2) {
+      SetPosition(new PointD(x1, y1), new PointD(x2, y2));
+    }
+    public override void Move(Offset delta) {
+      SetPosition(Start + delta, End + delta);
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      if (Selected) {
+        if (selectionRectangles.GetPrimitive(point) != null) return true;
+      }
+      return false;
+    }
+
+    public override void MouseDrag(PointD point, Offset offset, MouseButtons button) {
+      if (button == MouseButtons.Left) {
+        if (Selected) {
+          if (selectionRectangles.ContainsPoint(point)) {
+            SelectionRectangle rect = (SelectionRectangle)selectionRectangles.GetPrimitive(point);
+            if (rect.Point == Start) {
+              SetPosition(Start + offset, End);
+            } else if (rect.Point == End) {
+              SetPosition(Start, End + offset);
+            }
+          } else {
+            base.MouseDrag(point, offset, button);
+          }
+        }
+      }
+    }
+
+    public override Cursor GetCursor(PointD point) {
+      if (Selected) {
+        Cursor cursor = selectionRectangles.GetCursor(point);
+        if (cursor != null) return cursor;
+      }
+      return base.GetCursor(point);
+    }
+
+    public override void PostDraw(Graphics graphics) {
+      selectionRectangles.Clear();
+      if (Selected) {
+        Pen pen = new Pen(Color.LightGray, 3);
+        pen.DashStyle = DashStyle.Dash;
+        graphics.DrawLine(pen,
+                          Chart.TransformWorldToPixel(Start),
+                          Chart.TransformWorldToPixel(End));
+        selectionRectangles.Add(new SelectionRectangle(Chart, Start, Cursors.SizeAll));
+        selectionRectangles.Add(new SelectionRectangle(Chart, End, Cursors.SizeAll));
+
+        selectionRectangles.Draw(graphics);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/PrimitiveBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/PrimitiveBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/PrimitiveBase.cs	(revision 2)
@@ -0,0 +1,182 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public abstract class PrimitiveBase : IPrimitive {
+    private IChart myChart;
+    public IChart Chart {
+      get { return myChart; }
+    }
+    private IGroup myGroup;
+    public IGroup Group {
+      get { return myGroup; }
+      set { myGroup = value; }
+    }
+
+    private Pen myPen;
+    public virtual Pen Pen {
+      get { return myPen; }
+      set {
+        myPen = value;
+        OnUpdate();
+      }
+    }
+    private Brush myBrush;
+    public virtual Brush Brush {
+      get { return myBrush; }
+      set {
+        myBrush = value;
+        OnUpdate();
+      }
+    }
+
+    private bool myUpdateEnabled;
+    public bool UpdateEnabled {
+      get { return myUpdateEnabled; }
+      set { myUpdateEnabled = value; }
+    }
+
+    private bool mySelected;
+    public virtual bool Selected {
+      get { return mySelected; }
+      set {
+        mySelected = value;
+        OnUpdate();
+      }
+    }
+
+    private string myToolTipText;
+    public string ToolTipText {
+      get { return myToolTipText; }
+      set { myToolTipText = value; }
+    }
+
+    private object myTag;
+    public object Tag {
+      get { return myTag; }
+      set { myTag = value; }
+    }
+
+    protected PrimitiveBase(IChart chart) {
+      myChart = chart;
+      myGroup = null;
+      myPen = Pens.Black;
+      myBrush = Brushes.White;
+      myUpdateEnabled = true;
+      mySelected = false;
+      myToolTipText = null;
+      myTag = null;
+    }
+    protected PrimitiveBase(IChart chart, Pen pen, Brush brush)
+      : this(chart) {
+      myPen = pen;
+      myBrush = brush;
+    }
+
+    public abstract void Move(Offset delta);
+    public void Move(double dx, double dy) {
+      Move(new Offset(dx, dy));
+    }
+
+    public abstract bool ContainsPoint(PointD point);
+    public bool ContainsPoint(double x, double y) {
+      return ContainsPoint(new PointD(x, y));
+    }
+
+    public virtual Cursor GetCursor(PointD point) {
+      return null;
+    }
+    public Cursor GetCursor(double x, double y) {
+      return GetCursor(new PointD(x, y));
+    }
+    public virtual string GetToolTipText(PointD point) {
+      return ToolTipText;
+    }
+    public string GetToolTipText(double x, double y) {
+      return GetToolTipText(new PointD(x, y));
+    }
+
+    public void OneLayerUp() {
+      Group.OneLayerUp(this);
+    }
+    public void OneLayerDown() {
+      Group.OneLayerDown(this);
+    }
+    public void IntoForeground() {
+      Group.IntoForeground(this);
+    }
+    public void IntoBackground() {
+      Group.IntoBackground(this);
+    }
+
+    public virtual void MouseClick(PointD point, MouseButtons button) {
+      if (button == MouseButtons.Left) {
+        Selected = true;
+      }
+    }
+    public void MouseClick(double x, double y, MouseButtons button) {
+      MouseClick(new PointD(x, y), button);
+    }
+    public virtual void MouseDoubleClick(PointD point, MouseButtons button) {
+    }
+    public void MouseDoubleClick(double x, double y, MouseButtons button) {
+      MouseDoubleClick(new PointD(x, y), button);
+    }
+    public virtual void MouseMove(PointD point, Offset offset) {
+    }
+    public void MouseMove(double x, double y, double dx, double dy) {
+      MouseMove(new PointD(x, y), new Offset(dx, dy));
+    }
+    public virtual void MouseDrag(PointD point, Offset offset, MouseButtons button) {
+      if (button == MouseButtons.Left) {
+        Move(offset);
+      }
+    }
+    public void MouseDrag(double x, double y, double dx, double dy, MouseButtons button) {
+      MouseDrag(new PointD(x, y), new Offset(dx, dy), button);
+    }
+
+    public virtual void PreDraw(Graphics graphics) {
+    }
+    public virtual void Draw(Graphics graphics) {
+    }
+    public virtual void PostDraw(Graphics graphics) {
+    }
+
+    public event EventHandler Update;
+    public void EnforceUpdate() {
+      if (Update != null) {
+        Update(this, new EventArgs());
+      }
+    }
+    protected virtual void OnUpdate() {
+      if ((UpdateEnabled) && (Update != null)) {
+        Update(this, new EventArgs());
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/Rectangle.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/Rectangle.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/Rectangle.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public class Rectangle : RectangularPrimitiveBase {
+    public Rectangle(IChart chart, PointD lowerLeft, PointD upperRight)
+      : base(chart, lowerLeft, upperRight) {
+    }
+    public Rectangle(IChart chart, double x1, double y1, double x2, double y2)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+    public Rectangle(IChart chart, PointD lowerLeft, PointD upperRight, Pen pen, Brush brush)
+      : base(chart, lowerLeft, upperRight, pen, brush) {
+    }
+    public Rectangle(IChart chart, double x1, double y1, double x2, double y2, Pen pen, Brush brush)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen, brush) {
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      if (base.ContainsPoint(point)) return true;
+      return (point.X >= LowerLeft.X) && (point.X <= UpperRight.X) &&
+             (point.Y >= LowerLeft.Y) && (point.Y <= UpperRight.Y);
+    }
+
+    public override void Draw(Graphics graphics) {
+      Point p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+      Size s = Chart.TransformWorldToPixel(Size);
+      if (Brush != null)
+        graphics.FillRectangle(Brush, p.X, p.Y, s.Width, s.Height);
+      graphics.DrawRectangle(Pen, p.X, p.Y, s.Width, s.Height);
+      base.Draw(graphics);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/RectangularPrimitiveBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/RectangularPrimitiveBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/RectangularPrimitiveBase.cs	(revision 2)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public abstract class RectangularPrimitiveBase : PrimitiveBase {
+    protected IGroup selectionRectangles;
+
+    private PointD myLowerLeft;
+    public virtual PointD LowerLeft {
+      get { return myLowerLeft; }
+    }
+    private PointD myUpperRight;
+    public virtual PointD UpperRight {
+      get { return myUpperRight; }
+    }
+    public virtual SizeD Size {
+      get { return new SizeD(UpperRight.X - LowerLeft.X, UpperRight.Y - LowerLeft.Y); }
+    }
+
+    protected RectangularPrimitiveBase(IChart chart, PointD lowerLeft, PointD upperRight)
+      : base(chart) {
+      selectionRectangles = new Group(chart);
+      SetPosition(lowerLeft, upperRight);
+    }
+    protected RectangularPrimitiveBase(IChart chart, double x1, double y1, double x2, double y2)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+    protected RectangularPrimitiveBase(IChart chart, PointD lowerLeft, PointD upperRight, Pen pen, Brush brush)
+      : base(chart, pen, brush) {
+      selectionRectangles = new Group(chart);
+      SetPosition(lowerLeft, upperRight);
+    }
+    protected RectangularPrimitiveBase(IChart chart, double x1, double y1, double x2, double y2, Pen pen, Brush brush)
+      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen, brush) {
+    }
+
+    public virtual void SetPosition(PointD lowerLeft, PointD upperRight) {
+      if ((lowerLeft.X > upperRight.X) || (lowerLeft.Y > upperRight.Y))
+        throw new ArgumentException("Lower left point is greater than upper right point");
+
+      myLowerLeft = lowerLeft;
+      myUpperRight = upperRight;
+      OnUpdate();
+    }
+    public void SetPosition(double x1, double y1, double x2, double y2) {
+      SetPosition(new PointD(x1, y1), new PointD(x2, y2));
+    }
+    public override void Move(Offset delta) {
+      SetPosition(LowerLeft + delta, UpperRight + delta);
+    }
+
+    public override bool ContainsPoint(PointD point) {
+      if (Selected) {
+        if (selectionRectangles.ContainsPoint(point)) return true;
+      }
+      return false;
+    }
+
+    public override void MouseDrag(PointD point, Offset offset, MouseButtons button) {
+      if (button == MouseButtons.Left) {
+        if (Selected) {
+          if (selectionRectangles.ContainsPoint(point)) {
+            SelectionRectangle rect = (SelectionRectangle)selectionRectangles.GetPrimitive(point);
+            PointD point1 = PointD.Empty;
+            PointD point2 = PointD.Empty;
+            if (rect.Point == LowerLeft) {
+              point1 = LowerLeft + offset;
+              point2 = UpperRight;
+            } else if (rect.Point == UpperRight) {
+              point1 = LowerLeft;
+              point2 = UpperRight + offset;
+            } else if ((rect.Point.X == LowerLeft.X) && (rect.Point.Y == UpperRight.Y)) {
+              point1 = new PointD(LowerLeft.X + offset.DX, LowerLeft.Y);
+              point2 = new PointD(UpperRight.X, UpperRight.Y + offset.DY);
+            } else if ((rect.Point.X == UpperRight.X) && (rect.Point.Y == LowerLeft.Y)) {
+              point1 = new PointD(LowerLeft.X, LowerLeft.Y + offset.DY);
+              point2 = new PointD(UpperRight.X + offset.DX, UpperRight.Y);
+            }
+            SetPosition(Math.Min(point1.X, point2.X), Math.Min(point1.Y, point2.Y),
+                        Math.Max(point1.X, point2.X), Math.Max(point1.Y, point2.Y));
+          } else {
+            base.MouseDrag(point, offset, button);
+          }
+        }
+      }
+    }
+
+    public override Cursor GetCursor(PointD point) {
+      if (Selected) {
+        Cursor cursor = selectionRectangles.GetCursor(point);
+        if (cursor != null) return cursor;
+      }
+      return base.GetCursor(point);
+    }
+
+    public override void PostDraw(Graphics graphics) {
+      selectionRectangles.Clear();
+      if (Selected) {
+        Pen pen = new Pen(Color.LightGray, 3);
+        pen.DashStyle = DashStyle.Dash;
+        Point p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+        Size s = Chart.TransformWorldToPixel(Size);
+        graphics.DrawRectangle(pen, p.X, p.Y, s.Width, s.Height);
+        selectionRectangles.Add(new SelectionRectangle(Chart, UpperRight.X, LowerLeft.Y, Cursors.SizeNWSE));
+        selectionRectangles.Add(new SelectionRectangle(Chart, LowerLeft.X, LowerLeft.Y, Cursors.SizeNESW));
+        selectionRectangles.Add(new SelectionRectangle(Chart, UpperRight.X, UpperRight.Y, Cursors.SizeNESW));
+        selectionRectangles.Add(new SelectionRectangle(Chart, LowerLeft.X, UpperRight.Y, Cursors.SizeNWSE));
+
+        selectionRectangles.Draw(graphics);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Primitives/SelectionRectangle.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Primitives/SelectionRectangle.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Primitives/SelectionRectangle.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public class SelectionRectangle : FixedSizeRectangle {
+    private static int size = 6;
+    private Cursor cursor;
+
+    public SelectionRectangle(IChart chart, PointD point, Cursor cursor)
+      : base(chart, point, new Size(size, size)) {
+      this.cursor = cursor;
+      Pen = Pens.Black;
+      Brush = Brushes.LightGray;
+    }
+    public SelectionRectangle(IChart chart, double x, double y, Cursor cursor)
+      : this(chart, new PointD(x, y), cursor) {
+    }
+
+    public override Cursor GetCursor(PointD point) {
+      return cursor;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Charting")]
+[assembly: AssemblyDescription("Core classes of the HeuristicLab charting framework")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d68ae989-7286-4f29-a237-852547e5701d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Charting/PropertiesDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/PropertiesDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/PropertiesDialog.Designer.cs	(revision 2)
@@ -0,0 +1,95 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Charting {
+  partial class PropertiesDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.okButton = new System.Windows.Forms.Button();
+      this.propertyGrid = new System.Windows.Forms.PropertyGrid();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(419, 271);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // propertyGrid
+      // 
+      this.propertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.propertyGrid.Location = new System.Drawing.Point(12, 12);
+      this.propertyGrid.Name = "propertyGrid";
+      this.propertyGrid.Size = new System.Drawing.Size(482, 253);
+      this.propertyGrid.TabIndex = 1;
+      // 
+      // PropertiesDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(506, 306);
+      this.Controls.Add(this.propertyGrid);
+      this.Controls.Add(this.okButton);
+      this.Name = "PropertiesDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Properties";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button okButton;
+    protected System.Windows.Forms.PropertyGrid propertyGrid;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/PropertiesDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/PropertiesDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/PropertiesDialog.cs	(revision 2)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Charting {
+  public partial class PropertiesDialog : Form {
+    public object SelectedObject {
+      get { return propertyGrid.SelectedObject; }
+      set { propertyGrid.SelectedObject = value; }
+    }
+
+    public PropertiesDialog() {
+      InitializeComponent();
+    }
+    public PropertiesDialog(object selectedObject)
+      : this() {
+      SelectedObject = selectedObject;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/PropertiesDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Charting/PropertiesDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/PropertiesDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Charting/Structs/Offset.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Structs/Offset.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Structs/Offset.cs	(revision 2)
@@ -0,0 +1,101 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public struct Offset {
+    public static readonly Offset Empty;
+
+    private double myDX;
+    public double DX {
+      get { return myDX; }
+      set { myDX = value; }
+    }
+    private double myDY;
+    public double DY {
+      get { return myDY; }
+      set { myDY = value; }
+    }
+    public bool IsEmpty {
+      get { return this == Empty; }
+    }
+    public double Length {
+      get { return Math.Sqrt(DX * DX + DY * DY); }
+    }
+
+    public Offset(double dx, double dy) {
+      myDX = dx;
+      myDY = dy;
+    }
+    public Offset(PointD point) {
+      myDX = point.X;
+      myDY = point.Y;
+    }
+    public Offset(SizeD size) {
+      myDX = size.Width;
+      myDY = size.Height;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is Offset) {
+        return ((Offset)obj) == this;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+    public override int GetHashCode() {
+      return (int)Math.Pow(DX, DY);
+    }
+    public override string ToString() {
+      return "(" + DX.ToString() + ";" + DY.ToString() + ")";
+    }
+
+    public static Offset operator +(Offset offset1, Offset offset2) {
+      return new Offset(offset1.DX + offset2.DX, offset1.DY + offset2.DY);
+    }
+    public static Offset operator -(Offset offset1, Offset offset2) {
+      return new Offset(offset1.DX - offset2.DX, offset1.DY - offset2.DY);
+    }
+    public static bool operator ==(Offset offset1, Offset offset2) {
+      return (offset1.DX == offset2.DX) && (offset1.DY == offset2.DY);
+    }
+    public static bool operator !=(Offset offset1, Offset offset2) {
+      return (offset1.DX != offset2.DX) && (offset1.DY != offset2.DY);
+    }
+    public static explicit operator PointD(Offset offset) {
+      return new PointD(offset.DX, offset.DY);
+    }
+    public static explicit operator SizeD(Offset offset) {
+      return new SizeD(offset.DX, offset.DY);
+    }
+
+    public static Offset Add(Offset offset1, Offset offset2) {
+      return new Offset(offset1.DX + offset2.DX, offset1.DY + offset2.DY);
+    }
+    public static Offset Subtract(Offset offset1, Offset offset2) {
+      return new Offset(offset1.DX - offset2.DX, offset1.DY - offset2.DY);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Structs/PointD.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Structs/PointD.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Structs/PointD.cs	(revision 2)
@@ -0,0 +1,110 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public struct PointD {
+    public static readonly PointD Empty;
+
+    private double myX;
+    public double X {
+      get { return myX; }
+      set { myX = value; }
+    }
+    private double myY;
+    public double Y {
+      get { return myY; }
+      set { myY = value; }
+    }
+    public bool IsEmpty {
+      get { return this == Empty; }
+    }
+
+    public PointD(double x, double y) {
+      myX = x;
+      myY = y;
+    }
+    public PointD(SizeD size) {
+      myX = size.Width;
+      myY = size.Height;
+    }
+    public PointD(Offset offset) {
+      myX = offset.DX;
+      myY = offset.DY;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is PointD) {
+        return ((PointD)obj) == this;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+    public override int GetHashCode() {
+      return (int)Math.Pow(X, Y);
+    }
+    public override string ToString() {
+      return "(" + X.ToString() + ";" + Y.ToString() + ")";
+    }
+
+    public static PointD operator +(PointD point, Offset offset) {
+      return new PointD(point.X + offset.DX, point.Y + offset.DY);
+    }
+    public static PointD operator -(PointD point, Offset offset) {
+      return new PointD(point.X - offset.DX, point.Y - offset.DY);
+    }
+    public static Offset operator +(PointD point1, PointD point2) {
+      return new Offset(point1.X + point2.X, point1.Y + point2.Y);
+    }
+    public static Offset operator -(PointD point1, PointD point2) {
+      return new Offset(point1.X - point2.X, point1.Y - point2.Y);
+    }
+    public static bool operator ==(PointD point1, PointD point2) {
+      return (point1.X == point2.X) && (point1.Y == point2.Y);
+    }
+    public static bool operator !=(PointD point1, PointD point2) {
+      return (point1.X != point2.X) && (point1.Y != point2.Y);
+    }
+    public static explicit operator SizeD(PointD point) {
+      return new SizeD(point.X, point.Y);
+    }
+    public static explicit operator Offset(PointD point) {
+      return new Offset(point.X, point.Y);
+    }
+    public static implicit operator PointD(Point point) {
+      return new PointD(point.X, point.Y);
+    }
+    public static implicit operator PointD(PointF point) {
+      return new PointD(point.X, point.Y);
+    }
+
+    public static PointD Add(PointD point, Offset offset) {
+      return new PointD(point.X + offset.DX, point.Y + offset.DY);
+    }
+    public static PointD Subtract(PointD point, Offset offset) {
+      return new PointD(point.X - offset.DX, point.Y - offset.DY);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Charting/Structs/SizeD.cs
===================================================================
--- /trunk/sources/HeuristicLab.Charting/Structs/SizeD.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Charting/Structs/SizeD.cs	(revision 2)
@@ -0,0 +1,104 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace HeuristicLab.Charting {
+  public struct SizeD {
+    public static readonly SizeD Empty;
+
+    private double myWidth;
+    public double Width {
+      get { return myWidth; }
+      set { myWidth = value; }
+    }
+    private double myHeight;
+    public double Height {
+      get { return myHeight; }
+      set { myHeight = value; }
+    }
+    public bool IsEmpty {
+      get { return this == Empty; }
+    }
+
+    public SizeD(double width, double height) {
+      myWidth = width;
+      myHeight = height;
+    }
+    public SizeD(PointD point) {
+      myWidth = point.X;
+      myHeight = point.Y;
+    }
+    public SizeD(Offset offset) {
+      myWidth = offset.DX;
+      myHeight = offset.DY;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is SizeD) {
+        return ((SizeD)obj) == this;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+    public override int GetHashCode() {
+      return (int)Math.Pow(Width, Height);
+    }
+    public override string ToString() {
+      return "(" + Width.ToString() + ";" + Height.ToString() + ")";
+    }
+
+    public static SizeD operator +(SizeD size1, SizeD size2) {
+      return new SizeD(size1.Width + size2.Width, size1.Height + size2.Height);
+    }
+    public static SizeD operator -(SizeD size1, SizeD size2) {
+      return new SizeD(size1.Width - size2.Width, size1.Height - size2.Height);
+    }
+    public static bool operator ==(SizeD size1, SizeD size2) {
+      return (size1.Width == size2.Width) && (size1.Height == size2.Height);
+    }
+    public static bool operator !=(SizeD size1, SizeD size2) {
+      return (size1.Width != size2.Width) && (size1.Height != size2.Height);
+    }
+    public static explicit operator PointD(SizeD size) {
+      return new PointD(size.Width, size.Height);
+    }
+    public static explicit operator Offset(SizeD size) {
+      return new Offset(size.Width, size.Height);
+    }
+    public static implicit operator SizeD(Size size) {
+      return new SizeD(size.Width, size.Height);
+    }
+    public static implicit operator SizeD(SizeF size) {
+      return new SizeD(size.Width, size.Height);
+    }
+
+    public static SizeD Add(SizeD size1, SizeD size2) {
+      return new SizeD(size1.Width + size2.Width, size1.Height + size2.Height);
+    }
+    public static SizeD Subtract(SizeD size1, SizeD size2) {
+      return new SizeD(size1.Width - size2.Width, size1.Height - size2.Height);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraint.cs	(revision 2)
@@ -0,0 +1,100 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System.Xml;
+using System.Diagnostics;
+
+namespace HeuristicLab.Constraints {
+  public class AllSubOperatorsTypeConstraint : ConstraintBase {
+
+    private SubOperatorTypeConstraint groupConstraint;
+    public IList<IOperator> AllowedSubOperators {
+      get {
+        return groupConstraint.AllowedSubOperators;
+      }
+    }
+
+    public override string Description {
+      get { return "All sub-operators have to be elements of a pre-defined group."; }
+    }
+
+    public AllSubOperatorsTypeConstraint()
+      : base() {
+      groupConstraint = new SubOperatorTypeConstraint();
+    }
+
+    public void AddOperator(IOperator op) {
+      groupConstraint.AddOperator(op);
+    }
+
+    public void RemoveOperator(IOperator op) {
+      groupConstraint.RemoveOperator(op);
+    }
+
+    public override bool Check(IItem data) {
+      IOperator op = data as IOperator;
+      if (data == null) return false;
+
+      for (int i = 0; i < op.SubOperators.Count; i++ ) {
+        groupConstraint.SubOperatorIndex.Data = i;
+        if(groupConstraint.Check(data)==false) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      AllSubOperatorsTypeConstraint clone = new AllSubOperatorsTypeConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.groupConstraint = (SubOperatorTypeConstraint)Auxiliary.Clone(groupConstraint, clonedObjects);
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new AllSubOperatorsTypeConstraintView(groupConstraint);
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode subOperatorsNode = PersistenceManager.Persist("SubOperatorsGroupConstraint", groupConstraint, document, persistedObjects);
+      node.AppendChild(subOperatorsNode);
+
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      groupConstraint = (SubOperatorTypeConstraint)PersistenceManager.Restore(node.SelectSingleNode("SubOperatorsGroupConstraint"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,123 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class AllSubOperatorsTypeConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.listView = new System.Windows.Forms.ListView();
+      this.panel = new System.Windows.Forms.Panel();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.groupBox.SuspendLayout();
+      this.panel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.listView);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Top;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(463, 285);
+      this.groupBox.TabIndex = 0;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Allowed sub-operators";
+      // 
+      // listView
+      // 
+      this.listView.AllowDrop = true;
+      this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listView.Location = new System.Drawing.Point(3, 16);
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(457, 266);
+      this.listView.TabIndex = 1;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.List;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      this.listView.DragDrop += new System.Windows.Forms.DragEventHandler(this.listView_DragDrop);
+      this.listView.DragEnter += new System.Windows.Forms.DragEventHandler(this.listView_DragEnter);
+      this.listView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView_KeyDown);
+      this.listView.DragOver += new System.Windows.Forms.DragEventHandler(this.listView_DragOver);
+      // 
+      // panel
+      // 
+      this.panel.Controls.Add(this.removeButton);
+      this.panel.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.panel.Location = new System.Drawing.Point(0, 291);
+      this.panel.Name = "panel";
+      this.panel.Size = new System.Drawing.Size(463, 46);
+      this.panel.TabIndex = 1;
+      // 
+      // removeButton
+      // 
+      this.removeButton.Location = new System.Drawing.Point(3, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 0;
+      this.removeButton.Text = "Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // AllSubOperatorsTypeConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.panel);
+      this.Controls.Add(this.groupBox);
+      this.Name = "AllSubOperatorsTypeConstraintView";
+      this.Size = new System.Drawing.Size(463, 337);
+      this.groupBox.ResumeLayout(false);
+      this.panel.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Panel panel;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.ListView listView;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.cs	(revision 2)
@@ -0,0 +1,156 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public partial class AllSubOperatorsTypeConstraintView : ViewBase {
+    private SubOperatorTypeConstraint constraint;
+
+    public SubOperatorTypeConstraint Constraint {
+      get { return constraint; }
+      set { 
+        constraint = value;
+        UpdateAllowedOperatorsList();
+      }
+    }
+
+    public AllSubOperatorsTypeConstraintView() {
+      InitializeComponent();
+    }
+
+    public AllSubOperatorsTypeConstraintView(SubOperatorTypeConstraint constraint) {
+      InitializeComponent();
+      this.constraint = constraint;
+      UpdateAllowedOperatorsList();
+    }
+
+    private void UpdateAllowedOperatorsList() {
+      listView.Clear();
+      foreach(IOperator op in constraint.AllowedSubOperators) {
+        ListViewItem item = new ListViewItem();
+        item.Name = op.Name;
+        item.Text = op.Name;
+        item.Tag = op;
+        listView.Items.Add(item);
+      }
+      Refresh();
+    }
+
+    private void op_NameChanged(object sender, EventArgs e) {
+      IOperator srcOp = (IOperator)sender;
+
+      foreach(ListViewItem item in listView.Items) {
+        if(item.Tag == srcOp) {
+          item.Text = srcOp.Name;
+          item.Name = srcOp.Name;
+          break;
+        }
+      }
+      Refresh();
+    }
+
+    #region Key Events
+    private void listView_KeyDown(object sender, KeyEventArgs e) {
+      if(e.KeyCode == Keys.Delete) {
+        while(listView.SelectedIndices.Count > 0) {
+          constraint.RemoveOperator((IOperator)listView.SelectedItems[0].Tag);
+          listView.Items.RemoveAt(listView.SelectedIndices[0]);
+        }
+      }
+    }
+    #endregion
+
+    #region Drag Events   
+
+    private void listView_DragDrop(object sender, DragEventArgs e) {
+      if(e.Effect != DragDropEffects.None) {
+        if(e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          ListViewItem item = new ListViewItem();
+          item.Tag = op;
+          item.Name = op.Name;
+          item.Text = op.Name;
+          listView.Items.Add(item);
+          constraint.AddOperator(op);
+          op.NameChanged += new EventHandler(op_NameChanged);
+          listView.SelectedIndices.Clear();
+        }
+      }
+    }
+
+
+    private void listView_DragEnter(object sender, DragEventArgs e) {
+      this.FindForm().BringToFront();
+      this.Focus();
+      e.Effect = DragDropEffects.None;
+      if(e.Data.GetDataPresent("IOperator")) {
+        IOperator op = (IOperator)e.Data.GetData("IOperator");
+        if(!ListContains(op)) {
+          e.Effect = DragDropEffects.Copy;
+        }
+      }
+    }
+
+
+    private void listView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if(e.Data.GetDataPresent("IOperator")) {
+        IOperator op = (IOperator)e.Data.GetData("IOperator");
+        if(!ListContains(op)) {
+          e.Effect = DragDropEffects.Copy;
+        }
+      }
+    }
+    #endregion
+
+    #region button events
+    private void removeButton_Click(object sender, EventArgs e) {
+      while(listView.SelectedIndices.Count > 0) {
+        constraint.RemoveOperator((IOperator)listView.SelectedItems[0].Tag);
+        listView.Items.RemoveAt(listView.SelectedIndices[0]);
+      }
+    }
+    #endregion
+
+    private bool ListContains(IOperator op) {
+      foreach(ListViewItem item in listView.Items) {
+        if(item.Tag == op) return true;
+      }
+      return false;
+    }
+
+    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
+      if(listView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      } else {
+        removeButton.Enabled = false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AllSubOperatorsTypeConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/AndConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AndConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AndConstraint.cs	(revision 2)
@@ -0,0 +1,90 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class AndConstraint : ConstraintBase, IViewable {
+    private ItemList clauses;
+    public ItemList Clauses {
+      get { return clauses; }
+      set {
+        clauses = value;
+        OnChanged();
+      }
+    }
+
+    public override string Description {
+      get {
+        return "To return true, all subconstraints have to be true";
+      }
+    }
+
+    public AndConstraint() {
+      clauses = new ItemList();
+      clauses.ItemType = typeof(IConstraint);
+    }
+
+    public override bool Check(IItem data) {
+      bool result = true;
+      for (int i = 0 ; i < clauses.Count ; i++) {
+        result = ((IConstraint)clauses[i]).Check(data);
+        if (!result) return false;
+      }
+      return result;
+    }
+
+    public override IView CreateView() {
+      return new AndConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      AndConstraint clone = new AndConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.Clauses = (ItemList)Auxiliary.Clone(Clauses, clonedObjects);
+      return clone;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode clausesNode = PersistenceManager.Persist("Clauses", Clauses, document, persistedObjects);
+      node.AppendChild(clausesNode);
+
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      clauses = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Clauses"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AndConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AndConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AndConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class AndConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      if (AndConstraint != null) AndConstraint.Changed -= new System.EventHandler(AndConstraint_Changed);
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.clausesItemListView = new HeuristicLab.Data.ItemListView();
+      this.SuspendLayout();
+      // 
+      // clausesItemListView
+      // 
+      this.clausesItemListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.clausesItemListView.Caption = "View";
+      this.clausesItemListView.Location = new System.Drawing.Point(0, 0);
+      this.clausesItemListView.Name = "clausesItemListView";
+      this.clausesItemListView.Size = new System.Drawing.Size(338, 238);
+      this.clausesItemListView.TabIndex = 0;
+      // 
+      // AndConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.clausesItemListView);
+      this.Name = "AndConstraintView";
+      this.Size = new System.Drawing.Size(344, 244);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.ItemListView clausesItemListView;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AndConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AndConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AndConstraintView.cs	(revision 2)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class AndConstraintView : ViewBase {
+    public AndConstraint AndConstraint {
+      get { return (AndConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    public AndConstraintView() {
+      InitializeComponent();
+    }
+    public AndConstraintView(AndConstraint andConstraint)
+      : this() {
+      AndConstraint = andConstraint;
+    }
+
+    protected override void RemoveItemEvents() {
+      AndConstraint.Changed -= new EventHandler(AndConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      AndConstraint.Changed += new EventHandler(AndConstraint_Changed);
+    }
+
+    protected override void UpdateControls() {
+      if (AndConstraint == null) {
+        clausesItemListView.Enabled = false;
+        clausesItemListView.ItemList = null;
+      } else {
+        clausesItemListView.ItemList = AndConstraint.Clauses;
+        clausesItemListView.Enabled = true;
+      }
+    }
+
+    void AndConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/AndConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/AndConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/AndConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/ConstraintBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/ConstraintBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/ConstraintBase.cs	(revision 2)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public abstract class ConstraintBase : ItemBase, IConstraint {
+    public virtual string Description {
+      get { return "No constraint description available."; }
+    }
+
+    public abstract bool Check(IItem data);
+
+    public virtual void Accept(IConstraintVisitor visitor) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/ConstraintVisitorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/ConstraintVisitorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/ConstraintVisitorBase.cs	(revision 2)
@@ -0,0 +1,65 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public class ConstraintVisitorBase : IConstraintVisitor {
+    public virtual void Visit(AndConstraint constraint) {
+    }
+
+    public virtual void Visit(OrConstraint constraint) {
+    }
+
+    public virtual void Visit(NotConstraint constraint) {
+    }
+
+    public virtual void Visit(TrueConstraint constraint) {
+    }
+
+    public virtual void Visit(FalseConstraint constraint) {
+    }
+
+    public virtual void Visit(IsIntegerConstraint constraint) {
+    }
+
+    public virtual void Visit(DoubleBoundedConstraint constraint) {
+    }
+
+    public virtual void Visit(IntBoundedConstraint constraint) {
+    }
+
+    public virtual void Visit(NumberOfSubOperatorsConstraint constraint) {
+    }
+
+    public virtual void Visit(SubOperatorTypeConstraint constraint) {
+    }
+
+    public virtual void Visit(AllSubOperatorsTypeConstraint constraint) {
+    }
+
+    public virtual void Visit(ItemTypeConstraint constraint) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraint.cs	(revision 2)
@@ -0,0 +1,185 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class DoubleBoundedConstraint : ConstraintBase {
+    private double lowerBound;
+    public double LowerBound {
+      get { return lowerBound; }
+      set {
+        lowerBound = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundIncluded;
+    public bool LowerBoundIncluded {
+      get { return lowerBoundIncluded; }
+      set {
+        lowerBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundEnabled;
+    public bool LowerBoundEnabled {
+      get { return lowerBoundEnabled; }
+      set {
+        lowerBoundEnabled = value;
+        OnChanged();
+      }
+    }
+    private double upperBound;
+    public double UpperBound {
+      get { return upperBound; }
+      set {
+        upperBound = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundIncluded;
+    public bool UpperBoundIncluded {
+      get { return upperBoundIncluded; }
+      set {
+        upperBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundEnabled;
+    public bool UpperBoundEnabled {
+      get { return upperBoundEnabled; }
+      set {
+        upperBoundEnabled = value;
+        OnChanged();
+      }
+    }
+
+    public override string Description {
+      get { return "The double is limited one or two sided by a lower and/or upper boundary"; }
+    }
+
+    public DoubleBoundedConstraint()
+      : this(double.MinValue, double.MaxValue) {
+    }
+
+    public DoubleBoundedConstraint(double lowerBound, double upperBound)
+      : this(lowerBound, true, upperBound, true) {
+    }
+
+    public DoubleBoundedConstraint(double lowerBound, bool lowerBoundIncluded, double upperBound, bool upperBoundIncluded)
+      : base() {
+      this.lowerBound = lowerBound;
+      this.lowerBoundIncluded = lowerBoundIncluded;
+      this.lowerBoundEnabled = true;
+      this.upperBound = upperBound;
+      this.upperBoundIncluded = upperBoundIncluded;
+      this.upperBoundEnabled = true;
+    }
+
+
+    public override bool Check(IItem data) {
+      ConstrainedDoubleData d = (data as ConstrainedDoubleData);
+      if (d == null) return false;
+      if (LowerBoundEnabled && ((LowerBoundIncluded && d.CompareTo(LowerBound) < 0)
+        || (!LowerBoundIncluded && d.CompareTo(LowerBound) <= 0))) return false;
+      if (UpperBoundEnabled && ((UpperBoundIncluded && d.CompareTo(UpperBound) > 0)
+        || (!UpperBoundIncluded && d.CompareTo(UpperBound) >= 0))) return false;
+      return true;
+    }
+
+    public override IView CreateView() {
+      return new DoubleBoundedConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      DoubleBoundedConstraint clone = new DoubleBoundedConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.upperBound = UpperBound;
+      clone.upperBoundIncluded = UpperBoundIncluded;
+      clone.upperBoundEnabled = UpperBoundEnabled;
+      clone.lowerBound = LowerBound;
+      clone.lowerBoundIncluded = LowerBoundIncluded;
+      clone.lowerBoundEnabled = LowerBoundEnabled;
+      return clone;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute lb = document.CreateAttribute("LowerBound");
+      lb.Value = LowerBound+"";
+      XmlAttribute lbi = document.CreateAttribute("LowerBoundIncluded");
+      lbi.Value = lowerBoundIncluded+"";
+      XmlAttribute lbe = document.CreateAttribute("LowerBoundEnabled");
+      lbe.Value = lowerBoundEnabled + "";
+      XmlAttribute ub = document.CreateAttribute("UpperBound");
+      ub.Value = upperBound + "";
+      XmlAttribute ubi = document.CreateAttribute("UpperBoundIncluded");
+      ubi.Value = upperBoundIncluded + "";
+      XmlAttribute ube = document.CreateAttribute("UpperBoundEnabled");
+      ube.Value = upperBoundEnabled + "";
+      node.Attributes.Append(lb);
+      if (!lowerBoundIncluded) node.Attributes.Append(lbi);
+      if (!lowerBoundEnabled) node.Attributes.Append(lbe);
+      node.Attributes.Append(ub);
+      if (!upperBoundIncluded) node.Attributes.Append(ubi);
+      if (!upperBoundEnabled) node.Attributes.Append(ube);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      lowerBound = double.Parse(node.Attributes["LowerBound"].Value);
+      if (node.Attributes["LowerBoundIncluded"] != null) {
+        lowerBoundIncluded = bool.Parse(node.Attributes["LowerBoundIncluded"].Value);
+      } else {
+        lowerBoundIncluded = true;
+      }
+      if (node.Attributes["LowerBoundEnabled"] != null) {
+        lowerBoundEnabled = bool.Parse(node.Attributes["LowerBoundEnabled"].Value);
+      } else {
+        lowerBoundEnabled = true;
+      }
+
+      upperBound = double.Parse(node.Attributes["UpperBound"].Value);
+      if (node.Attributes["UpperBoundIncluded"] != null) {
+        upperBoundIncluded = bool.Parse(node.Attributes["UpperBoundIncluded"].Value);
+      } else {
+        upperBoundIncluded = true;
+      }
+      if (node.Attributes["UpperBoundEnabled"] != null) {
+        upperBoundEnabled = bool.Parse(node.Attributes["UpperBoundEnabled"].Value);
+      } else {
+        upperBoundEnabled = true;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,148 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class DoubleBoundedConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      if (DoubleBoundedConstraint != null) DoubleBoundedConstraint.Changed -= new System.EventHandler(DoubleBoundedConstraint_Changed);
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.lbEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbTextBox = new System.Windows.Forms.TextBox();
+      this.ubTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // lbEnabledCheckBox
+      // 
+      this.lbEnabledCheckBox.AutoSize = true;
+      this.lbEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.lbEnabledCheckBox.Location = new System.Drawing.Point(3, 6);
+      this.lbEnabledCheckBox.Name = "lbEnabledCheckBox";
+      this.lbEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.lbEnabledCheckBox.TabIndex = 20;
+      this.lbEnabledCheckBox.Text = "Lower bound:";
+      this.lbEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.lbEnabledCheckBox.CheckedChanged += new System.EventHandler(this.lbEnabledCheckBox_CheckedChanged);
+      // 
+      // ubEnabledCheckBox
+      // 
+      this.ubEnabledCheckBox.AutoSize = true;
+      this.ubEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.ubEnabledCheckBox.Location = new System.Drawing.Point(3, 29);
+      this.ubEnabledCheckBox.Name = "ubEnabledCheckBox";
+      this.ubEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.ubEnabledCheckBox.TabIndex = 21;
+      this.ubEnabledCheckBox.Text = "Upper bound:";
+      this.ubEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.ubEnabledCheckBox.CheckedChanged += new System.EventHandler(this.ubEnabledCheckBox_CheckedChanged);
+      // 
+      // lbIncludedCheckBox
+      // 
+      this.lbIncludedCheckBox.AutoSize = true;
+      this.lbIncludedCheckBox.Location = new System.Drawing.Point(189, 6);
+      this.lbIncludedCheckBox.Name = "lbIncludedCheckBox";
+      this.lbIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.lbIncludedCheckBox.TabIndex = 22;
+      this.lbIncludedCheckBox.Text = "Included?";
+      this.lbIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.lbIncludedCheckBox.CheckedChanged += new System.EventHandler(this.lbIncludedCheckBox_CheckedChanged);
+      // 
+      // ubIncludedCheckBox
+      // 
+      this.ubIncludedCheckBox.AutoSize = true;
+      this.ubIncludedCheckBox.Location = new System.Drawing.Point(189, 29);
+      this.ubIncludedCheckBox.Name = "ubIncludedCheckBox";
+      this.ubIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.ubIncludedCheckBox.TabIndex = 23;
+      this.ubIncludedCheckBox.Text = "Included?";
+      this.ubIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.ubIncludedCheckBox.CheckedChanged += new System.EventHandler(this.ubIncludedCheckBox_CheckedChanged);
+      // 
+      // lbTextBox
+      // 
+      this.lbTextBox.Location = new System.Drawing.Point(100, 4);
+      this.lbTextBox.Name = "lbTextBox";
+      this.lbTextBox.Size = new System.Drawing.Size(83, 20);
+      this.lbTextBox.TabIndex = 24;
+      this.lbTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.lbTextBox.Validated += new System.EventHandler(this.lbTextBox_Validated);
+      this.lbTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lbTextBox_Validating);
+      // 
+      // ubTextBox
+      // 
+      this.ubTextBox.Location = new System.Drawing.Point(100, 27);
+      this.ubTextBox.Name = "ubTextBox";
+      this.ubTextBox.Size = new System.Drawing.Size(83, 20);
+      this.ubTextBox.TabIndex = 25;
+      this.ubTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.ubTextBox.Validated += new System.EventHandler(this.ubTextBox_Validated);
+      this.ubTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ubTextBox_Validating);
+      // 
+      // DoubleBoundedConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ubTextBox);
+      this.Controls.Add(this.lbTextBox);
+      this.Controls.Add(this.ubIncludedCheckBox);
+      this.Controls.Add(this.lbIncludedCheckBox);
+      this.Controls.Add(this.ubEnabledCheckBox);
+      this.Controls.Add(this.lbEnabledCheckBox);
+      this.Name = "DoubleBoundedConstraintView";
+      this.Size = new System.Drawing.Size(263, 51);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox lbEnabledCheckBox;
+    private System.Windows.Forms.CheckBox ubEnabledCheckBox;
+    private System.Windows.Forms.CheckBox lbIncludedCheckBox;
+    private System.Windows.Forms.CheckBox ubIncludedCheckBox;
+    private System.Windows.Forms.TextBox lbTextBox;
+    private System.Windows.Forms.TextBox ubTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.cs	(revision 2)
@@ -0,0 +1,133 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class DoubleBoundedConstraintView : ViewBase {
+    public DoubleBoundedConstraint DoubleBoundedConstraint {
+      get { return (DoubleBoundedConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    public DoubleBoundedConstraintView() {
+      InitializeComponent();
+    }
+
+    public DoubleBoundedConstraintView(DoubleBoundedConstraint doubleBoundedConstraint)
+      : this() {
+      DoubleBoundedConstraint = doubleBoundedConstraint;
+    }
+
+    protected override void RemoveItemEvents() {
+      DoubleBoundedConstraint.Changed -= new EventHandler(DoubleBoundedConstraint_Changed); 
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      DoubleBoundedConstraint.Changed += new EventHandler(DoubleBoundedConstraint_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (DoubleBoundedConstraint == null) {
+        lbTextBox.Enabled = false;
+        lbTextBox.Text = "";
+        lbIncludedCheckBox.Enabled = false;
+        lbEnabledCheckBox.Checked = false;
+
+        ubTextBox.Enabled = false;
+        ubTextBox.Text = "";
+        ubIncludedCheckBox.Checked = false;
+        ubEnabledCheckBox.Enabled = false;
+      } else {
+        lbTextBox.Text = DoubleBoundedConstraint.LowerBound + "";
+        lbTextBox.Enabled = DoubleBoundedConstraint.LowerBoundEnabled;
+        lbIncludedCheckBox.Checked = DoubleBoundedConstraint.LowerBoundIncluded;
+        lbIncludedCheckBox.Enabled = true;
+        lbEnabledCheckBox.Checked = DoubleBoundedConstraint.LowerBoundEnabled;
+        lbEnabledCheckBox.Enabled = true;
+
+        ubTextBox.Text = DoubleBoundedConstraint.UpperBound + "";
+        ubTextBox.Enabled = DoubleBoundedConstraint.UpperBoundEnabled;
+        ubIncludedCheckBox.Checked = DoubleBoundedConstraint.UpperBoundIncluded;
+        ubIncludedCheckBox.Enabled = true;
+        ubEnabledCheckBox.Checked = DoubleBoundedConstraint.UpperBoundEnabled;
+        ubEnabledCheckBox.Enabled = true;
+      }
+    }
+
+    void DoubleBoundedConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void lbEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.LowerBoundEnabled = lbEnabledCheckBox.Checked;
+      lbTextBox.Enabled = lbEnabledCheckBox.Checked;
+      lbIncludedCheckBox.Enabled = lbEnabledCheckBox.Checked;
+    }
+
+    private void ubEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.UpperBoundEnabled = ubEnabledCheckBox.Checked;
+      ubTextBox.Enabled = ubEnabledCheckBox.Checked;
+      ubIncludedCheckBox.Enabled = ubEnabledCheckBox.Checked;
+    }
+
+    private void lbIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.LowerBoundIncluded = lbIncludedCheckBox.Checked;
+    }
+
+    private void ubIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.UpperBoundIncluded = ubIncludedCheckBox.Checked;
+    }
+
+    private void lbTextBox_Validating(object sender, CancelEventArgs e) {
+      double result;
+      if (!double.TryParse(lbTextBox.Text, out result)) {
+        e.Cancel = true;
+      } 
+    }
+
+    private void ubTextBox_Validating(object sender, CancelEventArgs e) {
+      double result;
+      if (!double.TryParse(ubTextBox.Text, out result)) {
+        e.Cancel = true;
+      } 
+    }
+
+    private void lbTextBox_Validated(object sender, EventArgs e) {
+      DoubleBoundedConstraint.LowerBound = double.Parse(lbTextBox.Text);
+    }
+
+    private void ubTextBox_Validated(object sender, EventArgs e) {
+      DoubleBoundedConstraint.UpperBound = double.Parse(ubTextBox.Text);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/DoubleBoundedConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/FalseConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/FalseConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/FalseConstraint.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public class FalseConstraint : ConstraintBase {
+    public override string Description {
+      get { return "This constraint is always false."; }
+    }
+
+    public override IView CreateView() {
+      return new FalseConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      FalseConstraint clone = new FalseConstraint();
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    public override bool Check(IItem data) {
+      return false;
+    }
+
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class FalseConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.falseLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // falseLabel
+      // 
+      this.falseLabel.Anchor = System.Windows.Forms.AnchorStyles.Top;
+      this.falseLabel.AutoSize = true;
+      this.falseLabel.Location = new System.Drawing.Point(42, 0);
+      this.falseLabel.Name = "falseLabel";
+      this.falseLabel.Size = new System.Drawing.Size(32, 13);
+      this.falseLabel.TabIndex = 0;
+      this.falseLabel.Text = "False";
+      // 
+      // FalseConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.falseLabel);
+      this.Name = "FalseConstraintView";
+      this.Size = new System.Drawing.Size(117, 28);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label falseLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.cs	(revision 2)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public partial class FalseConstraintView : ViewBase {
+    public FalseConstraint FalseConstraint {
+      get { return (FalseConstraint)Item; }
+      set { base.Item = value; }
+    }
+    public FalseConstraintView() {
+      InitializeComponent();
+    }
+
+    public FalseConstraintView(FalseConstraint falseConstraint)
+      : this() {
+      FalseConstraint = falseConstraint;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/FalseConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/HeuristicLab.Constraints.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/HeuristicLab.Constraints.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/HeuristicLab.Constraints.csproj	(revision 2)
@@ -0,0 +1,214 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Constraints</RootNamespace>
+    <AssemblyName>HeuristicLab.Constraints</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Constraints.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AllSubOperatorsTypeConstraint.cs" />
+    <Compile Include="AllSubOperatorsTypeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AllSubOperatorsTypeConstraintView.designer.cs">
+      <DependentUpon>AllSubOperatorsTypeConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="AndConstraint.cs" />
+    <Compile Include="AndConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AndConstraintView.Designer.cs">
+      <DependentUpon>AndConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstraintBase.cs" />
+    <Compile Include="ConstraintVisitorBase.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DoubleBoundedConstraint.cs" />
+    <Compile Include="DoubleBoundedConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleBoundedConstraintView.Designer.cs">
+      <DependentUpon>DoubleBoundedConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IConstraintVisitor.cs" />
+    <Compile Include="IntBoundedConstraint.cs" />
+    <Compile Include="FalseConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FalseConstraintView.Designer.cs">
+      <DependentUpon>FalseConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntBoundedConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntBoundedConstraintView.Designer.cs">
+      <DependentUpon>IntBoundedConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IsIntegerConstraint.cs" />
+    <Compile Include="ItemTypeConstraint.cs" />
+    <Compile Include="ItemTypeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemTypeConstraintView.Designer.cs">
+      <DependentUpon>ItemTypeConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NotConstraint.cs" />
+    <Compile Include="NotConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NotConstraintView.Designer.cs">
+      <DependentUpon>NotConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NumberOfSubOperatorsConstraint.cs" />
+    <Compile Include="NumberOfSubOperatorsConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NumberOfSubOperatorsConstraintView.Designer.cs">
+      <DependentUpon>NumberOfSubOperatorsConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OrConstraint.cs" />
+    <Compile Include="OrConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OrConstraintView.Designer.cs">
+      <DependentUpon>OrConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FalseConstraint.cs" />
+    <Compile Include="SubOperatorsConstraintAnalyser.cs" />
+    <Compile Include="SubOperatorsTypeConstraint.cs" />
+    <Compile Include="SubOperatorsTypeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SubOperatorsTypeConstraintView.designer.cs">
+      <DependentUpon>SubOperatorsTypeConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TrueConstraint.cs" />
+    <Compile Include="HeuristicLabConstraintsPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TrueConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TrueConstraintView.Designer.cs">
+      <DependentUpon>TrueConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableComparisonConstraint.cs" />
+    <Compile Include="VariableComparisonConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableComparisonConstraintView.Designer.cs">
+      <DependentUpon>VariableComparisonConstraintView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AllSubOperatorsTypeConstraintView.resx">
+      <DependentUpon>AllSubOperatorsTypeConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AndConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>AndConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DoubleBoundedConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>DoubleBoundedConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FalseConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>FalseConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="IntBoundedConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>IntBoundedConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemTypeConstraintView.resx">
+      <DependentUpon>ItemTypeConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NotConstraintView.resx">
+      <DependentUpon>NotConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NumberOfSubOperatorsConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>NumberOfSubOperatorsConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OrConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>OrConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SubOperatorsTypeConstraintView.resx">
+      <DependentUpon>SubOperatorsTypeConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TrueConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>TrueConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariableComparisonConstraintView.resx">
+      <DependentUpon>VariableComparisonConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Constraints/HeuristicLabConstraintsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/HeuristicLabConstraintsPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/HeuristicLabConstraintsPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Constraints {
+  [ClassInfo(Name = "HeuristicLab.Constraints")]
+  [PluginFile(Filename = "HeuristicLab.Constraints.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  public class HeuristicLabConstraintsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/IConstraintVisitor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/IConstraintVisitor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/IConstraintVisitor.cs	(revision 2)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Constraints {
+  public interface IConstraintVisitor {
+    void Visit(AndConstraint constraint);
+
+    void Visit(OrConstraint constraint);
+
+    void Visit(NotConstraint constraint);
+
+    void Visit(TrueConstraint constraint);
+
+    void Visit(FalseConstraint constraint);
+
+    void Visit(IsIntegerConstraint constraint);
+
+    void Visit(DoubleBoundedConstraint constraint);
+
+    void Visit(IntBoundedConstraint constraint);
+
+    void Visit(NumberOfSubOperatorsConstraint constraint);
+
+    void Visit(SubOperatorTypeConstraint constraint);
+
+    void Visit(AllSubOperatorsTypeConstraint constraint);
+
+    void Visit(ItemTypeConstraint constraint);
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraint.cs	(revision 2)
@@ -0,0 +1,180 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class IntBoundedConstraint : ConstraintBase {
+    private int lowerBound;
+    public int LowerBound {
+      get { return lowerBound; }
+      set {
+        lowerBound = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundIncluded;
+    public bool LowerBoundIncluded {
+      get { return lowerBoundIncluded; }
+      set {
+        lowerBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundEnabled;
+    public bool LowerBoundEnabled {
+      get { return lowerBoundEnabled; }
+      set {
+        lowerBoundEnabled = value;
+        OnChanged();
+      }
+    }
+    private int upperBound;
+    public int UpperBound {
+      get { return upperBound; }
+      set {
+        upperBound = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundIncluded;
+    public bool UpperBoundIncluded {
+      get { return upperBoundIncluded; }
+      set {
+        upperBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundEnabled;
+    public bool UpperBoundEnabled {
+      get { return upperBoundEnabled; }
+      set {
+        upperBoundEnabled = value;
+        OnChanged();
+      }
+    }
+
+    public override string Description {
+      get { return "The integer is limited one or two sided by a lower and/or upper boundary"; }
+    }
+
+    public IntBoundedConstraint()
+      : this(int.MinValue, int.MaxValue) {
+    }
+
+    public IntBoundedConstraint(int low, int high) : base() {
+      lowerBound = low;
+      lowerBoundIncluded = false;
+      lowerBoundEnabled = true;
+      upperBound = high;
+      upperBoundIncluded = false;
+      upperBoundEnabled = true;
+    }
+
+    public override bool Check(IItem data) {
+      ConstrainedIntData d = (data as ConstrainedIntData);
+      if (d == null) return false;
+      if (LowerBoundEnabled && ((LowerBoundIncluded && d.CompareTo(LowerBound) < 0)
+        || (!LowerBoundIncluded && d.CompareTo(LowerBound) <= 0))) return false;
+      if (UpperBoundEnabled && ((UpperBoundIncluded && d.CompareTo(UpperBound) > 0)
+        || (!UpperBoundIncluded && d.CompareTo(UpperBound) >= 0))) return false;
+      return true;
+    }
+
+    public override IView CreateView() {
+      return new IntBoundedConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      IntBoundedConstraint clone = new IntBoundedConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.upperBound = UpperBound;
+      clone.upperBoundIncluded = UpperBoundIncluded;
+      clone.upperBoundEnabled = UpperBoundEnabled;
+      clone.lowerBound = LowerBound;
+      clone.lowerBoundIncluded = LowerBoundIncluded;
+      clone.lowerBoundEnabled = LowerBoundEnabled;
+      return clone;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute lb = document.CreateAttribute("LowerBound");
+      lb.Value = LowerBound + "";
+      XmlAttribute lbi = document.CreateAttribute("LowerBoundIncluded");
+      lbi.Value = lowerBoundIncluded + "";
+      XmlAttribute lbe = document.CreateAttribute("LowerBoundEnabled");
+      lbe.Value = lowerBoundEnabled + "";
+      XmlAttribute ub = document.CreateAttribute("UpperBound");
+      ub.Value = upperBound + "";
+      XmlAttribute ubi = document.CreateAttribute("UpperBoundIncluded");
+      ubi.Value = upperBoundIncluded + "";
+      XmlAttribute ube = document.CreateAttribute("UpperBoundEnabled");
+      ube.Value = upperBoundEnabled + "";
+      node.Attributes.Append(lb);
+      if (!lowerBoundIncluded) node.Attributes.Append(lbi);
+      if (!lowerBoundEnabled) node.Attributes.Append(lbe);
+      node.Attributes.Append(ub);
+      if (!upperBoundIncluded) node.Attributes.Append(ubi);
+      if (!upperBoundEnabled) node.Attributes.Append(ube);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      lowerBound = int.Parse(node.Attributes["LowerBound"].Value);
+      if (node.Attributes["LowerBoundIncluded"] != null) {
+        lowerBoundIncluded = bool.Parse(node.Attributes["LowerBoundIncluded"].Value);
+      } else {
+        lowerBoundIncluded = true;
+      }
+      if (node.Attributes["LowerBoundEnabled"] != null) {
+        lowerBoundEnabled = bool.Parse(node.Attributes["LowerBoundEnabled"].Value);
+      } else {
+        lowerBoundEnabled = true;
+      }
+
+      upperBound = int.Parse(node.Attributes["UpperBound"].Value);
+      if (node.Attributes["UpperBoundIncluded"] != null) {
+        upperBoundIncluded = bool.Parse(node.Attributes["UpperBoundIncluded"].Value);
+      } else {
+        upperBoundIncluded = true;
+      }
+      if (node.Attributes["UpperBoundEnabled"] != null) {
+        upperBoundEnabled = bool.Parse(node.Attributes["UpperBoundEnabled"].Value);
+      } else {
+        upperBoundEnabled = true;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,149 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class IntBoundedConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      if (IntBoundedConstraint != null) IntBoundedConstraint.Changed -= new System.EventHandler(IntBoundedConstraint_Changed);
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.lbEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbTextBox = new System.Windows.Forms.TextBox();
+      this.ubTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // lbEnabledCheckBox
+      // 
+      this.lbEnabledCheckBox.AutoSize = true;
+      this.lbEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.lbEnabledCheckBox.Location = new System.Drawing.Point(4, 4);
+      this.lbEnabledCheckBox.Name = "lbEnabledCheckBox";
+      this.lbEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.lbEnabledCheckBox.TabIndex = 0;
+      this.lbEnabledCheckBox.Text = "Lower bound:";
+      this.lbEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.lbEnabledCheckBox.CheckedChanged += new System.EventHandler(this.lbEnabledCheckBox_CheckedChanged);
+      // 
+      // ubEnabledCheckBox
+      // 
+      this.ubEnabledCheckBox.AutoSize = true;
+      this.ubEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.ubEnabledCheckBox.Location = new System.Drawing.Point(4, 27);
+      this.ubEnabledCheckBox.Name = "ubEnabledCheckBox";
+      this.ubEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.ubEnabledCheckBox.TabIndex = 1;
+      this.ubEnabledCheckBox.Text = "Upper bound:";
+      this.ubEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.ubEnabledCheckBox.CheckedChanged += new System.EventHandler(this.ubEnabledCheckBox_CheckedChanged);
+      // 
+      // lbIncludedCheckBox
+      // 
+      this.lbIncludedCheckBox.AutoSize = true;
+      this.lbIncludedCheckBox.Location = new System.Drawing.Point(207, 4);
+      this.lbIncludedCheckBox.Name = "lbIncludedCheckBox";
+      this.lbIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.lbIncludedCheckBox.TabIndex = 2;
+      this.lbIncludedCheckBox.Text = "Included?";
+      this.lbIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.lbIncludedCheckBox.CheckedChanged += new System.EventHandler(this.lbIncludedCheckBox_CheckedChanged);
+      // 
+      // ubIncludedCheckBox
+      // 
+      this.ubIncludedCheckBox.AutoSize = true;
+      this.ubIncludedCheckBox.Location = new System.Drawing.Point(207, 27);
+      this.ubIncludedCheckBox.Name = "ubIncludedCheckBox";
+      this.ubIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.ubIncludedCheckBox.TabIndex = 3;
+      this.ubIncludedCheckBox.Text = "Included?";
+      this.ubIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.ubIncludedCheckBox.CheckedChanged += new System.EventHandler(this.ubIncludedCheckBox_CheckedChanged);
+      // 
+      // lbTextBox
+      // 
+      this.lbTextBox.Location = new System.Drawing.Point(101, 2);
+      this.lbTextBox.Name = "lbTextBox";
+      this.lbTextBox.Size = new System.Drawing.Size(100, 20);
+      this.lbTextBox.TabIndex = 4;
+      this.lbTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.lbTextBox.Validated += new System.EventHandler(this.lbTextBox_Validated);
+      this.lbTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lbTextBox_Validating);
+      // 
+      // ubTextBox
+      // 
+      this.ubTextBox.Location = new System.Drawing.Point(101, 25);
+      this.ubTextBox.Name = "ubTextBox";
+      this.ubTextBox.Size = new System.Drawing.Size(100, 20);
+      this.ubTextBox.TabIndex = 5;
+      this.ubTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.ubTextBox.Validated += new System.EventHandler(this.ubTextBox_Validated);
+      this.ubTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ubTextBox_Validating);
+      // 
+      // IntBoundedConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ubTextBox);
+      this.Controls.Add(this.lbTextBox);
+      this.Controls.Add(this.ubIncludedCheckBox);
+      this.Controls.Add(this.lbIncludedCheckBox);
+      this.Controls.Add(this.ubEnabledCheckBox);
+      this.Controls.Add(this.lbEnabledCheckBox);
+      this.Name = "IntBoundedConstraintView";
+      this.Size = new System.Drawing.Size(280, 52);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox lbEnabledCheckBox;
+    private System.Windows.Forms.CheckBox ubEnabledCheckBox;
+    private System.Windows.Forms.CheckBox lbIncludedCheckBox;
+    private System.Windows.Forms.CheckBox ubIncludedCheckBox;
+    private System.Windows.Forms.TextBox lbTextBox;
+    private System.Windows.Forms.TextBox ubTextBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.cs	(revision 2)
@@ -0,0 +1,133 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class IntBoundedConstraintView : ViewBase {
+    public IntBoundedConstraint IntBoundedConstraint {
+      get { return (IntBoundedConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    public IntBoundedConstraintView() {
+      InitializeComponent();
+    }
+
+    public IntBoundedConstraintView(IntBoundedConstraint intBoundedConstraint)
+      : this() {
+      IntBoundedConstraint = intBoundedConstraint;
+    }
+
+    protected override void RemoveItemEvents() {
+      IntBoundedConstraint.Changed -= new EventHandler(IntBoundedConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      IntBoundedConstraint.Changed += new EventHandler(IntBoundedConstraint_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (IntBoundedConstraint == null) {
+        lbTextBox.Enabled = false;
+        lbTextBox.Text = "";
+        lbIncludedCheckBox.Enabled = false;
+        lbEnabledCheckBox.Checked = false;
+
+        ubTextBox.Enabled = false;
+        ubTextBox.Text = "";
+        ubIncludedCheckBox.Enabled = false;
+        ubEnabledCheckBox.Checked = false;
+      } else {
+        lbTextBox.Text = IntBoundedConstraint.LowerBound + "";
+        lbTextBox.Enabled = IntBoundedConstraint.LowerBoundEnabled;
+        lbIncludedCheckBox.Checked = IntBoundedConstraint.LowerBoundIncluded;
+        lbIncludedCheckBox.Enabled = true;
+        lbEnabledCheckBox.Checked = IntBoundedConstraint.LowerBoundEnabled;
+        lbEnabledCheckBox.Enabled = true;
+
+        ubTextBox.Text = IntBoundedConstraint.UpperBound + "";
+        ubTextBox.Enabled = IntBoundedConstraint.UpperBoundEnabled;
+        ubIncludedCheckBox.Checked = IntBoundedConstraint.UpperBoundIncluded;
+        ubIncludedCheckBox.Enabled = true;
+        ubEnabledCheckBox.Checked = IntBoundedConstraint.UpperBoundEnabled;
+        ubEnabledCheckBox.Enabled = true;
+      }
+    }
+
+    void IntBoundedConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void lbEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.LowerBoundEnabled = lbEnabledCheckBox.Checked;
+      lbTextBox.Enabled = lbEnabledCheckBox.Checked;
+      lbIncludedCheckBox.Enabled = lbEnabledCheckBox.Checked;
+    }
+
+    private void ubEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.UpperBoundEnabled = ubEnabledCheckBox.Checked;
+      ubTextBox.Enabled = ubEnabledCheckBox.Checked;
+      ubIncludedCheckBox.Enabled = ubEnabledCheckBox.Checked;
+    }
+
+    private void lbIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.LowerBoundIncluded = lbIncludedCheckBox.Checked;
+    }
+
+    private void ubIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.UpperBoundIncluded = ubIncludedCheckBox.Checked;
+    }
+
+    private void lbTextBox_Validating(object sender, CancelEventArgs e) {
+      int result;
+      if (!int.TryParse(lbTextBox.Text, out result)) {
+        e.Cancel = true;
+      }
+    }
+
+    private void lbTextBox_Validated(object sender, EventArgs e) {
+      IntBoundedConstraint.LowerBound = int.Parse(lbTextBox.Text);
+    }
+
+    private void ubTextBox_Validating(object sender, CancelEventArgs e) {
+      int result;
+      if (!int.TryParse(ubTextBox.Text, out result)) {
+        e.Cancel = true;
+      }
+    }
+
+    private void ubTextBox_Validated(object sender, EventArgs e) {
+      IntBoundedConstraint.UpperBound = int.Parse(ubTextBox.Text);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/IntBoundedConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/IsIntegerConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/IsIntegerConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/IsIntegerConstraint.cs	(revision 2)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class IsIntegerConstraint : ConstraintBase{
+    public override string Description {
+      get { return "Allows only integer values."; }
+    }
+
+    public override bool Check(IItem item) {
+      // ConstrainedIntData is always integer => just return true
+      if(item is ConstrainedIntData)
+        return true;
+
+      // if we have an item of ConstrainedDoubleData then we check if it is integer or not
+      if(item is ConstrainedDoubleData) {
+        ConstrainedDoubleData d = (ConstrainedDoubleData)item;
+        if(d.Data == Math.Truncate(d.Data)) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+
+      // assume that all other data types are never integer
+      return false;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraint.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class ItemTypeConstraint : ConstraintBase {
+    private Type type;
+    public Type Type {
+      get { return type; }
+      set {
+        type = value;
+        OnChanged();
+      }
+    }
+
+    public override string Description {
+      get {
+        return @"The ItemTypeConstraint limits the type of a given item.
+If the item is a ConstrainedItemList, any containing elements are limited to the type and not the ConstrainedItemList itself.";
+      }
+    }
+
+    public ItemTypeConstraint() {
+      type = typeof(ItemBase);
+    }
+
+    public ItemTypeConstraint(Type type) {
+      this.type = type;
+    }
+
+    public override bool Check(IItem data) {
+      ConstrainedItemList list = (data as ConstrainedItemList);
+      if (list != null) {
+        for (int i = 0; i < list.Count; i++)
+          if (!list[i].GetType().Equals(type)) return false;
+        return true;
+      }
+      return data.GetType().Equals(type);
+    }
+
+    public override IView CreateView() {
+      return new ItemTypeConstraintView(this);
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+    #region clone & persistence
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ItemTypeConstraint clone = new ItemTypeConstraint(type);
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute itemTypeAttribute = document.CreateAttribute("ItemType");
+      string typeString = Type.AssemblyQualifiedName;
+      string[] tokens = typeString.Split(new string[] { ", " }, StringSplitOptions.None);
+      typeString = tokens[0] + ", " + tokens[1];
+      itemTypeAttribute.Value = typeString;
+      node.Attributes.Append(itemTypeAttribute);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlAttribute itemTypeAttribute = node.Attributes["ItemType"];
+      type = Type.GetType(itemTypeAttribute.Value);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class ItemTypeConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.typeTextBox = new System.Windows.Forms.TextBox();
+      this.setButton = new System.Windows.Forms.Button();
+      this.typeLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // typeTextBox
+      // 
+      this.typeTextBox.Location = new System.Drawing.Point(45, 3);
+      this.typeTextBox.Name = "typeTextBox";
+      this.typeTextBox.Size = new System.Drawing.Size(189, 20);
+      this.typeTextBox.TabIndex = 0;
+      // 
+      // setButton
+      // 
+      this.setButton.Location = new System.Drawing.Point(240, 1);
+      this.setButton.Name = "setButton";
+      this.setButton.Size = new System.Drawing.Size(44, 23);
+      this.setButton.TabIndex = 1;
+      this.setButton.Text = "Set";
+      this.setButton.UseVisualStyleBackColor = true;
+      this.setButton.Click += new System.EventHandler(this.setButton_Click);
+      // 
+      // typeLabel
+      // 
+      this.typeLabel.AutoSize = true;
+      this.typeLabel.Location = new System.Drawing.Point(5, 6);
+      this.typeLabel.Name = "typeLabel";
+      this.typeLabel.Size = new System.Drawing.Size(34, 13);
+      this.typeLabel.TabIndex = 2;
+      this.typeLabel.Text = "Type:";
+      // 
+      // ItemTypeConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.typeLabel);
+      this.Controls.Add(this.setButton);
+      this.Controls.Add(this.typeTextBox);
+      this.Name = "ItemTypeConstraintView";
+      this.Size = new System.Drawing.Size(287, 26);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox typeTextBox;
+    private System.Windows.Forms.Button setButton;
+    private System.Windows.Forms.Label typeLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.cs	(revision 2)
@@ -0,0 +1,82 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class ItemTypeConstraintView : ViewBase {
+    private ItemTypeConstraint ItemTypeConstraint {
+      get { return (ItemTypeConstraint)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public ItemTypeConstraintView() {
+      InitializeComponent();
+      typeTextBox.Enabled = false;
+    }
+
+    public ItemTypeConstraintView(ItemTypeConstraint itemTypeConstraint)
+      : this() {
+      ItemTypeConstraint = itemTypeConstraint;
+    }
+
+    protected override void RemoveItemEvents() {
+      ItemTypeConstraint.Changed -= new EventHandler(ItemTypeConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ItemTypeConstraint.Changed += new EventHandler(ItemTypeConstraint_Changed);
+    }
+
+    void ItemTypeConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ItemTypeConstraint == null) {
+        setButton.Enabled = false;
+      } else {
+        typeTextBox.Text = ItemTypeConstraint.Type.ToString();
+        setButton.Enabled = true;
+      }
+    }
+
+    private void setButton_Click(object sender, EventArgs e) {
+      using (ChooseTypeDialog dialog = new ChooseTypeDialog()) {
+        dialog.Caption = "Set Item Type";
+        if (dialog.ShowDialog(this) == DialogResult.OK) {
+          ItemTypeConstraint.Type = dialog.Type;
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/ItemTypeConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/NotConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NotConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NotConstraint.cs	(revision 2)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class NotConstraint : ConstraintBase {
+    private ConstraintBase subConstraint;
+    public ConstraintBase SubConstraint {
+      get { return subConstraint; }
+      set {
+        subConstraint = value;
+        OnChanged();
+      }
+    }
+    public override string Description {
+      get {
+        return "Requires that a constraint must be false to be true";
+      }
+    }
+    public NotConstraint()
+      : base() {
+      subConstraint = new FalseConstraint();
+    }
+
+    public override bool Check(IItem data) {
+      return !subConstraint.Check(data);
+    }
+
+    public override IView CreateView() {
+      return new NotConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NotConstraint clone = new NotConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.SubConstraint = (ConstraintBase)SubConstraint.Clone();
+      return clone;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode sub = PersistenceManager.Persist("SubConstraint", SubConstraint, document, persistedObjects);
+      node.AppendChild(sub);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      subConstraint = (ConstraintBase)PersistenceManager.Restore(node.SelectSingleNode("SubConstraint"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/NotConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NotConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NotConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class NotConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.subConstraintViewBase = new HeuristicLab.Core.ViewBase();
+      this.subConstraintComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // subConstraintViewBase
+      // 
+      this.subConstraintViewBase.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.subConstraintViewBase.Caption = "View";
+      this.subConstraintViewBase.Location = new System.Drawing.Point(0, 30);
+      this.subConstraintViewBase.Name = "subConstraintViewBase";
+      this.subConstraintViewBase.Size = new System.Drawing.Size(260, 206);
+      this.subConstraintViewBase.TabIndex = 0;
+      // 
+      // subConstraintComboBox
+      // 
+      this.subConstraintComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.subConstraintComboBox.FormattingEnabled = true;
+      this.subConstraintComboBox.Location = new System.Drawing.Point(0, 3);
+      this.subConstraintComboBox.Name = "subConstraintComboBox";
+      this.subConstraintComboBox.Size = new System.Drawing.Size(260, 21);
+      this.subConstraintComboBox.TabIndex = 1;
+      this.subConstraintComboBox.SelectedIndexChanged += new System.EventHandler(this.subConstraintComboBox_SelectedIndexChanged);
+      // 
+      // NotConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.subConstraintComboBox);
+      this.Controls.Add(this.subConstraintViewBase);
+      this.Name = "NotConstraintView";
+      this.Size = new System.Drawing.Size(263, 239);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Core.ViewBase subConstraintViewBase;
+    private System.Windows.Forms.ComboBox subConstraintComboBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/NotConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NotConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NotConstraintView.cs	(revision 2)
@@ -0,0 +1,120 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class NotConstraintView : ViewBase {
+    private Type[] itemTypes;
+
+    public NotConstraint NotConstraint {
+      get { return (NotConstraint)Item; }
+      set {
+        base.Item = value;
+        UpdateSubConstraintComboBox();
+        Refresh();
+      }
+    }
+
+    public NotConstraintView() {
+      InitializeComponent();
+      DiscoveryService discoveryService = new DiscoveryService();
+      itemTypes = discoveryService.GetTypes(typeof(ConstraintBase));
+      for (int i = 0; i < itemTypes.Length; i++) {
+        subConstraintComboBox.Items.Add(itemTypes[i].Name);
+      }
+      subConstraintComboBox.SelectedIndex = 0;
+      subConstraintComboBox.Enabled = false;
+    }
+
+    public NotConstraintView(NotConstraint notConstraint)
+      : this() {
+      NotConstraint = notConstraint;
+      UpdateSubConstraintComboBox();
+      Refresh();
+    }
+
+    protected override void RemoveItemEvents() {
+      NotConstraint.Changed -= new EventHandler(NotConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      NotConstraint.Changed += new EventHandler(NotConstraint_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (NotConstraint == null) {
+        subConstraintComboBox.Enabled = false;
+        subConstraintViewBase.Enabled = false;
+      } else {
+        if (subConstraintViewBase != null && Controls.Contains(subConstraintViewBase)) {
+          Controls.Remove(subConstraintViewBase);
+          subConstraintViewBase.Dispose();
+        }
+        subConstraintViewBase = (ViewBase)NotConstraint.SubConstraint.CreateView();
+        if (subConstraintViewBase != null) {
+          subConstraintViewBase.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
+          subConstraintViewBase.Location = new Point(0, 30);
+          subConstraintViewBase.Name = "subConstraintViewBase";
+          subConstraintViewBase.Size = new Size(Width, Height - 30);
+          Controls.Add(subConstraintViewBase);
+        }
+        subConstraintComboBox.Enabled = true;
+        subConstraintViewBase.Enabled = true;
+      }
+    }
+
+    private void subConstraintComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (NotConstraint != null) {
+        try {
+          NotConstraint.SubConstraint = (ConstraintBase)Activator.CreateInstance(itemTypes[subConstraintComboBox.SelectedIndex]);
+        } catch (Exception) {
+          NotConstraint.SubConstraint = new FalseConstraint();
+        }
+      }
+    }
+
+    private void NotConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+      UpdateSubConstraintComboBox();
+    }
+
+
+    private void UpdateSubConstraintComboBox() {
+      subConstraintComboBox.SelectedIndexChanged -= new EventHandler(subConstraintComboBox_SelectedIndexChanged);
+      for (int i = 0 ; i < itemTypes.Length ; i++)
+        if (itemTypes[i].Name.Equals(NotConstraint.SubConstraint.GetType().Name))
+          subConstraintComboBox.SelectedIndex = i;
+      subConstraintComboBox.SelectedIndexChanged += new EventHandler(subConstraintComboBox_SelectedIndexChanged);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/NotConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NotConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NotConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraint.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Data;
+using System.Xml;
+
+namespace HeuristicLab.Constraints {
+  public class NumberOfSubOperatorsConstraint : ConstraintBase {
+    private IntData minOperators;
+    private IntData maxOperators;
+
+    public IntData MaxOperators {
+      get { return maxOperators; }
+    }
+
+    public IntData MinOperators {
+      get { return minOperators; }
+    }
+
+    public override string Description {
+      get { return "Number of sub-operators has to be between " + MinOperators.ToString() + " and " + MaxOperators.ToString() + "."; }
+    }
+
+    public NumberOfSubOperatorsConstraint()
+      : this(0,0) {
+    }
+
+    public NumberOfSubOperatorsConstraint(int min, int max) : base() {
+      minOperators = new IntData(min);
+      maxOperators = new IntData(max);
+    }
+
+    public override bool Check(IItem data) {
+      IOperator op = data as IOperator;
+      if (data == null) return false;
+
+      return (op.SubOperators.Count >= minOperators.Data && op.SubOperators.Count <= maxOperators.Data);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NumberOfSubOperatorsConstraint clone = new NumberOfSubOperatorsConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.maxOperators.Data = maxOperators.Data;
+      clone.minOperators.Data = minOperators.Data;
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new NumberOfSubOperatorsConstraintView(this);
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode minNode = PersistenceManager.Persist("min", minOperators, document, persistedObjects);
+      XmlNode maxNode = PersistenceManager.Persist("max", maxOperators, document, persistedObjects);
+      node.AppendChild(minNode);
+      node.AppendChild(maxNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      minOperators = (IntData)PersistenceManager.Restore(node.SelectSingleNode("min"), restoredObjects);
+      maxOperators = (IntData)PersistenceManager.Restore(node.SelectSingleNode("max"), restoredObjects);
+    }
+    #endregion persistence
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,111 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class NumberOfSubOperatorsConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.minDataView = new HeuristicLab.Data.IntDataView();
+      this.maxDataView = new HeuristicLab.Data.IntDataView();
+      this.minLabel = new System.Windows.Forms.Label();
+      this.maxLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // minDataView
+      // 
+      this.minDataView.Caption = "View";
+      this.minDataView.IntData = null;
+      this.minDataView.Location = new System.Drawing.Point(36, 3);
+      this.minDataView.Name = "minDataView";
+      this.minDataView.Size = new System.Drawing.Size(265, 26);
+      this.minDataView.TabIndex = 0;
+      // 
+      // maxDataView
+      // 
+      this.maxDataView.Caption = "View";
+      this.maxDataView.IntData = null;
+      this.maxDataView.Location = new System.Drawing.Point(36, 32);
+      this.maxDataView.Name = "maxDataView";
+      this.maxDataView.Size = new System.Drawing.Size(265, 26);
+      this.maxDataView.TabIndex = 1;
+      // 
+      // minLabel
+      // 
+      this.minLabel.AutoSize = true;
+      this.minLabel.Location = new System.Drawing.Point(3, 3);
+      this.minLabel.Name = "minLabel";
+      this.minLabel.Size = new System.Drawing.Size(27, 13);
+      this.minLabel.TabIndex = 2;
+      this.minLabel.Text = "Min:";
+      // 
+      // maxLabel
+      // 
+      this.maxLabel.AutoSize = true;
+      this.maxLabel.Location = new System.Drawing.Point(3, 32);
+      this.maxLabel.Name = "maxLabel";
+      this.maxLabel.Size = new System.Drawing.Size(30, 13);
+      this.maxLabel.TabIndex = 3;
+      this.maxLabel.Text = "Max:";
+      // 
+      // NumberOfSubOperatorsConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.maxLabel);
+      this.Controls.Add(this.minLabel);
+      this.Controls.Add(this.maxDataView);
+      this.Controls.Add(this.minDataView);
+      this.Name = "NumberOfSubOperatorsConstraintView";
+      this.Size = new System.Drawing.Size(306, 61);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.IntDataView minDataView;
+    private HeuristicLab.Data.IntDataView maxDataView;
+    private System.Windows.Forms.Label minLabel;
+    private System.Windows.Forms.Label maxLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public partial class NumberOfSubOperatorsConstraintView : ViewBase {
+    private NumberOfSubOperatorsConstraint constraint;
+
+    public NumberOfSubOperatorsConstraintView() {
+      InitializeComponent();
+    }
+
+    public NumberOfSubOperatorsConstraintView(NumberOfSubOperatorsConstraint constraint) {
+      InitializeComponent();
+      this.constraint = constraint;
+
+      minDataView.IntData = constraint.MinOperators;
+      maxDataView.IntData = constraint.MaxOperators;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/NumberOfSubOperatorsConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/OrConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/OrConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/OrConstraint.cs	(revision 2)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class OrConstraint : ConstraintBase, IViewable {
+    private ItemList clauses;
+    public ItemList Clauses {
+      get { return clauses; }
+      set {
+        clauses = value;
+        OnChanged();
+      }
+    }
+
+    public override string Description {
+      get {
+        return "To return true, at least one subconstraint has to be true";
+      }
+    }
+
+    public OrConstraint() {
+      clauses = new ItemList();
+      clauses.ItemType = typeof(IConstraint);
+    }
+
+    public override bool Check(IItem data) {
+      bool result = false;
+      for (int i = 0 ; i < clauses.Count ; i++) {
+        result = ((IConstraint)clauses[i]).Check(data);
+        if (result) return true;
+      }
+      return result;
+    }
+
+    public override IView CreateView() {
+      return new OrConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OrConstraint clone = new OrConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.Clauses = (ItemList)Auxiliary.Clone(Clauses, clonedObjects);
+      return clone;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode clausesNode = PersistenceManager.Persist("Clauses", Clauses, document, persistedObjects);
+      node.AppendChild(clausesNode);
+
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      clauses = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Clauses"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/OrConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/OrConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/OrConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,77 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class OrConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      if (OrConstraint != null) OrConstraint.Changed -= new System.EventHandler(OrConstraint_Changed);
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.clausesItemListView = new HeuristicLab.Data.ItemListView();
+      this.SuspendLayout();
+      // 
+      // clausesItemListView
+      // 
+      this.clausesItemListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.clausesItemListView.Caption = "View";
+      this.clausesItemListView.Location = new System.Drawing.Point(0, 0);
+      this.clausesItemListView.Name = "clausesItemListView";
+      this.clausesItemListView.Size = new System.Drawing.Size(475, 284);
+      this.clausesItemListView.TabIndex = 0;
+      // 
+      // OrConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.clausesItemListView);
+      this.Name = "OrConstraintView";
+      this.Size = new System.Drawing.Size(478, 292);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.ItemListView clausesItemListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/OrConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/OrConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/OrConstraintView.cs	(revision 2)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class OrConstraintView : ViewBase {
+    private OrConstraint OrConstraint {
+      get { return (OrConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    public OrConstraintView() {
+      InitializeComponent();
+    }
+    public OrConstraintView(OrConstraint orConstraint)
+      : this() {
+      OrConstraint = orConstraint;
+    }
+
+    protected override void RemoveItemEvents() {
+      OrConstraint.Changed -= new EventHandler(OrConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      OrConstraint.Changed += new EventHandler(OrConstraint_Changed);
+    }
+
+    protected override void UpdateControls() {
+      if (OrConstraint == null) {
+        clausesItemListView.Enabled = false;
+        clausesItemListView.ItemList = null;
+      } else {
+        clausesItemListView.ItemList = OrConstraint.Clauses;
+        clausesItemListView.Enabled = true;
+      }
+    }
+
+    private void OrConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/OrConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/OrConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/OrConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Constraints")]
+[assembly: AssemblyDescription("Classes of the HeuristicLab constraints framework")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("97a3c082-71d3-429a-8cb0-91d85949b240")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Constraints/SubOperatorsConstraintAnalyser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/SubOperatorsConstraintAnalyser.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/SubOperatorsConstraintAnalyser.cs	(revision 2)
@@ -0,0 +1,171 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Constraints;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class SubOperatorsConstraintAnalyser {
+    private ICollection<IOperator> allPossibleOperators;
+
+    public ICollection<IOperator> AllPossibleOperators {
+      get { return allPossibleOperators; }
+      set { allPossibleOperators = value; }
+    }
+
+    public IList<IOperator> GetAllowedOperators(IOperator op, int childIndex) {
+
+      AndConstraint andConstraint = new AndConstraint();
+      foreach(IConstraint constraint in op.Constraints) {
+        andConstraint.Clauses.Add(constraint);
+      }
+
+      GetAllowedOperatorsVisitor visitor = new GetAllowedOperatorsVisitor(allPossibleOperators, childIndex);
+      andConstraint.Accept(visitor);
+
+      return visitor.AllowedOperators;
+    }
+
+    #region static set management methods
+    // better to use HashSets from .NET 3.5
+    // however we would need to switch the whole Constraints project to .NET 3.5 for that
+    private static IList<IOperator> Intersect(ICollection<IOperator> a, ICollection<IOperator> b) {
+      if(a.Count > b.Count) {
+        return Intersect(b, a);
+      }
+
+      List<IOperator> intersection = new List<IOperator>(a.Count);
+
+      foreach(IOperator element in a) {
+        if(InSet(element, b)) {
+          intersection.Add(element);
+        }
+      }
+      return intersection;
+    }
+
+    private static IList<IOperator> Union(ICollection<IOperator> a, ICollection<IOperator> b) {
+      List<IOperator> union = new List<IOperator>(a);
+      foreach(IOperator candidateElement in b) {
+        if(!InSet(candidateElement, union)) {
+          union.Add(candidateElement);
+        }
+      }
+
+      return union;
+    }
+
+    private static IList<IOperator> Substract(ICollection<IOperator> minuend, ICollection<IOperator> subtrahend) {
+      List<IOperator> difference = new List<IOperator>();
+      foreach(IOperator element in minuend) {
+        if(!InSet(element, subtrahend)) {
+          difference.Add(element);
+        }
+      }
+
+      return difference;
+    }
+
+    private static bool InSet(IOperator op, ICollection<IOperator> set) {
+      foreach(IOperator element in set) {
+        if(((StringData)element.GetVariable("TypeId").Value).Data ==
+          ((StringData)op.GetVariable("TypeId").Value).Data) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+    #endregion
+
+    #region visitor
+    /// <summary>
+    /// The visitor builds a set of allowed operators based on a tree of constraints.
+    /// </summary>
+    private class GetAllowedOperatorsVisitor : ConstraintVisitorBase {
+      private IList<IOperator> allowedOperators;
+
+      public IList<IOperator> AllowedOperators {
+        get { return allowedOperators; }
+      }
+      private ICollection<IOperator> possibleOperators;
+      private int childIndex;
+
+      public GetAllowedOperatorsVisitor(ICollection<IOperator> possibleOperators, int childIndex) {
+        // default is that all possible operators are allowed
+        allowedOperators = new List<IOperator>(possibleOperators);
+        this.possibleOperators = possibleOperators;
+        this.childIndex = childIndex;
+      }
+
+      public override void Visit(AndConstraint constraint) {
+        base.Visit(constraint);
+
+        // keep only the intersection of all subconstraints
+        foreach(ConstraintBase clause in constraint.Clauses) {
+          GetAllowedOperatorsVisitor visitor = new GetAllowedOperatorsVisitor(possibleOperators, childIndex);
+          clause.Accept(visitor);
+          allowedOperators = Intersect(allowedOperators, visitor.allowedOperators);
+        }
+      }
+      
+      public override void Visit(OrConstraint constraint) {
+        base.Visit(constraint);
+
+        // allowed operators is the union of all allowed operators as defined by the subconstraints
+        allowedOperators.Clear();
+
+        foreach(ConstraintBase clause in constraint.Clauses) {
+          GetAllowedOperatorsVisitor visitor = new GetAllowedOperatorsVisitor(possibleOperators, childIndex);
+          clause.Accept(visitor);
+          allowedOperators = Union(allowedOperators, visitor.allowedOperators);
+        }
+      }
+
+      public override void Visit(NotConstraint constraint) {
+        base.Visit(constraint);
+        GetAllowedOperatorsVisitor visitor = new GetAllowedOperatorsVisitor(possibleOperators, childIndex);
+        constraint.SubConstraint.Accept(visitor);
+
+        allowedOperators = Substract(possibleOperators, visitor.allowedOperators);
+      }
+
+      public override void Visit(AllSubOperatorsTypeConstraint constraint) {
+        base.Visit(constraint);
+
+        allowedOperators = Intersect(possibleOperators, constraint.AllowedSubOperators);
+      }
+
+      public override void Visit(SubOperatorTypeConstraint constraint) {
+        if(childIndex != constraint.SubOperatorIndex.Data) {
+          allowedOperators = new List<IOperator>(possibleOperators);
+        } else {
+          allowedOperators = Intersect(possibleOperators, constraint.AllowedSubOperators);
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraint.cs	(revision 2)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System.Diagnostics;
+using System.Xml;
+
+namespace HeuristicLab.Constraints {
+  public class SubOperatorTypeConstraint : ConstraintBase {
+    private IntData subOperatorIndex;
+    public IntData SubOperatorIndex {
+      get { return subOperatorIndex; }
+    }
+
+    private List<IOperator> subOperators;
+    public IList<IOperator> AllowedSubOperators {
+      get {
+        return subOperators.AsReadOnly();
+      }
+    }
+
+    public override string Description {
+      get { return "The sub-operator at a specific index has to be an element of a pre-defined group."; }
+    }
+
+    public SubOperatorTypeConstraint()
+      : base() {
+      subOperatorIndex = new IntData(0);
+      subOperators = new List<IOperator>();
+    }
+
+    public void AddOperator(IOperator op) {
+      // check if already in the list of allowed functions
+      foreach(IOperator existingOp in subOperators) {
+        if (IsOperatorTypeEqual(existingOp, op)) {
+          return;
+        }
+      }
+
+      subOperators.Add(op);
+    }
+
+    public void RemoveOperator(IOperator op) {
+      IOperator matchingOperator = null;
+      foreach(IOperator existingOp in subOperators) {
+        if(IsOperatorTypeEqual(existingOp, op)) {
+          matchingOperator = existingOp;
+          break;
+        }
+      }
+
+      if (matchingOperator != null) {
+        subOperators.Remove(matchingOperator);
+      }
+    }
+
+    public override bool Check(IItem data) {
+      IOperator op = data as IOperator;
+      if (data == null) return false;
+
+      if(op.SubOperators.Count <= subOperatorIndex.Data) {
+        return false;
+      }
+      
+      return subOperators.Exists(delegate(IOperator curOp) { return IsOperatorTypeEqual(curOp, op.SubOperators[subOperatorIndex.Data]); });
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      SubOperatorTypeConstraint clone = new SubOperatorTypeConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.subOperatorIndex.Data = subOperatorIndex.Data;
+      foreach(IOperator op in subOperators) {
+        clone.AddOperator((IOperator)Auxiliary.Clone(op, clonedObjects));
+      }
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new SubOperatorsTypeConstraintView(this);
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode indexNode = PersistenceManager.Persist("SubOperatorIndex", subOperatorIndex, document, persistedObjects);
+      node.AppendChild(indexNode);
+      XmlNode listNode = document.CreateNode(XmlNodeType.Element, "AllowedSubOperators", document.NamespaceURI);
+      foreach(IOperator op in subOperators) {
+        XmlNode opNode = PersistenceManager.Persist(op, document, persistedObjects);
+        listNode.AppendChild(opNode);
+      }
+      node.AppendChild(listNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      subOperatorIndex = (IntData)PersistenceManager.Restore(node.SelectSingleNode("SubOperatorIndex"), restoredObjects);
+      subOperators = new List<IOperator>();
+      foreach(XmlNode childNode in node.SelectSingleNode("AllowedSubOperators").ChildNodes) {
+        subOperators.Add((IOperator)PersistenceManager.Restore(childNode, restoredObjects));
+      }
+    }
+    #endregion persistence
+
+
+    private bool IsOperatorTypeEqual(IOperator f, IOperator g) {
+      return ((StringData)f.GetVariable("TypeId").Value).Data == ((StringData)g.GetVariable("TypeId").Value).Data;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class SubOperatorsTypeConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.indexDataView = new HeuristicLab.Data.IntDataView();
+      this.indexLabel = new System.Windows.Forms.Label();
+      this.allSubOperatorsTypeConstraintView = new HeuristicLab.Constraints.AllSubOperatorsTypeConstraintView();
+      this.SuspendLayout();
+      // 
+      // indexDataView
+      // 
+      this.indexDataView.Caption = "View";
+      this.indexDataView.IntData = null;
+      this.indexDataView.Location = new System.Drawing.Point(109, 3);
+      this.indexDataView.Name = "indexDataView";
+      this.indexDataView.Size = new System.Drawing.Size(265, 26);
+      this.indexDataView.TabIndex = 1;
+      // 
+      // indexLabel
+      // 
+      this.indexLabel.AutoSize = true;
+      this.indexLabel.Location = new System.Drawing.Point(4, 4);
+      this.indexLabel.Name = "indexLabel";
+      this.indexLabel.Size = new System.Drawing.Size(99, 13);
+      this.indexLabel.TabIndex = 2;
+      this.indexLabel.Text = "Sub-operator index:";
+      // 
+      // allSubOperatorsTypeConstraintView
+      // 
+      this.allSubOperatorsTypeConstraintView.Caption = "View";
+      this.allSubOperatorsTypeConstraintView.Location = new System.Drawing.Point(0, 35);
+      this.allSubOperatorsTypeConstraintView.Name = "allSubOperatorsTypeConstraintView";
+      this.allSubOperatorsTypeConstraintView.Size = new System.Drawing.Size(492, 337);
+      this.allSubOperatorsTypeConstraintView.TabIndex = 3;
+      // 
+      // SubOperatorsTypeConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.allSubOperatorsTypeConstraintView);
+      this.Controls.Add(this.indexLabel);
+      this.Controls.Add(this.indexDataView);
+      this.Name = "SubOperatorsTypeConstraintView";
+      this.Size = new System.Drawing.Size(496, 377);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.IntDataView indexDataView;
+    private System.Windows.Forms.Label indexLabel;
+    private AllSubOperatorsTypeConstraintView allSubOperatorsTypeConstraintView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public partial class SubOperatorsTypeConstraintView : ViewBase {
+    private SubOperatorTypeConstraint constraint;
+
+    public SubOperatorsTypeConstraintView() {
+      InitializeComponent();
+    }
+
+    public SubOperatorsTypeConstraintView(SubOperatorTypeConstraint constraint) {
+      InitializeComponent();
+
+      this.constraint = constraint;
+      allSubOperatorsTypeConstraintView.Constraint = constraint;
+      indexDataView.IntData = constraint.SubOperatorIndex;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/SubOperatorsTypeConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/TrueConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/TrueConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/TrueConstraint.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public class TrueConstraint : ConstraintBase {
+    public override string Description {
+      get { return "This constraint is always true."; }
+    }
+
+    public override IView CreateView() {
+      return new TrueConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      TrueConstraint clone = new TrueConstraint();
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IConstraintVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+
+    public override bool Check(IItem data) {
+      return true;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class TrueConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.trueLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // trueLabel
+      // 
+      this.trueLabel.Anchor = System.Windows.Forms.AnchorStyles.Top;
+      this.trueLabel.AutoSize = true;
+      this.trueLabel.Location = new System.Drawing.Point(36, 0);
+      this.trueLabel.Name = "trueLabel";
+      this.trueLabel.Size = new System.Drawing.Size(29, 13);
+      this.trueLabel.TabIndex = 0;
+      this.trueLabel.Text = "True";
+      // 
+      // TrueConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.trueLabel);
+      this.Name = "TrueConstraintView";
+      this.Size = new System.Drawing.Size(100, 31);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label trueLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.cs	(revision 2)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Constraints {
+  public partial class TrueConstraintView : ViewBase {
+    public TrueConstraint TrueConstraint {
+      get { return (TrueConstraint)Item; }
+      set { base.Item = value; }
+    }
+    public TrueConstraintView() {
+      InitializeComponent();
+    }
+
+    public TrueConstraintView(TrueConstraint trueConstraint)
+      : this() {
+      TrueConstraint = trueConstraint;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/TrueConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraint.cs	(revision 2)
@@ -0,0 +1,127 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public class VariableComparisonConstraint : ConstraintBase {
+    private StringData leftVarName;
+    public StringData LeftVarName {
+      get { return leftVarName; }
+      set { leftVarName = value; }
+    }
+
+    private StringData rightVarName;
+    public StringData RightVarName {
+      get { return rightVarName; }
+      set { rightVarName = value; }
+    }
+
+    private IntData comparer;
+    public IntData Comparer {
+      get { return comparer; }
+      set { comparer = value; }
+    }
+
+    public override string Description {
+      get {
+        return @"Compares items in a ConstrainedItemList";
+      }
+    }
+
+    public VariableComparisonConstraint() {
+      leftVarName = new StringData();
+      rightVarName = new StringData();
+      comparer = new IntData(-1);
+    }
+
+    public override bool Check(IItem data) {
+      ConstrainedItemList list = (data as ConstrainedItemList);
+      if (list == null) throw new InvalidOperationException("ERROR in VariableComparisonConstraint: Can only be applied on ConstrainedItemLists");
+      IComparable left = null;
+      IItem right = null;
+      foreach (IItem item in list) {
+        Variable tmp = (item as Variable);
+        if (tmp != null && tmp.Name.Equals(leftVarName.Data)) {
+          left = (tmp.Value as IComparable);
+          if (left == null) throw new InvalidCastException("ERROR in VariableComparisonConstraint: Value of the variable on the left side needs to be of type IComparable");
+        } else if (tmp != null && tmp.Name.Equals(rightVarName.Data)) {
+          right = tmp;
+        }
+      }
+      if (left != null && right != null) {
+        switch (comparer.Data) {
+          case 0:
+            return left.CompareTo(right) < 0;
+          case 1:
+            return left.CompareTo(right) <= 0;
+          case 2:
+            return left.CompareTo(right) == 0;
+          case 3:
+            return left.CompareTo(right) >= 0;
+          case 4:
+            return left.CompareTo(right) > 0;
+          default:
+            throw new InvalidOperationException("ERROR in VariableComparisonConstraint: Comparer undefined");
+        }
+      }
+      return true;
+    }
+
+    public override IView CreateView() {
+      return new VariableComparisonConstraintView(this);
+    }
+
+    #region clone & persistence
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      VariableComparisonConstraint clone = new VariableComparisonConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.LeftVarName = (StringData)Auxiliary.Clone(LeftVarName, clonedObjects);
+      clone.RightVarName = (StringData)Auxiliary.Clone(RightVarName, clonedObjects);
+      clone.Comparer = (IntData)Auxiliary.Clone(Comparer, clonedObjects);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode leftNode = PersistenceManager.Persist("LeftVarName", LeftVarName, document, persistedObjects);
+      node.AppendChild(leftNode);
+      XmlNode rightNode = PersistenceManager.Persist("RightVarName", RightVarName, document, persistedObjects);
+      node.AppendChild(rightNode);
+      XmlNode comparerNode = PersistenceManager.Persist("Comparer", Comparer, document, persistedObjects);
+      node.AppendChild(comparerNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      leftVarName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("LeftVarName"), restoredObjects);
+      rightVarName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("RightVarName"), restoredObjects);
+      comparer = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Comparer"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.Designer.cs	(revision 2)
@@ -0,0 +1,196 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Constraints {
+  partial class VariableComparisonConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.label1 = new System.Windows.Forms.Label();
+      this.comparerGroupBox = new System.Windows.Forms.GroupBox();
+      this.greaterRadioButton = new System.Windows.Forms.RadioButton();
+      this.greaterOrEqualRadioButton = new System.Windows.Forms.RadioButton();
+      this.equalRadioButton = new System.Windows.Forms.RadioButton();
+      this.lessOrEqualRadioButton = new System.Windows.Forms.RadioButton();
+      this.lessRadioButton = new System.Windows.Forms.RadioButton();
+      this.label2 = new System.Windows.Forms.Label();
+      this.rightVarNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.leftVarNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.comparerGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 5);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(25, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Left";
+      // 
+      // comparerGroupBox
+      // 
+      this.comparerGroupBox.Controls.Add(this.greaterRadioButton);
+      this.comparerGroupBox.Controls.Add(this.greaterOrEqualRadioButton);
+      this.comparerGroupBox.Controls.Add(this.equalRadioButton);
+      this.comparerGroupBox.Controls.Add(this.lessOrEqualRadioButton);
+      this.comparerGroupBox.Controls.Add(this.lessRadioButton);
+      this.comparerGroupBox.Location = new System.Drawing.Point(3, 54);
+      this.comparerGroupBox.Name = "comparerGroupBox";
+      this.comparerGroupBox.Size = new System.Drawing.Size(141, 137);
+      this.comparerGroupBox.TabIndex = 1;
+      this.comparerGroupBox.TabStop = false;
+      this.comparerGroupBox.Text = "Comparer";
+      // 
+      // greaterRadioButton
+      // 
+      this.greaterRadioButton.AutoSize = true;
+      this.greaterRadioButton.Location = new System.Drawing.Point(9, 111);
+      this.greaterRadioButton.Name = "greaterRadioButton";
+      this.greaterRadioButton.Size = new System.Drawing.Size(31, 17);
+      this.greaterRadioButton.TabIndex = 4;
+      this.greaterRadioButton.Text = ">";
+      this.greaterRadioButton.UseVisualStyleBackColor = true;
+      this.greaterRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // greaterOrEqualRadioButton
+      // 
+      this.greaterOrEqualRadioButton.AutoSize = true;
+      this.greaterOrEqualRadioButton.Location = new System.Drawing.Point(9, 88);
+      this.greaterOrEqualRadioButton.Name = "greaterOrEqualRadioButton";
+      this.greaterOrEqualRadioButton.Size = new System.Drawing.Size(37, 17);
+      this.greaterOrEqualRadioButton.TabIndex = 3;
+      this.greaterOrEqualRadioButton.Text = ">=";
+      this.greaterOrEqualRadioButton.UseVisualStyleBackColor = true;
+      this.greaterOrEqualRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // equalRadioButton
+      // 
+      this.equalRadioButton.AutoSize = true;
+      this.equalRadioButton.Location = new System.Drawing.Point(9, 65);
+      this.equalRadioButton.Name = "equalRadioButton";
+      this.equalRadioButton.Size = new System.Drawing.Size(31, 17);
+      this.equalRadioButton.TabIndex = 2;
+      this.equalRadioButton.Text = "=";
+      this.equalRadioButton.UseVisualStyleBackColor = true;
+      this.equalRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // lessOrEqualRadioButton
+      // 
+      this.lessOrEqualRadioButton.AutoSize = true;
+      this.lessOrEqualRadioButton.Location = new System.Drawing.Point(9, 42);
+      this.lessOrEqualRadioButton.Name = "lessOrEqualRadioButton";
+      this.lessOrEqualRadioButton.Size = new System.Drawing.Size(37, 17);
+      this.lessOrEqualRadioButton.TabIndex = 1;
+      this.lessOrEqualRadioButton.Text = "<=";
+      this.lessOrEqualRadioButton.UseVisualStyleBackColor = true;
+      this.lessOrEqualRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // lessRadioButton
+      // 
+      this.lessRadioButton.AutoSize = true;
+      this.lessRadioButton.Location = new System.Drawing.Point(9, 19);
+      this.lessRadioButton.Name = "lessRadioButton";
+      this.lessRadioButton.Size = new System.Drawing.Size(31, 17);
+      this.lessRadioButton.TabIndex = 0;
+      this.lessRadioButton.Text = "<";
+      this.lessRadioButton.UseVisualStyleBackColor = true;
+      this.lessRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 31);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(32, 13);
+      this.label2.TabIndex = 4;
+      this.label2.Text = "Right";
+      // 
+      // rightVarNameStringDataView
+      // 
+      this.rightVarNameStringDataView.Caption = "View";
+      this.rightVarNameStringDataView.Location = new System.Drawing.Point(44, 28);
+      this.rightVarNameStringDataView.Name = "rightVarNameStringDataView";
+      this.rightVarNameStringDataView.Size = new System.Drawing.Size(100, 20);
+      this.rightVarNameStringDataView.StringData = null;
+      this.rightVarNameStringDataView.TabIndex = 5;
+      // 
+      // leftVarNameStringDataView
+      // 
+      this.leftVarNameStringDataView.Caption = "View";
+      this.leftVarNameStringDataView.Location = new System.Drawing.Point(44, 2);
+      this.leftVarNameStringDataView.Name = "leftVarNameStringDataView";
+      this.leftVarNameStringDataView.Size = new System.Drawing.Size(100, 20);
+      this.leftVarNameStringDataView.StringData = null;
+      this.leftVarNameStringDataView.TabIndex = 6;
+      // 
+      // VariableComparisonConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.leftVarNameStringDataView);
+      this.Controls.Add(this.rightVarNameStringDataView);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.comparerGroupBox);
+      this.Controls.Add(this.label1);
+      this.Name = "VariableComparisonConstraintView";
+      this.Size = new System.Drawing.Size(147, 193);
+      this.comparerGroupBox.ResumeLayout(false);
+      this.comparerGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.GroupBox comparerGroupBox;
+    private System.Windows.Forms.RadioButton greaterRadioButton;
+    private System.Windows.Forms.RadioButton greaterOrEqualRadioButton;
+    private System.Windows.Forms.RadioButton equalRadioButton;
+    private System.Windows.Forms.RadioButton lessOrEqualRadioButton;
+    private System.Windows.Forms.RadioButton lessRadioButton;
+    private System.Windows.Forms.Label label2;
+    private HeuristicLab.Data.StringDataView rightVarNameStringDataView;
+    private HeuristicLab.Data.StringDataView leftVarNameStringDataView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.cs	(revision 2)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  public partial class VariableComparisonConstraintView : ViewBase {
+    public VariableComparisonConstraint VariableComparisonConstraint {
+      get { return (VariableComparisonConstraint)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public VariableComparisonConstraintView() {
+      InitializeComponent();
+    }
+
+    public VariableComparisonConstraintView(VariableComparisonConstraint variableComparisonConstraint)
+      : this() {
+      VariableComparisonConstraint = variableComparisonConstraint;
+    }
+
+    protected override void RemoveItemEvents() {
+      VariableComparisonConstraint.Changed -= new EventHandler(VariableComparisonConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      VariableComparisonConstraint.Changed += new EventHandler(VariableComparisonConstraint_Changed);
+    }
+
+    void VariableComparisonConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (VariableComparisonConstraint == null) {
+        leftVarNameStringDataView.Enabled = false;
+        leftVarNameStringDataView.StringData = null;
+        rightVarNameStringDataView.Enabled = false;
+        rightVarNameStringDataView.StringData = null;
+        comparerGroupBox.Enabled = false;
+      } else {
+        leftVarNameStringDataView.StringData = VariableComparisonConstraint.LeftVarName;
+        leftVarNameStringDataView.Enabled = true;
+        rightVarNameStringDataView.StringData = VariableComparisonConstraint.RightVarName;
+        rightVarNameStringDataView.Enabled = true;
+        comparerGroupBox.Enabled = true;
+        switch (VariableComparisonConstraint.Comparer.Data) {
+          case 0:
+            lessRadioButton.Checked = true;
+            break;
+          case 1:
+            lessOrEqualRadioButton.Checked = true;
+            break;
+          case 2:
+            equalRadioButton.Checked = true;
+            break;
+          case 3:
+            greaterOrEqualRadioButton.Checked = true;
+            break;
+          case 4:
+            greaterRadioButton.Checked = true;
+            break;
+        }
+      }
+    }
+
+    private void anyRadioButton_CheckedChanged(object sender, EventArgs e) {
+      if (VariableComparisonConstraint != null) {
+        if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("lessOrEqual")) {
+          VariableComparisonConstraint.Comparer.Data = 1;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("less")) {
+          VariableComparisonConstraint.Comparer.Data = 0;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("greaterOrEqual")) {
+          VariableComparisonConstraint.Comparer.Data = 3;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("greater")) {
+          VariableComparisonConstraint.Comparer.Data = 4;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("equal")) {
+          VariableComparisonConstraint.Comparer.Data = 2;
+        } else {
+          Auxiliary.ShowErrorMessageBox("Unknown radio button selected");
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Constraints/VariableComparisonConstraintView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/AtomicOperation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/AtomicOperation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/AtomicOperation.cs	(revision 2)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class AtomicOperation : ItemBase, IOperation {
+    private IOperator myOperator;
+    public IOperator Operator {
+      get { return myOperator; }
+    }
+    private IScope myScope;
+    public IScope Scope {
+      get { return myScope; }
+    }
+
+    public AtomicOperation() { }
+    public AtomicOperation(IOperator op, IScope scope) {
+      myOperator = op;
+      myScope = scope;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      AtomicOperation clone = new AtomicOperation();
+      clonedObjects.Add(Guid, clone);
+      clone.myOperator = (IOperator)Auxiliary.Clone(Operator, clonedObjects);
+      clone.myScope = (IScope)Auxiliary.Clone(Scope, clonedObjects);
+      return clone;
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Operator", Operator, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Scope", Scope, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myOperator = (IOperator)PersistenceManager.Restore(node.SelectSingleNode("Operator"), restoredObjects);
+      myScope = (IScope)PersistenceManager.Restore(node.SelectSingleNode("Scope"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Auxiliary.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Auxiliary.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Auxiliary.cs	(revision 2)
@@ -0,0 +1,90 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public static class Auxiliary {
+    #region Cloning
+    public static object Clone(IStorable obj, IDictionary<Guid, object> clonedObjects) {
+      object clone;
+      if (clonedObjects.TryGetValue(obj.Guid, out clone))
+        return clone;
+      else
+        return obj.Clone(clonedObjects);
+    }
+    #endregion
+
+    #region Error Messages
+    public static void ShowErrorMessageBox(string message) {
+      MessageBox.Show(message,
+                      "Error",
+                      MessageBoxButtons.OK,
+                      MessageBoxIcon.Error);
+    }
+    public static void ShowErrorMessageBox(Exception ex) {
+      MessageBox.Show(BuildErrorMessage(ex),
+                      "Error - " + ex.GetType().Name,
+                      MessageBoxButtons.OK,
+                      MessageBoxIcon.Error);
+    }
+    private static string BuildErrorMessage(Exception ex) {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("Sorry, but something went wrong!\n\n" + ex.Message + "\n\n" + ex.StackTrace);
+
+      while (ex.InnerException != null) {
+        ex = ex.InnerException;
+        sb.Append("\n\n-----\n\n" + ex.Message + "\n\n" + ex.StackTrace);
+      }
+      return sb.ToString();
+    }
+    #endregion
+
+    #region Constraint Violation Messages
+    public static void ShowConstraintViolationMessageBox(ICollection<IConstraint> violatedConstraints) {
+      string message = BuildConstraintViolationMessage(violatedConstraints);
+      MessageBox.Show("The following constraints are violated. The operation could not be completed.\n\n" + message,
+                      "Constraint Violation",
+                      MessageBoxButtons.OK,
+                      MessageBoxIcon.Warning);
+    }
+    public static DialogResult ShowIgnoreConstraintViolationMessageBox(ICollection<IConstraint> violatedConstraints) {
+      string message = BuildConstraintViolationMessage(violatedConstraints);
+      return MessageBox.Show("The following constraints are violated. Do you want to complete the operation anyhow?\n\n" + message,
+                             "Constraint Violation",
+                             MessageBoxButtons.YesNo,
+                             MessageBoxIcon.Question);
+    }
+    private static string BuildConstraintViolationMessage(ICollection<IConstraint> violatedConstraints) {
+      StringBuilder sb = new StringBuilder();
+      foreach (IConstraint constraint in violatedConstraints) {
+        sb.AppendLine(constraint.GetType().Name);
+        sb.AppendLine(constraint.Description);
+        sb.AppendLine();
+      }
+      return sb.ToString();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseItemDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseItemDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseItemDialog.Designer.cs	(revision 2)
@@ -0,0 +1,131 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class ChooseItemDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.typesGroupBox = new System.Windows.Forms.GroupBox();
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.typesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.okButton.Location = new System.Drawing.Point(305, 368);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(386, 368);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // typesGroupBox
+      // 
+      this.typesGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.typesGroupBox.Controls.Add(this.treeView);
+      this.typesGroupBox.Location = new System.Drawing.Point(12, 12);
+      this.typesGroupBox.Name = "typesGroupBox";
+      this.typesGroupBox.Size = new System.Drawing.Size(449, 350);
+      this.typesGroupBox.TabIndex = 0;
+      this.typesGroupBox.TabStop = false;
+      this.typesGroupBox.Text = "&Available Item Types";
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.HideSelection = false;
+      this.treeView.Location = new System.Drawing.Point(3, 16);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(443, 331);
+      this.treeView.TabIndex = 0;
+      this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // ChooseItemDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(473, 403);
+      this.Controls.Add(this.typesGroupBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChooseItemDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Choose Item";
+      this.Load += new System.EventHandler(this.ChooseItemDialog_Load);
+      this.typesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.GroupBox typesGroupBox;
+    private System.Windows.Forms.TreeView treeView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseItemDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseItemDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseItemDialog.cs	(revision 2)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public partial class ChooseItemDialog : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    public string Caption {
+      get { return Text; }
+      set { Text = value; }
+    }
+
+    private IItem myItem;
+    public IItem Item {
+      get { return myItem; }
+    }
+
+    public ChooseItemDialog()
+      : this(typeof(IItem)) {
+    }
+
+    public ChooseItemDialog(Type itemType) {
+      InitializeComponent();
+
+      treeView.TreeViewNodeSorter = new TreeNodeSorter();
+
+      if (itemType == null) {
+        itemType = typeof(IItem);
+      }
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      foreach (PluginInfo plugin in discoveryService.Plugins) {
+        TreeNode pluginNode = new TreeNode(plugin.Name);
+        pluginNode.Tag = null;
+
+        Type[] types = discoveryService.GetTypes(itemType, plugin);
+        foreach (Type type in types) {
+          if (!type.IsAbstract) {
+            TreeNode itemNode = new TreeNode();
+            itemNode.Text = type.Name;
+            itemNode.Tag = type;
+            pluginNode.Nodes.Add(itemNode);
+          }
+        }
+        if (pluginNode.Nodes.Count > 0) {
+          treeView.Nodes.Add(pluginNode);
+        }
+      }
+      if (treeView.Nodes.Count == 0) {
+        treeView.Enabled = false;
+        treeView.Nodes.Add(new TreeNode("No item types available"));
+      }
+      okButton.Enabled = false;
+
+      if (treeView.Nodes.Count == 1) {
+        TreeNodeCollection items = treeView.Nodes[0].Nodes;
+        treeView.Nodes.Clear();
+        foreach (TreeNode i in items) {
+          treeView.Nodes.Add(i);
+        }
+      }
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      Type type = (Type)treeView.SelectedNode.Tag;
+
+      myItem = (IItem)Activator.CreateInstance(type);
+      this.DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      // plugin groups have a null-tag
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null)) {
+        Type type = (Type)treeView.SelectedNode.Tag;
+        myItem = (IItem)Activator.CreateInstance(type);
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null))
+        okButton.Enabled = true;
+    }
+
+    private void ChooseItemDialog_Load(object sender, EventArgs e) {
+      myItem = null;
+      if (treeView.Nodes.Count == 1) {
+        Type type = (Type)treeView.Nodes[0].Tag;
+        myItem = (IItem)Activator.CreateInstance(type);
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseItemDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseItemDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseItemDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.Designer.cs	(revision 2)
@@ -0,0 +1,342 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class ChooseOperatorDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.builtinOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.builtinOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.builtinOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorLibrariesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorLibraryTextBox = new System.Windows.Forms.TextBox();
+      this.operatorLibraryLabel = new System.Windows.Forms.Label();
+      this.operatorLibraryOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorLibraryOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.operatorLibraryOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.loadButton = new System.Windows.Forms.Button();
+      this.builtinTabPage = new System.Windows.Forms.TabPage();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.builtinOperatorsGroupBox.SuspendLayout();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.operatorLibrariesTabPage.SuspendLayout();
+      this.operatorLibraryOperatorsGroupBox.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.builtinTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Enabled = false;
+      this.okButton.Location = new System.Drawing.Point(305, 368);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(386, 368);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // builtinOperatorsGroupBox
+      // 
+      this.builtinOperatorsGroupBox.Controls.Add(this.splitContainer2);
+      this.builtinOperatorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.builtinOperatorsGroupBox.Name = "builtinOperatorsGroupBox";
+      this.builtinOperatorsGroupBox.Size = new System.Drawing.Size(435, 318);
+      this.builtinOperatorsGroupBox.TabIndex = 0;
+      this.builtinOperatorsGroupBox.TabStop = false;
+      this.builtinOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.builtinOperatorsTreeView);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.builtinOperatorsDescriptionTextBox);
+      this.splitContainer2.Size = new System.Drawing.Size(429, 299);
+      this.splitContainer2.SplitterDistance = 220;
+      this.splitContainer2.TabIndex = 2;
+      // 
+      // builtinOperatorsTreeView
+      // 
+      this.builtinOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsTreeView.HideSelection = false;
+      this.builtinOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsTreeView.Name = "builtinOperatorsTreeView";
+      this.builtinOperatorsTreeView.Size = new System.Drawing.Size(429, 220);
+      this.builtinOperatorsTreeView.TabIndex = 0;
+      this.builtinOperatorsTreeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.builtinOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.builtinOperatorsTreeView_AfterSelect);
+      // 
+      // builtinOperatorsDescriptionTextBox
+      // 
+      this.builtinOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.builtinOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsDescriptionTextBox.Multiline = true;
+      this.builtinOperatorsDescriptionTextBox.Name = "builtinOperatorsDescriptionTextBox";
+      this.builtinOperatorsDescriptionTextBox.ReadOnly = true;
+      this.builtinOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.builtinOperatorsDescriptionTextBox.Size = new System.Drawing.Size(429, 75);
+      this.builtinOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.operatorLibrariesTabPage);
+      this.tabControl.Controls.Add(this.builtinTabPage);
+      this.tabControl.Location = new System.Drawing.Point(12, 12);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(449, 350);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorLibrariesTabPage
+      // 
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryTextBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryLabel);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryOperatorsGroupBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.loadButton);
+      this.operatorLibrariesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorLibrariesTabPage.Name = "operatorLibrariesTabPage";
+      this.operatorLibrariesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorLibrariesTabPage.Size = new System.Drawing.Size(441, 324);
+      this.operatorLibrariesTabPage.TabIndex = 0;
+      this.operatorLibrariesTabPage.Text = "Operator Libraries";
+      this.operatorLibrariesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorLibraryTextBox
+      // 
+      this.operatorLibraryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryTextBox.Location = new System.Drawing.Point(97, 8);
+      this.operatorLibraryTextBox.Name = "operatorLibraryTextBox";
+      this.operatorLibraryTextBox.ReadOnly = true;
+      this.operatorLibraryTextBox.Size = new System.Drawing.Size(257, 20);
+      this.operatorLibraryTextBox.TabIndex = 2;
+      // 
+      // operatorLibraryLabel
+      // 
+      this.operatorLibraryLabel.AutoSize = true;
+      this.operatorLibraryLabel.Location = new System.Drawing.Point(6, 11);
+      this.operatorLibraryLabel.Name = "operatorLibraryLabel";
+      this.operatorLibraryLabel.Size = new System.Drawing.Size(85, 13);
+      this.operatorLibraryLabel.TabIndex = 1;
+      this.operatorLibraryLabel.Text = "&Operator Library:";
+      // 
+      // operatorLibraryOperatorsGroupBox
+      // 
+      this.operatorLibraryOperatorsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryOperatorsGroupBox.Controls.Add(this.splitContainer1);
+      this.operatorLibraryOperatorsGroupBox.Enabled = false;
+      this.operatorLibraryOperatorsGroupBox.Location = new System.Drawing.Point(6, 35);
+      this.operatorLibraryOperatorsGroupBox.Name = "operatorLibraryOperatorsGroupBox";
+      this.operatorLibraryOperatorsGroupBox.Size = new System.Drawing.Size(429, 283);
+      this.operatorLibraryOperatorsGroupBox.TabIndex = 3;
+      this.operatorLibraryOperatorsGroupBox.TabStop = false;
+      this.operatorLibraryOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorLibraryOperatorsTreeView);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.operatorLibraryOperatorsDescriptionTextBox);
+      this.splitContainer1.Size = new System.Drawing.Size(423, 264);
+      this.splitContainer1.SplitterDistance = 187;
+      this.splitContainer1.TabIndex = 1;
+      // 
+      // operatorLibraryOperatorsTreeView
+      // 
+      this.operatorLibraryOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsTreeView.HideSelection = false;
+      this.operatorLibraryOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsTreeView.Name = "operatorLibraryOperatorsTreeView";
+      this.operatorLibraryOperatorsTreeView.ShowNodeToolTips = true;
+      this.operatorLibraryOperatorsTreeView.Size = new System.Drawing.Size(423, 187);
+      this.operatorLibraryOperatorsTreeView.TabIndex = 0;
+      this.operatorLibraryOperatorsTreeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.operatorLibraryOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.operatorsTreeView_AfterSelect);
+      // 
+      // operatorLibraryOperatorsDescriptionTextBox
+      // 
+      this.operatorLibraryOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.operatorLibraryOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsDescriptionTextBox.Multiline = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.Name = "operatorLibraryOperatorsDescriptionTextBox";
+      this.operatorLibraryOperatorsDescriptionTextBox.ReadOnly = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.operatorLibraryOperatorsDescriptionTextBox.Size = new System.Drawing.Size(423, 73);
+      this.operatorLibraryOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // loadButton
+      // 
+      this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.loadButton.Location = new System.Drawing.Point(360, 6);
+      this.loadButton.Name = "loadButton";
+      this.loadButton.Size = new System.Drawing.Size(75, 23);
+      this.loadButton.TabIndex = 0;
+      this.loadButton.Text = "&Load...";
+      this.loadButton.UseVisualStyleBackColor = true;
+      this.loadButton.Click += new System.EventHandler(this.loadButton_Click);
+      // 
+      // builtinTabPage
+      // 
+      this.builtinTabPage.Controls.Add(this.builtinOperatorsGroupBox);
+      this.builtinTabPage.Location = new System.Drawing.Point(4, 22);
+      this.builtinTabPage.Name = "builtinTabPage";
+      this.builtinTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.builtinTabPage.Size = new System.Drawing.Size(441, 324);
+      this.builtinTabPage.TabIndex = 1;
+      this.builtinTabPage.Text = "Built-In";
+      this.builtinTabPage.UseVisualStyleBackColor = true;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "library";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Open file ...";
+      // 
+      // ChooseOperatorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(473, 403);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChooseOperatorDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Choose Operator";
+      this.Shown += new System.EventHandler(this.ChooseOperatorDialog_Shown);
+      this.builtinOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      this.splitContainer2.Panel2.PerformLayout();
+      this.splitContainer2.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.operatorLibrariesTabPage.ResumeLayout(false);
+      this.operatorLibrariesTabPage.PerformLayout();
+      this.operatorLibraryOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.Panel2.PerformLayout();
+      this.splitContainer1.ResumeLayout(false);
+      this.builtinTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.GroupBox builtinOperatorsGroupBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorLibrariesTabPage;
+    private System.Windows.Forms.TabPage builtinTabPage;
+    private System.Windows.Forms.TextBox operatorLibraryTextBox;
+    private System.Windows.Forms.Label operatorLibraryLabel;
+    private System.Windows.Forms.GroupBox operatorLibraryOperatorsGroupBox;
+    private System.Windows.Forms.TreeView operatorLibraryOperatorsTreeView;
+    private System.Windows.Forms.Button loadButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.TreeView builtinOperatorsTreeView;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private System.Windows.Forms.TextBox builtinOperatorsDescriptionTextBox;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.TextBox operatorLibraryOperatorsDescriptionTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.cs	(revision 2)
@@ -0,0 +1,176 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public partial class ChooseOperatorDialog : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    private IOperatorLibrary operatorLibrary;
+
+    private IOperator myOperator;
+    public IOperator Operator {
+      get { return myOperator; }
+    }
+
+    public ChooseOperatorDialog() {
+      InitializeComponent();
+      operatorLibrary = null;
+      myOperator = null;
+      TreeNodeSorter nodeSorter = new TreeNodeSorter();
+      operatorLibraryOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+      builtinOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      PluginInfo[] plugins = discoveryService.Plugins;
+      foreach(PluginInfo plugin in plugins) {
+        TreeNode pluginItem = new TreeNode();
+        pluginItem.Text = plugin.Name;
+        pluginItem.Tag = plugin;
+
+        Type[] operators = discoveryService.GetTypes(typeof(IOperator), plugin);
+        foreach(Type type in operators) {
+          if(!type.IsAbstract) {
+            TreeNode operatorItem = new TreeNode();
+            operatorItem.Text = type.Name;
+            operatorItem.Tag = type;
+            pluginItem.Nodes.Add(operatorItem);
+          }
+        }
+        // add plugin node only if it contains operators
+        if(pluginItem.Nodes.Count > 0) {
+          builtinOperatorsTreeView.Nodes.Add(pluginItem);
+        }
+      }
+      if (builtinOperatorsTreeView.Nodes.Count == 0) {
+        builtinOperatorsTreeView.Enabled = false;
+        builtinOperatorsTreeView.Nodes.Add("No operators available");
+      }
+      builtinOperatorsTreeView.Sort();
+    }
+
+    private void UpdateOperatorsTreeView() {
+      operatorLibraryOperatorsTreeView.Nodes.Clear();
+      operatorLibraryOperatorsTreeView.Nodes.Add(CreateTreeNode(operatorLibrary.Group));
+      operatorLibraryOperatorsTreeView.Sort();
+    }
+
+    private TreeNode CreateTreeNode(IOperatorGroup group) {
+      TreeNode node = new TreeNode();
+      node.Text = group.Name;
+      node.ForeColor = Color.LightGray;
+      node.Tag = group;
+
+      foreach (IOperator op in group.Operators)
+        node.Nodes.Add(CreateTreeNode(op));
+      foreach (IOperatorGroup subGroup in group.SubGroups)
+        node.Nodes.Add(CreateTreeNode(subGroup));
+      return node;
+    }
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.ToolTipText = op.GetType().Name;
+      node.Tag = op;
+      return node;
+    }
+
+    #region Form Events
+    private void ChooseOperatorDialog_Shown(object sender, EventArgs e) {
+      operatorLibraryOperatorsTreeView.SelectedNode = null;
+      operatorLibraryOperatorsDescriptionTextBox.Text = "";
+      myOperator = null;
+      builtinOperatorsTreeView.SelectedNode = null;
+      builtinOperatorsDescriptionTextBox.Text = "";
+      okButton.Enabled = false;
+    }
+    #endregion
+
+    #region Selection Events
+    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      myOperator = null;
+      operatorLibraryOperatorsDescriptionTextBox.Text = "";
+      if ((operatorLibraryOperatorsTreeView.SelectedNode != null) && (operatorLibraryOperatorsTreeView.SelectedNode.Tag is IOperator)) {
+        myOperator = (IOperator)operatorLibraryOperatorsTreeView.SelectedNode.Tag;
+        myOperator = (IOperator)myOperator.Clone();
+        operatorLibraryOperatorsDescriptionTextBox.Text = myOperator.Description;
+        okButton.Enabled = true;
+      }
+    }
+    private void builtinOperatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      myOperator = null;
+      builtinOperatorsDescriptionTextBox.Text = "";
+      if ((builtinOperatorsTreeView.SelectedNode != null) && (builtinOperatorsTreeView.SelectedNode.Tag is Type)) {
+        okButton.Enabled = true;
+        myOperator = (IOperator)Activator.CreateInstance((Type)builtinOperatorsTreeView.SelectedNode.Tag);
+        builtinOperatorsDescriptionTextBox.Text = myOperator.Description;
+      }
+    }
+    #endregion
+
+    #region Click Events
+    private void loadButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        operatorLibrary = (IOperatorLibrary)PersistenceManager.Load(openFileDialog.FileName);
+        operatorLibraryTextBox.Text = openFileDialog.FileName;
+        toolTip.SetToolTip(operatorLibraryTextBox, openFileDialog.FileName);
+        operatorLibraryOperatorsGroupBox.Enabled = true;
+        UpdateOperatorsTreeView();
+      }
+    }
+    private void okButton_Click(object sender, EventArgs e) {
+      if (Operator != null) {
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      if (Operator != null) {
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseOperatorDialog.resx	(revision 2)
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>141, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.Designer.cs	(revision 2)
@@ -0,0 +1,131 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class ChooseTypeDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.typesGroupBox = new System.Windows.Forms.GroupBox();
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.typesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.okButton.Location = new System.Drawing.Point(305, 368);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(386, 368);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // typesGroupBox
+      // 
+      this.typesGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.typesGroupBox.Controls.Add(this.treeView);
+      this.typesGroupBox.Location = new System.Drawing.Point(12, 12);
+      this.typesGroupBox.Name = "typesGroupBox";
+      this.typesGroupBox.Size = new System.Drawing.Size(449, 350);
+      this.typesGroupBox.TabIndex = 0;
+      this.typesGroupBox.TabStop = false;
+      this.typesGroupBox.Text = "&Available Types";
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.HideSelection = false;
+      this.treeView.Location = new System.Drawing.Point(3, 16);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(443, 331);
+      this.treeView.TabIndex = 0;
+      this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // ChooseTypeDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(473, 403);
+      this.Controls.Add(this.typesGroupBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChooseTypeDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Choose Type";
+      this.Load += new System.EventHandler(this.ChooseTypeDialog_Load);
+      this.typesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.GroupBox typesGroupBox;
+    private System.Windows.Forms.TreeView treeView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.cs	(revision 2)
@@ -0,0 +1,132 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public partial class ChooseTypeDialog : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    public string Caption {
+      get { return Text; }
+      set { Text = value; }
+    }
+
+    private Type myType;
+    public Type Type {
+      get { return myType; }
+    }
+
+    public ChooseTypeDialog()
+      : this(typeof(IItem)) {
+    }
+
+    public ChooseTypeDialog(Type baseType) {
+      InitializeComponent();
+
+      treeView.TreeViewNodeSorter = new TreeNodeSorter();
+
+      if (baseType == null) {
+        baseType = typeof(IItem);
+      }
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      foreach (PluginInfo plugin in discoveryService.Plugins) {
+        TreeNode pluginNode = new TreeNode(plugin.Name);
+        pluginNode.Tag = null;
+
+        Type[] types = discoveryService.GetTypes(baseType, plugin);
+        foreach (Type type in types) {
+          TreeNode itemNode = new TreeNode();
+          itemNode.Text = type.Name;
+          itemNode.Tag = type;
+          pluginNode.Nodes.Add(itemNode);
+        }
+        if (pluginNode.Nodes.Count > 0) {
+          treeView.Nodes.Add(pluginNode);
+        }
+      }
+      if (treeView.Nodes.Count == 0) {
+        treeView.Enabled = false;
+        treeView.Nodes.Add(new TreeNode("No item types available"));
+      }
+      okButton.Enabled = false;
+
+      if (treeView.Nodes.Count == 1) {
+        TreeNodeCollection items = treeView.Nodes[0].Nodes;
+        treeView.Nodes.Clear();
+        foreach (TreeNode i in items) {
+          treeView.Nodes.Add(i);
+        }
+      }
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      myType = (Type)treeView.SelectedNode.Tag;
+      this.DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      // plugin groups have a null-tag
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null)) {
+        myType = (Type)treeView.SelectedNode.Tag;
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null))
+        okButton.Enabled = true;
+    }
+
+    private void ChooseTypeDialog_Load(object sender, EventArgs e) {
+      myType = null;
+      if (treeView.Nodes.Count == 1) {
+        myType = (Type)treeView.Nodes[0].Tag;
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ChooseTypeDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/CompositeOperation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/CompositeOperation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/CompositeOperation.cs	(revision 2)
@@ -0,0 +1,84 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class CompositeOperation : ItemBase, IOperation {
+    private bool myExecuteInParallel;
+    public bool ExecuteInParallel {
+      get { return myExecuteInParallel; }
+      set { myExecuteInParallel = value; }
+    }
+    private List<IOperation> myOperations;
+    public IList<IOperation> Operations {
+      get { return myOperations.AsReadOnly(); }
+    }
+
+    public CompositeOperation() {
+      myOperations = new List<IOperation>();
+      myExecuteInParallel = false;
+    }
+
+    public void AddOperation(IOperation operation) {
+      myOperations.Add(operation);
+    }
+    public void RemoveOperation(IOperation operation) {
+      myOperations.Remove(operation);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      CompositeOperation clone = new CompositeOperation();
+      clonedObjects.Add(Guid, clone);
+      clone.myExecuteInParallel = ExecuteInParallel;
+      for (int i = 0; i < Operations.Count; i++)
+        clone.AddOperation((IOperation)Auxiliary.Clone(Operations[i], clonedObjects));
+      return clone;
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute parallelAttribute = document.CreateAttribute("ExecuteInParallel");
+      parallelAttribute.Value = ExecuteInParallel.ToString();
+      node.Attributes.Append(parallelAttribute);
+
+      XmlNode operationsNode = document.CreateNode(XmlNodeType.Element, "Operations", null);
+      for (int i = 0; i < Operations.Count; i++)
+        operationsNode.AppendChild(PersistenceManager.Persist(Operations[i], document, persistedObjects));
+      node.AppendChild(operationsNode);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      myExecuteInParallel = bool.Parse(node.Attributes["ExecuteInParallel"].Value);
+
+      XmlNode operationsNode = node.SelectSingleNode("Operations");
+      for (int i = 0; i < operationsNode.ChildNodes.Count; i++)
+        AddOperation((IOperation)PersistenceManager.Restore(operationsNode.ChildNodes[i], restoredObjects));
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ConstrainedItemBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ConstrainedItemBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ConstrainedItemBase.cs	(revision 2)
@@ -0,0 +1,110 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public abstract class ConstrainedItemBase : ItemBase, IConstrainedItem {
+    private List<IConstraint> myConstraints;
+    public virtual ICollection<IConstraint> Constraints {
+      get { return myConstraints.AsReadOnly(); }
+    }
+
+    protected ConstrainedItemBase() {
+      myConstraints = new List<IConstraint>();
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedItemBase clone = (ConstrainedItemBase)base.Clone(clonedObjects);
+      clone.myConstraints.Clear();
+      foreach (IConstraint constraint in Constraints)
+        clone.AddConstraint((IConstraint)Auxiliary.Clone(constraint, clonedObjects));
+      return clone;
+    }
+
+    public virtual void AddConstraint(IConstraint constraint) {
+      myConstraints.Add(constraint);
+      OnConstraintAdded(constraint);
+    }
+    public virtual void RemoveConstraint(IConstraint constraint) {
+      if (myConstraints.Remove(constraint))
+        OnConstraintRemoved(constraint);
+    }
+
+    public bool IsValid() {
+      bool result = true;
+      foreach (IConstraint constraint in Constraints)
+        result = result && constraint.Check(this);
+      return result;
+    }
+    public bool IsValid(out ICollection<IConstraint> violatedConstraints) {
+      bool result = true;
+      violatedConstraints = new List<IConstraint>();
+      foreach (IConstraint constraint in Constraints) {
+        if (!constraint.Check(this)) {
+          result = false;
+          violatedConstraints.Add(constraint);
+        }
+      }
+      return result;
+    }
+
+    public override IView CreateView() {
+      return new ConstrainedItemBaseView(this);
+    }
+
+    public event EventHandler<ConstraintEventArgs> ConstraintAdded;
+    protected virtual void OnConstraintAdded(IConstraint constraint) {
+      if (ConstraintAdded != null)
+        ConstraintAdded(this, new ConstraintEventArgs(constraint));
+    }
+    public event EventHandler<ConstraintEventArgs> ConstraintRemoved;
+    protected virtual void OnConstraintRemoved(IConstraint constraint) {
+      if (ConstraintRemoved != null)
+        ConstraintRemoved(this, new ConstraintEventArgs(constraint));
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      if (Constraints.Count > 0) {
+        XmlNode constraintsNode = document.CreateNode(XmlNodeType.Element, "Constraints", null);
+        foreach (IConstraint constraint in Constraints)
+          constraintsNode.AppendChild(PersistenceManager.Persist(constraint, document, persistedObjects));
+        node.AppendChild(constraintsNode);
+      }
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode constraintsNode = node.SelectSingleNode("Constraints");
+      if (constraintsNode != null) {
+        myConstraints.Clear();
+        foreach (XmlNode constraintNode in constraintsNode.ChildNodes)
+          AddConstraint((IConstraint)PersistenceManager.Restore(constraintNode, restoredObjects));
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.Designer.cs	(revision 2)
@@ -0,0 +1,174 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class ConstrainedItemBaseView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseItemDialog != null) chooseItemDialog.Dispose();
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.removeConstraintButton = new System.Windows.Forms.Button();
+      this.addConstraintButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.constraintsGroupBox = new System.Windows.Forms.GroupBox();
+      this.constraintsListView = new System.Windows.Forms.ListView();
+      this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
+      this.constraintDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.constraintsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // removeConstraintButton
+      // 
+      this.removeConstraintButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeConstraintButton.Enabled = false;
+      this.removeConstraintButton.Location = new System.Drawing.Point(81, 310);
+      this.removeConstraintButton.Name = "removeConstraintButton";
+      this.removeConstraintButton.Size = new System.Drawing.Size(75, 23);
+      this.removeConstraintButton.TabIndex = 2;
+      this.removeConstraintButton.Text = "&Remove";
+      this.removeConstraintButton.UseVisualStyleBackColor = true;
+      this.removeConstraintButton.Click += new System.EventHandler(this.removeConstraintButton_Click);
+      // 
+      // addConstraintButton
+      // 
+      this.addConstraintButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addConstraintButton.Location = new System.Drawing.Point(0, 310);
+      this.addConstraintButton.Name = "addConstraintButton";
+      this.addConstraintButton.Size = new System.Drawing.Size(75, 23);
+      this.addConstraintButton.TabIndex = 1;
+      this.addConstraintButton.Text = "&Add...";
+      this.addConstraintButton.UseVisualStyleBackColor = true;
+      this.addConstraintButton.Click += new System.EventHandler(this.addConstraintButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.constraintsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.constraintDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 304);
+      this.splitContainer.SplitterDistance = 149;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // constraintsGroupBox
+      // 
+      this.constraintsGroupBox.Controls.Add(this.constraintsListView);
+      this.constraintsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.constraintsGroupBox.Name = "constraintsGroupBox";
+      this.constraintsGroupBox.Size = new System.Drawing.Size(149, 304);
+      this.constraintsGroupBox.TabIndex = 0;
+      this.constraintsGroupBox.TabStop = false;
+      this.constraintsGroupBox.Text = "&Constraints";
+      // 
+      // constraintsListView
+      // 
+      this.constraintsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader3});
+      this.constraintsListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.constraintsListView.HideSelection = false;
+      this.constraintsListView.Location = new System.Drawing.Point(3, 16);
+      this.constraintsListView.Name = "constraintsListView";
+      this.constraintsListView.ShowItemToolTips = true;
+      this.constraintsListView.Size = new System.Drawing.Size(143, 285);
+      this.constraintsListView.TabIndex = 0;
+      this.constraintsListView.UseCompatibleStateImageBehavior = false;
+      this.constraintsListView.View = System.Windows.Forms.View.Details;
+      this.constraintsListView.SelectedIndexChanged += new System.EventHandler(this.constraintsListView_SelectedIndexChanged);
+      this.constraintsListView.SizeChanged += new System.EventHandler(this.constraintsListView_SizeChanged);
+      this.constraintsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.constraintsListView_KeyDown);
+      // 
+      // constraintDetailsGroupBox
+      // 
+      this.constraintDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.constraintDetailsGroupBox.Name = "constraintDetailsGroupBox";
+      this.constraintDetailsGroupBox.Size = new System.Drawing.Size(270, 304);
+      this.constraintDetailsGroupBox.TabIndex = 0;
+      this.constraintDetailsGroupBox.TabStop = false;
+      this.constraintDetailsGroupBox.Text = "&Details";
+      // 
+      // ConstrainedItemBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.addConstraintButton);
+      this.Controls.Add(this.removeConstraintButton);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ConstrainedItemBaseView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.constraintsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ColumnHeader columnHeader3;
+    protected Button removeConstraintButton;
+    protected Button addConstraintButton;
+    protected SplitContainer splitContainer;
+    protected GroupBox constraintsGroupBox;
+    protected ListView constraintsListView;
+    protected GroupBox constraintDetailsGroupBox;
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.cs	(revision 2)
@@ -0,0 +1,155 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class ConstrainedItemBaseView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    public IConstrainedItem ConstrainedItem {
+      get { return (IConstrainedItem)Item; }
+      set { base.Item = value; }
+    }
+
+    public ConstrainedItemBaseView() {
+      InitializeComponent();
+      constraintsListView.Columns[0].Width = Math.Max(0, constraintsListView.Width - 25);
+      Caption = "Constrained Item";
+    }
+    public ConstrainedItemBaseView(IConstrainedItem constraintItem)
+      : this() {
+      ConstrainedItem = constraintItem;
+    }
+
+    protected override void RemoveItemEvents() {
+      ConstrainedItem.ConstraintAdded -= new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintAdded);
+      ConstrainedItem.ConstraintRemoved -= new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintRemoved);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedItem.ConstraintAdded += new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintAdded);
+      ConstrainedItem.ConstraintRemoved += new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintRemoved);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      constraintDetailsGroupBox.Controls.Clear();
+      if (ConstrainedItem == null) {
+        Caption = "Constrained Item";
+        constraintsListView.Enabled = false;
+        constraintDetailsGroupBox.Enabled = false;
+        removeConstraintButton.Enabled = false;
+      } else {
+        Caption = "Constrained Item (" + ConstrainedItem.GetType().Name + ")";
+        constraintsListView.Enabled = true;
+        constraintsListView.Items.Clear();
+        foreach (IConstraint constraint in ConstrainedItem.Constraints) {
+          ListViewItem item = new ListViewItem();
+          item.Text = constraint.GetType().Name;
+          item.Tag = constraint;
+          constraintsListView.Items.Add(item);
+        }
+        if (constraintsListView.Items.Count > 0)
+          constraintsListView.SelectedIndices.Add(0);
+      }
+    }
+
+    private void constraintsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (constraintDetailsGroupBox.Controls.Count > 0)
+        constraintDetailsGroupBox.Controls[0].Dispose();
+      constraintDetailsGroupBox.Controls.Clear();
+      constraintDetailsGroupBox.Enabled = false;
+      removeConstraintButton.Enabled = false;
+      if (constraintsListView.SelectedItems.Count > 0) {
+        removeConstraintButton.Enabled = true;
+      }
+      if (constraintsListView.SelectedItems.Count == 1) {
+        IConstraint constraint = (IConstraint)constraintsListView.SelectedItems[0].Tag;
+        Control view = (Control)constraint.CreateView();
+        if (view != null) {
+          constraintDetailsGroupBox.Controls.Add(view);
+          view.Dock = DockStyle.Fill;
+          constraintDetailsGroupBox.Enabled = true;
+        }
+      }
+    }
+
+    #region Size Changed Events
+    private void constraintsListView_SizeChanged(object sender, EventArgs e) {
+      if (constraintsListView.Columns.Count > 0)
+        constraintsListView.Columns[0].Width = Math.Max(0, constraintsListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void constraintsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (constraintsListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in constraintsListView.SelectedItems)
+            ConstrainedItem.RemoveConstraint((IConstraint)item.Tag);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addConstraintButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog(typeof(IConstraint));
+        chooseItemDialog.Caption = "Add Constraint";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK)
+        ConstrainedItem.AddConstraint((IConstraint)chooseItemDialog.Item);
+    }
+    private void removeConstraintButton_Click(object sender, EventArgs e) {
+      if (constraintsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in constraintsListView.SelectedItems)
+          ConstrainedItem.RemoveConstraint((IConstraint)item.Tag);
+      }
+    }
+    #endregion
+
+    #region ConstrainedItemBase Events
+    private void ConstrainedItemBase_ConstraintAdded(object sender, ConstraintEventArgs e) {
+      ListViewItem item = new ListViewItem();
+      item.Text = e.Constraint.GetType().Name;
+      item.Tag = e.Constraint;
+      constraintsListView.Items.Add(item);
+    }
+    private void ConstrainedItemBase_ConstraintRemoved(object sender, ConstraintEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in constraintsListView.Items) {
+        if (item.Tag == e.Constraint)
+          itemToDelete = item;
+      }
+      constraintsListView.Items.Remove(itemToDelete);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ConstrainedItemBaseView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/ConstraintEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ConstraintEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ConstraintEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class ConstraintEventArgs : ItemEventArgs {
+    public IConstraint Constraint {
+      get { return (IConstraint)Item; }
+    }
+
+    public ConstraintEventArgs(IConstraint constraint)
+      : base(constraint) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/EditorBase.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/EditorBase.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EditorBase.Designer.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class EditorBase {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.SuspendLayout();
+      // 
+      // EditorBase
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "EditorBase";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/EditorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/EditorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EditorBase.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class EditorBase : ViewBase, IEditor {
+    private string myFilename;
+    public string Filename {
+      get { return myFilename; }
+      set {
+        if (value != myFilename) {
+          myFilename = value;
+          OnFilenameChanged();
+        }
+      }
+    }
+
+    public EditorBase() {
+      InitializeComponent();
+      Caption = "Editor";
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Item == null)
+        Caption = "Editor";
+      else
+        Caption = "Editor (" + Item.GetType().Name + ")";
+    }
+
+    public event EventHandler FilenameChanged;
+    protected virtual void OnFilenameChanged() {
+      if (FilenameChanged != null)
+        FilenameChanged(this, new EventArgs());
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/EditorBase.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/EditorBase.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EditorBase.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/EngineBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/EngineBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EngineBase.cs	(revision 2)
@@ -0,0 +1,207 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Threading;
+
+namespace HeuristicLab.Core {
+  public abstract class EngineBase : ItemBase, IEngine {
+    protected IOperatorGraph myOperatorGraph;
+    public IOperatorGraph OperatorGraph {
+      get { return myOperatorGraph; }
+    }
+    protected IScope myGlobalScope;
+    public IScope GlobalScope {
+      get { return myGlobalScope; }
+    }
+
+    private TimeSpan myExecutionTime;
+    public TimeSpan ExecutionTime {
+      get { return myExecutionTime; }
+      protected set {
+        myExecutionTime = value;
+        OnExecutionTimeChanged();
+      }
+    }
+
+    protected Stack<IOperation> myExecutionStack;
+    public Stack<IOperation> ExecutionStack {
+      get { return myExecutionStack; }
+    }
+    protected bool myRunning;
+    public bool Running {
+      get { return myRunning; }
+    }
+    protected bool myCanceled;
+    public bool Canceled {
+      get { return myCanceled; }
+    }
+    public virtual bool Terminated {
+      get { return ExecutionStack.Count == 0; }
+    }
+
+    protected EngineBase() {
+      myOperatorGraph = new OperatorGraph();
+      myGlobalScope = new Scope("Global");
+      myExecutionStack = new Stack<IOperation>();
+      Reset();
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      EngineBase clone = (EngineBase)base.Clone(clonedObjects);
+      clone.myOperatorGraph = (IOperatorGraph)Auxiliary.Clone(OperatorGraph, clonedObjects);
+      clone.myGlobalScope = (IScope)Auxiliary.Clone(GlobalScope, clonedObjects);
+      clone.myExecutionTime = ExecutionTime;
+      IOperation[] operations = new IOperation[ExecutionStack.Count];
+      ExecutionStack.CopyTo(operations, 0);
+      for (int i = operations.Length - 1; i >= 0; i--)
+        clone.myExecutionStack.Push((IOperation)Auxiliary.Clone(operations[i], clonedObjects));
+      clone.myRunning = Running;
+      clone.myCanceled = Canceled;
+      return clone;
+      
+    }
+
+    public virtual void Execute() {
+      myRunning = true;
+      myCanceled = false;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
+    }
+    public virtual void ExecuteSteps(int steps) {
+      myRunning = true;
+      myCanceled = false;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), steps);
+    }
+    public void ExecuteStep() {
+      ExecuteSteps(1);
+    }
+    public virtual void Abort() {
+      myCanceled = true;
+    }
+    public virtual void Reset() {
+      myCanceled = false;
+      myRunning = false;
+      OperatorGraph.Reset();
+      GlobalScope.Clear();
+      ExecutionTime = new TimeSpan();
+      myExecutionStack.Clear();
+      if (OperatorGraph.InitialOperator != null)
+        myExecutionStack.Push(new AtomicOperation(OperatorGraph.InitialOperator, GlobalScope));
+      OnInitialized();
+    }
+
+    private void Run(object state) {
+      if (state == null) Run();
+      else RunSteps((int)state);
+      myRunning = false;
+      OnFinished();
+    }
+    private void Run() {
+      DateTime start = DateTime.Now;
+      DateTime end;
+      while ((!Canceled) && (!Terminated)) {
+        ProcessNextOperation();
+        end = DateTime.Now;
+        ExecutionTime += end - start;
+        start = end;
+      }
+      ExecutionTime += DateTime.Now - start;
+    }
+    private void RunSteps(int steps) {
+      DateTime start = DateTime.Now;
+      DateTime end;
+      int step = 0;
+      while ((!Canceled) && (!Terminated) && (step < steps)) {
+        ProcessNextOperation();
+        step++;
+        end = DateTime.Now;
+        ExecutionTime += end - start;
+        start = end;
+      }
+      ExecutionTime += DateTime.Now - start;
+    }
+
+    protected abstract void ProcessNextOperation();
+
+    public event EventHandler Initialized;
+    protected virtual void OnInitialized() {
+      if (Initialized != null)
+        Initialized(this, new EventArgs());
+    }
+    public event EventHandler<OperationEventArgs> OperationExecuted;
+    protected virtual void OnOperationExecuted(IOperation operation) {
+      if (OperationExecuted != null)
+        OperationExecuted(this, new OperationEventArgs(operation));
+    }
+    public event EventHandler<ExceptionEventArgs> ExceptionOccurred;
+    protected virtual void OnExceptionOccurred(Exception exception) {
+      Abort();
+      if (ExceptionOccurred != null)
+        ExceptionOccurred(this, new ExceptionEventArgs(exception));
+    }
+    public event EventHandler ExecutionTimeChanged;
+    protected virtual void OnExecutionTimeChanged() {
+      if (ExecutionTimeChanged != null)
+        ExecutionTimeChanged(this, new EventArgs());
+    }
+    public event EventHandler Finished;
+    protected virtual void OnFinished() {
+      if (Finished != null)
+        Finished(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+
+      node.AppendChild(PersistenceManager.Persist("OperatorGraph", OperatorGraph, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("GlobalScope", GlobalScope, document, persistedObjects));
+
+      XmlNode stackNode = document.CreateNode(XmlNodeType.Element, "ExecutionStack", null);
+      IOperation[] operations = new IOperation[ExecutionStack.Count];
+      ExecutionStack.CopyTo(operations, 0);
+      for (int i = 0; i < operations.Length; i++)
+        stackNode.AppendChild(PersistenceManager.Persist(operations[i], document, persistedObjects));
+      node.AppendChild(stackNode);
+
+      XmlNode timeNode = document.CreateNode(XmlNodeType.Element, "ExecutionTime", null);
+      timeNode.InnerText = ExecutionTime.ToString();
+      node.AppendChild(timeNode);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myOperatorGraph = (IOperatorGraph)PersistenceManager.Restore(node.SelectSingleNode("OperatorGraph"), restoredObjects);
+      myGlobalScope = (IScope)PersistenceManager.Restore(node.SelectSingleNode("GlobalScope"), restoredObjects);
+
+      XmlNode stackNode = node.SelectSingleNode("ExecutionStack");
+      for (int i = stackNode.ChildNodes.Count - 1; i >= 0; i--)
+        myExecutionStack.Push((IOperation)PersistenceManager.Restore(stackNode.ChildNodes[i], restoredObjects));
+
+      XmlNode timeNode = node.SelectSingleNode("ExecutionTime");
+      myExecutionTime = TimeSpan.Parse(timeNode.InnerText);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/EngineBaseEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/EngineBaseEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EngineBaseEditor.Designer.cs	(revision 2)
@@ -0,0 +1,214 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class EngineBaseEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorGraphGroupBox = new System.Windows.Forms.GroupBox();
+      this.operatorGraphView = new HeuristicLab.Core.OperatorGraphView();
+      this.globalScopeGroupBox = new System.Windows.Forms.GroupBox();
+      this.scopeView = new HeuristicLab.Core.ScopeView();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.abortButton = new System.Windows.Forms.Button();
+      this.executeButton = new System.Windows.Forms.Button();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.operatorGraphGroupBox.SuspendLayout();
+      this.globalScopeGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(499, 460);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(141, 20);
+      this.executionTimeTextBox.TabIndex = 5;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(496, 444);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 4;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorGraphGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.globalScopeGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(640, 441);
+      this.splitContainer1.SplitterDistance = 320;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // operatorGraphGroupBox
+      // 
+      this.operatorGraphGroupBox.Controls.Add(this.operatorGraphView);
+      this.operatorGraphGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorGraphGroupBox.Name = "operatorGraphGroupBox";
+      this.operatorGraphGroupBox.Size = new System.Drawing.Size(320, 441);
+      this.operatorGraphGroupBox.TabIndex = 0;
+      this.operatorGraphGroupBox.TabStop = false;
+      this.operatorGraphGroupBox.Text = "Operator &Graph";
+      // 
+      // operatorGraphView
+      // 
+      this.operatorGraphView.Caption = "Operator Graph";
+      this.operatorGraphView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphView.Location = new System.Drawing.Point(3, 16);
+      this.operatorGraphView.Name = "operatorGraphView";
+      this.operatorGraphView.OperatorGraph = null;
+      this.operatorGraphView.Size = new System.Drawing.Size(314, 422);
+      this.operatorGraphView.TabIndex = 0;
+      // 
+      // globalScopeGroupBox
+      // 
+      this.globalScopeGroupBox.Controls.Add(this.scopeView);
+      this.globalScopeGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.globalScopeGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.globalScopeGroupBox.Name = "globalScopeGroupBox";
+      this.globalScopeGroupBox.Size = new System.Drawing.Size(316, 441);
+      this.globalScopeGroupBox.TabIndex = 0;
+      this.globalScopeGroupBox.TabStop = false;
+      this.globalScopeGroupBox.Text = "Global &Scope";
+      // 
+      // scopeView
+      // 
+      this.scopeView.Caption = "Scope";
+      this.scopeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scopeView.Location = new System.Drawing.Point(3, 16);
+      this.scopeView.Name = "scopeView";
+      this.scopeView.Scope = null;
+      this.scopeView.Size = new System.Drawing.Size(310, 422);
+      this.scopeView.TabIndex = 0;
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Location = new System.Drawing.Point(196, 457);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(92, 23);
+      this.resetButton.TabIndex = 3;
+      this.resetButton.Text = "&Reset";
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // abortButton
+      // 
+      this.abortButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.abortButton.Enabled = false;
+      this.abortButton.Location = new System.Drawing.Point(98, 457);
+      this.abortButton.Name = "abortButton";
+      this.abortButton.Size = new System.Drawing.Size(92, 23);
+      this.abortButton.TabIndex = 2;
+      this.abortButton.Text = "&Abort";
+      this.abortButton.UseVisualStyleBackColor = true;
+      this.abortButton.Click += new System.EventHandler(this.abortButton_Click);
+      // 
+      // executeButton
+      // 
+      this.executeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.executeButton.Location = new System.Drawing.Point(0, 457);
+      this.executeButton.Name = "executeButton";
+      this.executeButton.Size = new System.Drawing.Size(92, 23);
+      this.executeButton.TabIndex = 1;
+      this.executeButton.Text = "&Execute";
+      this.executeButton.UseVisualStyleBackColor = true;
+      this.executeButton.Click += new System.EventHandler(this.executeButton_Click);
+      // 
+      // EngineBaseEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.abortButton);
+      this.Controls.Add(this.executeButton);
+      this.Name = "EngineBaseEditor";
+      this.Size = new System.Drawing.Size(640, 480);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.operatorGraphGroupBox.ResumeLayout(false);
+      this.globalScopeGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
+    protected System.Windows.Forms.GroupBox operatorGraphGroupBox;
+    protected System.Windows.Forms.GroupBox globalScopeGroupBox;
+    protected System.Windows.Forms.Button resetButton;
+    protected System.Windows.Forms.Button abortButton;
+    protected System.Windows.Forms.Button executeButton;
+    protected HeuristicLab.Core.OperatorGraphView operatorGraphView;
+    protected HeuristicLab.Core.ScopeView scopeView;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/EngineBaseEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/EngineBaseEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EngineBaseEditor.cs	(revision 2)
@@ -0,0 +1,148 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Core {
+  public partial class EngineBaseEditor : EditorBase {
+    private int executionTimeCounter;
+
+    public IEngine Engine {
+      get { return (IEngine)Item; }
+      set { base.Item = value; }
+    }
+
+    public EngineBaseEditor() {
+      InitializeComponent();
+    }
+
+    protected override void RemoveItemEvents() {
+      Engine.Initialized -= new EventHandler(Engine_Initialized);
+      Engine.ExceptionOccurred -= new EventHandler<ExceptionEventArgs>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged -= new EventHandler(Engine_ExecutionTimeChanged);
+      Engine.Finished -= new EventHandler(Engine_Finished);
+      operatorGraphView.OperatorGraph = null;
+      scopeView.Scope = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Engine.Initialized += new EventHandler(Engine_Initialized);
+      Engine.ExceptionOccurred += new EventHandler<ExceptionEventArgs>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged += new EventHandler(Engine_ExecutionTimeChanged);
+      Engine.Finished += new EventHandler(Engine_Finished);
+      operatorGraphView.OperatorGraph = Engine.OperatorGraph;
+      scopeView.Scope = Engine.GlobalScope;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      abortButton.Enabled = false;
+      if (Engine == null) {
+        executeButton.Enabled = false;
+        resetButton.Enabled = false;
+        executionTimeTextBox.Enabled = false;
+      } else {
+        executeButton.Enabled = true;
+        resetButton.Enabled = true;
+        executionTimeCounter = 0;
+        executionTimeTextBox.Text = Engine.ExecutionTime.ToString();
+        executionTimeTextBox.Enabled = true;
+      }
+    }
+
+    #region Engine Events
+    private void Engine_Initialized(object sender, EventArgs e) {
+      Refresh();
+    }
+    private delegate void OnExceptionEventDelegate(object sender, ExceptionEventArgs e);
+    private void Engine_ExceptionOccurred(object sender, ExceptionEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnExceptionEventDelegate(Engine_ExceptionOccurred), sender, e);
+      else
+        Auxiliary.ShowErrorMessageBox(e.Exception);
+    }
+    private void Engine_ExecutionTimeChanged(object sender, EventArgs e) {
+      executionTimeCounter++;
+      if (executionTimeCounter == 1000)
+        UpdateExecutionTimeTextBox();
+    }
+    private void Engine_Finished(object sender, EventArgs e) {
+      UpdateExecutionTimeTextBox();
+      if (globalScopeGroupBox.Controls.Count > 0) {
+        ScopeView scopeEditor = (ScopeView)globalScopeGroupBox.Controls[0];
+        if (!scopeEditor.AutomaticUpdating)
+          scopeEditor.Refresh();
+      }
+      EnableDisableControls();
+    }
+    private void UpdateExecutionTimeTextBox() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateExecutionTimeTextBox));
+      else {
+        executionTimeCounter = 0;
+        executionTimeTextBox.Text = Engine.ExecutionTime.ToString();
+      }
+    }
+    private void EnableDisableControls() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(EnableDisableControls));
+      else {
+        executeButton.Enabled = true;
+        abortButton.Enabled = false;
+        resetButton.Enabled = true;
+        operatorGraphGroupBox.Enabled = true;
+        globalScopeGroupBox.Enabled = true;
+      }
+    }
+    #endregion
+
+    #region Button events
+    private void executeButton_Click(object sender, EventArgs e) {
+      executeButton.Enabled = false;
+      abortButton.Enabled = true;
+      resetButton.Enabled = false;
+      operatorGraphGroupBox.Enabled = false;
+      globalScopeGroupBox.Enabled = false;
+      Engine.Execute();
+    }
+    private void abortButton_Click(object sender, EventArgs e) {
+      Engine.Abort();
+    }
+    private void resetButton_Click(object sender, EventArgs e) {
+      Engine.Reset();
+      UpdateExecutionTimeTextBox();
+      if (globalScopeGroupBox.Controls.Count > 0) {
+        ScopeView scopeEditor = (ScopeView)globalScopeGroupBox.Controls[0];
+        if (!scopeEditor.AutomaticUpdating)
+          scopeEditor.Refresh();
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/EngineBaseEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/EngineBaseEditor.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/EngineBaseEditor.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Core/ExceptionEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ExceptionEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ExceptionEventArgs.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class ExceptionEventArgs : EventArgs {
+    private Exception myException;
+    public Exception Exception {
+      get { return myException; }
+    }
+
+    public ExceptionEventArgs(Exception exception) {
+      myException = exception;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/HeuristicLab.Core.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Core/HeuristicLab.Core.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/HeuristicLab.Core.csproj	(revision 2)
@@ -0,0 +1,344 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F43B59AB-2B8C-4570-BC1E-15592086517C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Core</RootNamespace>
+    <AssemblyName>HeuristicLab.Core</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/HeuristicLab.Core/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Core.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Auxiliary.cs" />
+    <Compile Include="ChooseItemDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ChooseItemDialog.Designer.cs">
+      <DependentUpon>ChooseItemDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ChooseOperatorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ChooseOperatorDialog.Designer.cs">
+      <DependentUpon>ChooseOperatorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedItemBase.cs" />
+    <Compile Include="ConstrainedItemBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedItemBaseView.Designer.cs">
+      <DependentUpon>ConstrainedItemBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstraintEventArgs.cs" />
+    <Compile Include="AtomicOperation.cs" />
+    <Compile Include="CompositeOperation.cs" />
+    <Compile Include="ChooseTypeDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ChooseTypeDialog.Designer.cs">
+      <DependentUpon>ChooseTypeDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorBaseDescriptionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseDescriptionView.Designer.cs">
+      <DependentUpon>OperatorBaseDescriptionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Interfaces\IOperation.cs" />
+    <Compile Include="Interfaces\IOperatorLibrary.cs" />
+    <Compile Include="Interfaces\IVisualizationItem.cs" />
+    <Compile Include="NameChangingEventArgs.cs" />
+    <Compile Include="OperationEventArgs.cs" />
+    <Compile Include="OperatorBaseVariablesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseVariablesView.Designer.cs">
+      <DependentUpon>OperatorBaseVariablesView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorBaseVariableInfosView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseVariableInfosView.Designer.cs">
+      <DependentUpon>OperatorBaseVariableInfosView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ExceptionEventArgs.cs" />
+    <Compile Include="Interfaces\IConstrainedItem.cs" />
+    <Compile Include="Interfaces\IConstraint.cs" />
+    <Compile Include="Interfaces\IItem.cs" />
+    <Compile Include="ItemBase.cs" />
+    <Compile Include="ItemBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemBaseView.Designer.cs">
+      <DependentUpon>ItemBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemEventArgs.cs" />
+    <Compile Include="ItemIndexEventArgs.cs" />
+    <Compile Include="OperatorLibrary.cs" />
+    <Compile Include="OperatorLibraryEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorLibraryEditor.Designer.cs">
+      <DependentUpon>OperatorLibraryEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ScopeIndexEventArgs.cs" />
+    <Compile Include="EngineBaseEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EngineBaseEditor.Designer.cs">
+      <DependentUpon>EngineBaseEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableInfoEventArgs.cs" />
+    <Compile Include="VariableEventArgs.cs" />
+    <Compile Include="Interfaces\IOperatorGroup.cs" />
+    <Compile Include="Interfaces\IOperatorGraph.cs" />
+    <Compile Include="Interfaces\IScope.cs" />
+    <Compile Include="Interfaces\IVariable.cs" />
+    <Compile Include="Interfaces\IVariableInfo.cs" />
+    <Compile Include="OperatorEventArgs.cs" />
+    <Compile Include="OperatorGroup.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="OperatorIndexEventArgs.cs" />
+    <Compile Include="ScopeEventArgs.cs" />
+    <Compile Include="OperatorBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseView.Designer.cs">
+      <DependentUpon>OperatorBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorGraphView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorGraphView.Designer.cs">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScopeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScopeView.Designer.cs">
+      <DependentUpon>ScopeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableInfoView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableInfoView.Designer.cs">
+      <DependentUpon>VariableInfoView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableView.Designer.cs">
+      <DependentUpon>VariableView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ViewBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ViewBase.Designer.cs">
+      <DependentUpon>ViewBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Interfaces\IViewable.cs" />
+    <Compile Include="Interfaces\IView.cs" />
+    <Compile Include="EditorBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EditorBase.Designer.cs">
+      <DependentUpon>EditorBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Interfaces\IEditable.cs" />
+    <Compile Include="Interfaces\IEditor.cs" />
+    <Compile Include="OperatorBase.cs" />
+    <Compile Include="Interfaces\IRandom.cs" />
+    <Compile Include="OperatorGraph.cs" />
+    <Compile Include="StorableBase.cs" />
+    <Compile Include="Scope.cs" />
+    <Compile Include="EngineBase.cs" />
+    <Compile Include="Interfaces\IEngine.cs" />
+    <Compile Include="Interfaces\IOperator.cs" />
+    <Compile Include="Interfaces\IStorable.cs" />
+    <Compile Include="PersistenceManager.cs" />
+    <Compile Include="HeuristicLabCorePlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Variable.cs" />
+    <Compile Include="VariableInfo.cs" />
+    <Compile Include="VariableKind.cs" />
+    <Compile Include="VariablesScopeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariablesScopeView.Designer.cs">
+      <DependentUpon>VariablesScopeView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ChooseItemDialog.resx">
+      <DependentUpon>ChooseItemDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ChooseOperatorDialog.resx">
+      <DependentUpon>ChooseOperatorDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedItemBaseView.resx">
+      <DependentUpon>ConstrainedItemBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ChooseTypeDialog.resx">
+      <DependentUpon>ChooseTypeDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseDescriptionView.resx">
+      <DependentUpon>OperatorBaseDescriptionView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseVariablesView.resx">
+      <DependentUpon>OperatorBaseVariablesView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseVariableInfosView.resx">
+      <DependentUpon>OperatorBaseVariableInfosView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditorBase.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>EditorBase.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemBaseView.resx">
+      <DependentUpon>ItemBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseView.resx">
+      <DependentUpon>OperatorBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorGraphView.resx">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorLibraryEditor.resx">
+      <DependentUpon>OperatorLibraryEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ScopeView.resx">
+      <DependentUpon>ScopeView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EngineBaseEditor.resx">
+      <DependentUpon>EngineBaseEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariableInfoView.resx">
+      <DependentUpon>VariableInfoView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariablesScopeView.resx">
+      <DependentUpon>VariablesScopeView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariableView.resx">
+      <DependentUpon>VariableView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\CombinedOperator.bmp" />
+    <Content Include="Resources\HeuristicLab.ico" />
+    <Content Include="Resources\Operator.bmp" />
+    <Content Include="Resources\ProgrammableOperator.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Core/HeuristicLabCorePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/HeuristicLabCorePlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/HeuristicLabCorePlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  [ClassInfo(Name = "HeuristicLab.Core")]
+  [PluginFile(Filename = "HeuristicLab.Core.dll", Filetype = PluginFileType.Assembly)]
+  public class HeuristicLabCorePlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IConstrainedItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IConstrainedItem.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IConstrainedItem.cs	(revision 2)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IConstrainedItem : IItem {
+    ICollection<IConstraint> Constraints { get; }
+
+    void AddConstraint(IConstraint constraint);
+    void RemoveConstraint(IConstraint constraint);
+
+    bool IsValid();
+    bool IsValid(out ICollection<IConstraint> violatedConstraints);
+
+    event EventHandler<ConstraintEventArgs> ConstraintAdded;
+    event EventHandler<ConstraintEventArgs> ConstraintRemoved;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IConstraint.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IConstraint.cs	(revision 2)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IConstraint : IItem {
+    string Description { get; }
+
+    bool Check(IItem data);
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IEditable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IEditable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IEditable.cs	(revision 2)
@@ -0,0 +1,30 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IEditable : IViewable {
+    IEditor CreateEditor();
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IEditor.cs	(revision 2)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IEditor : IView {
+    string Filename { get; set; }
+
+    event EventHandler FilenameChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IEngine.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IEngine.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IEngine : IItem {
+    IOperatorGraph OperatorGraph { get; }
+    IScope GlobalScope { get; }
+
+    TimeSpan ExecutionTime { get; }
+
+    bool Running { get; }
+    bool Canceled { get; }
+    bool Terminated { get; }
+
+    void Execute();
+    void ExecuteStep();
+    void ExecuteSteps(int steps);
+    void Abort();
+    void Reset();
+
+    event EventHandler Initialized;
+    event EventHandler<OperationEventArgs> OperationExecuted;
+    event EventHandler<ExceptionEventArgs> ExceptionOccurred;
+    event EventHandler ExecutionTimeChanged;
+    event EventHandler Finished;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IItem.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IItem.cs	(revision 2)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IItem : IStorable, IViewable {
+    void FireChanged();
+
+    event EventHandler Changed;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IOperation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IOperation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IOperation.cs	(revision 2)
@@ -0,0 +1,29 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IOperation : IItem {
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IOperator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IOperator.cs	(revision 2)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IOperator : IConstrainedItem {
+    string Name { get; set; }
+    string Description { get; }
+
+    bool Canceled { get; }
+    bool Breakpoint { get; set; }
+
+    IList<IOperator> SubOperators { get; }
+    ICollection<IVariableInfo> VariableInfos { get; }
+    ICollection<IVariable> Variables { get; }
+
+    void AddSubOperator(IOperator op);
+    bool TryAddSubOperator(IOperator op);
+    bool TryAddSubOperator(IOperator op, out ICollection<IConstraint> violatedConstraints);
+    void AddSubOperator(IOperator op, int index);
+    bool TryAddSubOperator(IOperator op, int index);
+    bool TryAddSubOperator(IOperator op, int index, out ICollection<IConstraint> violatedConstraints);
+    void RemoveSubOperator(int index);
+    bool TryRemoveSubOperator(int index);
+    bool TryRemoveSubOperator(int index, out ICollection<IConstraint> violatedConstraints);
+
+    IVariableInfo GetVariableInfo(string formalName);
+    void AddVariableInfo(IVariableInfo variableInfo);
+    bool TryAddVariableInfo(IVariableInfo variableInfo);
+    bool TryAddVariableInfo(IVariableInfo variableInfo, out ICollection<IConstraint> violatedConstraints);
+    void RemoveVariableInfo(string formalName);
+    bool TryRemoveVariableInfo(string formalName);
+    bool TryRemoveVariableInfo(string formalName, out ICollection<IConstraint> violatedConstraints);
+
+    IVariable GetVariable(string name);
+    void AddVariable(IVariable variable);
+    bool TryAddVariable(IVariable variable);
+    bool TryAddVariable(IVariable variable, out ICollection<IConstraint> violatedConstraints);
+    void RemoveVariable(string name);
+    bool TryRemoveVariable(string name);
+    bool TryRemoveVariable(string name, out ICollection<IConstraint> violatedConstraints);
+    T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup) where T : class, IItem;
+    T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) where T : class, IItem;
+    IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup);
+    IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup, bool throwOnError);
+
+    IOperation Execute(IScope scope);
+    void Abort();
+    void Reset();
+
+    event EventHandler NameChanged;
+    event EventHandler BreakpointChanged;
+    event EventHandler<OperatorIndexEventArgs> SubOperatorAdded;
+    event EventHandler<OperatorIndexEventArgs> SubOperatorRemoved;
+    event EventHandler<VariableInfoEventArgs> VariableInfoAdded;
+    event EventHandler<VariableInfoEventArgs> VariableInfoRemoved;
+    event EventHandler<VariableEventArgs> VariableAdded;
+    event EventHandler<VariableEventArgs> VariableRemoved;
+    event EventHandler Initialized;
+    event EventHandler Executed;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorGraph.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorGraph.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorGraph.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IOperatorGraph : IItem {
+    ICollection<IOperator> Operators { get; }
+    IOperator InitialOperator { get; set; }
+
+    void AddOperator(IOperator op);
+    void RemoveOperator(Guid guid);
+    IOperator GetOperator(Guid guid);
+    void Reset();
+    void Clear();
+
+    event EventHandler<OperatorEventArgs> OperatorAdded;
+    event EventHandler<OperatorEventArgs> OperatorRemoved;
+    event EventHandler InitialOperatorChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorGroup.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorGroup.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorGroup.cs	(revision 2)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IOperatorGroup : IStorable {
+    string Name { get; set; }
+    ICollection<IOperatorGroup> SubGroups { get; }
+    ICollection<IOperator> Operators { get; }
+
+    void AddSubGroup(IOperatorGroup group);
+    void RemoveSubGroup(IOperatorGroup group);
+    void AddOperator(IOperator op);
+    void RemoveOperator(IOperator op);
+
+    event EventHandler NameChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorLibrary.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorLibrary.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IOperatorLibrary.cs	(revision 2)
@@ -0,0 +1,31 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IOperatorLibrary : IItem {
+    IOperatorGroup Group { get; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IRandom.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IRandom.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IRandom.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Core {
+  public interface IRandom : IItem {
+    void Reset();
+    void Reset(int seed);
+
+    int Next();
+    int Next(int maxVal);
+    int Next(int minVal, int maxVal);
+    double NextDouble();
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IScope.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IScope.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IScope.cs	(revision 2)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IScope : IItem {
+    string Name { get; }
+
+    ICollection<IVariable> Variables { get; }
+    IList<IScope> SubScopes { get; }
+
+    void SetParent(IScope scope);
+
+    IVariable GetVariable(string name);
+    void AddVariable(IVariable variable);
+    void RemoveVariable(string name);
+    T GetVariableValue<T>(string name, bool recursiveLookup) where T : class, IItem;
+    T GetVariableValue<T>(string name, bool recursiveLookup, bool throwOnError) where T : class, IItem;
+    IItem GetVariableValue(string name, bool recursiveLookup);
+    IItem GetVariableValue(string name, bool recursiveLookup, bool throwOnError);
+
+    void AddSubScope(IScope scope);
+    void RemoveSubScope(IScope scope);
+    void ReorderSubScopes(int[] sequence);
+    IScope GetScope(Guid guid);
+    IScope GetScope(string name);
+
+    void Clear();
+
+    event EventHandler<VariableEventArgs> VariableAdded;
+    event EventHandler<VariableEventArgs> VariableRemoved;
+    event EventHandler<ScopeIndexEventArgs> SubScopeAdded;
+    event EventHandler<ScopeIndexEventArgs> SubScopeRemoved;
+    event EventHandler SubScopesReordered;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IStorable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IStorable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IStorable.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IStorable {
+    Guid Guid { get; }
+
+    object Clone();
+    object Clone(IDictionary<Guid, object> clonedObjects);
+
+    XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects);
+    void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects);
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IVariable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IVariable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IVariable.cs	(revision 2)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IVariable : IItem {
+    string Name { get; set; }
+    IItem Value { get; set; }
+
+    T GetValue<T>() where T : class, IItem;
+
+    event EventHandler<NameChangingEventArgs> NameChanging;
+    event EventHandler NameChanged;
+    event EventHandler ValueChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IVariableInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IVariableInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IVariableInfo.cs	(revision 2)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public interface IVariableInfo : IItem {
+    string ActualName { get; set; }
+    string FormalName { get; }
+    string Description { get; }
+    Type DataType { get; }
+    VariableKind Kind { get; }
+    bool Local { get; set; }
+
+    event EventHandler ActualNameChanged;
+    event EventHandler LocalChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IView.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public interface IView : IControl {
+    IItem Item { get; }
+    string Caption { get; set; }
+
+    event EventHandler ItemChanged;
+    event EventHandler CaptionChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IViewable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IViewable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IViewable.cs	(revision 2)
@@ -0,0 +1,30 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IViewable {
+    IView CreateView();
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Interfaces/IVisualizationItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Interfaces/IVisualizationItem.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Interfaces/IVisualizationItem.cs	(revision 2)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public interface IVisualizationItem : IItem { }
+}
Index: /trunk/sources/HeuristicLab.Core/ItemBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ItemBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ItemBase.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public abstract class ItemBase : StorableBase, IItem {
+    public virtual IView CreateView() {
+      return new ItemBaseView(this);
+    }
+
+    public override string ToString() {
+      return GetType().Name;
+    }
+
+    public void FireChanged() {
+      OnChanged();
+    }
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged() {
+      if (Changed != null)
+        Changed(this, new EventArgs());
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ItemBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ItemBaseView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ItemBaseView.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class ItemBaseView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.messageLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // messageLabel
+      // 
+      this.messageLabel.Anchor = System.Windows.Forms.AnchorStyles.Top;
+      this.messageLabel.AutoSize = true;
+      this.messageLabel.Location = new System.Drawing.Point(55, 0);
+      this.messageLabel.Name = "messageLabel";
+      this.messageLabel.Size = new System.Drawing.Size(91, 13);
+      this.messageLabel.TabIndex = 0;
+      this.messageLabel.Text = "No view available";
+      // 
+      // DataBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.messageLabel);
+      this.Name = "DataBaseView";
+      this.Size = new System.Drawing.Size(201, 46);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label messageLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ItemBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ItemBaseView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ItemBaseView.cs	(revision 2)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class ItemBaseView : ViewBase {
+    public ItemBaseView() {
+      InitializeComponent();
+    }
+    public ItemBaseView(IItem item)
+      : this() {
+      Item = item;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ItemBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/ItemBaseView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ItemBaseView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/ItemEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ItemEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ItemEventArgs.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class ItemEventArgs : EventArgs {
+    private IItem myItem;
+    public IItem Item {
+      get { return myItem; }
+    }
+
+    public ItemEventArgs(IItem item) {
+      myItem = item;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ItemIndexEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ItemIndexEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ItemIndexEventArgs.cs	(revision 2)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class ItemIndexEventArgs : ItemEventArgs {
+    private int myIndex;
+    public int Index {
+      get { return myIndex; }
+    }
+
+    public ItemIndexEventArgs(IItem item, int index)
+      : base(item) {
+      myIndex = index;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/NameChangingEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/NameChangingEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/NameChangingEventArgs.cs	(revision 2)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ComponentModel;
+
+namespace HeuristicLab.Core {
+  public class NameChangingEventArgs : CancelEventArgs {
+    private string myName;
+    public string Name {
+      get { return myName; }
+    }
+
+    public NameChangingEventArgs(string name)
+      : base() {
+      myName = name;
+    }
+    public NameChangingEventArgs(string name, bool cancel)
+      : base(cancel) {
+      myName = name;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperationEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperationEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperationEventArgs.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class OperationEventArgs : EventArgs {
+    private IOperation myOperation;
+    public IOperation Operation {
+      get { return myOperation; }
+    }
+
+    public OperationEventArgs(IOperation operation) {
+      myOperation = operation;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBase.cs	(revision 2)
@@ -0,0 +1,483 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public abstract class OperatorBase : ConstrainedItemBase, IOperator {
+    private string myName;
+    public string Name {
+      get { return myName; }
+      set {
+        if (myName != value) {
+          myName = value;
+          OnNameChanged();
+        }
+      }
+    }
+    public virtual string Description {
+      get { return "No operator description available."; }
+    }
+
+    private bool myCanceled;
+    public bool Canceled {
+      get { return myCanceled; }
+    }
+    private bool myBreakpoint;
+    public bool Breakpoint {
+      get { return myBreakpoint; }
+      set {
+        if (value != myBreakpoint) {
+          myBreakpoint = value;
+          OnBreakpointChanged();
+        }
+      }
+    }
+
+    private List<IOperator> mySubOperators;
+    public virtual IList<IOperator> SubOperators {
+      get { return mySubOperators.AsReadOnly(); }
+    }
+    private Dictionary<string, IVariableInfo> myVariableInfos;
+    public virtual ICollection<IVariableInfo> VariableInfos {
+      get { return myVariableInfos.Values; }
+    }
+    private Dictionary<string, IVariable> myVariables;
+    public virtual ICollection<IVariable> Variables {
+      get { return myVariables.Values; }
+    }
+
+    protected OperatorBase() {
+      myName = this.GetType().Name;
+      myCanceled = false;
+      myBreakpoint = false;
+      mySubOperators = new List<IOperator>();
+      myVariableInfos = new Dictionary<string, IVariableInfo>();
+      myVariables = new Dictionary<string, IVariable>();
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorBase clone = (OperatorBase)base.Clone(clonedObjects);
+      clone.myName = Name;
+      clone.mySubOperators.Clear();
+      for (int i = 0; i < SubOperators.Count; i++)
+        clone.AddSubOperator((IOperator)Auxiliary.Clone(SubOperators[i], clonedObjects));
+      clone.myVariableInfos.Clear();
+      foreach (IVariableInfo variableInfo in myVariableInfos.Values)
+        clone.AddVariableInfo((IVariableInfo)Auxiliary.Clone(variableInfo, clonedObjects));
+      clone.myVariables.Clear();
+      foreach (IVariable variable in myVariables.Values)
+        clone.AddVariable((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new OperatorBaseView(this);
+    }
+
+    #region SubOperator Methods
+    public virtual void AddSubOperator(IOperator subOperator) {
+      mySubOperators.Add(subOperator);
+      OnSubOperatorAdded(subOperator, mySubOperators.Count - 1);
+    }
+    public virtual bool TryAddSubOperator(IOperator subOperator) {
+      mySubOperators.Add(subOperator);
+      if (IsValid()) {
+        OnSubOperatorAdded(subOperator, mySubOperators.Count - 1);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(mySubOperators.Count - 1);
+        return false;
+      }
+    }
+    public virtual bool TryAddSubOperator(IOperator subOperator, out ICollection<IConstraint> violatedConstraints) {
+      mySubOperators.Add(subOperator);
+      if (IsValid(out violatedConstraints)) {
+        OnSubOperatorAdded(subOperator, mySubOperators.Count - 1);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(mySubOperators.Count - 1);
+        return false;
+      }
+    }
+    public virtual void AddSubOperator(IOperator subOperator, int index) {
+      mySubOperators.Insert(index, subOperator);
+      OnSubOperatorAdded(subOperator, index);
+    }
+    public virtual bool TryAddSubOperator(IOperator subOperator, int index) {
+      mySubOperators.Insert(index, subOperator);
+      if (IsValid()) {
+        OnSubOperatorAdded(subOperator, index);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(index);
+        return false;
+      }
+    }
+    public virtual bool TryAddSubOperator(IOperator subOperator, int index, out ICollection<IConstraint> violatedConstraints) {
+      mySubOperators.Insert(index, subOperator);
+      if (IsValid(out violatedConstraints)) {
+        OnSubOperatorAdded(subOperator, index);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(index);
+        return false;
+      }
+    }
+    public virtual void RemoveSubOperator(int index) {
+      IOperator op = mySubOperators[index];
+      mySubOperators.RemoveAt(index);
+      OnSubOperatorRemoved(op, index);
+    }
+    public virtual bool TryRemoveSubOperator(int index) {
+      IOperator op = mySubOperators[index];
+      mySubOperators.RemoveAt(index);
+      if (IsValid()) {
+        OnSubOperatorRemoved(op, index);
+        return true;
+      } else {
+        mySubOperators.Insert(index, op);
+        return false;
+      }
+    }
+    public virtual bool TryRemoveSubOperator(int index, out ICollection<IConstraint> violatedConstraints) {
+      IOperator op = mySubOperators[index];
+      mySubOperators.RemoveAt(index);
+      if (IsValid(out violatedConstraints)) {
+        OnSubOperatorRemoved(op, index);
+        return true;
+      } else {
+        mySubOperators.Insert(index, op);
+        return false;
+      }
+    }
+    #endregion
+
+    #region VariableInfo Methods
+    public virtual IVariableInfo GetVariableInfo(string formalName) {
+      IVariableInfo info;
+      if (myVariableInfos.TryGetValue(formalName, out info))
+        return info;
+      else
+        return null;
+    }
+    public virtual void AddVariableInfo(IVariableInfo variableInfo) {
+      myVariableInfos.Add(variableInfo.FormalName, variableInfo);
+      OnVariableInfoAdded(variableInfo);
+    }
+    public virtual bool TryAddVariableInfo(IVariableInfo variableInfo) {
+      myVariableInfos.Add(variableInfo.FormalName, variableInfo);
+      if (IsValid()) {
+        OnVariableInfoAdded(variableInfo);
+        return true;
+      } else {
+        myVariableInfos.Remove(variableInfo.FormalName);
+        return false;
+      }
+    }
+    public virtual bool TryAddVariableInfo(IVariableInfo variableInfo, out ICollection<IConstraint> violatedConstraints) {
+      myVariableInfos.Add(variableInfo.FormalName, variableInfo);
+      if (IsValid(out violatedConstraints)) {
+        OnVariableInfoAdded(variableInfo);
+        return true;
+      } else {
+        myVariableInfos.Remove(variableInfo.FormalName);
+        return false;
+      }
+    }
+    public virtual void RemoveVariableInfo(string formalName) {
+      IVariableInfo variableInfo;
+      if (myVariableInfos.TryGetValue(formalName, out variableInfo)) {
+        myVariableInfos.Remove(formalName);
+        OnVariableInfoRemoved(variableInfo);
+      }
+    }
+    public virtual bool TryRemoveVariableInfo(string formalName) {
+      IVariableInfo variableInfo;
+      if (myVariableInfos.TryGetValue(formalName, out variableInfo)) {
+        myVariableInfos.Remove(formalName);
+        if (IsValid()) {
+          OnVariableInfoRemoved(variableInfo);
+          return true;
+        } else {
+          myVariableInfos.Add(formalName, variableInfo);
+          return false;
+        }
+      }
+      return true;
+    }
+    public virtual bool TryRemoveVariableInfo(string formalName, out ICollection<IConstraint> violatedConstraints) {
+      IVariableInfo variableInfo;
+      if (myVariableInfos.TryGetValue(formalName, out variableInfo)) {
+        myVariableInfos.Remove(formalName);
+        if (IsValid(out violatedConstraints)) {
+          OnVariableInfoRemoved(variableInfo);
+          return true;
+        } else {
+          myVariableInfos.Add(formalName, variableInfo);
+          return false;
+        }
+      }
+      violatedConstraints = new List<IConstraint>();
+      return true;
+    }
+    #endregion
+
+    #region Variable Methods
+    public virtual IVariable GetVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable))
+        return variable;
+      else
+        return null;
+    }
+    public virtual void AddVariable(IVariable variable) {
+      myVariables.Add(variable.Name, variable);
+      variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+      variable.NameChanged += new EventHandler(Variable_NameChanged);
+      OnVariableAdded(variable);
+    }
+    public virtual bool TryAddVariable(IVariable variable) {
+      myVariables.Add(variable.Name, variable);
+      if (IsValid()) {
+        variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged += new EventHandler(Variable_NameChanged);
+        OnVariableAdded(variable);
+        return true;
+      } else {
+        myVariableInfos.Remove(variable.Name);
+        return false;
+      }
+    }
+    public virtual bool TryAddVariable(IVariable variable, out ICollection<IConstraint> violatedConstraints) {
+      myVariables.Add(variable.Name, variable);
+      if (IsValid(out violatedConstraints)) {
+        variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged += new EventHandler(Variable_NameChanged);
+        OnVariableAdded(variable);
+        return true;
+      } else {
+        myVariableInfos.Remove(variable.Name);
+        return false;
+      }
+    }
+    public virtual void RemoveVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged -= new EventHandler(Variable_NameChanged);
+        myVariables.Remove(name);
+        OnVariableRemoved(variable);
+      }
+    }
+    public virtual bool TryRemoveVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        myVariables.Remove(name);
+        if (IsValid()) {
+          variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+          variable.NameChanged -= new EventHandler(Variable_NameChanged);
+          OnVariableRemoved(variable);
+          return true;
+        } else {
+          myVariables.Add(name, variable);
+          return false;
+        }
+      }
+      return true;
+    }
+    public virtual bool TryRemoveVariable(string name, out ICollection<IConstraint> violatedConstraints) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        myVariables.Remove(name);
+        if (IsValid(out violatedConstraints)) {
+          variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+          variable.NameChanged -= new EventHandler(Variable_NameChanged);
+          OnVariableRemoved(variable);
+          return true;
+        } else {
+          myVariables.Add(name, variable);
+          return false;
+        }
+      }
+      violatedConstraints = new List<IConstraint>();
+      return true;
+    }
+    private void Variable_NameChanging(object sender, NameChangingEventArgs e) {
+      e.Cancel = myVariables.ContainsKey(e.Name);
+    }
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      string oldName = null;
+      foreach (KeyValuePair<string, IVariable> element in myVariables) {
+        if (element.Value == variable)
+          oldName = element.Key;
+      }
+      myVariables.Remove(oldName);
+      myVariables.Add(variable.Name, variable);
+    }
+    public T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup) where T : class, IItem {
+      return GetVariableValue<T>(formalName, scope, recursiveLookup, true);
+    }
+    public T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) where T : class, IItem {
+      return (T)GetVariableValue(formalName, scope, recursiveLookup, throwOnError);
+    }
+    public IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup) {
+      return GetVariableValue(formalName, scope, recursiveLookup, true);
+    }
+    public virtual IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) {
+      IVariableInfo info = GetVariableInfo(formalName);
+      if (info.Local) {
+        IVariable variable;
+        if (myVariables.TryGetValue(info.ActualName, out variable))
+          return variable.Value;
+        else {
+          if (throwOnError)
+            throw new ArgumentException("Variable " + info.ActualName + " not found");
+          else
+            return null;
+        }
+      } else {
+        return scope.GetVariableValue(info.ActualName, recursiveLookup, throwOnError);
+      }
+    }
+    #endregion
+
+    public virtual IOperation Execute(IScope scope) {
+      myCanceled = false;
+      IOperation next = Apply(scope);
+      OnExecuted();
+      return next;
+    }
+    public virtual void Abort() {
+      myCanceled = true;
+    }
+    public virtual void Reset() {
+      OnInitialized();
+    }
+
+    public virtual IOperation Apply(IScope scope) {
+      return null;
+    }
+
+    public event EventHandler NameChanged;
+    protected virtual void OnNameChanged() {
+      if (NameChanged != null) {
+        NameChanged(this, new EventArgs());
+      }
+    }
+    public event EventHandler BreakpointChanged;
+    protected virtual void OnBreakpointChanged() {
+      if (BreakpointChanged != null) {
+        BreakpointChanged(this, new EventArgs());
+      }
+    }
+    public event EventHandler<OperatorIndexEventArgs> SubOperatorAdded;
+    protected virtual void OnSubOperatorAdded(IOperator subOperator, int index) {
+      if (SubOperatorAdded != null)
+        SubOperatorAdded(this, new OperatorIndexEventArgs(subOperator, index));
+    }
+    public event EventHandler<OperatorIndexEventArgs> SubOperatorRemoved;
+    protected virtual void OnSubOperatorRemoved(IOperator subOperator, int index) {
+      if (SubOperatorRemoved != null)
+        SubOperatorRemoved(this, new OperatorIndexEventArgs(subOperator, index));
+    }
+    public event EventHandler<VariableInfoEventArgs> VariableInfoAdded;
+    protected virtual void OnVariableInfoAdded(IVariableInfo variableInfo) {
+      if (VariableInfoAdded != null)
+        VariableInfoAdded(this, new VariableInfoEventArgs(variableInfo));
+    }
+    public event EventHandler<VariableInfoEventArgs> VariableInfoRemoved;
+    protected virtual void OnVariableInfoRemoved(IVariableInfo variableInfo) {
+      if (VariableInfoRemoved != null)
+        VariableInfoRemoved(this, new VariableInfoEventArgs(variableInfo));
+    }
+    public event EventHandler<VariableEventArgs> VariableAdded;
+    protected virtual void OnVariableAdded(IVariable variable) {
+      if (VariableAdded != null)
+        VariableAdded(this, new VariableEventArgs(variable));
+    }
+    public event EventHandler<VariableEventArgs> VariableRemoved;
+    protected virtual void OnVariableRemoved(IVariable variable) {
+      if (VariableRemoved != null)
+        VariableRemoved(this, new VariableEventArgs(variable));
+    }
+    public event EventHandler Initialized;
+    protected virtual void OnInitialized() {
+      if (Initialized != null) {
+        Initialized(this, new EventArgs());
+      }
+    }
+    public event EventHandler Executed;
+    protected virtual void OnExecuted() {
+      if (Executed != null) {
+        Executed(this, new EventArgs());
+      }
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name;
+      node.Attributes.Append(nameAttribute);
+      if (Breakpoint) {
+        XmlAttribute breakpointAttribute = document.CreateAttribute("Breakpoint");
+        breakpointAttribute.Value = Breakpoint.ToString();
+        node.Attributes.Append(breakpointAttribute);
+      }
+      XmlNode subOperatorsNode = document.CreateNode(XmlNodeType.Element, "SubOperators", null);
+      for (int i = 0; i < SubOperators.Count; i++)
+        subOperatorsNode.AppendChild(PersistenceManager.Persist(SubOperators[i], document, persistedObjects));
+      node.AppendChild(subOperatorsNode);
+      XmlNode infosNode = document.CreateNode(XmlNodeType.Element, "VariableInfos", null);
+      foreach (IVariableInfo info in myVariableInfos.Values)
+        infosNode.AppendChild(PersistenceManager.Persist(info, document, persistedObjects));
+      node.AppendChild(infosNode);
+      XmlNode variablesNode = document.CreateNode(XmlNodeType.Element, "Variables", null);
+      foreach (IVariable variable in myVariables.Values)
+        variablesNode.AppendChild(PersistenceManager.Persist(variable, document, persistedObjects));
+      node.AppendChild(variablesNode);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+      if (node.Attributes["Breakpoint"] != null)
+        myBreakpoint = bool.Parse(node.Attributes["Breakpoint"].Value);
+      XmlNode subOperatorsNode = node.SelectSingleNode("SubOperators");
+      for (int i = 0; i < subOperatorsNode.ChildNodes.Count; i++)
+        AddSubOperator((IOperator)PersistenceManager.Restore(subOperatorsNode.ChildNodes[i], restoredObjects));
+      XmlNode infosNode = node.SelectSingleNode("VariableInfos");
+      myVariableInfos.Clear();
+      foreach (XmlNode infoNode in infosNode.ChildNodes)
+        AddVariableInfo((IVariableInfo)PersistenceManager.Restore(infoNode, restoredObjects));
+      XmlNode variablesNode = node.SelectSingleNode("Variables");
+      myVariables.Clear();
+      foreach (XmlNode variableNode in variablesNode.ChildNodes)
+        AddVariable((IVariable)PersistenceManager.Restore(variableNode, restoredObjects));
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.Designer.cs	(revision 2)
@@ -0,0 +1,84 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseDescriptionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(423, 333);
+      this.descriptionTextBox.TabIndex = 0;
+      // 
+      // OperatorBaseDescriptionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.descriptionTextBox);
+      this.Name = "OperatorBaseDescriptionView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private TextBox descriptionTextBox;
+
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.cs	(revision 2)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class OperatorBaseDescriptionView : ViewBase {
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set { base.Item = value; }
+    }
+
+    public OperatorBaseDescriptionView() {
+      InitializeComponent();
+      Caption = "Operator";
+    }
+    public OperatorBaseDescriptionView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Operator == null) {
+        Caption = "Operator";
+        descriptionTextBox.Text = "";
+        descriptionTextBox.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        descriptionTextBox.Text = Operator.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseDescriptionView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.Designer.cs	(revision 2)
@@ -0,0 +1,144 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseVariableInfosView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      foreach (ListViewItem item in variableInfosListView.Items) {
+        ((IVariableInfo)item.Tag).ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variableInfosGroupBox = new System.Windows.Forms.GroupBox();
+      this.variableInfosListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.variableInfoDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variableInfosGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.variableInfosGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variableInfoDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.SplitterDistance = 203;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // variableInfosGroupBox
+      // 
+      this.variableInfosGroupBox.Controls.Add(this.variableInfosListView);
+      this.variableInfosGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableInfosGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variableInfosGroupBox.Name = "variableInfosGroupBox";
+      this.variableInfosGroupBox.Size = new System.Drawing.Size(203, 333);
+      this.variableInfosGroupBox.TabIndex = 0;
+      this.variableInfosGroupBox.TabStop = false;
+      this.variableInfosGroupBox.Text = "&Variable Infos";
+      // 
+      // variableInfosListView
+      // 
+      this.variableInfosListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.variableInfosListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableInfosListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variableInfosListView.HideSelection = false;
+      this.variableInfosListView.Location = new System.Drawing.Point(3, 16);
+      this.variableInfosListView.Name = "variableInfosListView";
+      this.variableInfosListView.Size = new System.Drawing.Size(197, 314);
+      this.variableInfosListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.variableInfosListView.TabIndex = 0;
+      this.variableInfosListView.UseCompatibleStateImageBehavior = false;
+      this.variableInfosListView.View = System.Windows.Forms.View.Details;
+      this.variableInfosListView.SelectedIndexChanged += new System.EventHandler(this.variableInfosListView_SelectedIndexChanged);
+      this.variableInfosListView.SizeChanged += new System.EventHandler(this.variableInfosListView_SizeChanged);
+      // 
+      // variableInfoDetailsGroupBox
+      // 
+      this.variableInfoDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableInfoDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variableInfoDetailsGroupBox.Name = "variableInfoDetailsGroupBox";
+      this.variableInfoDetailsGroupBox.Size = new System.Drawing.Size(216, 333);
+      this.variableInfoDetailsGroupBox.TabIndex = 0;
+      this.variableInfoDetailsGroupBox.TabStop = false;
+      this.variableInfoDetailsGroupBox.Text = "&Details";
+      // 
+      // OperatorBaseVariableInfosView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "OperatorBaseVariableInfosView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.variableInfosGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    protected SplitContainer splitContainer;
+    protected GroupBox variableInfosGroupBox;
+    protected ListView variableInfosListView;
+    protected GroupBox variableInfoDetailsGroupBox;
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.cs	(revision 2)
@@ -0,0 +1,149 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class OperatorBaseVariableInfosView : ViewBase {
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set { base.Item = value; }
+    }
+    public ICollection<IVariableInfo> SelectedVariableInfos {
+      get {
+        List<IVariableInfo> selected = new List<IVariableInfo>();
+        foreach (ListViewItem item in variableInfosListView.SelectedItems)
+          selected.Add((IVariableInfo)item.Tag);
+        return selected.AsReadOnly();
+      }
+    }
+
+    public OperatorBaseVariableInfosView() {
+      InitializeComponent();
+      variableInfosListView.Columns[0].Width = Math.Max(0, variableInfosListView.Width - 25);
+      Caption = "Operator";
+    }
+    public OperatorBaseVariableInfosView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    protected override void RemoveItemEvents() {
+      Operator.VariableInfoAdded -= new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoAdded);
+      Operator.VariableInfoRemoved -= new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoRemoved);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Operator.VariableInfoAdded += new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoAdded);
+      Operator.VariableInfoRemoved += new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoRemoved);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      variableInfoDetailsGroupBox.Controls.Clear();
+      if (Operator == null) {
+        Caption = "Operator";
+        variableInfosListView.Enabled = false;
+        variableInfoDetailsGroupBox.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        variableInfosListView.Enabled = true;
+        foreach (ListViewItem item in variableInfosListView.Items) {
+          ((IVariableInfo)item.Tag).ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+        }
+        variableInfosListView.Items.Clear();
+        foreach (IVariableInfo variableInfo in Operator.VariableInfos) {
+          ListViewItem item = new ListViewItem();
+          item.Text = variableInfo.ActualName;
+          item.Tag = variableInfo;
+          variableInfosListView.Items.Add(item);
+          variableInfo.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+        }
+        if (variableInfosListView.Items.Count > 0)
+          variableInfosListView.SelectedIndices.Add(0);
+      }
+    }
+
+    private void variableInfosListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (variableInfoDetailsGroupBox.Controls.Count > 0)
+        variableInfoDetailsGroupBox.Controls[0].Dispose();
+      variableInfoDetailsGroupBox.Controls.Clear();
+      variableInfoDetailsGroupBox.Enabled = false;
+      if (variableInfosListView.SelectedItems.Count == 1) {
+        IVariableInfo variableInfo = (IVariableInfo)variableInfosListView.SelectedItems[0].Tag;
+        Control control = (Control)variableInfo.CreateView();
+        variableInfoDetailsGroupBox.Controls.Add(control);
+        control.Dock = DockStyle.Fill;
+        variableInfoDetailsGroupBox.Enabled = true;
+      }
+      OnSelectedVariableInfosChanged();
+    }
+
+    public event EventHandler SelectedVariableInfosChanged;
+    protected virtual void OnSelectedVariableInfosChanged() {
+      if (SelectedVariableInfosChanged != null)
+        SelectedVariableInfosChanged(this, new EventArgs());
+    }
+
+    #region Size Changed Events
+    private void variableInfosListView_SizeChanged(object sender, EventArgs e) {
+      if (variableInfosListView.Columns.Count > 0)
+        variableInfosListView.Columns[0].Width = Math.Max(0, variableInfosListView.Width - 25);
+    }
+    #endregion
+
+    #region VariableInfo Events
+    private void VariableInfo_ActualNameChanged(object sender, EventArgs e) {
+      IVariableInfo variableInfo = (IVariableInfo)sender;
+      foreach (ListViewItem item in variableInfosListView.Items) {
+        if (item.Tag == variableInfo)
+          item.Text = variableInfo.ActualName;
+      }
+    }
+    #endregion
+
+    #region OperatorBase Events
+    private void OperatorBase_VariableInfoAdded(object sender, VariableInfoEventArgs e) {
+      ListViewItem item = new ListViewItem();
+      item.Text = e.VariableInfo.ActualName;
+      item.Tag = e.VariableInfo;
+      variableInfosListView.Items.Add(item);
+      e.VariableInfo.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+    }
+    private void OperatorBase_VariableInfoRemoved(object sender, VariableInfoEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in variableInfosListView.Items) {
+        if (item.Tag == e.VariableInfo)
+          itemToDelete = item;
+      }
+      e.VariableInfo.ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+      variableInfosListView.Items.Remove(itemToDelete);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseVariableInfosView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.Designer.cs	(revision 2)
@@ -0,0 +1,177 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseVariablesView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseItemDialog != null) chooseItemDialog.Dispose();
+      foreach (ListViewItem item in variablesListView.Items) {
+        ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.removeVariableButton = new System.Windows.Forms.Button();
+      this.addVariableButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesListView = new System.Windows.Forms.ListView();
+      this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
+      this.variableDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // removeVariableButton
+      // 
+      this.removeVariableButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeVariableButton.Enabled = false;
+      this.removeVariableButton.Location = new System.Drawing.Point(81, 310);
+      this.removeVariableButton.Name = "removeVariableButton";
+      this.removeVariableButton.Size = new System.Drawing.Size(75, 23);
+      this.removeVariableButton.TabIndex = 2;
+      this.removeVariableButton.Text = "&Remove";
+      this.removeVariableButton.UseVisualStyleBackColor = true;
+      this.removeVariableButton.Click += new System.EventHandler(this.removeVariableButton_Click);
+      // 
+      // addVariableButton
+      // 
+      this.addVariableButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addVariableButton.Location = new System.Drawing.Point(0, 310);
+      this.addVariableButton.Name = "addVariableButton";
+      this.addVariableButton.Size = new System.Drawing.Size(75, 23);
+      this.addVariableButton.TabIndex = 1;
+      this.addVariableButton.Text = "&Add...";
+      this.addVariableButton.UseVisualStyleBackColor = true;
+      this.addVariableButton.Click += new System.EventHandler(this.addVariableButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.variablesGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variableDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 304);
+      this.splitContainer.SplitterDistance = 212;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.variablesListView);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(212, 304);
+      this.variablesGroupBox.TabIndex = 0;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "&Variables";
+      // 
+      // variablesListView
+      // 
+      this.variablesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader2});
+      this.variablesListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variablesListView.HideSelection = false;
+      this.variablesListView.Location = new System.Drawing.Point(3, 16);
+      this.variablesListView.Name = "variablesListView";
+      this.variablesListView.Size = new System.Drawing.Size(206, 285);
+      this.variablesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.variablesListView.TabIndex = 0;
+      this.variablesListView.UseCompatibleStateImageBehavior = false;
+      this.variablesListView.View = System.Windows.Forms.View.Details;
+      this.variablesListView.SelectedIndexChanged += new System.EventHandler(this.variablesListView_SelectedIndexChanged);
+      this.variablesListView.SizeChanged += new System.EventHandler(this.variablesListView_SizeChanged);
+      this.variablesListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.variablesListView_KeyDown);
+      // 
+      // variableDetailsGroupBox
+      // 
+      this.variableDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variableDetailsGroupBox.Name = "variableDetailsGroupBox";
+      this.variableDetailsGroupBox.Size = new System.Drawing.Size(207, 304);
+      this.variableDetailsGroupBox.TabIndex = 0;
+      this.variableDetailsGroupBox.TabStop = false;
+      this.variableDetailsGroupBox.Text = "&Details";
+      // 
+      // OperatorBaseVariablesView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Controls.Add(this.removeVariableButton);
+      this.Controls.Add(this.addVariableButton);
+      this.Name = "OperatorBaseVariablesView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ColumnHeader columnHeader2;
+    protected SplitContainer splitContainer;
+    protected GroupBox variablesGroupBox;
+    protected ListView variablesListView;
+    protected GroupBox variableDetailsGroupBox;
+    protected Button removeVariableButton;
+    protected Button addVariableButton;
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.cs	(revision 2)
@@ -0,0 +1,190 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class OperatorBaseVariablesView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set { base.Item = value; }
+    }
+
+    public OperatorBaseVariablesView() {
+      InitializeComponent();
+      variablesListView.Columns[0].Width = Math.Max(0, variablesListView.Width - 25);
+      Caption = "Operator";
+    }
+    public OperatorBaseVariablesView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    protected override void RemoveItemEvents() {
+      Operator.VariableAdded -= new EventHandler<VariableEventArgs>(OperatorBase_VariableAdded);
+      Operator.VariableRemoved -= new EventHandler<VariableEventArgs>(OperatorBase_VariableRemoved);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Operator.VariableAdded += new EventHandler<VariableEventArgs>(OperatorBase_VariableAdded);
+      Operator.VariableRemoved += new EventHandler<VariableEventArgs>(OperatorBase_VariableRemoved);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      variableDetailsGroupBox.Controls.Clear();
+      if (Operator == null) {
+        Caption = "Operator";
+        variablesListView.Enabled = false;
+        variableDetailsGroupBox.Enabled = false;
+        removeVariableButton.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        variablesListView.Enabled = true;
+        foreach (ListViewItem item in variablesListView.Items) {
+          ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+        }
+        variablesListView.Items.Clear();
+        foreach (IVariable variable in Operator.Variables) {
+          ListViewItem item = new ListViewItem();
+          item.Text = variable.Name;
+          item.Tag = variable;
+          variablesListView.Items.Add(item);
+          variable.NameChanged += new EventHandler(Variable_NameChanged);
+        }
+        if (variablesListView.Items.Count > 0)
+          variablesListView.SelectedIndices.Add(0);
+      }
+    }
+
+    private void variablesListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (variableDetailsGroupBox.Controls.Count > 0)
+        variableDetailsGroupBox.Controls[0].Dispose();
+      variableDetailsGroupBox.Controls.Clear();
+      variableDetailsGroupBox.Enabled = false;
+      removeVariableButton.Enabled = false;
+      if (variablesListView.SelectedItems.Count > 0) {
+        removeVariableButton.Enabled = true;
+      }
+      if (variablesListView.SelectedItems.Count == 1) {
+        IVariable variable = (IVariable)variablesListView.SelectedItems[0].Tag;
+        Control editor = (Control)variable.CreateView();
+        variableDetailsGroupBox.Controls.Add(editor);
+        editor.Dock = DockStyle.Fill;
+        variableDetailsGroupBox.Enabled = true;
+      }
+    }
+
+    #region Size Changed Events
+    private void variablesListView_SizeChanged(object sender, EventArgs e) {
+      if (variablesListView.Columns.Count > 0)
+        variablesListView.Columns[0].Width = Math.Max(0, variablesListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void variablesListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (variablesListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in variablesListView.SelectedItems)
+            Operator.RemoveVariable(((IVariable)item.Tag).Name);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addVariableButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Add Variable";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        IVariable newVariable = new Variable(chooseItemDialog.Item.GetType().Name, chooseItemDialog.Item);
+        int index = 1;
+        bool valid = true;
+        string name = null;
+        do {
+          valid = true;
+          name = newVariable.Name + " (" + index.ToString() + ")";
+          foreach (IVariable existingVariable in Operator.Variables) {
+            if (existingVariable.Name == name) {
+              valid = false;
+              index++;
+            }
+          }
+        } while (!valid);
+        newVariable.Name = name;
+        Operator.AddVariable(newVariable);
+      }
+    }
+    private void removeVariableButton_Click(object sender, EventArgs e) {
+      if (variablesListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in variablesListView.SelectedItems)
+          Operator.RemoveVariable(((IVariable)item.Tag).Name);
+      }
+    }
+    #endregion
+
+    #region Variable Events
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      foreach (ListViewItem item in variablesListView.Items) {
+        if (item.Tag == variable)
+          item.Text = variable.Name;
+      }
+    }
+    #endregion
+
+    #region OperatorBase Events
+    private void OperatorBase_VariableAdded(object sender, VariableEventArgs e) {
+      ListViewItem item = new ListViewItem();
+      item.Text = e.Variable.Name;
+      item.Tag = e.Variable;
+      variablesListView.Items.Add(item);
+      // select the new item
+      foreach(ListViewItem oldSelected in variablesListView.SelectedItems) {
+        oldSelected.Selected = false;
+      }
+      item.Selected = true;
+      e.Variable.NameChanged += new EventHandler(Variable_NameChanged);
+    }
+    private void OperatorBase_VariableRemoved(object sender, VariableEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in variablesListView.Items) {
+        if (item.Tag == e.Variable)
+          itemToDelete = item;
+      }
+      e.Variable.NameChanged -= new EventHandler(Variable_NameChanged);
+      variablesListView.Items.Remove(itemToDelete);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseVariablesView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseView.Designer.cs	(revision 2)
@@ -0,0 +1,194 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.variablesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariablesView = new HeuristicLab.Core.OperatorBaseVariablesView();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
+      this.tabControl.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.variablesTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.variablesTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(423, 333);
+      this.tabControl.TabIndex = 0;
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(415, 307);
+      this.variableInfosTabPage.TabIndex = 0;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(409, 301);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      // 
+      // variablesTabPage
+      // 
+      this.variablesTabPage.Controls.Add(this.operatorBaseVariablesView);
+      this.variablesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variablesTabPage.Name = "variablesTabPage";
+      this.variablesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variablesTabPage.Size = new System.Drawing.Size(415, 307);
+      this.variablesTabPage.TabIndex = 1;
+      this.variablesTabPage.Text = "Local Variables";
+      this.variablesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariablesView
+      // 
+      this.operatorBaseVariablesView.Caption = "Operator";
+      this.operatorBaseVariablesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariablesView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariablesView.Name = "operatorBaseVariablesView";
+      this.operatorBaseVariablesView.Operator = null;
+      this.operatorBaseVariablesView.Size = new System.Drawing.Size(409, 301);
+      this.operatorBaseVariablesView.TabIndex = 0;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(415, 307);
+      this.constraintsTabPage.TabIndex = 2;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constrainedItemBaseView
+      // 
+      this.constrainedItemBaseView.Caption = "Constrained Data";
+      this.constrainedItemBaseView.ConstrainedItem = null;
+      this.constrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constrainedItemBaseView.Name = "constrainedItemBaseView";
+      this.constrainedItemBaseView.Size = new System.Drawing.Size(409, 301);
+      this.constrainedItemBaseView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.operatorBaseDescriptionView);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(415, 307);
+      this.descriptionTabPage.TabIndex = 3;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseDescriptionView
+      // 
+      this.operatorBaseDescriptionView.Caption = "Operator";
+      this.operatorBaseDescriptionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseDescriptionView.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.operatorBaseDescriptionView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
+      this.operatorBaseDescriptionView.Operator = null;
+      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(409, 301);
+      this.operatorBaseDescriptionView.TabIndex = 0;
+      // 
+      // OperatorBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "OperatorBaseView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.tabControl.ResumeLayout(false);
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.variablesTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected TabControl tabControl;
+    protected TabPage variableInfosTabPage;
+    protected TabPage variablesTabPage;
+    private TabPage constraintsTabPage;
+    protected ConstrainedItemBaseView constrainedItemBaseView;
+    protected OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    protected OperatorBaseVariablesView operatorBaseVariablesView;
+    private TabPage descriptionTabPage;
+    private OperatorBaseDescriptionView operatorBaseDescriptionView;
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseView.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class OperatorBaseView : ViewBase {
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set {base.Item = value; }
+    }
+
+    public OperatorBaseView() {
+      InitializeComponent();
+      Caption = "Operator";
+    }
+    public OperatorBaseView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    protected override void RemoveItemEvents() {
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseVariablesView.Operator = null;
+      constrainedItemBaseView.ConstrainedItem = null;
+      operatorBaseDescriptionView.Operator = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorBaseVariableInfosView.Operator = Operator;
+      operatorBaseVariablesView.Operator = Operator;
+      constrainedItemBaseView.ConstrainedItem = Operator;
+      operatorBaseDescriptionView.Operator = Operator;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Operator == null) {
+        Caption = "Operator";
+        tabControl.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        tabControl.Enabled = true;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorBaseView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorBaseView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/OperatorEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class OperatorEventArgs : ItemEventArgs {
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+    }
+
+    public OperatorEventArgs(IOperator op)
+      : base(op) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorGraph.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorGraph.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorGraph.cs	(revision 2)
@@ -0,0 +1,154 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class OperatorGraph : ItemBase, IOperatorGraph {
+    private IDictionary<Guid, IOperator> myOperators;
+    public ICollection<IOperator> Operators {
+      get { return myOperators.Values; }
+    }
+    private IOperator myInitialOperator;
+    public IOperator InitialOperator {
+      get { return myInitialOperator; }
+      set {
+        if (myInitialOperator != value) {
+          myInitialOperator = value;
+          OnInitialOperatorChanged();
+        }
+      }
+    }
+
+    public OperatorGraph() {
+      myOperators = new Dictionary<Guid, IOperator>();
+    }
+
+    public override IView CreateView() {
+      return new OperatorGraphView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorGraph clone = new OperatorGraph();
+      clonedObjects.Add(Guid, clone);
+      foreach (IOperator op in Operators)
+        clone.AddOperator((IOperator)Auxiliary.Clone(op, clonedObjects));
+      if (InitialOperator != null)
+        clone.myInitialOperator = (IOperator)Auxiliary.Clone(InitialOperator, clonedObjects);
+      return clone;
+    }
+
+    public void AddOperator(IOperator op) {
+      if (!myOperators.ContainsKey(op.Guid)) {
+        myOperators.Add(op.Guid, op);
+        OnOperatorAdded(op);
+
+        foreach (IOperator subOperator in op.SubOperators)
+          AddOperator(subOperator);
+      }
+    }
+    public void RemoveOperator(Guid guid) {
+      IOperator op = GetOperator(guid);
+      if (op != null) {
+        foreach (IOperator o in Operators) {
+          int i = 0;
+          while (i < o.SubOperators.Count) {
+            if (o.SubOperators[i] == op)
+              o.RemoveSubOperator(i);
+            else
+              i++;
+          }
+        }
+        if (InitialOperator == op)
+          InitialOperator = null;
+        myOperators.Remove(op.Guid);
+        OnOperatorRemoved(op);
+      }
+    }
+    public IOperator GetOperator(Guid guid) {
+      IOperator op;
+      if (myOperators.TryGetValue(guid, out op))
+        return op;
+      else
+        return null;
+    }
+    public void Reset() {
+      foreach (IOperator op in Operators)
+        op.Reset();
+    }
+    public void Clear() {
+      Guid[] guids = new Guid[Operators.Count];
+      int i = 0;
+      foreach (IOperator op in Operators) {
+        guids[i] = op.Guid;
+        i++;
+      }
+      for (int j = 0; j < guids.Length; j++)
+        RemoveOperator(guids[j]);
+    }
+
+    public event EventHandler<OperatorEventArgs> OperatorAdded;
+    protected virtual void OnOperatorAdded(IOperator op) {
+      if (OperatorAdded != null)
+        OperatorAdded(this, new OperatorEventArgs(op));
+    }
+    public event EventHandler<OperatorEventArgs> OperatorRemoved;
+    protected virtual void OnOperatorRemoved(IOperator op) {
+      if (OperatorRemoved != null)
+        OperatorRemoved(this, new OperatorEventArgs(op));
+    }
+    public event EventHandler InitialOperatorChanged;
+    protected virtual void OnInitialOperatorChanged() {
+      if (InitialOperatorChanged != null)
+        InitialOperatorChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode ops = document.CreateNode(XmlNodeType.Element, "Operators", null);
+      foreach (IOperator op in myOperators.Values)
+        ops.AppendChild(PersistenceManager.Persist(op, document, persistedObjects));
+      node.AppendChild(ops);
+      if (InitialOperator != null)
+        node.AppendChild(PersistenceManager.Persist("InitialOperator", InitialOperator, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      XmlNode ops = node.SelectSingleNode("Operators");
+      for (int i = 0; i < ops.ChildNodes.Count; i++) {
+        XmlNode opNode = ops.ChildNodes[i];
+        IOperator op = (IOperator)PersistenceManager.Restore(opNode, restoredObjects);
+        myOperators.Add(op.Guid, op);
+      }
+
+      XmlNode initial = node.SelectSingleNode("InitialOperator");
+      if (initial != null)
+        myInitialOperator = (IOperator)PersistenceManager.Restore(initial, restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorGraphView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorGraphView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorGraphView.Designer.cs	(revision 2)
@@ -0,0 +1,288 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class OperatorGraphView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseOperatorDialog != null) chooseOperatorDialog.Dispose();
+      if (graphTreeView.Nodes.Count > 0) {
+        RemoveTreeNode(graphTreeView.Nodes[0]);
+        graphTreeView.Nodes.Clear();
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OperatorGraphView));
+      this.operatorsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.operatorsContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.initialOperatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.addOperatorButton = new System.Windows.Forms.Button();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.graphGroupBox = new System.Windows.Forms.GroupBox();
+      this.graphTreeView = new System.Windows.Forms.TreeView();
+      this.graphContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.breakpointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.operatorsContextMenuStrip.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.operatorsGroupBox.SuspendLayout();
+      this.graphGroupBox.SuspendLayout();
+      this.graphContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // operatorsListView
+      // 
+      this.operatorsListView.AllowDrop = true;
+      this.operatorsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.operatorsListView.ContextMenuStrip = this.operatorsContextMenuStrip;
+      this.operatorsListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.operatorsListView.HideSelection = false;
+      this.operatorsListView.LabelEdit = true;
+      this.operatorsListView.Location = new System.Drawing.Point(3, 16);
+      this.operatorsListView.Name = "operatorsListView";
+      this.operatorsListView.Size = new System.Drawing.Size(169, 243);
+      this.operatorsListView.SmallImageList = this.imageList;
+      this.operatorsListView.TabIndex = 0;
+      this.operatorsListView.UseCompatibleStateImageBehavior = false;
+      this.operatorsListView.View = System.Windows.Forms.View.Details;
+      this.operatorsListView.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.operatorsListView_AfterLabelEdit);
+      this.operatorsListView.SelectedIndexChanged += new System.EventHandler(this.operatorsListView_SelectedIndexChanged);
+      this.operatorsListView.SizeChanged += new System.EventHandler(this.operatorsListView_SizeChanged);
+      this.operatorsListView.DoubleClick += new System.EventHandler(this.operatorsListView_DoubleClick);
+      this.operatorsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.operatorsListView_DragDrop);
+      this.operatorsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.operatorsListView_DragEnter);
+      this.operatorsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.operatorsListView_KeyDown);
+      this.operatorsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.operatorsListView_ItemDrag);
+      this.operatorsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.operatorsListView_DragOver);
+      // 
+      // operatorsContextMenuStrip
+      // 
+      this.operatorsContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.initialOperatorToolStripMenuItem,
+            this.viewToolStripMenuItem});
+      this.operatorsContextMenuStrip.Name = "operatorsContextMenuStrip";
+      this.operatorsContextMenuStrip.Size = new System.Drawing.Size(159, 48);
+      this.operatorsContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.operatorsContextMenuStrip_Opening);
+      // 
+      // initialOperatorToolStripMenuItem
+      // 
+      this.initialOperatorToolStripMenuItem.CheckOnClick = true;
+      this.initialOperatorToolStripMenuItem.Name = "initialOperatorToolStripMenuItem";
+      this.initialOperatorToolStripMenuItem.Size = new System.Drawing.Size(158, 22);
+      this.initialOperatorToolStripMenuItem.Text = "&Initial Operator";
+      this.initialOperatorToolStripMenuItem.ToolTipText = "Set as initial operator";
+      this.initialOperatorToolStripMenuItem.Click += new System.EventHandler(this.initialOperatorToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(158, 22);
+      this.viewToolStripMenuItem.Text = "&View...";
+      this.viewToolStripMenuItem.ToolTipText = "View operator";
+      this.viewToolStripMenuItem.Click += new System.EventHandler(this.viewToolStripMenuItem_Click);
+      // 
+      // imageList
+      // 
+      this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
+      this.imageList.TransparentColor = System.Drawing.Color.Magenta;
+      this.imageList.Images.SetKeyName(0, "Operator.bmp");
+      this.imageList.Images.SetKeyName(1, "CombinedOperator.bmp");
+      this.imageList.Images.SetKeyName(2, "ProgrammableOperator.bmp");
+      // 
+      // addOperatorButton
+      // 
+      this.addOperatorButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addOperatorButton.Location = new System.Drawing.Point(0, 268);
+      this.addOperatorButton.Name = "addOperatorButton";
+      this.addOperatorButton.Size = new System.Drawing.Size(75, 23);
+      this.addOperatorButton.TabIndex = 0;
+      this.addOperatorButton.Text = "&Add...";
+      this.addOperatorButton.UseVisualStyleBackColor = true;
+      this.addOperatorButton.Click += new System.EventHandler(this.addOperatorButton_Click);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorsGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.graphGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(475, 262);
+      this.splitContainer1.SplitterDistance = 175;
+      this.splitContainer1.TabIndex = 4;
+      // 
+      // operatorsGroupBox
+      // 
+      this.operatorsGroupBox.Controls.Add(this.operatorsListView);
+      this.operatorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorsGroupBox.Name = "operatorsGroupBox";
+      this.operatorsGroupBox.Size = new System.Drawing.Size(175, 262);
+      this.operatorsGroupBox.TabIndex = 3;
+      this.operatorsGroupBox.TabStop = false;
+      this.operatorsGroupBox.Text = "&Operators";
+      // 
+      // graphGroupBox
+      // 
+      this.graphGroupBox.Controls.Add(this.graphTreeView);
+      this.graphGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.graphGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.graphGroupBox.Name = "graphGroupBox";
+      this.graphGroupBox.Size = new System.Drawing.Size(296, 262);
+      this.graphGroupBox.TabIndex = 0;
+      this.graphGroupBox.TabStop = false;
+      this.graphGroupBox.Text = "&Graph";
+      // 
+      // graphTreeView
+      // 
+      this.graphTreeView.AllowDrop = true;
+      this.graphTreeView.ContextMenuStrip = this.graphContextMenuStrip;
+      this.graphTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.graphTreeView.HideSelection = false;
+      this.graphTreeView.Location = new System.Drawing.Point(3, 16);
+      this.graphTreeView.Name = "graphTreeView";
+      this.graphTreeView.ShowNodeToolTips = true;
+      this.graphTreeView.Size = new System.Drawing.Size(290, 243);
+      this.graphTreeView.TabIndex = 0;
+      this.graphTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.graphTreeView_BeforeExpand);
+      this.graphTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragDrop);
+      this.graphTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.graphTreeView_AfterSelect);
+      this.graphTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.graphTreeView_MouseDown);
+      this.graphTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragEnter);
+      this.graphTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.graphTreeView_KeyDown);
+      this.graphTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.graphTreeView_ItemDrag);
+      this.graphTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragOver);
+      // 
+      // graphContextMenuStrip
+      // 
+      this.graphContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.breakpointToolStripMenuItem,
+            this.viewToolStripMenuItem1});
+      this.graphContextMenuStrip.Name = "graphContextMenuStrip";
+      this.graphContextMenuStrip.Size = new System.Drawing.Size(137, 48);
+      this.graphContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.graphContextMenuStrip_Opening);
+      // 
+      // breakpointToolStripMenuItem
+      // 
+      this.breakpointToolStripMenuItem.CheckOnClick = true;
+      this.breakpointToolStripMenuItem.Name = "breakpointToolStripMenuItem";
+      this.breakpointToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.breakpointToolStripMenuItem.Text = "&Breakpoint";
+      this.breakpointToolStripMenuItem.ToolTipText = "Halt engine execution after executing the operator";
+      this.breakpointToolStripMenuItem.Click += new System.EventHandler(this.breakpointToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem1
+      // 
+      this.viewToolStripMenuItem1.Name = "viewToolStripMenuItem1";
+      this.viewToolStripMenuItem1.Size = new System.Drawing.Size(136, 22);
+      this.viewToolStripMenuItem1.Text = "&View...";
+      this.viewToolStripMenuItem1.ToolTipText = "View operator";
+      this.viewToolStripMenuItem1.Click += new System.EventHandler(this.viewToolStripMenuItem_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Location = new System.Drawing.Point(81, 268);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 1;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // OperatorGraphView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.addOperatorButton);
+      this.Controls.Add(this.removeButton);
+      this.Name = "OperatorGraphView";
+      this.Size = new System.Drawing.Size(475, 291);
+      this.operatorsContextMenuStrip.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.operatorsGroupBox.ResumeLayout(false);
+      this.graphGroupBox.ResumeLayout(false);
+      this.graphContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button addOperatorButton;
+    private System.Windows.Forms.ListView operatorsListView;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.GroupBox operatorsGroupBox;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.ContextMenuStrip operatorsContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem initialOperatorToolStripMenuItem;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.GroupBox graphGroupBox;
+    private System.Windows.Forms.TreeView graphTreeView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ContextMenuStrip graphContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem breakpointToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem1;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorGraphView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorGraphView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorGraphView.cs	(revision 2)
@@ -0,0 +1,485 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public partial class OperatorGraphView : ViewBase {
+    private ChooseOperatorDialog chooseOperatorDialog;
+    private Dictionary<IOperator, IList<TreeNode>> operatorNodeTable;
+
+    public IOperatorGraph OperatorGraph {
+      get { return (IOperatorGraph)Item; }
+      set { base.Item = value; }
+    }
+
+    public OperatorGraphView() {
+      InitializeComponent();
+      operatorNodeTable = new Dictionary<IOperator, IList<TreeNode>>();
+      operatorsListView.Columns[0].Width = Math.Max(0, operatorsListView.Width - 25);
+      Caption = "Operator Graph";
+    }
+    public OperatorGraphView(IOperatorGraph operatorGraph)
+      : this() {
+      OperatorGraph = operatorGraph;
+    }
+
+    protected override void RemoveItemEvents() {
+      OperatorGraph.OperatorAdded -= new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorAdded);
+      OperatorGraph.OperatorRemoved -= new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorRemoved);
+      OperatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      OperatorGraph.OperatorAdded += new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorAdded);
+      OperatorGraph.OperatorRemoved += new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorRemoved);
+      OperatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (graphTreeView.Nodes.Count > 0)
+        RemoveTreeNode(graphTreeView.Nodes[0]);
+      graphTreeView.SelectedNode = null;
+      graphTreeView.Nodes.Clear();
+      graphTreeView.Enabled = false;
+      operatorsListView.Items.Clear();
+      removeButton.Enabled = false;
+      if (OperatorGraph == null) {
+        Caption = "Operator Graph";
+        operatorsListView.Enabled = false;
+        addOperatorButton.Enabled = false;
+      } else {
+        Caption = "Operator Graph (" + OperatorGraph.GetType().Name + ")";
+        foreach (IOperator op in OperatorGraph.Operators) {
+          operatorsListView.Items.Add(CreateListViewItem(op));
+        }
+        operatorsListView.Enabled = true;
+        addOperatorButton.Enabled = true;
+        if (OperatorGraph.InitialOperator != null) {
+          graphTreeView.Nodes.Add(CreateTreeNode(OperatorGraph.InitialOperator));
+          graphTreeView.Enabled = true;
+        }
+      }
+    }
+
+    private ListViewItem CreateListViewItem(IOperator op) {
+      ListViewItem item = new ListViewItem();
+      item.Text = op.Name;
+      item.Tag = op;
+      item.ImageIndex = 0;
+      if (op.GetType().Name == "CombinedOperator")
+        item.ImageIndex = 1;
+      else if (op.GetType().Name == "ProgrammableOperator")
+        item.ImageIndex = 2;
+      if (op == OperatorGraph.InitialOperator)
+        item.Font = new Font(operatorsListView.Font, FontStyle.Bold);
+      return item;
+    }
+
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.Tag = op;
+      if (op.Breakpoint)
+        node.ForeColor = Color.Red;
+
+      if (!operatorNodeTable.ContainsKey(op)) {
+        operatorNodeTable.Add(op, new List<TreeNode>());
+        op.NameChanged += new EventHandler(Operator_NameChanged);
+        op.BreakpointChanged += new EventHandler(Operator_BreakpointChanged);
+        op.SubOperatorAdded += new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorAdded);
+        op.SubOperatorRemoved += new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorRemoved);
+      }
+      operatorNodeTable[op].Add(node);
+
+      for (int i = 0; i < op.SubOperators.Count; i++)
+        node.Nodes.Add(new TreeNode());
+      return node;
+    }
+
+    private void RemoveTreeNode(TreeNode node) {
+      foreach (TreeNode child in node.Nodes)
+        RemoveTreeNode(child);
+
+      IOperator op = (IOperator)node.Tag;
+      if (op != null) {
+        operatorNodeTable[op].Remove(node);
+        if (operatorNodeTable[op].Count == 0) {
+          op.NameChanged -= new EventHandler(Operator_NameChanged);
+          op.BreakpointChanged -= new EventHandler(Operator_BreakpointChanged);
+          op.SubOperatorAdded -= new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorAdded);
+          op.SubOperatorRemoved -= new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorRemoved);
+          operatorNodeTable.Remove(op);
+        }
+      }
+    }
+
+    #region ListView Events
+    private void operatorsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = false;
+      if (operatorsListView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+    }
+    private void operatorsListView_DoubleClick(object sender, EventArgs e) {
+      if (operatorsListView.SelectedItems.Count == 1) {
+        IOperator op = (IOperator)operatorsListView.SelectedItems[0].Tag;
+        IView view = op.CreateView();
+        if (view != null)
+          PluginManager.ControlManager.ShowControl(view);
+      }
+    }
+    #endregion
+
+    #region TreeView Events
+    private void graphTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
+      TreeNode node = e.Node;
+      IOperator op = (IOperator)node.Tag;
+      for (int i = 0; i < node.Nodes.Count; i++) {
+        if (node.Nodes[i].Tag == null) {
+          node.Nodes[i].Remove();
+          node.Nodes.Insert(i, CreateTreeNode(op.SubOperators[i]));
+        }
+      }
+    }
+    private void graphTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      IOperator op = (IOperator)e.Node.Tag;
+      foreach (ListViewItem item in operatorsListView.Items)
+        item.Selected = item.Tag == op;
+    }
+    #endregion
+
+    #region Size Changed Events
+    private void operatorsListView_SizeChanged(object sender, EventArgs e) {
+      if (operatorsListView.Columns.Count > 0)
+        operatorsListView.Columns[0].Width = Math.Max(0, operatorsListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void operatorsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (operatorsListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in operatorsListView.SelectedItems)
+            OperatorGraph.RemoveOperator(((IOperator)item.Tag).Guid);
+        }
+      }
+      if (e.KeyCode == Keys.F2) {
+        if (operatorsListView.SelectedItems.Count == 1)
+          operatorsListView.SelectedItems[0].BeginEdit();
+      }
+    }
+    private void graphTreeView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        TreeNode node = graphTreeView.SelectedNode;
+        if ((node != null) && (node.Parent != null)) {
+          IOperator parent = (IOperator)node.Parent.Tag;
+          parent.RemoveSubOperator(node.Index);
+        }
+      }
+    }
+    #endregion
+
+    #region Edit Events
+    private void operatorsListView_AfterLabelEdit(object sender, LabelEditEventArgs e) {
+      e.CancelEdit = false;
+
+      string name = e.Label;
+      if (name != null) {
+        IOperator op = (IOperator)operatorsListView.Items[e.Item].Tag;
+        op.Name = name;
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addOperatorButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK)
+        OperatorGraph.AddOperator(chooseOperatorDialog.Operator);
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      if (operatorsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in operatorsListView.SelectedItems)
+          OperatorGraph.RemoveOperator(((IOperator)item.Tag).Guid);
+      }
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void operatorsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem item = (ListViewItem)e.Item;
+      IOperator op = (IOperator)item.Tag;
+      DataObject data = new DataObject();
+      data.SetData("IOperator", op);
+      data.SetData("DragSource", operatorsListView);
+      DoDragDrop(data, DragDropEffects.Copy);
+    }
+    private void operatorsListView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator"))
+        e.Effect = DragDropEffects.Copy;
+    }
+    private void operatorsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator"))
+        e.Effect = DragDropEffects.Copy;
+    }
+    private void operatorsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          op = (IOperator)op.Clone();
+          OperatorGraph.AddOperator(op);
+        }
+      }
+    }
+    private void graphTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      if (node.Parent != null) {
+        IOperator op = (IOperator)node.Tag;
+        IOperator parent = (IOperator)node.Parent.Tag;
+        int index = node.Index;
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", graphTreeView);
+        data.SetData("ParentOperator", parent);
+        data.SetData("Index", index);
+        DoDragDrop(data, DragDropEffects.Move);
+      }
+    }
+    private void graphTreeView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = graphTreeView.GetNodeAt(p);
+        if (node != null) {
+          if ((e.Data.GetDataPresent("ParentOperator")) && (node.Parent != null)) {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == graphTreeView))
+              e.Effect = DragDropEffects.Move;
+          } else {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == operatorsListView))
+              e.Effect = DragDropEffects.Copy;
+          }
+        }
+      }
+    }
+    private void graphTreeView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = graphTreeView.GetNodeAt(p);
+        if (node != null) {
+          if ((e.Data.GetDataPresent("ParentOperator")) && (node.Parent != null)) {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == graphTreeView))
+              e.Effect = DragDropEffects.Move;
+          } else {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == operatorsListView))
+              e.Effect = DragDropEffects.Copy;
+          }
+        }
+      }
+    }
+    private void graphTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));
+          TreeNode node = graphTreeView.GetNodeAt(p);
+          if (e.Data.GetDataPresent("ParentOperator")) {
+            if (node.Parent != null) {
+              TreeNode parentNode = node.Parent;
+              IOperator oldParent = (IOperator)e.Data.GetData("ParentOperator");
+              int oldIndex = (int)e.Data.GetData("Index");
+              IOperator newParent = (IOperator)node.Parent.Tag;
+              int newIndex = node.Index;
+              ICollection<IConstraint> violatedConstraints;
+              ICollection<IConstraint> violatedConstraints2;
+              oldParent.TryRemoveSubOperator(oldIndex, out violatedConstraints);
+              newParent.TryAddSubOperator(op, newIndex, out violatedConstraints2);
+              if ((violatedConstraints.Count == 0) && (violatedConstraints2.Count == 0)) {
+                graphTreeView.SelectedNode = parentNode.Nodes[newIndex];
+              } else {
+                List<IConstraint> allViolatedConstraints = new List<IConstraint>(violatedConstraints);
+                allViolatedConstraints.AddRange(violatedConstraints2);
+                if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(allViolatedConstraints) == DialogResult.Yes) {
+                  if (violatedConstraints.Count > 0)
+                    oldParent.RemoveSubOperator(oldIndex);
+                  if (violatedConstraints2.Count > 0)
+                    newParent.AddSubOperator(op, newIndex);
+                  graphTreeView.SelectedNode = parentNode.Nodes[newIndex];
+                } else {
+                  if (violatedConstraints.Count == 0)
+                    oldParent.AddSubOperator(op, oldIndex);
+                  if (violatedConstraints2.Count == 0)
+                    newParent.RemoveSubOperator(newIndex);
+                }
+              }
+            }
+          } else {
+            if (node != null) {
+              IOperator parent = (IOperator)node.Tag;
+              ICollection<IConstraint> violatedConstraints;
+              if (parent.TryAddSubOperator(op, out violatedConstraints)) {
+                graphTreeView.SelectedNode = node.Nodes[node.Nodes.Count - 1];
+              } else if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(violatedConstraints) == DialogResult.Yes) {
+                parent.AddSubOperator(op);
+                graphTreeView.SelectedNode = node.Nodes[node.Nodes.Count - 1];
+              }
+            }
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Context Menu Events
+    private void operatorsContextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem.Enabled = false;
+      initialOperatorToolStripMenuItem.Enabled = false;
+      initialOperatorToolStripMenuItem.Checked = false;
+      if (operatorsListView.SelectedItems.Count == 1) {
+        IOperator op = (IOperator)operatorsListView.SelectedItems[0].Tag;
+        IView view = op.CreateView();
+        if (view != null) {
+          viewToolStripMenuItem.Enabled = true;
+          viewToolStripMenuItem.Tag = view;
+        }
+        initialOperatorToolStripMenuItem.Enabled = true;
+        initialOperatorToolStripMenuItem.Tag = op;
+        if (op == OperatorGraph.InitialOperator)
+          initialOperatorToolStripMenuItem.Checked = true;
+      }
+    }
+    private void viewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IView view = (IView)((ToolStripMenuItem)sender).Tag;
+      PluginManager.ControlManager.ShowControl(view);
+    }
+    private void initialOperatorToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (initialOperatorToolStripMenuItem.Checked) {
+        foreach (ListViewItem item in operatorsListView.Items)
+          item.Font = operatorsListView.Font;
+        operatorsListView.SelectedItems[0].Font = new Font(operatorsListView.Font, FontStyle.Bold);
+        OperatorGraph.InitialOperator = (IOperator)initialOperatorToolStripMenuItem.Tag;
+      } else {
+        operatorsListView.SelectedItems[0].Font = operatorsListView.Font;
+        OperatorGraph.InitialOperator = null;
+      }
+    }
+    private void graphContextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem1.Enabled = false;
+      breakpointToolStripMenuItem.Enabled = false;
+      breakpointToolStripMenuItem.Checked = false;
+      if (graphTreeView.SelectedNode != null) {
+        IOperator op = (IOperator)graphTreeView.SelectedNode.Tag;
+        IView view = op.CreateView();
+        if (view != null) {
+          viewToolStripMenuItem1.Enabled = true;
+          viewToolStripMenuItem1.Tag = view;
+        }
+        breakpointToolStripMenuItem.Enabled = true;
+        breakpointToolStripMenuItem.Tag = op;
+        if (op.Breakpoint)
+          breakpointToolStripMenuItem.Checked = true;
+      }
+    }
+    private void breakpointToolStripMenuItem_Click(object sender, EventArgs e) {
+      IOperator op = (IOperator)breakpointToolStripMenuItem.Tag;
+      op.Breakpoint = breakpointToolStripMenuItem.Checked;
+    }
+    #endregion
+
+    #region OperatorGraph Events
+    private void OperatorGraph_OperatorAdded(object sender, OperatorEventArgs e) {
+      operatorsListView.Items.Add(CreateListViewItem(e.Operator));
+    }
+    private void OperatorGraph_OperatorRemoved(object sender, OperatorEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in operatorsListView.Items) {
+        if (item.Tag == e.Operator)
+          itemToDelete = item;
+      }
+      itemToDelete.Remove();
+    }
+    private void OperatorGraph_InitialOperatorChanged(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+
+    #region Operator Events
+    private void Operator_NameChanged(object sender, EventArgs e) {
+      IOperator op = (IOperator)sender;
+      foreach (TreeNode node in operatorNodeTable[op])
+        node.Text = op.Name;
+    }
+    private void Operator_BreakpointChanged(object sender, EventArgs e) {
+      IOperator op = (IOperator)sender;
+      foreach (TreeNode node in operatorNodeTable[op]) {
+        if (op.Breakpoint)
+          node.ForeColor = Color.Red;
+        else
+          node.ForeColor = graphTreeView.ForeColor;
+      }
+    }
+    private void Operator_SubOperatorAdded(object sender, OperatorIndexEventArgs e) {
+      IOperator op = (IOperator)sender;
+      if (operatorNodeTable.ContainsKey(op)) {
+        TreeNode[] nodes = new TreeNode[operatorNodeTable[op].Count];
+        operatorNodeTable[op].CopyTo(nodes, 0);
+        foreach (TreeNode node in nodes)
+          node.Nodes.Insert(e.Index, CreateTreeNode(e.Operator));
+      }
+    }
+    private void Operator_SubOperatorRemoved(object sender, OperatorIndexEventArgs e) {
+      IOperator op = (IOperator)sender;
+      if (operatorNodeTable.ContainsKey(op)) {
+        TreeNode[] nodes = new TreeNode[operatorNodeTable[op].Count];
+        operatorNodeTable[op].CopyTo(nodes, 0);
+        foreach (TreeNode node in nodes) {
+          RemoveTreeNode(node.Nodes[e.Index]);
+          node.Nodes.RemoveAt(e.Index);
+        }
+      }
+    }
+    #endregion
+
+    #region Mouse Events
+    private void graphTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button != MouseButtons.Right) return;
+      TreeNode clickedNode = graphTreeView.GetNodeAt(e.X, e.Y);
+      if (clickedNode != null) {
+        graphTreeView.SelectedNode = clickedNode;
+        graphTreeView.Refresh();
+      }
+    }
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorGraphView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorGraphView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorGraphView.resx	(revision 2)
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="operatorsContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>434, 17</value>
+  </metadata>
+  <data name="imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC6
+        CgAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABEAMAAQEBAAEYBgABDP8APwABuQGiAZIBYAFIATQBYgFJATUBYQFJATcBZgFJATQBYgFKATQBYgFJ
+        ATUBYQFIATQBYQFIATgBZQFIATMBZQFKATYBYQFHATaBAAHlAssBnQFNASUBnQFNASUBnQFNASUB3QK7
+        DAABuwGhAZMB/QH/Af4BuQGiAZIBuQGiAZIBtQGgAZgBswGkAZEBtAGhAZIBuQGiAZMBtQGiAZMBugGk
+        AZIBuAGhAZEBYwFKATZRAAHsAdIB7AFyASQBcQHmAcwB5gkAAfsBwwH7AcsBHwHNAfwB1QH8EgAB8ALh
+        AZ0BTQElAfoBnQFiAeEBhgFYAeEBhgFYAZ0BTQElDAABtwGiAZMG/wH+AfoB+QH8AfoB+QH2AfEB8AHx
+        AeYB4gHsAd0B1AHlAdMByAHhAckBvQG3AaMBkgFhAUgBNE4AAe0B2AHtAakBUAGoAYABMAF/AXUBJwF1
+        AesB0QHrAwAB/QHpAf4BywEfAc0BywEfAc0BywEfAc0DAAHpAfAB6QEnAW8BKAEaAWcBHAEaAWcBHAHp
+        AfAB6QHnAZoBcwH8Ab4BlwH7AcABoQH7AbEBggGiAVYBMQHyAuQB1QHdAeIBQAF5AY4BNwFiAXUBKAFV
+        AWoBKwFVAWwBKgFVAWgBJwFRAWgBMwFcAXUBLAFYAWkB+QL3AfUB7AHoAfEB5AHcAeoB2QHQAeUBzwHE
+        AbcBogGTAWIBSQE1SwAB6AHRAegBqgFQAakBzAFnAcsBfgEuAX4BlgE4AZUBewErAXoB8AHVAfAB2AFr
+        AdcB/wFeAfwBywEfAc0BywEfAc0B6QHwAekBLAGCATMBWgGvAV8BWwGpAV8BTQGcAU8BGQF3ARwB9wLw
+        AecBmgFzAecBmgFzAecBmgFzAfMC5wMAATwBdAGNAaYB1wHfAbcB5wHzAa4B5QHyAbAB5gHxAa4B5gHx
+        AaQB3gHqAUYBeAGUAUEBowHTATkBeQGSAfsB8gHvAfIB6QHlAewB3wHXAecB1AHMAbQBoQGSAWIBSQE1
+        NgABqwHwAfcBqwHiAeUBrAHOAcwBrQG7AbUBrgGnAZwDAAHkAcoB5AGpAVABqAHTAWsB0gHUAW4B0wF/
+        ATABfgGfATwBnwGOATUBjQF9AS0BfAHYAWsB1wHkAUIB5gH/AaYB/wHLAR8BzQErAYIBOQGIAdcBkwF+
+        Ac0BiAFkAbMBaQEiAXoBJwHpAfAB6QYAAVYBUAFKCQABYAGVAaoBUAGEAZsBRgF8AZMBVwGJAZ8BVgGK
+        AaEBVgGIAZ4BVAGDAZkBXAGFAZwBRwGtAdgBPQF/AZwB/AH7AfcB9gHvAewB7wHlAd4B6wHbAdQBtwGi
+        AZMBYgFJATVIAAGqAVIBqQHSAWoB0QHVAW8B1QG9AXABvAHeAZgB3QGPAUYBjgGdATwBnAF+AS4BfgHY
+        AWsB1wH/AaYB/wHYAWsB1wH8AdUB/AHpAfAB6QErAYIBOQEmAX4BLgEiAXoBJwHpAfAB6QFWAVABSgMA
+        AVYBUAFKDwAB1QHdAeIBfgGpAbwBiAHUAesBXwHBAekBXwHBAesBTwG5AegBTAGyAeIBPgGEAaEBYQGL
+        AZ4B+gH9AfsB+QH2AfIB9AHrAecB7AHgAdoBuQGiAZIBYgFJATUzAAGrAfAB9wGrAeUB6QGsAtUBrAHE
+        AcEBrQG1AawBrgGkAZgDAAGoAU8BpwHSAW0B0QG8AW8BuwHvAaUB7gH7AZ8B+gHvAZ0B7gGXAVIBlgF8
+        AS4BfAH9AekB/gHYAWsB1wH9AekB/gFWAVABShIAAVYBUAFKFQABPgF2AY8BhQHZAfIBcQHNAfABZwHE
+        AesBWAG+AegBPQF6AZQBdAGhAbYD/gL/Af4B/wH6AfkB9wHwAe0B8QHmAeIBuQGiAZIBYgFJATVIAAGn
+        AVABpgG8AW8BuwHvAaUB7gH7AZsB+gH7AZgB+gH7AZkB+gHnAZgB5gGRAU4BkAwAAVYBUAFKDAABVgFQ
+        AUoDAAFWAVABSgH7AcMB+wHLAR8BzQH8AdUB/AYAAV0BjwGhAXcBoAGvAZUB5AH3AYoB3AH1AXwB1AHy
+        AWoBxAHmAT0BeAGYAe4B9gH1Af0C/wH7Av8D/gH6AfYC9QHvAeoBuQGiAZIBYgFJATU5AAGrAfAB9wGs
+        AtUBrgG0AawBrgGZAYoD/QHPAYgBzwHiAa8B4gH7AasB+gH7AZgB+gH7AZgB+gHqAZAB6QHPAYgBzwH0
+        AeYB9A8AA4YBEgFbAYUBhwGwAcgBVgFQAUoGAAH9AekB/gHLAR8BzQHLAR8BzQHLAR8BzQYAAW0BmwGs
+        Aa4B9AH7AasB8AH/AZ0B6wH4AZcB5AH3ATUBdgGVAVEBpAHDATgBbgGFATkBawF/Af8B/gH/Af0B/wH+
+        A/8B+gH3AfMBuQGiAZIBYgFJATVIAAHwAdQB8AHPAYgBzwHuAb4B7gH7Aa4B+gHsAZEB6wHPAYgBzwHz
+        AeAB8hIAASgBfAGrAQwBrQHuARoBZwGTAZsBvgHRBgAB2AFrAdcB/wFeAfwBywEfAc0BywEfAc0GAAE2
+        AW4BhwGtAfIB+wGvAfQB/QGxAfQB/QGnAe0B+gEkAWEBewFUAaMBxAFfAbIB0QEaAUkBXgP+A/8B/gH8
+        AfsBtwGiAZMBuwGiAZIBYwFKATZLAAHyAdsB8gHPAYgBzwHjAawB4wHPAYgBzwHzAeMB8xUAAQwBrQHu
+        ASgBfAGrAQwBrQHuARoBZwGTBgAB2AFrAdcB5AFCAeYB/wGmAf8BywEfAc0GAAHVAd0B4gF7Aa0BvwF3
+        AaYBuwFwAZ4BtgFoAZcBrQFjAY4BowEwAWQBdQE0AWQBdgH/Af4D/wL+Af0B/wG3AaIBkwFhAUkBNQFk
+        AUwBNgFiAUsBNU4AAfIB2wHyAc8BiAHPAfAB4wHwGAABBAG0AfwBZgHMAf8BKAF8AasBIQFyAaAGAAHY
+        AWsB1wH/AaYB/wHYAWsB1wH8AdUB/A8AAdIBwAGvAf8B/gP/Af4B/Qf/Af4B/wH+A/8B/AG4AaQBkwHU
+        AcQBvQFlAUoBNQHgAdsB11EAAf4B+wH+GwAB2QHlAewBBAG0AfwBZgHMAf8BKAF8AasGAAH9AekB/gHY
+        AWsB1wH9AekB/hIAAdkBwgGyAf4B/wL9A/8B/gX/Af0C/wH+Af8B/AH/Af0BvgGrAZwBZQFKATUB4AHb
+        Add1AAHZAeUB7AEEAbQB/AG4AdAB3SEAAdgBwgGwAdsBwQGzAdcBwgGzAdgBwgGwAdkBwgGzAdIBwwGw
+        AdUBvgGvAc4BuQGqAcoBswGjAeAB2wHXNgABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGA
+        FwAD/wEABv8CAAT/AfADAAP/AeAB8AMAAf8B4wGPAcAB8AMAAf8BwQEIBQAB/wGAAQABAQQAAcECAAE3
+        BAAB/wIAAS8BgAMAAYEBAAEPAd8BwAMAAf8BAAH3AaEBgAMAAeABAAH4AWEBgAMAAf8BAQH4AWEBgAMA
+        Af8BgwH4AWEBgAMAAf8BxwH4AWEB8AMAAf8B7wH4AWMB8AEBAgAC/wH8AX8B8AEDAgAL
+</value>
+  </data>
+  <metadata name="graphContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>204, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>349, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Core/OperatorGroup.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorGroup.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorGroup.cs	(revision 2)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class OperatorGroup : StorableBase, IOperatorGroup {
+    private string myName;
+    public string Name {
+      get { return myName; }
+      set {
+        if (myName != value) {
+          myName = value;
+          OnNameChanged();
+        }
+      }
+    }
+    private List<IOperatorGroup> mySubGroups;
+    public ICollection<IOperatorGroup> SubGroups {
+      get { return mySubGroups.AsReadOnly(); }
+    }
+    private List<IOperator> myOperators;
+    public ICollection<IOperator> Operators {
+      get { return myOperators.AsReadOnly(); }
+    }
+
+    public OperatorGroup() {
+      myName = "Anonymous";
+      mySubGroups = new List<IOperatorGroup>();
+      myOperators = new List<IOperator>();
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorGroup clone = (OperatorGroup)base.Clone(clonedObjects);
+      clone.myName = Name;
+      foreach (IOperatorGroup group in SubGroups)
+        clone.AddSubGroup((IOperatorGroup)Auxiliary.Clone(group, clonedObjects));
+      foreach (IOperator op in Operators)
+        clone.AddOperator((IOperator)Auxiliary.Clone(op, clonedObjects));
+      return clone;
+    }
+
+    public virtual void AddSubGroup(IOperatorGroup group) {
+      mySubGroups.Add(group);
+    }
+    public virtual void RemoveSubGroup(IOperatorGroup group) {
+      mySubGroups.Remove(group);
+    }
+    public virtual void AddOperator(IOperator op) {
+      myOperators.Add(op);
+    }
+    public virtual void RemoveOperator(IOperator op) {
+      myOperators.Remove(op);
+    }
+
+    public event EventHandler NameChanged;
+    protected virtual void OnNameChanged() {
+      if (NameChanged != null) {
+        NameChanged(this, new EventArgs());
+      }
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name;
+      node.Attributes.Append(nameAttribute);
+      XmlNode subGroupsNode = document.CreateNode(XmlNodeType.Element, "SubGroups", null);
+      foreach (IOperatorGroup group in SubGroups)
+        subGroupsNode.AppendChild(PersistenceManager.Persist(group, document, persistedObjects));
+      node.AppendChild(subGroupsNode);
+      XmlNode operatorsNode = document.CreateNode(XmlNodeType.Element, "Operators", null);
+      foreach (IOperator op in Operators)
+        operatorsNode.AppendChild(PersistenceManager.Persist(op, document, persistedObjects));
+      node.AppendChild(operatorsNode);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+      XmlNode subGroupsNode = node.SelectSingleNode("SubGroups");
+      foreach (XmlNode subGroupNode in subGroupsNode.ChildNodes)
+        AddSubGroup((IOperatorGroup)PersistenceManager.Restore(subGroupNode, restoredObjects));
+      XmlNode operatorsNode = node.SelectSingleNode("Operators");
+      foreach (XmlNode operatorNode in operatorsNode.ChildNodes)
+        AddOperator((IOperator)PersistenceManager.Restore(operatorNode, restoredObjects));
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorIndexEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorIndexEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorIndexEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class OperatorIndexEventArgs : ItemIndexEventArgs {
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+    }
+
+    public OperatorIndexEventArgs(IOperator op, int index)
+      : base(op, index) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorLibrary.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorLibrary.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorLibrary.cs	(revision 2)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class OperatorLibrary : ItemBase, IOperatorLibrary, IEditable {
+    private IOperatorGroup myGroup;
+    public IOperatorGroup Group {
+      get { return myGroup; }
+    }
+
+    public OperatorLibrary() {
+      myGroup = new OperatorGroup();
+    }
+
+    public override IView CreateView() {
+      return new OperatorLibraryEditor(this);
+    }
+    public virtual IEditor CreateEditor() {
+      return new OperatorLibraryEditor(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorLibrary clone = new OperatorLibrary();
+      clonedObjects.Add(Guid, clone);
+      clone.myGroup = (IOperatorGroup)Auxiliary.Clone(Group, clonedObjects);
+      return clone;
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("OperatorGroup", Group, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myGroup = (IOperatorGroup)PersistenceManager.Restore(node.SelectSingleNode("OperatorGroup"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.Designer.cs	(revision 2)
@@ -0,0 +1,196 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class OperatorLibraryEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseOperatorDialog != null) chooseOperatorDialog.Dispose();
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.operatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.operatorsTreeView = new System.Windows.Forms.TreeView();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addGroupButton = new System.Windows.Forms.Button();
+      this.addOperatorButton = new System.Windows.Forms.Button();
+      this.importButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.operatorsGroupBox.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // operatorsGroupBox
+      // 
+      this.operatorsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorsGroupBox.Controls.Add(this.operatorsTreeView);
+      this.operatorsGroupBox.Enabled = false;
+      this.operatorsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorsGroupBox.Name = "operatorsGroupBox";
+      this.operatorsGroupBox.Size = new System.Drawing.Size(522, 366);
+      this.operatorsGroupBox.TabIndex = 0;
+      this.operatorsGroupBox.TabStop = false;
+      this.operatorsGroupBox.Text = "&Operators";
+      // 
+      // operatorsTreeView
+      // 
+      this.operatorsTreeView.AllowDrop = true;
+      this.operatorsTreeView.ContextMenuStrip = this.contextMenuStrip;
+      this.operatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorsTreeView.HideSelection = false;
+      this.operatorsTreeView.LabelEdit = true;
+      this.operatorsTreeView.Location = new System.Drawing.Point(3, 16);
+      this.operatorsTreeView.Name = "operatorsTreeView";
+      this.operatorsTreeView.ShowNodeToolTips = true;
+      this.operatorsTreeView.Size = new System.Drawing.Size(516, 347);
+      this.operatorsTreeView.TabIndex = 0;
+      this.operatorsTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.operatorsTreeView_AfterLabelEdit);
+      this.operatorsTreeView.DoubleClick += new System.EventHandler(this.operatorsTreeView_DoubleClick);
+      this.operatorsTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.operatorsTreeView_DragDrop);
+      this.operatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.operatorsTreeView_AfterSelect);
+      this.operatorsTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.operatorsTreeView_MouseDown);
+      this.operatorsTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.operatorsTreeView_DragEnter);
+      this.operatorsTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.operatorsTreeView_KeyDown);
+      this.operatorsTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.operatorsTreeView_ItemDrag);
+      this.operatorsTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.operatorsTreeView_DragOver);
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.viewToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(120, 26);
+      this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
+      this.viewToolStripMenuItem.Text = "&View...";
+      this.viewToolStripMenuItem.Click += new System.EventHandler(this.viewToolStripMenuItem_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Enabled = false;
+      this.removeButton.Location = new System.Drawing.Point(220, 372);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(104, 23);
+      this.removeButton.TabIndex = 3;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addGroupButton
+      // 
+      this.addGroupButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addGroupButton.Enabled = false;
+      this.addGroupButton.Location = new System.Drawing.Point(0, 372);
+      this.addGroupButton.Name = "addGroupButton";
+      this.addGroupButton.Size = new System.Drawing.Size(104, 23);
+      this.addGroupButton.TabIndex = 1;
+      this.addGroupButton.Text = "&Add &Group...";
+      this.addGroupButton.UseVisualStyleBackColor = true;
+      this.addGroupButton.Click += new System.EventHandler(this.addGroupButton_Click);
+      // 
+      // addOperatorButton
+      // 
+      this.addOperatorButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addOperatorButton.Enabled = false;
+      this.addOperatorButton.Location = new System.Drawing.Point(110, 372);
+      this.addOperatorButton.Name = "addOperatorButton";
+      this.addOperatorButton.Size = new System.Drawing.Size(104, 23);
+      this.addOperatorButton.TabIndex = 2;
+      this.addOperatorButton.Text = "Add &Operator...";
+      this.addOperatorButton.UseVisualStyleBackColor = true;
+      this.addOperatorButton.Click += new System.EventHandler(this.addOperatorButton_Click);
+      // 
+      // importButton
+      // 
+      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.importButton.Location = new System.Drawing.Point(330, 372);
+      this.importButton.Name = "importButton";
+      this.importButton.Size = new System.Drawing.Size(104, 23);
+      this.importButton.TabIndex = 4;
+      this.importButton.Text = "&Import...";
+      this.importButton.UseVisualStyleBackColor = true;
+      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "item";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Import ...";
+      // 
+      // OperatorLibraryEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.importButton);
+      this.Controls.Add(this.operatorsGroupBox);
+      this.Controls.Add(this.addGroupButton);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.addOperatorButton);
+      this.Name = "OperatorLibraryEditor";
+      this.Size = new System.Drawing.Size(522, 395);
+      this.operatorsGroupBox.ResumeLayout(false);
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox operatorsGroupBox;
+    private System.Windows.Forms.TreeView operatorsTreeView;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addGroupButton;
+    private System.Windows.Forms.Button addOperatorButton;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.Button importButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.cs	(revision 2)
@@ -0,0 +1,326 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public partial class OperatorLibraryEditor : EditorBase {
+    private ChooseOperatorDialog chooseOperatorDialog;
+
+    public IOperatorLibrary OperatorLibrary {
+      get { return (IOperatorLibrary)Item; }
+      set { base.Item = value; }
+    }
+
+    public OperatorLibraryEditor() {
+      InitializeComponent();
+      operatorsTreeView.TreeViewNodeSorter = new NodeSorter();
+      Caption = "Operator Library";
+    }
+    public OperatorLibraryEditor(IOperatorLibrary operatorLibrary)
+      : this() {
+      OperatorLibrary = operatorLibrary;
+    }
+
+    private class NodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      operatorsTreeView.Nodes.Clear();
+      addGroupButton.Enabled = false;
+      addOperatorButton.Enabled = false;
+      removeButton.Enabled = false;
+      if (OperatorLibrary == null) {
+        Caption = "Operator Library";
+        operatorsGroupBox.Enabled = false;
+      } else {
+        Caption = OperatorLibrary.Group.Name + " (" + OperatorLibrary.GetType().Name + ")";
+        operatorsGroupBox.Enabled = true;
+        operatorsTreeView.Nodes.Add(CreateTreeNode(OperatorLibrary.Group));
+        operatorsTreeView.Sort();
+      }
+    }
+
+    private TreeNode CreateTreeNode(IOperatorGroup group) {
+      TreeNode node = new TreeNode();
+      node.Text = group.Name;
+      node.ForeColor = Color.LightGray;
+      node.Tag = group;
+
+      foreach (IOperator op in group.Operators)
+        node.Nodes.Add(CreateTreeNode(op));
+      foreach (IOperatorGroup subGroup in group.SubGroups)
+        node.Nodes.Add(CreateTreeNode(subGroup));
+      return node;
+    }
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.ToolTipText = op.GetType().Name;
+      node.Tag = op;
+      return node;
+    }
+    private void RemoveTreeNode(TreeNode node) {
+      if (node.Tag is IOperatorGroup) {
+        IOperatorGroup group = node.Tag as IOperatorGroup;
+        IOperatorGroup parent = node.Parent.Tag as IOperatorGroup;
+        parent.RemoveSubGroup(group);
+      } else if (node.Tag is IOperator) {
+        IOperator op = node.Tag as IOperator;
+        IOperatorGroup group = node.Parent.Tag as IOperatorGroup;
+        group.RemoveOperator(op);
+      }
+      node.Remove();
+      EnableDisableButtons();
+    }
+
+    private void EnableDisableButtons() {
+      addGroupButton.Enabled = false;
+      addOperatorButton.Enabled = false;
+      removeButton.Enabled = false;
+      operatorsTreeView.Focus();
+
+      if (operatorsTreeView.SelectedNode != null) {
+        if (operatorsTreeView.SelectedNode.Parent != null)
+          removeButton.Enabled = true;
+        if (operatorsTreeView.SelectedNode.Tag is IOperatorGroup) {
+          addGroupButton.Enabled = true;
+          addOperatorButton.Enabled = true;
+        }
+      }
+    }
+
+    private void MergeOperatorLibrary(IOperatorGroup src, IOperatorGroup dest) {
+      foreach(IOperator op in src.Operators) {
+        if(!Contains(dest, op)) {
+          dest.AddOperator(op);
+        }
+      }
+
+      foreach(OperatorGroup group in src.SubGroups) {
+        bool mergedIntoExistingGroup = false;
+        // try to find a group in dest with matching name
+        foreach(OperatorGroup destGroup in dest.SubGroups) {
+          if(group.Name == destGroup.Name) {
+            MergeOperatorLibrary(group, destGroup);
+            mergedIntoExistingGroup = true;
+            break;
+          }
+        }
+        if(!mergedIntoExistingGroup) {
+          OperatorGroup newGroup = new OperatorGroup();
+          newGroup.Name = group.Name;
+          dest.AddSubGroup(newGroup);
+          MergeOperatorLibrary(group, newGroup);
+        }
+      }
+    }
+
+    private bool Contains(IOperatorGroup group, IOperator op) {
+      foreach(IOperator destOp in group.Operators) {
+        if(op.Name == destOp.Name) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+
+    #region TreeView Events
+    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      EnableDisableButtons();
+    }
+    private void operatorsTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
+      e.CancelEdit = false;
+
+      string name = e.Label;
+      if (name != null) {
+        if (e.Node.Tag is IOperatorGroup)
+          ((IOperatorGroup)e.Node.Tag).Name = name;
+        else if (e.Node.Tag is IOperator)
+          ((IOperator)e.Node.Tag).Name = name;
+      }
+    }
+    private void operatorsTreeView_DoubleClick(object sender, EventArgs e) {
+      if (operatorsTreeView.SelectedNode != null) {
+        IOperator op = operatorsTreeView.SelectedNode.Tag as IOperator;
+        if (op != null) {
+          IView view = op.CreateView();
+          if (view != null)
+            PluginManager.ControlManager.ShowControl(view);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addOperatorButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        TreeNode node = operatorsTreeView.SelectedNode;
+        IOperatorGroup group = node.Tag as IOperatorGroup;
+        group.AddOperator(chooseOperatorDialog.Operator);
+        node.Nodes.Add(CreateTreeNode(chooseOperatorDialog.Operator));
+        operatorsTreeView.Sort();
+        EnableDisableButtons();
+      }
+    }
+    private void addGroupButton_Click(object sender, EventArgs e) {
+      TreeNode node = operatorsTreeView.SelectedNode;
+      IOperatorGroup newGroup = new OperatorGroup();
+      IOperatorGroup group = node.Tag as OperatorGroup;
+      group.AddSubGroup(newGroup);
+      node.Nodes.Add(CreateTreeNode(newGroup));
+      operatorsTreeView.Sort();
+      EnableDisableButtons();
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      TreeNode node = operatorsTreeView.SelectedNode;
+      RemoveTreeNode(node);
+    }
+    private void importButton_Click(object sender, EventArgs e) {
+      if(openFileDialog.ShowDialog() == DialogResult.OK) {
+        IOperatorLibrary loadedLibrary = (PersistenceManager.Load(openFileDialog.FileName) as IOperatorLibrary);
+        if(loadedLibrary == null) {
+          Auxiliary.ShowErrorMessageBox("The selected file does not contain an operator library");
+        } else {
+          MergeOperatorLibrary(loadedLibrary.Group, OperatorLibrary.Group);
+          Refresh();
+        }
+      }
+    }
+    #endregion
+
+    #region Key Events
+    private void operatorsTreeView_KeyDown(object sender, KeyEventArgs e) {
+      TreeNode node = operatorsTreeView.SelectedNode;
+      if ((e.KeyCode == Keys.Delete) && (node != null) && (node.Parent != null))
+        RemoveTreeNode(operatorsTreeView.SelectedNode);
+      if ((e.KeyCode == Keys.F2) && (node != null))
+        node.BeginEdit();
+    }
+    #endregion
+
+
+    #region Mouse Events
+    private void operatorsTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button != MouseButtons.Right) return;
+      TreeNode clickedNode = operatorsTreeView.GetNodeAt(e.X, e.Y);
+      if (clickedNode != null) {
+        operatorsTreeView.SelectedNode = clickedNode;
+        operatorsTreeView.Refresh();
+      }
+    }
+    #endregion
+
+
+    #region Context Menu Events
+    private void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem.Enabled = false;
+      if (operatorsTreeView.SelectedNode != null) {
+        IOperator op = operatorsTreeView.SelectedNode.Tag as IOperator;
+        if (op != null) {
+          IView view = op.CreateView();
+          if (view != null) {
+            viewToolStripMenuItem.Enabled = true;
+            viewToolStripMenuItem.Tag = view;
+          }
+        }
+      }
+    }
+    private void viewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IView view = (IView)viewToolStripMenuItem.Tag;
+      PluginManager.ControlManager.ShowControl(view);
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void operatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      IOperator op = node.Tag as IOperator;
+      if (op != null) {
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", operatorsTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    private void operatorsTreeView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = operatorsTreeView.GetNodeAt(p);
+        if ((node != null) && (node.Tag is IOperatorGroup))
+          e.Effect = DragDropEffects.Copy;
+      }
+    }
+    private void operatorsTreeView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = operatorsTreeView.GetNodeAt(p);
+        if ((node != null) && (node.Tag is IOperatorGroup))
+          e.Effect = DragDropEffects.Copy;
+      }
+    }
+    private void operatorsTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
+          TreeNode node = operatorsTreeView.GetNodeAt(p);
+          if (node != null) {
+            op = (IOperator)op.Clone();
+
+            while (op.SubOperators.Count > 0)
+              op.RemoveSubOperator(0);
+
+            IOperatorGroup group = (IOperatorGroup)node.Tag;
+            group.AddOperator(op);
+            node.Nodes.Add(CreateTreeNode(op));
+            operatorsTreeView.Sort();
+            EnableDisableButtons();
+          }
+        }
+      }
+    }
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/OperatorLibraryEditor.resx	(revision 2)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>139, 17</value>
+  </metadata>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>277, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Core/PersistenceManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/PersistenceManager.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/PersistenceManager.cs	(revision 2)
@@ -0,0 +1,80 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.IO;
+
+namespace HeuristicLab.Core {
+  public static class PersistenceManager {
+    public static XmlDocument CreateXmlDocument() {
+      XmlDocument document = new XmlDocument();
+      document.AppendChild(document.CreateXmlDeclaration("1.0", null, null));
+      return document;
+    }
+    public static XmlNode Persist(IStorable instance, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      return Persist(instance.GetType().Name, instance, document, persistedObjects);
+    }
+    public static XmlNode Persist(string name, IStorable instance, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      if (persistedObjects.ContainsKey(instance.Guid)) {
+        XmlNode node = document.CreateNode(XmlNodeType.Element, name, null);
+        XmlAttribute guidAttribute = document.CreateAttribute("GUID");
+        guidAttribute.Value = instance.Guid.ToString();
+        node.Attributes.Append(guidAttribute);
+        return node;
+      } else {
+        persistedObjects.Add(instance.Guid, instance);
+        XmlNode node = instance.GetXmlNode(name, document, persistedObjects);
+        return node;
+      }
+    }
+    public static IStorable Restore(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      Guid guid = new Guid(node.Attributes["GUID"].Value);
+      if (restoredObjects.ContainsKey(guid)) {
+        return restoredObjects[guid];
+      } else {
+        Type type = Type.GetType(node.Attributes["Type"].Value, true);
+        IStorable instance = (IStorable)Activator.CreateInstance(type);
+        restoredObjects.Add(guid, instance);
+        instance.Populate(node, restoredObjects);
+        return instance;
+      }
+    }
+    public static void Save(IStorable instance, string filename) {
+      Save(instance, File.OpenWrite(filename));
+    }
+    public static void Save(IStorable instance, Stream stream) {
+      XmlDocument document = PersistenceManager.CreateXmlDocument();
+      document.AppendChild(Persist(instance, document, new Dictionary<Guid, IStorable>()));
+      document.Save(stream);
+    }
+    public static IStorable Load(string filename) {
+      return Load(File.OpenRead(filename));
+    }
+    public static IStorable Load(Stream stream) {
+      XmlDocument doc = new XmlDocument();
+      doc.Load(stream);
+      return PersistenceManager.Restore(doc.ChildNodes[1], new Dictionary<Guid, IStorable>());
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Core")]
+[assembly: AssemblyDescription("HeuristicLab core classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Core/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Properties/Resources.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Properties/Resources.Designer.cs	(revision 2)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Core.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Core.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap CombinedOperator {
+            get {
+                object obj = ResourceManager.GetObject("CombinedOperator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Icon HeuristicLab {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLab", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Operator {
+            get {
+                object obj = ResourceManager.GetObject("Operator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ProgrammableOperator {
+            get {
+                object obj = ResourceManager.GetObject("ProgrammableOperator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.Core/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/Properties/Resources.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Properties/Resources.resx	(revision 2)
@@ -0,0 +1,133 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="CombinedOperator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\CombinedOperator.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HeuristicLab" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\HeuristicLab.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Operator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Operator.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ProgrammableOperator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ProgrammableOperator.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.Core/Scope.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Scope.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Scope.cs	(revision 2)
@@ -0,0 +1,253 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class Scope : ItemBase, IScope {
+    private IScope parent;
+
+    private string myName;
+    public string Name {
+      get { return myName; }
+    }
+
+    private IDictionary<string, IVariable> myVariables;
+    public ICollection<IVariable> Variables {
+      get { return myVariables.Values; }
+    }
+    private List<IScope> mySubScopes;
+    public IList<IScope> SubScopes {
+      get { return mySubScopes.AsReadOnly(); }
+    }
+
+    public Scope() {
+      myName = "Anonymous";
+      myVariables = new Dictionary<string, IVariable>();
+      mySubScopes = new List<IScope>();
+    }
+    public Scope(string name)
+      : this() {
+      if (name != null) myName = name;
+    }
+
+    public void SetParent(IScope scope) {
+      parent = scope;
+    }
+
+    public override IView CreateView() {
+      return new ScopeView(this);
+    }
+
+    public IVariable GetVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable))
+        return variable;
+      else
+        return null;
+    }
+    public void AddVariable(IVariable variable) {
+      myVariables.Add(variable.Name, variable);
+      variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+      variable.NameChanged += new EventHandler(Variable_NameChanged);
+      OnVariableAdded(variable);
+    }
+
+    public void RemoveVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged -= new EventHandler(Variable_NameChanged);
+        myVariables.Remove(name);
+        OnVariableRemoved(variable);
+      }
+    }
+    private void Variable_NameChanging(object sender, NameChangingEventArgs e) {
+      e.Cancel = myVariables.ContainsKey(e.Name);
+    }
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      string oldName = null;
+      foreach (KeyValuePair<string, IVariable> element in myVariables) {
+        if (element.Value == variable)
+          oldName = element.Key;
+      }
+      myVariables.Remove(oldName);
+      myVariables.Add(variable.Name, variable);
+    }
+    public T GetVariableValue<T>(string name, bool recursiveLookup) where T : class, IItem {
+      return GetVariableValue<T>(name, recursiveLookup, true);
+    }
+    public T GetVariableValue<T>(string name, bool recursiveLookup, bool throwOnError) where T : class, IItem {
+      return (T)GetVariableValue(name, recursiveLookup, throwOnError);
+    }
+    public IItem GetVariableValue(string name, bool recursiveLookup) {
+      return GetVariableValue(name, recursiveLookup, true);
+    }
+    public IItem GetVariableValue(string name, bool recursiveLookup, bool throwOnError) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        return variable.Value;
+      } else {
+        if (recursiveLookup && (parent != null))
+          return parent.GetVariableValue(name, recursiveLookup, throwOnError);
+        else {
+          if (throwOnError)
+            throw new ArgumentException("Variable " + name + " not found");
+          else
+            return null;
+        }
+      }
+    }
+
+    public void AddSubScope(IScope scope) {
+      scope.SetParent(this);
+      mySubScopes.Add(scope);
+      OnSubScopeAdded(scope, mySubScopes.Count - 1);
+    }
+    public void RemoveSubScope(IScope scope) {
+      int index = mySubScopes.IndexOf(scope);
+      if (mySubScopes.Remove(scope)) {
+        scope.SetParent(null);
+        OnSubScopeRemoved(scope, index);
+      }
+    }
+    public void ReorderSubScopes(int[] sequence) {
+      IScope[] scopes = mySubScopes.ToArray();
+      mySubScopes.Clear();
+      for (int i = 0; i < scopes.Length; i++)
+        mySubScopes.Add(scopes[sequence[i]]);
+      OnSubScopesReordered();
+    }
+    public IScope GetScope(Guid guid) {
+      if (Guid == guid) return this;
+      else {
+        for (int i = 0; i < mySubScopes.Count; i++) {
+          IScope s = GetScope(guid);
+          if (s != null) return s;
+        }
+      }
+      return null;
+    }
+    public IScope GetScope(string name) {
+      if (Name == name) return this;
+      else {
+        for (int i = 0; i < mySubScopes.Count; i++) {
+          IScope s = GetScope(name);
+          if (s != null) return s;
+        }
+      }
+      return null;
+    }
+
+    public void Clear() {
+      string[] variableNames = new string[Variables.Count];
+      int i = 0;
+      foreach (IVariable variable in Variables) {
+        variableNames[i] = variable.Name;
+        i++;
+      }
+      for (int j = 0; j < variableNames.Length; j++)
+        RemoveVariable(variableNames[j]);
+
+      while (SubScopes.Count > 0)
+        RemoveSubScope(SubScopes[0]);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Scope clone = (Scope)base.Clone(clonedObjects);
+      clone.myName = Name;
+
+      foreach (IVariable variable in myVariables.Values)
+        clone.AddVariable((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      for (int i = 0; i < SubScopes.Count; i++)
+        clone.AddSubScope((IScope)Auxiliary.Clone(SubScopes[i], clonedObjects));
+
+      return clone;
+    }
+
+    public event EventHandler<VariableEventArgs> VariableAdded;
+    protected virtual void OnVariableAdded(IVariable variable) {
+      if (VariableAdded != null)
+        VariableAdded(this, new VariableEventArgs(variable));
+    }
+    public event EventHandler<VariableEventArgs> VariableRemoved;
+    protected virtual void OnVariableRemoved(IVariable variable) {
+      if (VariableRemoved != null)
+        VariableRemoved(this, new VariableEventArgs(variable));
+    }
+    public event EventHandler<ScopeIndexEventArgs> SubScopeAdded;
+    protected virtual void OnSubScopeAdded(IScope scope, int index) {
+      if (SubScopeAdded != null)
+        SubScopeAdded(this, new ScopeIndexEventArgs(scope, index));
+    }
+    public event EventHandler<ScopeIndexEventArgs> SubScopeRemoved;
+    protected virtual void OnSubScopeRemoved(IScope scope, int index) {
+      if (SubScopeRemoved != null)
+        SubScopeRemoved(this, new ScopeIndexEventArgs(scope, index));
+    }
+    public event EventHandler SubScopesReordered;
+    protected virtual void OnSubScopesReordered() {
+      if (SubScopesReordered != null)
+        SubScopesReordered(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name.ToString();
+      node.Attributes.Append(nameAttribute);
+
+      XmlNode variables = document.CreateNode(XmlNodeType.Element, "Variables", null);
+      foreach (IVariable variable in Variables)
+        variables.AppendChild(PersistenceManager.Persist(variable, document, persistedObjects));
+      node.AppendChild(variables);
+
+      XmlNode subScopes = document.CreateNode(XmlNodeType.Element, "SubScopes", null);
+      for (int i = 0; i < SubScopes.Count; i++)
+        subScopes.AppendChild(PersistenceManager.Persist(SubScopes[i], document, persistedObjects));
+      node.AppendChild(subScopes);
+
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+
+      XmlNode variables = node.SelectSingleNode("Variables");
+      foreach (XmlNode variableNode in variables.ChildNodes) {
+        IVariable variable = (IVariable)PersistenceManager.Restore(variableNode, restoredObjects);
+        AddVariable(variable);
+      }
+
+      XmlNode subScopes = node.SelectSingleNode("SubScopes");
+      for (int i = 0; i < subScopes.ChildNodes.Count; i++) {
+        IScope scope = (IScope)PersistenceManager.Restore(subScopes.ChildNodes[i], restoredObjects);
+        AddSubScope(scope);
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ScopeEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ScopeEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ScopeEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class ScopeEventArgs : ItemEventArgs {
+    public IScope Scope {
+      get { return (IScope)Item; }
+    }
+
+    public ScopeEventArgs(IScope scope)
+      : base(scope) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ScopeIndexEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ScopeIndexEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ScopeIndexEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class ScopeIndexEventArgs : ItemIndexEventArgs {
+    public IScope Scope {
+      get { return (IScope)Item; }
+    }
+
+    public ScopeIndexEventArgs(IScope scope, int index)
+      : base(scope, index) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ScopeView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ScopeView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ScopeView.Designer.cs	(revision 2)
@@ -0,0 +1,146 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class ScopeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (scopesTreeView.Nodes.Count > 0) {
+        RemoveTreeNode(scopesTreeView.Nodes[0]);
+        scopesTreeView.Nodes.Clear();
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.scopesTreeView = new System.Windows.Forms.TreeView();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.automaticUpdatingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.variablesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // scopesTreeView
+      // 
+      this.scopesTreeView.ContextMenuStrip = this.contextMenuStrip;
+      this.scopesTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scopesTreeView.HideSelection = false;
+      this.scopesTreeView.Location = new System.Drawing.Point(0, 0);
+      this.scopesTreeView.Name = "scopesTreeView";
+      this.scopesTreeView.ShowNodeToolTips = true;
+      this.scopesTreeView.Size = new System.Drawing.Size(400, 400);
+      this.scopesTreeView.TabIndex = 0;
+      this.scopesTreeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.scopesTreeView_AfterCollapse);
+      this.scopesTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.scopesTreeView_BeforeExpand);
+      this.scopesTreeView.DoubleClick += new System.EventHandler(this.scopesTreeView_DoubleClick);
+      this.scopesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.scopesTreeView_MouseDown);
+      this.scopesTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.scopesTreeView_ItemDrag);
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.automaticUpdatingToolStripMenuItem,
+            this.refreshToolStripMenuItem,
+            this.toolStripMenuItem1,
+            this.variablesToolStripMenuItem,
+            this.viewToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(180, 98);
+      this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);
+      // 
+      // automaticUpdatingToolStripMenuItem
+      // 
+      this.automaticUpdatingToolStripMenuItem.CheckOnClick = true;
+      this.automaticUpdatingToolStripMenuItem.Name = "automaticUpdatingToolStripMenuItem";
+      this.automaticUpdatingToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.automaticUpdatingToolStripMenuItem.Text = "Automatic &Updating";
+      this.automaticUpdatingToolStripMenuItem.ToolTipText = "Automatically update scope editor during execution";
+      this.automaticUpdatingToolStripMenuItem.Click += new System.EventHandler(this.automaticUpdatingToolStripMenuItem_Click);
+      // 
+      // refreshToolStripMenuItem
+      // 
+      this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem";
+      this.refreshToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.refreshToolStripMenuItem.Text = "&Refresh";
+      this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click);
+      // 
+      // toolStripMenuItem1
+      // 
+      this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(176, 6);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.viewToolStripMenuItem.Text = "&View";
+      // 
+      // variablesToolStripMenuItem
+      // 
+      this.variablesToolStripMenuItem.Name = "variablesToolStripMenuItem";
+      this.variablesToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.variablesToolStripMenuItem.Text = "&Variables...";
+      this.variablesToolStripMenuItem.Click += new System.EventHandler(this.variablesToolStripMenuItem_Click);
+      // 
+      // ScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.scopesTreeView);
+      this.Name = "ScopeView";
+      this.Size = new System.Drawing.Size(400, 400);
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView scopesTreeView;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem automaticUpdatingToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+    private System.Windows.Forms.ToolStripMenuItem variablesToolStripMenuItem;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ScopeView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ScopeView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ScopeView.cs	(revision 2)
@@ -0,0 +1,256 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  public partial class ScopeView : ViewBase {
+    private Dictionary<IScope, TreeNode> scopeNodeTable;
+    private Dictionary<IScope, bool> scopeExpandedTable;
+
+    public IScope Scope {
+      get { return (IScope)Item; }
+      set { base.Item = value; }
+    }
+    private bool myAutomaticUpdating;
+    public bool AutomaticUpdating {
+      get { return myAutomaticUpdating; }
+    }
+
+    public ScopeView() {
+      InitializeComponent();
+      Caption = "Scope";
+      scopeNodeTable = new Dictionary<IScope, TreeNode>();
+      scopeExpandedTable = new Dictionary<IScope, bool>();
+      myAutomaticUpdating = false;
+    }
+    public ScopeView(IScope scope)
+      : this() {
+      Scope = scope;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (scopesTreeView.Nodes.Count > 0)
+        RemoveTreeNode(scopesTreeView.Nodes[0]);
+      scopesTreeView.SelectedNode = null;
+      scopesTreeView.Nodes.Clear();
+      if (Scope == null) {
+        Caption = "Scope";
+        scopesTreeView.Enabled = false;
+      } else {
+        Caption = Scope.Name + " (" + Scope.GetType().Name + ")";
+        scopesTreeView.Nodes.Add(CreateTreeNode(Scope));
+        scopesTreeView.Enabled = true;
+      }
+    }
+
+    private TreeNode CreateTreeNode(IScope scope) {
+      TreeNode node = new TreeNode();
+      node.Text = scope.Name;
+      node.Tag = scope;
+
+      scopeNodeTable.Add(scope, node);
+      scopeExpandedTable.Add(scope, false);
+      if (myAutomaticUpdating) {
+        scope.SubScopeAdded += new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeAdded);
+        scope.SubScopeRemoved += new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeRemoved);
+        scope.SubScopesReordered += new EventHandler(Scope_SubScopesReordered);
+      }
+      if (scope.SubScopes.Count > 0)
+        node.Nodes.Add(new TreeNode());
+      return node;
+    }
+    private void RemoveTreeNode(TreeNode node) {
+      foreach (TreeNode child in node.Nodes)
+        RemoveTreeNode(child);
+
+      IScope scope = node.Tag as IScope;
+      if ((scope != null) && (scopeNodeTable.ContainsKey(scope))) {
+        scopeNodeTable.Remove(scope);
+        scopeExpandedTable.Remove(scope);
+        scope.SubScopeAdded -= new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeAdded);
+        scope.SubScopeRemoved -= new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeRemoved);
+        scope.SubScopesReordered -= new EventHandler(Scope_SubScopesReordered);
+      }
+    }
+
+    #region TreeView Events
+    private void scopesTreeView_DoubleClick(object sender, EventArgs e) {
+      // make sure that we can't get NullPointerExceptions
+      if(scopesTreeView.SelectedNode != null && scopesTreeView.SelectedNode.Tag != null) {
+        IScope scope = (IScope)scopesTreeView.SelectedNode.Tag;
+        PluginManager.ControlManager.ShowControl(new VariablesScopeView(scope));
+      }
+    }
+    private void scopesTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
+      TreeNode node = e.Node;
+      IScope scope = (IScope)node.Tag;
+
+      node.Nodes.Clear();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        node.Nodes.Add(CreateTreeNode(scope.SubScopes[i]));
+      scopeExpandedTable[scope] = true;
+    }
+    private void scopesTreeView_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e) {
+      TreeNode node = e.Node;
+      IScope scope = (IScope)node.Tag;
+
+      if (node.Nodes.Count > 0) {
+        for (int i = 0; i < node.Nodes.Count; i++)
+          RemoveTreeNode(node.Nodes[i]);
+        node.Nodes.Clear();
+        node.Nodes.Add(new TreeNode());
+      }
+      scopeExpandedTable[scope] = false;
+    }
+    private void scopesTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      IScope scope = node.Tag as IScope;
+      if (scope != null) {
+        DataObject data = new DataObject();
+        data.SetData("IScope", scope);
+        data.SetData("DragSource", scopesTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    #endregion
+
+    #region Context Menu Events
+    private void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      variablesToolStripMenuItem.Enabled = false;
+      viewToolStripMenuItem.DropDownItems.Clear();
+      viewToolStripMenuItem.Enabled = false;
+      if (scopesTreeView.SelectedNode != null) {
+        variablesToolStripMenuItem.Enabled = true;
+        IScope scope = (IScope)scopesTreeView.SelectedNode.Tag;
+        foreach (IVariable variable in scope.Variables) {
+          if (variable.Value is IVisualizationItem) {
+            ToolStripMenuItem item = new ToolStripMenuItem();
+            item.Text = variable.Name + "...";
+            item.Tag = variable.Value;
+            item.Click += new EventHandler(showViewToolStripMenuItem_Click);
+            viewToolStripMenuItem.DropDownItems.Add(item);
+          }
+        }
+        if (viewToolStripMenuItem.DropDownItems.Count > 0)
+          viewToolStripMenuItem.Enabled = true;
+      }
+    }
+    private void automaticUpdatingToolStripMenuItem_Click(object sender, EventArgs e) {
+      ToolStripMenuItem item = (ToolStripMenuItem)sender;
+      myAutomaticUpdating = item.Checked;
+      if (myAutomaticUpdating)
+        Refresh();
+    }
+    private void refreshToolStripMenuItem_Click(object sender, EventArgs e) {
+      Refresh();
+    }
+    private void variablesToolStripMenuItem_Click(object sender, EventArgs e) {
+      IScope scope = (IScope)scopesTreeView.SelectedNode.Tag;
+      PluginManager.ControlManager.ShowControl(new VariablesScopeView(scope));
+    }
+    private void showViewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IItem item = (IItem)((ToolStripMenuItem)sender).Tag;
+      PluginManager.ControlManager.ShowControl(item.CreateView());
+    }
+    #endregion
+
+    #region Scope Events
+    private delegate void ScopeDelegate(IScope scope);
+    private delegate void ScopeScopeIndexDelegate(IScope scope, IScope subScope, int index);
+    private void Scope_SubScopeAdded(object sender, ScopeIndexEventArgs e) {
+      IScope scope = (IScope)sender;
+      TreeNode node = scopeNodeTable[scope];
+      if (scopeExpandedTable[scope] || (scope.SubScopes.Count == 1))
+        AddSubScope(scope, e.Scope, e.Index);
+    }
+    private void AddSubScope(IScope scope, IScope subScope, int index) {
+      if (InvokeRequired) {
+        Invoke(new ScopeScopeIndexDelegate(AddSubScope), scope, subScope, index);
+      } else {
+        TreeNode parent = scopeNodeTable[scope];
+        TreeNode child;
+        if (parent.IsExpanded)
+          child = CreateTreeNode(subScope);
+        else
+          child = new TreeNode();
+        parent.Nodes.Insert(index, child);
+      }
+    }
+    private void Scope_SubScopeRemoved(object sender, ScopeIndexEventArgs e) {
+      IScope scope = (IScope)sender;
+      TreeNode node = scopeNodeTable[scope];
+      if (scopeExpandedTable[scope] || (scope.SubScopes.Count == 0))
+        RemoveSubScope(scope, e.Scope, e.Index);
+    }
+    private void RemoveSubScope(IScope scope, IScope subScope, int index) {
+      if (InvokeRequired) {
+        Invoke(new ScopeScopeIndexDelegate(RemoveSubScope), scope, subScope, index);
+      } else {
+        if (scopeNodeTable.ContainsKey(subScope)) {
+          TreeNode node = scopeNodeTable[subScope];
+          RemoveTreeNode(scopeNodeTable[subScope]);
+          node.Remove();
+        } else {
+          TreeNode node = scopeNodeTable[scope];
+          node.Nodes[0].Remove();
+        }
+      }
+    }
+    private void Scope_SubScopesReordered(object sender, EventArgs e) {
+      IScope scope = (IScope)sender;
+      TreeNode node = scopeNodeTable[scope];
+      if (scopeExpandedTable[scope])
+        ReorderSubScopes(scope);
+    }
+    private void ReorderSubScopes(IScope scope) {
+      if (InvokeRequired) {
+        Invoke(new ScopeDelegate(ReorderSubScopes), scope);
+      } else {
+        TreeNode node = scopeNodeTable[scope];
+        node.Nodes.Clear();
+        for (int i = 0; i < scope.SubScopes.Count; i++)
+          node.Nodes.Add(scopeNodeTable[scope.SubScopes[i]]);
+      }
+    }
+    #endregion
+
+    #region Mouse Events
+    private void scopesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button != MouseButtons.Right)
+        return;
+      TreeNode clickedNode = scopesTreeView.GetNodeAt(e.X, e.Y);
+      if (clickedNode != null) {
+        scopesTreeView.SelectedNode = clickedNode;
+        scopesTreeView.Refresh();
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ScopeView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/ScopeView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ScopeView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Core/StorableBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/StorableBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/StorableBase.cs	(revision 2)
@@ -0,0 +1,65 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public abstract class StorableBase : IStorable {
+    private Guid myGuid;
+    public Guid Guid {
+      get { return myGuid; }
+    }
+
+    protected StorableBase() {
+      myGuid = Guid.NewGuid();
+    }
+
+    public object Clone() {
+      return Auxiliary.Clone(this, new Dictionary<Guid, object>());
+    }
+    public virtual object Clone(IDictionary<Guid, object> clonedObjects) {
+      object clone = Activator.CreateInstance(this.GetType());
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    public virtual XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = document.CreateNode(XmlNodeType.Element, name, null);
+      Type type = this.GetType();
+      string typeString = type.AssemblyQualifiedName;
+      string[] tokens = typeString.Split(new string[] { ", " }, StringSplitOptions.None);
+      typeString = tokens[0] + ", " + tokens[1];
+      XmlAttribute typeAttribute = document.CreateAttribute("Type");
+      typeAttribute.Value = typeString;
+      node.Attributes.Append(typeAttribute);
+      XmlAttribute guidAttribute = document.CreateAttribute("GUID");
+      guidAttribute.Value = Guid.ToString();
+      node.Attributes.Append(guidAttribute);
+      return node;
+    }
+    public virtual void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      myGuid = new Guid(node.Attributes["GUID"].Value);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/Variable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/Variable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/Variable.cs	(revision 2)
@@ -0,0 +1,119 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class Variable : ItemBase, IVariable {
+    private string myName;
+    public string Name {
+      get { return myName; }
+      set {
+        if (!myName.Equals(value)) {
+          NameChangingEventArgs e = new NameChangingEventArgs(value);
+          OnNameChanging(e);
+          if (!e.Cancel) {
+            myName = value;
+            OnNameChanged();
+          }
+        }
+      }
+    }
+    private IItem myValue;
+    public IItem Value {
+      get { return myValue; }
+      set {
+        if (myValue != value) {
+          myValue = value;
+          OnValueChanged();
+        }
+      }
+    }
+
+    public Variable() {
+      myName = "Anonymous";
+      myValue = null;
+    }
+    public Variable(string name, IItem value) {
+      myName = name;
+      myValue = value;
+    }
+
+    public T GetValue<T>() where T : class, IItem {
+      return (T)Value;
+    }
+
+    public override IView CreateView() {
+      return new VariableView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Variable clone = new Variable();
+      clonedObjects.Add(Guid, clone);
+      clone.myName = Name;
+      clone.myValue = (IItem)Auxiliary.Clone(Value, clonedObjects);
+      return clone;
+    }
+
+    public override string ToString() {
+      return Name + ": " + ((Value == null) ? ("null") : (Value.ToString()));
+    }
+
+    public event EventHandler<NameChangingEventArgs> NameChanging;
+    protected virtual void OnNameChanging(NameChangingEventArgs e) {
+      if (NameChanging != null)
+        NameChanging(this, e);
+    }
+    public event EventHandler NameChanged;
+    protected virtual void OnNameChanged() {
+      if (NameChanged != null)
+        NameChanged(this, new EventArgs());
+      OnChanged();
+    }
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      if (ValueChanged != null)
+        ValueChanged(this, new EventArgs());
+      OnChanged();
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name;
+      node.Attributes.Append(nameAttribute);
+      if (Value != null)
+        node.AppendChild(PersistenceManager.Persist("Value", Value, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      myName = node.Attributes["Name"].Value;
+      XmlNode valueNode = node.SelectSingleNode("Value");
+      if (valueNode != null)
+        myValue = (IItem)PersistenceManager.Restore(valueNode, restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class VariableEventArgs : ItemEventArgs {
+    public IVariable Variable {
+      get { return (IVariable)Item; }
+    }
+
+    public VariableEventArgs(IVariable variable)
+      : base(variable) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableInfo.cs	(revision 2)
@@ -0,0 +1,152 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  public class VariableInfo : ItemBase, IVariableInfo {
+    private string myActualName;
+    public string ActualName {
+      get { return myActualName; }
+      set {
+        if (myActualName != value) {
+          myActualName = value;
+          OnActualNameChanged();
+        }
+      }
+    }
+    private string myFormalName;
+    public string FormalName {
+      get { return myFormalName; }
+    }
+    private string myDescription;
+    public string Description {
+      get { return myDescription; }
+    }
+    private Type myDataType;
+    public Type DataType {
+      get { return myDataType; }
+    }
+    private VariableKind myKind;
+    public VariableKind Kind {
+      get { return myKind; }
+    }
+    private bool myLocal;
+    public bool Local {
+      get { return myLocal; }
+      set {
+        if (myLocal != value) {
+          myLocal = value;
+          OnLocalChanged();
+        }
+      }
+    }
+
+    public VariableInfo() {
+      myActualName = "Anonymous";
+      myFormalName = "Anonymous";
+      myDescription = "";
+      myDataType = null;
+      myKind = VariableKind.In;
+      myLocal = false;
+    }
+    public VariableInfo(string formalName, string description, Type dataType, VariableKind kind)
+      : this() {
+      myActualName = formalName;
+      myFormalName = formalName;
+      myDescription = description;
+      myDataType = dataType;
+      myKind = kind;
+    }
+
+    public override IView CreateView() {
+      return new VariableInfoView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      VariableInfo clone = new VariableInfo();
+      clonedObjects.Add(Guid, clone);
+      clone.myActualName = ActualName;
+      clone.myFormalName = FormalName;
+      clone.myDescription = Description;
+      clone.myDataType = DataType;
+      clone.myKind = Kind;
+      clone.myLocal = Local;
+      return clone;
+    }
+
+    public event EventHandler ActualNameChanged;
+    protected virtual void OnActualNameChanged() {
+      if (ActualNameChanged != null)
+        ActualNameChanged(this, new EventArgs());
+    }
+    public event EventHandler LocalChanged;
+    protected virtual void OnLocalChanged() {
+      if (LocalChanged != null)
+        LocalChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute actualNameAttribute = document.CreateAttribute("ActualName");
+      actualNameAttribute.Value = ActualName;
+      node.Attributes.Append(actualNameAttribute);
+
+      XmlAttribute formalNameAttribute = document.CreateAttribute("FormalName");
+      formalNameAttribute.Value = FormalName;
+      node.Attributes.Append(formalNameAttribute);
+
+      XmlAttribute descriptionAttribute = document.CreateAttribute("Description");
+      descriptionAttribute.Value = Description;
+      node.Attributes.Append(descriptionAttribute);
+
+      XmlAttribute dataTypeAttribute = document.CreateAttribute("DataType");
+      string typeString = DataType.AssemblyQualifiedName;
+      string[] tokens = typeString.Split(new string[] { ", " }, StringSplitOptions.None);
+      typeString = tokens[0] + ", " + tokens[1];
+      dataTypeAttribute.Value = typeString;
+      node.Attributes.Append(dataTypeAttribute);
+
+      XmlAttribute kindAttribute = document.CreateAttribute("Kind");
+      kindAttribute.Value = Kind.ToString();
+      node.Attributes.Append(kindAttribute);
+
+      XmlAttribute localAttribute = document.CreateAttribute("Local");
+      localAttribute.Value = Local.ToString();
+      node.Attributes.Append(localAttribute);
+
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      myActualName = node.Attributes["ActualName"].Value;
+      myFormalName = node.Attributes["FormalName"].Value;
+      myDescription = node.Attributes["Description"].Value;
+      myDataType = Type.GetType(node.Attributes["DataType"].Value, true);
+      myKind = (VariableKind)Enum.Parse(typeof(VariableKind), node.Attributes["Kind"].Value);
+      myLocal = bool.Parse(node.Attributes["Local"].Value);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableInfoEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableInfoEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableInfoEventArgs.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  public class VariableInfoEventArgs : ItemEventArgs {
+    public IVariableInfo VariableInfo {
+      get { return (IVariableInfo)Item; }
+    }
+
+    public VariableInfoEventArgs(IVariableInfo variableInfo)
+      : base(variableInfo) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableInfoView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableInfoView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableInfoView.Designer.cs	(revision 2)
@@ -0,0 +1,217 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class VariableInfoView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.actualNameLabel = new System.Windows.Forms.Label();
+      this.actualNameTextBox = new System.Windows.Forms.TextBox();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.kindLabel = new System.Windows.Forms.Label();
+      this.kindTextBox = new System.Windows.Forms.TextBox();
+      this.formalNameTextBox = new System.Windows.Forms.TextBox();
+      this.formalNameLabel = new System.Windows.Forms.Label();
+      this.localLabel = new System.Windows.Forms.Label();
+      this.localCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // actualNameLabel
+      // 
+      this.actualNameLabel.AutoSize = true;
+      this.actualNameLabel.Location = new System.Drawing.Point(3, 3);
+      this.actualNameLabel.Name = "actualNameLabel";
+      this.actualNameLabel.Size = new System.Drawing.Size(71, 13);
+      this.actualNameLabel.TabIndex = 0;
+      this.actualNameLabel.Text = "&Actual Name:";
+      // 
+      // actualNameTextBox
+      // 
+      this.actualNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.actualNameTextBox.Location = new System.Drawing.Point(81, 0);
+      this.actualNameTextBox.Name = "actualNameTextBox";
+      this.actualNameTextBox.Size = new System.Drawing.Size(188, 20);
+      this.actualNameTextBox.TabIndex = 1;
+      this.actualNameTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 55);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(34, 13);
+      this.dataTypeLabel.TabIndex = 4;
+      this.dataTypeLabel.Text = "&Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(81, 52);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(188, 20);
+      this.dataTypeTextBox.TabIndex = 5;
+      // 
+      // descriptionLabel
+      // 
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(3, 127);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 10;
+      this.descriptionLabel.Text = "&Description:";
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(81, 124);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.Size = new System.Drawing.Size(188, 85);
+      this.descriptionTextBox.TabIndex = 11;
+      this.descriptionTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // kindLabel
+      // 
+      this.kindLabel.AutoSize = true;
+      this.kindLabel.Location = new System.Drawing.Point(3, 81);
+      this.kindLabel.Name = "kindLabel";
+      this.kindLabel.Size = new System.Drawing.Size(31, 13);
+      this.kindLabel.TabIndex = 6;
+      this.kindLabel.Text = "&Kind:";
+      // 
+      // kindTextBox
+      // 
+      this.kindTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.kindTextBox.Location = new System.Drawing.Point(81, 78);
+      this.kindTextBox.Name = "kindTextBox";
+      this.kindTextBox.ReadOnly = true;
+      this.kindTextBox.Size = new System.Drawing.Size(188, 20);
+      this.kindTextBox.TabIndex = 7;
+      this.kindTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // formalNameTextBox
+      // 
+      this.formalNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.formalNameTextBox.Location = new System.Drawing.Point(81, 26);
+      this.formalNameTextBox.Name = "formalNameTextBox";
+      this.formalNameTextBox.ReadOnly = true;
+      this.formalNameTextBox.Size = new System.Drawing.Size(188, 20);
+      this.formalNameTextBox.TabIndex = 3;
+      // 
+      // formalNameLabel
+      // 
+      this.formalNameLabel.AutoSize = true;
+      this.formalNameLabel.Location = new System.Drawing.Point(3, 29);
+      this.formalNameLabel.Name = "formalNameLabel";
+      this.formalNameLabel.Size = new System.Drawing.Size(72, 13);
+      this.formalNameLabel.TabIndex = 2;
+      this.formalNameLabel.Text = "&Formal Name:";
+      // 
+      // localLabel
+      // 
+      this.localLabel.AutoSize = true;
+      this.localLabel.Location = new System.Drawing.Point(3, 104);
+      this.localLabel.Name = "localLabel";
+      this.localLabel.Size = new System.Drawing.Size(36, 13);
+      this.localLabel.TabIndex = 8;
+      this.localLabel.Text = "&Local:";
+      // 
+      // localCheckBox
+      // 
+      this.localCheckBox.AutoSize = true;
+      this.localCheckBox.Location = new System.Drawing.Point(81, 104);
+      this.localCheckBox.Name = "localCheckBox";
+      this.localCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.localCheckBox.TabIndex = 9;
+      this.localCheckBox.UseVisualStyleBackColor = true;
+      this.localCheckBox.CheckedChanged += new System.EventHandler(this.localCheckBox_CheckedChanged);
+      // 
+      // VariableInfoEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.localCheckBox);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.kindTextBox);
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.formalNameTextBox);
+      this.Controls.Add(this.actualNameTextBox);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.kindLabel);
+      this.Controls.Add(this.formalNameLabel);
+      this.Controls.Add(this.localLabel);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.actualNameLabel);
+      this.Name = "VariableInfoEditor";
+      this.Size = new System.Drawing.Size(269, 209);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label actualNameLabel;
+    private System.Windows.Forms.TextBox actualNameTextBox;
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.TextBox dataTypeTextBox;
+    private System.Windows.Forms.Label descriptionLabel;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private System.Windows.Forms.Label kindLabel;
+    private System.Windows.Forms.TextBox kindTextBox;
+    private System.Windows.Forms.TextBox formalNameTextBox;
+    private System.Windows.Forms.Label formalNameLabel;
+    private System.Windows.Forms.Label localLabel;
+    private System.Windows.Forms.CheckBox localCheckBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableInfoView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableInfoView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableInfoView.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class VariableInfoView : ViewBase {
+    public IVariableInfo VariableInfo {
+      get { return (IVariableInfo)Item; }
+      set { base.Item = value; }
+    }
+
+    public VariableInfoView() {
+      InitializeComponent();
+      Caption = "Variable Info";
+    }
+    public VariableInfoView(IVariableInfo variableInfo)
+      : this() {
+      VariableInfo = variableInfo;
+    }
+
+    protected override void RemoveItemEvents() {
+      VariableInfo.ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+      VariableInfo.LocalChanged -= new EventHandler(VariableInfo_LocalChanged);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      VariableInfo.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+      VariableInfo.LocalChanged += new EventHandler(VariableInfo_LocalChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      Caption = "Variable Info";
+      if (VariableInfo == null) {
+        actualNameTextBox.Enabled = false;
+        formalNameTextBox.Enabled = false;
+        dataTypeTextBox.Enabled = false;
+        kindTextBox.Enabled = false;
+        localCheckBox.Enabled = false;
+        descriptionTextBox.Enabled = false;
+      } else {
+        Caption = VariableInfo.ActualName + " (" + VariableInfo.GetType().Name + ")";
+        actualNameTextBox.Text = VariableInfo.ActualName;
+        actualNameTextBox.Enabled = true;
+        formalNameTextBox.Text = VariableInfo.FormalName;
+        formalNameTextBox.Enabled = true;
+        dataTypeTextBox.Text = VariableInfo.DataType.FullName;
+        dataTypeTextBox.Enabled = true;
+        kindTextBox.Text = VariableInfo.Kind.ToString();
+        kindTextBox.Enabled = true;
+        localCheckBox.Checked = VariableInfo.Local;
+        localCheckBox.Enabled = true;
+        descriptionTextBox.Text = VariableInfo.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+
+    private void VariableInfo_ActualNameChanged(object sender, EventArgs e) {
+      actualNameTextBox.Text = VariableInfo.ActualName;
+    }
+    private void VariableInfo_LocalChanged(object sender, EventArgs e) {
+      localCheckBox.Checked = VariableInfo.Local;
+    }
+
+    private void actualNameTextBox_Validated(object sender, EventArgs e) {
+      VariableInfo.ActualName = actualNameTextBox.Text;
+    }
+    private void localCheckBox_CheckedChanged(object sender, EventArgs e) {
+      VariableInfo.Local = localCheckBox.Checked;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableInfoView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableInfoView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableInfoView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Core/VariableKind.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableKind.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableKind.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  [FlagsAttribute]
+  public enum VariableKind {
+    None = 0,
+    New = 1,
+    Out = 2,
+    In = 4,
+    Deleted = 8
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableView.Designer.cs	(revision 2)
@@ -0,0 +1,143 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  partial class VariableView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseItemDialog != null) chooseItemDialog.Dispose();
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.valueLabel = new System.Windows.Forms.Label();
+      this.valueTextBox = new System.Windows.Forms.TextBox();
+      this.editorGroupBox = new System.Windows.Forms.GroupBox();
+      this.setVariableValueButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(3, 3);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 0;
+      this.nameLabel.Text = "&Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(50, 0);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(153, 20);
+      this.nameTextBox.TabIndex = 1;
+      this.nameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.nameTextBox_Validating);
+      // 
+      // valueLabel
+      // 
+      this.valueLabel.AutoSize = true;
+      this.valueLabel.Location = new System.Drawing.Point(3, 29);
+      this.valueLabel.Name = "valueLabel";
+      this.valueLabel.Size = new System.Drawing.Size(37, 13);
+      this.valueLabel.TabIndex = 2;
+      this.valueLabel.Text = "&Value:";
+      // 
+      // valueTextBox
+      // 
+      this.valueTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueTextBox.Location = new System.Drawing.Point(50, 26);
+      this.valueTextBox.Name = "valueTextBox";
+      this.valueTextBox.ReadOnly = true;
+      this.valueTextBox.Size = new System.Drawing.Size(99, 20);
+      this.valueTextBox.TabIndex = 3;
+      // 
+      // editorGroupBox
+      // 
+      this.editorGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.editorGroupBox.Location = new System.Drawing.Point(0, 52);
+      this.editorGroupBox.Name = "editorGroupBox";
+      this.editorGroupBox.Size = new System.Drawing.Size(203, 102);
+      this.editorGroupBox.TabIndex = 5;
+      this.editorGroupBox.TabStop = false;
+      this.editorGroupBox.Text = "&Editor:";
+      // 
+      // setVariableValueButton
+      // 
+      this.setVariableValueButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.setVariableValueButton.Location = new System.Drawing.Point(155, 26);
+      this.setVariableValueButton.Name = "setVariableValueButton";
+      this.setVariableValueButton.Size = new System.Drawing.Size(45, 20);
+      this.setVariableValueButton.TabIndex = 4;
+      this.setVariableValueButton.Text = "Set...";
+      this.setVariableValueButton.UseVisualStyleBackColor = true;
+      this.setVariableValueButton.Click += new System.EventHandler(this.setVariableValueButton_Click);
+      // 
+      // VariableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.setVariableValueButton);
+      this.Controls.Add(this.editorGroupBox);
+      this.Controls.Add(this.valueTextBox);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.valueLabel);
+      this.Controls.Add(this.nameLabel);
+      this.Name = "VariableView";
+      this.Size = new System.Drawing.Size(203, 154);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.Label valueLabel;
+    private System.Windows.Forms.TextBox valueTextBox;
+    private System.Windows.Forms.GroupBox editorGroupBox;
+    private System.Windows.Forms.Button setVariableValueButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableView.cs	(revision 2)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class VariableView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    public IVariable Variable {
+      get { return (IVariable)Item; }
+      set { base.Item = value; }
+    }
+
+    public VariableView() {
+      InitializeComponent();
+      Caption = "Variable";
+    }
+    public VariableView(IVariable variable)
+      : this() {
+      Variable = variable;
+    }
+
+    protected override void RemoveItemEvents() {
+      Variable.NameChanged -= new EventHandler(Variable_NameChanged);
+      Variable.ValueChanged -= new EventHandler(Variable_ValueChanged);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Variable.NameChanged += new EventHandler(Variable_NameChanged);
+      Variable.ValueChanged += new EventHandler(Variable_ValueChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      valueTextBox.Text = "-";
+      valueTextBox.Enabled = false;
+      editorGroupBox.Controls.Clear();
+      editorGroupBox.Enabled = false;
+      if (Variable == null) {
+        Caption = "Variable";
+        nameTextBox.Enabled = false;
+      } else {
+        Caption = Variable.Name + " (" + Variable.GetType().Name + ")";
+        nameTextBox.Text = Variable.Name;
+        nameTextBox.Enabled = true;
+        if (Variable.Value != null) {
+          valueTextBox.Text = Variable.Value.GetType().FullName;
+          valueTextBox.Enabled = true;
+          Control editor = (Control)Variable.Value.CreateView();
+          if (editor != null) {
+            editorGroupBox.Controls.Add(editor);
+            editor.Dock = DockStyle.Fill;
+            editorGroupBox.Enabled = true;
+          }
+        }
+      }
+    }
+
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    private void UpdateText() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateText));
+      else
+        nameTextBox.Text = Variable.Name;
+    }
+    private void Variable_ValueChanged(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void nameTextBox_Validating(object sender, CancelEventArgs e) {
+      Variable.Name = nameTextBox.Text;
+
+      // check if variable name was set successfully
+      e.Cancel = Variable.Name != nameTextBox.Text;
+    }
+
+    private void setVariableValueButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Set Value";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK)
+        Variable.Value = chooseItemDialog.Item;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariableView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariableView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariableView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/VariablesScopeView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariablesScopeView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariablesScopeView.Designer.cs	(revision 2)
@@ -0,0 +1,174 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class VariablesScopeView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseItemDialog != null) chooseItemDialog.Dispose();
+      foreach (ListViewItem item in variablesListView.Items) {
+        ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.addButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.variablesGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(276, 155);
+      this.splitContainer1.SplitterDistance = 135;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.variablesListView);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(135, 155);
+      this.variablesGroupBox.TabIndex = 0;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "&Variables";
+      // 
+      // variablesListView
+      // 
+      this.variablesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.variablesListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variablesListView.HideSelection = false;
+      this.variablesListView.Location = new System.Drawing.Point(3, 16);
+      this.variablesListView.Name = "variablesListView";
+      this.variablesListView.Size = new System.Drawing.Size(129, 136);
+      this.variablesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.variablesListView.TabIndex = 0;
+      this.variablesListView.UseCompatibleStateImageBehavior = false;
+      this.variablesListView.View = System.Windows.Forms.View.Details;
+      this.variablesListView.SelectedIndexChanged += new System.EventHandler(this.variablesListView_SelectedIndexChanged);
+      this.variablesListView.SizeChanged += new System.EventHandler(this.variablesListView_SizeChanged);
+      this.variablesListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.variablesListView_KeyDown);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(137, 155);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "&Details";
+      // 
+      // addButton
+      // 
+      this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addButton.Location = new System.Drawing.Point(0, 161);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(75, 23);
+      this.addButton.TabIndex = 1;
+      this.addButton.Text = "&Add...";
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Enabled = false;
+      this.removeButton.Location = new System.Drawing.Point(81, 161);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 2;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // VariablesScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.addButton);
+      this.Controls.Add(this.splitContainer1);
+      this.Name = "VariablesScopeView";
+      this.Size = new System.Drawing.Size(276, 184);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.ListView variablesListView;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.Button removeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/VariablesScopeView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariablesScopeView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariablesScopeView.cs	(revision 2)
@@ -0,0 +1,197 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class VariablesScopeView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    public IScope Scope {
+      get { return (IScope)Item; }
+      set { base.Item = value; }
+    }
+
+    public VariablesScopeView() {
+      InitializeComponent();
+      Caption = "Variables Scope View";
+    }
+    public VariablesScopeView(IScope scope)
+      : this() {
+      Scope = scope;
+    }
+
+    protected override void RemoveItemEvents() {
+      Scope.VariableAdded -= new EventHandler<VariableEventArgs>(Scope_VariableAdded);
+      Scope.VariableRemoved -= new EventHandler<VariableEventArgs>(Scope_VariableRemoved);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Scope.VariableAdded += new EventHandler<VariableEventArgs>(Scope_VariableAdded);
+      Scope.VariableRemoved += new EventHandler<VariableEventArgs>(Scope_VariableRemoved);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if (Scope == null) {
+        Caption = "Variables Scope View";
+        variablesListView.Enabled = false;
+      } else {
+        Caption = "Variables Scope View of " + Scope.Name + " (" + Scope.GetType().Name + ")";
+        variablesListView.Enabled = true;
+        foreach (ListViewItem item in variablesListView.Items) {
+          ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+        }
+        variablesListView.Items.Clear();
+        foreach (IVariable variable in Scope.Variables) {
+          ListViewItem item = new ListViewItem();
+          item.Text = variable.Name;
+          item.Tag = variable;
+          variablesListView.Items.Add(item);
+          variable.NameChanged += new EventHandler(Variable_NameChanged);
+        }
+      }
+    }
+
+    private void variablesListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (detailsGroupBox.Controls.Count > 0)
+        detailsGroupBox.Controls[0].Dispose();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if (variablesListView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+      if (variablesListView.SelectedItems.Count == 1) {
+        IVariable variable = (IVariable)variablesListView.SelectedItems[0].Tag;
+        Control control = (Control)new VariableView(variable);
+        detailsGroupBox.Controls.Add(control);
+        control.Dock = DockStyle.Fill;
+        detailsGroupBox.Enabled = true;
+      }
+    }
+
+    #region Size Changed Events
+    private void variablesListView_SizeChanged(object sender, EventArgs e) {
+      if (variablesListView.Columns.Count > 0)
+        variablesListView.Columns[0].Width = Math.Max(0, variablesListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void variablesListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (variablesListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in variablesListView.SelectedItems)
+            Scope.RemoveVariable(((IVariable)item.Tag).Name);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Add Variable";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        IVariable newVariable = new Variable(chooseItemDialog.Item.GetType().Name, chooseItemDialog.Item);
+        int index = 1;
+        bool valid = true;
+        string name = null;
+        do {
+          valid = true;
+          name = newVariable.Name + " (" + index.ToString() + ")";
+          foreach (IVariable existingVariable in Scope.Variables) {
+            if (existingVariable.Name == name) {
+              valid = false;
+              index++;
+            }
+          }
+        } while (!valid);
+        newVariable.Name = name;
+        Scope.AddVariable(newVariable);
+      }
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      if (variablesListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in variablesListView.SelectedItems)
+          Scope.RemoveVariable(((IVariable)item.Tag).Name);
+      }
+    }
+    #endregion
+
+    #region Scope Events
+    private delegate void OnVariableEventDelegate(object sender, VariableEventArgs e);
+    private void Scope_VariableAdded(object sender, VariableEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnVariableEventDelegate(Scope_VariableAdded), sender, e);
+      else {
+        ListViewItem item = new ListViewItem();
+        item.Text = e.Variable.Name;
+        item.Tag = e.Variable;
+        variablesListView.Items.Add(item);
+        e.Variable.NameChanged += new EventHandler(Variable_NameChanged);
+      }
+    }
+    private void Scope_VariableRemoved(object sender, VariableEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnVariableEventDelegate(Scope_VariableRemoved), sender, e);
+      else {
+        ListViewItem itemToDelete = null;
+        foreach (ListViewItem item in variablesListView.Items) {
+          if (item.Tag == e.Variable)
+            itemToDelete = item;
+        }
+        e.Variable.NameChanged -= new EventHandler(Variable_NameChanged);
+        variablesListView.Items.Remove(itemToDelete);
+      }
+    }
+    #endregion
+
+    #region Variable Events
+    private delegate void OnEventDelegate(object sender, EventArgs e);
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnEventDelegate(Variable_NameChanged), sender, e);
+      else {
+        IVariable variable = (IVariable)sender;
+        foreach (ListViewItem item in variablesListView.Items) {
+          if (item.Tag == variable)
+            item.Text = variable.Name;
+        }
+      }
+    }
+    #endregion
+  }
+}
+
Index: /trunk/sources/HeuristicLab.Core/VariablesScopeView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core/VariablesScopeView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/VariablesScopeView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Core/ViewBase.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ViewBase.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ViewBase.Designer.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Core {
+  partial class ViewBase {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (Item != null)
+        RemoveItemEvents();
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/ViewBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/ViewBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Core/ViewBase.cs	(revision 2)
@@ -0,0 +1,113 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Xml;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  public partial class ViewBase : UserControl, IView {
+    private IItem myItem;
+    public IItem Item {
+      get { return myItem; }
+      protected set {
+        if (value != myItem) {
+          if (myItem != null)
+            RemoveItemEvents();
+          myItem = value;
+          if (myItem != null)
+            AddItemEvents();
+          OnItemChanged();
+          Refresh();
+        }
+      }
+    }
+    private string myCaption;
+    public string Caption {
+      get { return myCaption; }
+      set {
+        if (value != myCaption) {
+          myCaption = value;
+          OnCaptionChanged();
+        }
+      }
+    }
+
+    public ViewBase() {
+      InitializeComponent();
+      Caption = "View";
+    }
+
+    protected virtual void RemoveItemEvents() { }
+    protected virtual void AddItemEvents() { }
+
+    public override void Refresh() {
+      if (InvokeRequired) {
+        Invoke(new MethodInvoker(Refresh));
+      } else {
+        UpdateControls();
+        base.Refresh();
+      }
+    }
+    protected virtual void UpdateControls() {
+      if (Item == null)
+        Caption = "View";
+      else
+        Caption = "View (" + Item.GetType().Name + ")";
+      
+    }
+
+    public event EventHandler ItemChanged;
+    protected virtual void OnItemChanged() {
+      if (ItemChanged != null)
+        ItemChanged(this, new EventArgs());
+    }
+    public event EventHandler CaptionChanged;
+    protected virtual void OnCaptionChanged() {
+      if (CaptionChanged != null)
+        CaptionChanged(this, new EventArgs());
+    }
+
+    protected new void Invoke(Delegate method) {
+      // enforce context switch to improve GUI response time
+      System.Threading.Thread.Sleep(0);
+
+      // prevent blocking of worker thread in Invoke, if the control is disposed
+      IAsyncResult result = BeginInvoke(method);
+      while ((!result.AsyncWaitHandle.WaitOne(100, false)) && (!IsDisposed)) { }
+      if (!IsDisposed) EndInvoke(result);
+    }
+    protected new void Invoke(Delegate method, params object[] args) {
+      // enforce context switch to improve GUI response time
+      System.Threading.Thread.Sleep(0);
+
+      // prevent blocking of worker thread in Invoke, if the control is disposed
+      IAsyncResult result = BeginInvoke(method, args);
+      while ((!result.AsyncWaitHandle.WaitOne(100, false)) && (!IsDisposed)) { }
+      if (!IsDisposed) EndInvoke(result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ArrayDataBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ArrayDataBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ArrayDataBase.cs	(revision 2)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public abstract class ArrayDataBase : ObjectData {
+    public new virtual Array Data {
+      get { return (Array)base.Data; }
+      set { base.Data = value; }
+    }
+
+    public override string ToString() {
+      if (Data.Length <= 0) return "Empty Array";
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.Length; i++) {
+        builder.Append(";");
+        builder.Append(Data.GetValue(i).ToString());
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.Designer.cs	(revision 2)
@@ -0,0 +1,109 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+namespace HeuristicLab.Data {
+  partial class ArrayDataBaseView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.sizeLabel = new System.Windows.Forms.Label();
+      this.lengthTextBox = new System.Windows.Forms.TextBox();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // sizeLabel
+      // 
+      this.sizeLabel.AutoSize = true;
+      this.sizeLabel.Location = new System.Drawing.Point(3, 4);
+      this.sizeLabel.Name = "sizeLabel";
+      this.sizeLabel.Size = new System.Drawing.Size(30, 13);
+      this.sizeLabel.TabIndex = 0;
+      this.sizeLabel.Text = "Size:";
+      // 
+      // lengthTextBox
+      // 
+      this.lengthTextBox.AcceptsReturn = true;
+      this.lengthTextBox.Location = new System.Drawing.Point(39, 1);
+      this.lengthTextBox.Name = "lengthTextBox";
+      this.lengthTextBox.Size = new System.Drawing.Size(110, 20);
+      this.lengthTextBox.TabIndex = 1;
+      this.lengthTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lengthTextBox_Validating);
+      this.lengthTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lengthTextBox_KeyDown);
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.ColumnHeadersVisible = false;
+      this.dataGridView.Location = new System.Drawing.Point(3, 30);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(155, 226);
+      this.dataGridView.TabIndex = 2;
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      // 
+      // ArrayDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.lengthTextBox);
+      this.Controls.Add(this.sizeLabel);
+      this.Name = "ArrayDataView";
+      this.Size = new System.Drawing.Size(163, 259);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label sizeLabel;
+    private System.Windows.Forms.TextBox lengthTextBox;
+    private System.Windows.Forms.DataGridView dataGridView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.cs	(revision 2)
@@ -0,0 +1,120 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class ArrayDataBaseView : ViewBase {
+    public ArrayDataBase ArrayDataBase {
+      get { return (ArrayDataBase)Item; }
+      protected set { base.Item = value; }
+    }
+
+    public ArrayDataBaseView() {
+      InitializeComponent();
+    }
+
+    protected override void RemoveItemEvents() {
+      ArrayDataBase.Changed -= new EventHandler(ArrayDataBase_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ArrayDataBase.Changed += new EventHandler(ArrayDataBase_Changed);
+    }
+
+    protected virtual bool ValidateData(string element) {
+      throw new InvalidOperationException("ValidateData has to be overridden in each inherited class");
+    }
+    protected virtual void SetArrayElement(int index, string element) {
+      throw new InvalidOperationException("SetArrayElement has to be overridden in each inherited class");
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ArrayDataBase != null) {
+        int length = ArrayDataBase.Data.Length;
+        lengthTextBox.Text = length + "";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = length;
+        for (int i = 0; i < length; i++) {
+          dataGridView.Rows[i].Cells[0].Value = ArrayDataBase.Data.GetValue(i); ;
+        }
+      } else {
+        lengthTextBox.Text = "0";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = 0;
+      }
+    }
+
+    private void lengthTextBox_Validating(object sender, CancelEventArgs e) {
+      int newLength;
+      if (int.TryParse(lengthTextBox.Text, out newLength)) {
+        if (newLength > 0) {
+          e.Cancel = false;
+          if (newLength != ArrayDataBase.Data.Length) {
+            CreateAndCopyArray(newLength);
+          }
+        } else {
+          // only allow values greater than 0
+          e.Cancel = true;
+        }
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private void CreateAndCopyArray(int newLength) {
+      Array newArray = Array.CreateInstance(ArrayDataBase.Data.GetType().GetElementType(), newLength);
+      Array.Copy(ArrayDataBase.Data, newArray, Math.Min(newLength, ArrayDataBase.Data.Length));
+      ArrayDataBase.Data = newArray;
+    }
+
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (ValidateData((string)e.FormattedValue)) {
+        SetArrayElement(e.RowIndex, (string)e.FormattedValue);
+        e.Cancel = false;
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private void lengthTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) {
+        e.SuppressKeyPress = true;
+        dataGridView.Focus();
+      }
+    }
+
+    #region ArrayDataBase Events
+    private void ArrayDataBase_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ArrayDataBaseView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/BoolArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolArrayData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolArrayData.cs	(revision 2)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class BoolArrayData : ArrayDataBase {
+    public new bool[] Data {
+      get { return (bool[])base.Data; }
+      set { base.Data = value; }
+    }
+
+    public BoolArrayData() {
+      Data = new bool[0];
+    }
+    public BoolArrayData(bool[] data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new BoolArrayDataView(this);
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString();
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      string[] tokens = node.InnerText.Split(';');
+      bool[] data = new bool[tokens.Length];
+      for (int i = 0; i < data.Length; i++)
+        data[i] = bool.Parse(tokens[i]);
+      Data = data;
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolArrayDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolArrayDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolArrayDataView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class BoolArrayDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolArrayDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolArrayDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolArrayDataView.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  public partial class BoolArrayDataView : ArrayDataBaseView {
+    public BoolArrayData BoolArrayData {
+      get { return (BoolArrayData)base.Item; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    public BoolArrayDataView() {
+      InitializeComponent();
+    }
+    public BoolArrayDataView(BoolArrayData boolArrayData)
+      : this() {
+      BoolArrayData = boolArrayData;
+    }
+
+    protected override void SetArrayElement(int index, string element) {
+      bool result;
+      bool.TryParse(element, out result);
+
+      BoolArrayData.Data[index] = result;
+    }
+
+    protected override bool ValidateData(string element) {
+      bool result;
+      return element != null && bool.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolData.cs	(revision 2)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class BoolData : ObjectData {
+    public new bool Data {
+      get { return (bool)base.Data; }
+      set { base.Data = value; }
+    }
+
+    public BoolData() {
+      Data = false;
+    }
+    public BoolData(bool data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new BoolDataView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      BoolData clone = new BoolData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString();
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Data = bool.Parse(node.InnerText);
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolDataView.Designer.cs	(revision 2)
@@ -0,0 +1,77 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class BoolDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // dataCheckBox
+      // 
+      this.dataCheckBox.AutoSize = true;
+      this.dataCheckBox.Location = new System.Drawing.Point(0, 0);
+      this.dataCheckBox.Name = "dataCheckBox";
+      this.dataCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.dataCheckBox.TabIndex = 1;
+      this.dataCheckBox.UseVisualStyleBackColor = true;
+      this.dataCheckBox.CheckedChanged += new System.EventHandler(this.dataCheckBox_CheckedChanged);
+      // 
+      // BoolDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataCheckBox);
+      this.Name = "BoolDataView";
+      this.Size = new System.Drawing.Size(19, 18);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox dataCheckBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolDataView.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class BoolDataView : ViewBase {
+    public BoolData BoolData {
+      get { return (BoolData)Item; }
+      set { base.Item = value; }
+    }
+
+    public BoolDataView() {
+      InitializeComponent();
+    }
+    public BoolDataView(BoolData boolData)
+      : this() {
+      BoolData = boolData;
+    }
+
+    protected override void RemoveItemEvents() {
+      BoolData.Changed -= new EventHandler(BoolData_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      BoolData.Changed += new EventHandler(BoolData_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (BoolData == null) {
+        dataCheckBox.Enabled = false;
+      } else {
+        dataCheckBox.Enabled = true;
+        dataCheckBox.Checked = BoolData.Data;
+      }
+    }
+
+    private void dataCheckBox_CheckedChanged(object sender, EventArgs e) {
+      BoolData.Data = dataCheckBox.Checked;
+    }
+
+    private void BoolData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolDataView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolDataView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/BoolMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolMatrixData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolMatrixData.cs	(revision 2)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class BoolMatrixData : ArrayDataBase {
+    public new bool[,] Data {
+      get { return (bool[,])base.Data; }
+      set { base.Data = value; }
+    }
+
+    public BoolMatrixData() {
+      Data = new bool[1, 1];
+    }
+    public BoolMatrixData(bool[,] data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new BoolMatrixDataView(this);
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = Data.GetLength(0).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = Data.GetLength(1).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+      node.InnerText = ToString();
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int dim1 = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      int dim2 = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      string[] tokens = node.InnerText.Split(';');
+      bool[,] data = new bool[dim1, dim2];
+      for (int i = 0; i < dim1; i++) {
+        for (int j = 0; j < dim2; j++) {
+          data[i, j] = bool.Parse(tokens[i * dim2 + j]);
+        }
+      }
+      Data = data;
+    }
+
+    public override string ToString() {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.GetLength(0); i++) {
+        for (int j = 0; j < Data.GetLength(1); j++) {
+          builder.Append(";");
+          builder.Append(Data[i, j].ToString());
+        }
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolMatrixDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolMatrixDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolMatrixDataView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class BoolMatrixDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/BoolMatrixDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolMatrixDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/BoolMatrixDataView.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  public partial class BoolMatrixDataView : MatrixDataBaseView {
+    public BoolMatrixData BoolMatrixData {
+      get { return (BoolMatrixData)base.Item; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    public BoolMatrixDataView() {
+      InitializeComponent();
+    }
+    public BoolMatrixDataView(BoolMatrixData boolMatrixData)
+      : this() {
+      BoolMatrixData = boolMatrixData;
+    }
+
+    protected override void SetArrayElement(int row, int column, string element) {
+      bool result;
+      bool.TryParse(element, out result);
+
+      BoolMatrixData.Data[row, column] = result;
+    }
+
+    protected override bool ValidateData(string element) {
+      bool result;
+      return element != null && bool.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedDoubleData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedDoubleData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedDoubleData.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class ConstrainedDoubleData : ConstrainedObjectData {
+    public new double Data {
+      get { return ((DoubleData)base.Data).Data; }
+      set { ((DoubleData)base.Data).Data = value; }
+    }
+
+    public ConstrainedDoubleData() : this (0.0) {
+    }
+    public ConstrainedDoubleData(double data) : base() {
+      base.Data = new DoubleData(data);
+    }
+
+    public virtual bool TrySetData(double data) {
+      return base.TrySetData(new DoubleData(data));
+    }
+    public virtual bool TrySetData(double data, out ICollection<IConstraint> violatedConstraints) {
+      return base.TrySetData(new DoubleData(data), out violatedConstraints);
+    }
+
+    public override IView CreateView() {
+      return new ConstrainedDoubleDataView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedDoubleData clone = (ConstrainedDoubleData)base.Clone(clonedObjects);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Value", (DoubleData) base.Data, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      base.Data = (DoubleData)PersistenceManager.Restore(node.SelectSingleNode("Value"), restoredObjects);
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.Designer.cs	(revision 2)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class ConstrainedDoubleDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataTextBox = new System.Windows.Forms.TextBox();
+      this.constrainedDataBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(344, 20);
+      this.dataTextBox.TabIndex = 0;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // constrainedDataBaseView
+      // 
+      this.constrainedDataBaseView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.constrainedDataBaseView.Caption = "Constrained Data";
+      this.constrainedDataBaseView.ConstrainedItem = null;
+      this.constrainedDataBaseView.Location = new System.Drawing.Point(0, 26);
+      this.constrainedDataBaseView.Name = "constrainedDataBaseView";
+      this.constrainedDataBaseView.Size = new System.Drawing.Size(344, 204);
+      this.constrainedDataBaseView.TabIndex = 1;
+      // 
+      // ConstrainedIntDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.constrainedDataBaseView);
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "ConstrainedIntDataView";
+      this.Size = new System.Drawing.Size(344, 230);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedDataBaseView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.cs	(revision 2)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class ConstrainedDoubleDataView : ViewBase {
+    public ConstrainedDoubleData ConstrainedDoubleData {
+      get { return (ConstrainedDoubleData)Item; }
+      set {
+        base.Item = value;
+        constrainedDataBaseView.ConstrainedItem = value;
+      }
+    }
+
+    public ConstrainedDoubleDataView() {
+      InitializeComponent();
+    }
+    public ConstrainedDoubleDataView(ConstrainedDoubleData constraintDoubleData)
+      : this() {
+      ConstrainedDoubleData = constraintDoubleData;
+    }
+
+    protected override void RemoveItemEvents() {
+      ConstrainedDoubleData.Changed -= new EventHandler(ConstrainedDoubleData_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedDoubleData.Changed += new EventHandler(ConstrainedDoubleData_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ConstrainedDoubleData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = ConstrainedDoubleData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      double value;
+      try {
+        value = double.Parse(dataTextBox.Text);
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedDoubleData.TrySetData(value, out violatedConstraints)) {
+          if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(violatedConstraints) == DialogResult.Yes)
+            ConstrainedDoubleData.Data = value;
+          else
+            e.Cancel = true;
+        }
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void ConstrainedDoubleData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedDoubleDataView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/ConstrainedIntData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedIntData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedIntData.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class ConstrainedIntData : ConstrainedObjectData {
+    public new int Data {
+      get { return ((IntData)base.Data).Data; }
+      set { ((IntData)base.Data).Data = value; }
+    }
+
+    public ConstrainedIntData() : this (0) {
+    }
+    public ConstrainedIntData(int data) : base() {
+      base.Data = new IntData(data);
+    }
+
+    public virtual bool TrySetData(int data) {
+      return base.TrySetData(new IntData(data));
+    }
+    public virtual bool TrySetData(int data, out ICollection<IConstraint> violatedConstraints) {
+      return base.TrySetData(new IntData(data), out violatedConstraints);
+    }
+
+    public override IView CreateView() {
+      return new ConstrainedIntDataView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedIntData clone = (ConstrainedIntData)base.Clone(clonedObjects);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Value", ((IntData)base.Data), document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      base.Data = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Value"), restoredObjects);
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.Designer.cs	(revision 2)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class ConstrainedIntDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataTextBox = new System.Windows.Forms.TextBox();
+      this.constrainedDataBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(344, 20);
+      this.dataTextBox.TabIndex = 0;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // constrainedDataBaseView
+      // 
+      this.constrainedDataBaseView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.constrainedDataBaseView.Caption = "Constrained Data";
+      this.constrainedDataBaseView.ConstrainedItem = null;
+      this.constrainedDataBaseView.Location = new System.Drawing.Point(0, 26);
+      this.constrainedDataBaseView.Name = "constrainedDataBaseView";
+      this.constrainedDataBaseView.Size = new System.Drawing.Size(344, 204);
+      this.constrainedDataBaseView.TabIndex = 1;
+      // 
+      // ConstrainedIntDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.constrainedDataBaseView);
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "ConstrainedIntDataView";
+      this.Size = new System.Drawing.Size(344, 230);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedDataBaseView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.cs	(revision 2)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class ConstrainedIntDataView : ViewBase {
+    public ConstrainedIntData ConstrainedIntData {
+      get { return (ConstrainedIntData)Item; }
+      set {
+        base.Item = value;
+        constrainedDataBaseView.ConstrainedItem = value;
+      }
+    }
+
+    public ConstrainedIntDataView() {
+      InitializeComponent();
+    }
+    public ConstrainedIntDataView(ConstrainedIntData constraintIntData)
+      : this() {
+      ConstrainedIntData = constraintIntData;
+    }
+
+    protected override void RemoveItemEvents() {
+      ConstrainedIntData.Changed -= new EventHandler(ConstrainedIntData_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedIntData.Changed += new EventHandler(ConstrainedIntData_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ConstrainedIntData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = ConstrainedIntData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      int value;
+      try {
+        value = int.Parse(dataTextBox.Text);
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedIntData.TrySetData(value, out violatedConstraints)) {
+          if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(violatedConstraints) == DialogResult.Yes)
+            ConstrainedIntData.Data = value;
+          else
+            e.Cancel = true;
+        }
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void ConstrainedIntData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedIntDataView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/ConstrainedItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedItemList.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedItemList.cs	(revision 2)
@@ -0,0 +1,211 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class ConstrainedItemList : ConstrainedItemBase, IEnumerable, IEnumerable<IItem> {
+    private List<IItem> list;
+    private bool suspendConstraintCheck;
+
+    public ConstrainedItemList()
+      : base() {
+      list = new List<IItem>();
+      suspendConstraintCheck = false;
+    }
+
+    public override IView CreateView() {
+      return new ConstrainedItemListView(this);
+    }
+
+    #region Clone & Persistence
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedItemList clone = new ConstrainedItemList();
+      clonedObjects.Add(Guid, clone);
+      foreach (IConstraint constraint in Constraints)
+        clone.AddConstraint((IConstraint)Auxiliary.Clone(constraint, clonedObjects));
+      clone.suspendConstraintCheck = suspendConstraintCheck;
+      foreach (IItem item in list) {
+        clone.list.Add((IItem)Auxiliary.Clone(item, clonedObjects));
+      }
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode listNode = document.CreateNode(XmlNodeType.Element, "ListItems", null);
+      for (int i = 0; i < list.Count; i++)
+        listNode.AppendChild(PersistenceManager.Persist(list[i], document, persistedObjects));
+      XmlAttribute sccAttrib = document.CreateAttribute("SuspendConstraintCheck");
+      sccAttrib.Value = suspendConstraintCheck.ToString();
+      listNode.Attributes.Append(sccAttrib);
+      node.AppendChild(listNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode listNode = node.SelectSingleNode("ListItems");
+      list = new List<IItem>();
+      for (int i = 0; i < listNode.ChildNodes.Count; i++)
+        list.Add((IItem)PersistenceManager.Restore(listNode.ChildNodes[i], restoredObjects));
+      suspendConstraintCheck = bool.Parse(listNode.Attributes["SuspendConstraintCheck"].Value);
+    }
+    #endregion
+
+    public override string ToString() {
+      if (list.Count > 0) {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(list[0].ToString());
+        for (int i = 1; i < list.Count; i++) {
+          builder.Append(";");
+          builder.Append(list[i].ToString());
+        }
+        return builder.ToString();
+      } else {
+        return "Empty List";
+      }
+    }
+
+    public int IndexOf(IItem item) {
+      return list.IndexOf(item);
+    }
+
+    public void BeginCombinedOperation() {
+      suspendConstraintCheck = true;
+    }
+
+    public bool EndCombinedOperation(out ICollection<IConstraint> violatedConstraints) {
+      suspendConstraintCheck = false;
+      return IsValid(out violatedConstraints);
+    }
+
+    public bool TryInsert(int index, IItem item, out ICollection<IConstraint> violatedConstraints) {
+      list.Insert(index, item);
+      if (!suspendConstraintCheck && IsValid(out violatedConstraints)) {
+        OnItemAdded(item, index);
+        return true;
+      } else {
+        violatedConstraints = new List<IConstraint>();
+        list.RemoveAt(index);
+        return false;
+      }
+    }
+
+    public bool TryRemoveAt(int index, out ICollection<IConstraint> violatedConstraints) {
+      IItem item = list[index];
+      list.RemoveAt(index);
+      if (!suspendConstraintCheck && IsValid(out violatedConstraints)) {
+        OnItemRemoved(item, index);
+        return true;
+      } else {
+        violatedConstraints = new List<IConstraint>();
+        list.Insert(index, item);
+        return false;
+      }
+    }
+
+    public IItem this[int index] {
+      get { return list[index]; }
+    }
+
+    public bool TrySetAt(int index, IItem item, out ICollection<IConstraint> violatedConstraints) {
+      IItem backup = this[index];
+      list[index] = item;
+      if (!suspendConstraintCheck && IsValid(out violatedConstraints)) {
+        return true;
+      } else {
+        violatedConstraints = new List<IConstraint>();
+        list[index] = backup;
+        return false;
+      }
+    }
+
+    public bool TryAdd(IItem item, out ICollection<IConstraint> violatedConstraints) {
+      list.Add(item);
+      if (!suspendConstraintCheck && IsValid(out violatedConstraints)) {
+        OnItemAdded(item, list.Count - 1);
+        return true;
+      } else {
+        violatedConstraints = new List<IConstraint>();
+        list.RemoveAt(list.Count - 1);
+        return false;
+      }
+    }
+    public void Clear() {
+      list.Clear();
+      OnCleared();
+    }
+    public bool Contains(IItem item) {
+      return list.Contains(item);
+    }
+    public void CopyTo(IItem[] array, int arrayIndex) {
+      list.CopyTo(array, arrayIndex);
+    }
+    public int Count {
+      get { return list.Count; }
+    }
+    public bool IsReadOnly {
+      get { return false; }
+    }
+    public bool TryRemove(IItem item, out ICollection<IConstraint> violatedConstraints) {
+      int index = list.IndexOf(item);
+      if (index >= 0) {
+        return TryRemoveAt(index, out violatedConstraints);
+      } else {
+        violatedConstraints = new List<IConstraint>();
+        return false;
+      }
+    }
+
+    public IEnumerator<IItem> GetEnumerator() {
+      return list.GetEnumerator();
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return list.GetEnumerator();
+    }
+
+    public event EventHandler<ItemIndexEventArgs> ItemAdded;
+    protected virtual void OnItemAdded(IItem item, int index) {
+      if (ItemAdded != null)
+        ItemAdded(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    public event EventHandler<ItemIndexEventArgs> ItemRemoved;
+    protected virtual void OnItemRemoved(IItem item, int index) {
+      if (ItemRemoved != null)
+        ItemRemoved(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    public event EventHandler Cleared;
+    protected virtual void OnCleared() {
+      if (Cleared != null)
+        Cleared(this, new EventArgs());
+      OnChanged();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.Designer.cs	(revision 2)
@@ -0,0 +1,215 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class ConstrainedItemListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.itemsSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.removeItemButton = new System.Windows.Forms.Button();
+      this.addItemButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.itemsTabPage = new System.Windows.Forms.TabPage();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constraintsConstrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.itemsSplitContainer.Panel1.SuspendLayout();
+      this.itemsSplitContainer.Panel2.SuspendLayout();
+      this.itemsSplitContainer.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.itemsTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // itemsSplitContainer
+      // 
+      this.itemsSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsSplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.itemsSplitContainer.Name = "itemsSplitContainer";
+      // 
+      // itemsSplitContainer.Panel1
+      // 
+      this.itemsSplitContainer.Panel1.Controls.Add(this.itemsGroupBox);
+      // 
+      // itemsSplitContainer.Panel2
+      // 
+      this.itemsSplitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.itemsSplitContainer.Size = new System.Drawing.Size(367, 378);
+      this.itemsSplitContainer.SplitterDistance = 162;
+      this.itemsSplitContainer.TabIndex = 2;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.itemsListView);
+      this.itemsGroupBox.Controls.Add(this.removeItemButton);
+      this.itemsGroupBox.Controls.Add(this.addItemButton);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(162, 378);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // removeItemButton
+      // 
+      this.removeItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeItemButton.Location = new System.Drawing.Point(84, 349);
+      this.removeItemButton.Name = "removeItemButton";
+      this.removeItemButton.Size = new System.Drawing.Size(75, 23);
+      this.removeItemButton.TabIndex = 4;
+      this.removeItemButton.Text = "Remove";
+      this.removeItemButton.UseVisualStyleBackColor = true;
+      this.removeItemButton.Click += new System.EventHandler(this.removeItemButton_Click);
+      // 
+      // addItemButton
+      // 
+      this.addItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addItemButton.Location = new System.Drawing.Point(3, 349);
+      this.addItemButton.Name = "addItemButton";
+      this.addItemButton.Size = new System.Drawing.Size(75, 23);
+      this.addItemButton.TabIndex = 3;
+      this.addItemButton.Text = "Add";
+      this.addItemButton.UseVisualStyleBackColor = true;
+      this.addItemButton.Click += new System.EventHandler(this.addItemButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(201, 378);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.itemsTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(381, 410);
+      this.tabControl.TabIndex = 5;
+      // 
+      // itemsTabPage
+      // 
+      this.itemsTabPage.Controls.Add(this.itemsSplitContainer);
+      this.itemsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.itemsTabPage.Name = "itemsTabPage";
+      this.itemsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.itemsTabPage.Size = new System.Drawing.Size(373, 384);
+      this.itemsTabPage.TabIndex = 0;
+      this.itemsTabPage.Text = "Items";
+      this.itemsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constraintsConstrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(373, 384);
+      this.constraintsTabPage.TabIndex = 1;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constraintsConstrainedItemBaseView
+      // 
+      this.constraintsConstrainedItemBaseView.Caption = "Constrained Item";
+      this.constraintsConstrainedItemBaseView.ConstrainedItem = null;
+      this.constraintsConstrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintsConstrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constraintsConstrainedItemBaseView.Name = "constraintsConstrainedItemBaseView";
+      this.constraintsConstrainedItemBaseView.Size = new System.Drawing.Size(367, 378);
+      this.constraintsConstrainedItemBaseView.TabIndex = 0;
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.itemsListView.Location = new System.Drawing.Point(6, 19);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.Size = new System.Drawing.Size(153, 324);
+      this.itemsListView.TabIndex = 0;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyUp);
+      // 
+      // ConstrainedItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "ConstrainedItemListView";
+      this.Size = new System.Drawing.Size(381, 410);
+      this.itemsSplitContainer.Panel1.ResumeLayout(false);
+      this.itemsSplitContainer.Panel2.ResumeLayout(false);
+      this.itemsSplitContainer.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.itemsTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer itemsSplitContainer;
+    private System.Windows.Forms.Button addItemButton;
+    private System.Windows.Forms.Button removeItemButton;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage itemsTabPage;
+    private System.Windows.Forms.TabPage constraintsTabPage;
+    private System.Windows.Forms.GroupBox itemsGroupBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private HeuristicLab.Core.ConstrainedItemBaseView constraintsConstrainedItemBaseView;
+    private System.Windows.Forms.ListView itemsListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.cs	(revision 2)
@@ -0,0 +1,178 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class ConstrainedItemListView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    public ConstrainedItemList ConstrainedItemList {
+      get { return (ConstrainedItemList)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public ConstrainedItemListView() {
+      InitializeComponent();
+      //itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
+    }
+
+    public ConstrainedItemListView(ConstrainedItemList constrainedItemList)
+      : this() {
+      ConstrainedItemList = constrainedItemList;
+    }
+
+    protected override void RemoveItemEvents() {
+      ConstrainedItemList.ItemAdded -= new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemAdded);
+      ConstrainedItemList.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemRemoved);
+      ConstrainedItemList.Cleared -= new EventHandler(ConstrainedItemList_Cleared);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedItemList.ItemAdded += new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemAdded);
+      ConstrainedItemList.ItemRemoved += new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemRemoved);
+      ConstrainedItemList.Cleared += new EventHandler(ConstrainedItemList_Cleared);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsGroupBox.Enabled = false;
+      detailsGroupBox.Controls.Clear();
+      removeItemButton.Enabled = false;
+
+      if (ConstrainedItemList == null) {
+        itemsGroupBox.Enabled = false;
+        itemsSplitContainer.Enabled = false;
+        constraintsConstrainedItemBaseView.Enabled = false;
+      } else {
+        foreach (ListViewItem item in itemsListView.Items) {
+          ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed);
+        }
+        itemsListView.Items.Clear();
+        foreach (IItem data in ConstrainedItemList) {
+          ListViewItem item = new ListViewItem();
+          item.Text = data.ToString();
+          item.Tag = data;
+          itemsListView.Items.Add(item);
+          data.Changed += new EventHandler(Item_Changed);
+        }
+        itemsSplitContainer.Enabled = true;
+        constraintsConstrainedItemBaseView.ConstrainedItem = ConstrainedItemList;
+        constraintsConstrainedItemBaseView.Enabled = true;
+      }
+    }
+
+    private void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      detailsGroupBox.Enabled = false;
+      if (detailsGroupBox.Controls.Count > 0) detailsGroupBox.Controls[0].Dispose();
+      detailsGroupBox.Controls.Clear();
+      if (itemsListView.SelectedItems.Count == 1) {
+        IItem data = (IItem)itemsListView.SelectedItems[0].Tag;
+        Control view = (Control)data.CreateView();
+        detailsGroupBox.Controls.Add(view);
+        view.Dock = DockStyle.Fill;
+        detailsGroupBox.Enabled = true;
+      }
+      removeItemButton.Enabled = (itemsListView.SelectedItems.Count == 1);
+    }
+
+    #region ConstrainedItemList changes
+    void ConstrainedItemList_ItemAdded(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemAdded), sender, e);
+      else {
+        ListViewItem item = new ListViewItem();
+        item.Text = e.Item.ToString();
+        item.Tag = e.Item;
+        itemsListView.Items.Insert(e.Index, item);
+        e.Item.Changed += new EventHandler(Item_Changed);
+      }
+    }
+
+    void ConstrainedItemList_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemRemoved), sender, e);
+      else {
+        itemsListView.Items.RemoveAt(e.Index);
+        e.Item.Changed -= new EventHandler(Item_Changed);
+      }
+    }
+
+    void ConstrainedItemList_Cleared(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    void Item_Changed(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_Changed), sender, e);
+      else {
+        IItem data = (IItem)sender;
+        foreach (ListViewItem item in itemsListView.Items) {
+          if (item.Tag == data)
+            item.Text = data.ToString();
+        }
+      }
+    }
+    #endregion
+
+    #region Button events
+    private void addItemButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Add Item";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedItemList.TryAdd(chooseItemDialog.Item, out violatedConstraints)) {
+          Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints);
+        }
+      }
+    }
+
+    private void removeItemButton_Click(object sender, EventArgs e) {
+      ICollection<IConstraint> violatedConstraints;
+      if (!ConstrainedItemList.TryRemoveAt(itemsListView.SelectedIndices[0], out violatedConstraints)) {
+        Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints);
+      }
+    }
+    #endregion
+
+    #region Key events
+    private void itemsListView_KeyUp(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedItemList.TryRemoveAt(itemsListView.SelectedIndices[0], out violatedConstraints)) {
+          Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints);
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedItemListView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/ConstrainedObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedObjectData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedObjectData.cs	(revision 2)
@@ -0,0 +1,102 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class ConstrainedObjectData : ConstrainedItemBase, IObjectData {
+    private object myData;
+    public virtual object Data {
+      get { return myData; }
+      set {
+        if (myData != value) {
+          myData = value;
+          OnChanged();
+        }
+      }
+    }
+
+    public virtual bool TrySetData(object data) {
+      if (myData != data) {
+        object backup = myData;
+        myData = data;
+        if (IsValid()) {
+          OnChanged();
+          return true;
+        } else {
+          myData = backup;
+          return false;
+        }
+      }
+      return true;
+    }
+    public virtual bool TrySetData(object data, out ICollection<IConstraint> violatedConstraints) {
+      if (myData != data) {
+        object backup = myData;
+        myData = data;
+        if (IsValid(out violatedConstraints)) {
+          OnChanged();
+          return true;
+        } else {
+          myData = backup;
+          return false;
+        }
+      }
+      violatedConstraints = new List<IConstraint>();
+      return true;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedObjectData clone = (ConstrainedObjectData)base.Clone(clonedObjects);
+      if (Data is IStorable)
+        clone.myData = Auxiliary.Clone((IStorable)Data, clonedObjects);
+      else if (Data is ICloneable)
+        clone.myData = ((ICloneable)Data).Clone();
+      else
+        throw new InvalidOperationException("contained object is not cloneable");
+      return clone;
+    }
+
+    public int CompareTo(object obj) {
+      IComparable comparable = Data as IComparable;
+      if (comparable != null) {
+        IObjectData other = obj as IObjectData;
+        if (other != null)
+          return comparable.CompareTo(other.Data);
+        else
+          return comparable.CompareTo(obj);
+      }
+      throw new InvalidOperationException("Cannot compare as contained object doesn't implement IComparable");
+    }
+
+    public override string ToString() {
+      return Data.ToString();
+    }
+
+    public virtual void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleArrayData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleArrayData.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class DoubleArrayData : ArrayDataBase {
+    public new double[] Data {
+      get { return (double[])base.Data; }
+      set { base.Data = value; }
+    }
+
+    public DoubleArrayData() {
+      Data = new double[0];
+    }
+    public DoubleArrayData(double[] data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new DoubleArrayDataView(this);
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      string[] tokens = node.InnerText.Split(';');
+      double[] data = new double[tokens.Length];
+      for(int i = 0; i < data.Length; i++)
+        if(double.TryParse(tokens[i], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i]) == false) {
+          throw new FormatException("Can't parse " + tokens[i] + " as double value.");
+        }
+      Data = data;
+    }
+
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for(int i = 0; i < Data.Length; i++) {
+        builder.Append(";");
+        builder.Append(Data[i].ToString(format));
+      }
+      if(builder.Length > 0)
+        builder.Remove(0, 1);
+      return builder.ToString();
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleArrayDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleArrayDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleArrayDataView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class DoubleArrayDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleArrayDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleArrayDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleArrayDataView.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  public partial class DoubleArrayDataView : ArrayDataBaseView {
+    public DoubleArrayData DoubleArrayData {
+      get { return (DoubleArrayData)base.Item; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    public DoubleArrayDataView() {
+      InitializeComponent();
+    }
+    public DoubleArrayDataView(DoubleArrayData doubleArrayData)
+      : this() {
+      DoubleArrayData = doubleArrayData;
+    }
+
+    protected override void SetArrayElement(int index, string element) {
+      double result;
+      double.TryParse(element, out result);
+
+      DoubleArrayData.Data[index] = result;
+    }
+
+    protected override bool ValidateData(string element) {
+      double result;
+      return element != null && double.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleData.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class DoubleData : ObjectData {
+    public new double Data {
+      get { return (double)base.Data; }
+      set { base.Data = value; }
+    }
+
+    public DoubleData() {
+      Data = 0.0;
+    }
+    public DoubleData(double data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new DoubleDataView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      DoubleData clone = new DoubleData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = Data.ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      double data;
+      if(double.TryParse(node.InnerText, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data) == true) {
+        Data = data;
+      } else {
+        throw new FormatException("Can't parse " + node.InnerText + " as double value.");       
+      }
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleDataView.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class DoubleDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(274, 20);
+      this.dataTextBox.TabIndex = 1;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // DoubleDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "DoubleDataView";
+      this.Size = new System.Drawing.Size(274, 26);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleDataView.cs	(revision 2)
@@ -0,0 +1,80 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class DoubleDataView : ViewBase {
+    public DoubleData DoubleData {
+      get { return (DoubleData)Item; }
+      set { base.Item = value; }
+    }
+
+    public DoubleDataView() {
+      InitializeComponent();
+    }
+    public DoubleDataView(DoubleData doubleData)
+      : this() {
+      DoubleData = doubleData;
+    }
+
+    protected override void RemoveItemEvents() {
+      DoubleData.Changed -= new EventHandler(DoubleData_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      DoubleData.Changed += new EventHandler(DoubleData_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (DoubleData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = DoubleData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        DoubleData.Data = double.Parse(dataTextBox.Text);
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void DoubleData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleDataView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleDataView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/DoubleMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleMatrixData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleMatrixData.cs	(revision 2)
@@ -0,0 +1,90 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class DoubleMatrixData : ArrayDataBase {
+    public new double[,] Data {
+      get { return (double[,])base.Data; }
+      set { base.Data = value; }
+    }
+
+    public DoubleMatrixData() {
+      Data = new double[1, 1];
+    }
+    public DoubleMatrixData(double[,] data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new DoubleMatrixDataView(this);
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = Data.GetLength(0).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = Data.GetLength(1).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int dim1 = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      int dim2 = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      string[] tokens = node.InnerText.Split(';');
+      double[,] data = new double[dim1, dim2];
+      for (int i = 0; i < dim1; i++) {
+        for (int j = 0; j < dim2; j++) {
+          if(double.TryParse(tokens[i * dim2 + j], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i, j])==false) {
+            throw new FormatException("Can't parse " + tokens[i * dim2 + j] + " as double value.");
+          }
+        }
+      }
+      Data = data;
+    }
+
+    public override string ToString() {
+      return ToString(CultureInfo.CurrentCulture.NumberFormat);
+    }
+
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.GetLength(0); i++) {
+        for (int j = 0; j < Data.GetLength(1); j++) {
+          builder.Append(";");
+          builder.Append(Data[i, j].ToString(format));
+        }
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleMatrixDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleMatrixDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleMatrixDataView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class DoubleMatrixDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/DoubleMatrixDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleMatrixDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/DoubleMatrixDataView.cs	(revision 2)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  public partial class DoubleMatrixDataView : MatrixDataBaseView {
+    public DoubleMatrixData DoubleMatrixData {
+      get { return (DoubleMatrixData)base.Item; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    public DoubleMatrixDataView() {
+      InitializeComponent();
+    }
+    public DoubleMatrixDataView(DoubleMatrixData doubleMatrixData)
+      : this() {
+      DoubleMatrixData = doubleMatrixData;
+    }
+
+    protected override void SetArrayElement(int row, int column, string element) {
+      double result;
+      double.TryParse(element, out result);
+      if(result != DoubleMatrixData.Data[row, column]) {
+        DoubleMatrixData.Data[row, column] = result;
+        DoubleMatrixData.FireChanged();
+      }
+    }
+
+    protected override bool ValidateData(string element) {
+      double result;
+      return element != null && double.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/HeuristicLab.Data.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Data/HeuristicLab.Data.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/HeuristicLab.Data.csproj	(revision 2)
@@ -0,0 +1,262 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Data</RootNamespace>
+    <AssemblyName>HeuristicLab.Data</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/HeuristicLab.Data/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Data.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ArrayDataBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ArrayDataBaseView.Designer.cs">
+      <DependentUpon>ArrayDataBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoolArrayData.cs" />
+    <Compile Include="BoolArrayDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolArrayDataView.Designer.cs">
+      <DependentUpon>BoolArrayDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoolData.cs" />
+    <Compile Include="BoolDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolDataView.Designer.cs">
+      <DependentUpon>BoolDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoolMatrixData.cs" />
+    <Compile Include="ArrayDataBase.cs" />
+    <Compile Include="BoolMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolMatrixDataView.Designer.cs">
+      <DependentUpon>BoolMatrixDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedItemList.cs" />
+    <Compile Include="ConstrainedItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedItemListView.Designer.cs">
+      <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedObjectData.cs" />
+    <Compile Include="ConstrainedIntData.cs" />
+    <Compile Include="ConstrainedIntDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedIntDataView.Designer.cs">
+      <DependentUpon>ConstrainedIntDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedDoubleData.cs" />
+    <Compile Include="ConstrainedDoubleDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedDoubleDataView.Designer.cs">
+      <DependentUpon>ConstrainedDoubleDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntMatrixDataView.Designer.cs">
+      <DependentUpon>IntMatrixDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleMatrixDataView.Designer.cs">
+      <DependentUpon>DoubleMatrixDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntArrayDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntArrayDataView.Designer.cs">
+      <DependentUpon>IntArrayDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleArrayDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleArrayDataView.Designer.cs">
+      <DependentUpon>DoubleArrayDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleDataView.Designer.cs">
+      <DependentUpon>DoubleDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntDataView.Designer.cs">
+      <DependentUpon>IntDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IObjectData.cs" />
+    <Compile Include="IObjectDataVisitor.cs" />
+    <Compile Include="ItemList.cs" />
+    <Compile Include="ItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemListView.Designer.cs">
+      <DependentUpon>ItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MatrixDataBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MatrixDataBaseView.Designer.cs">
+      <DependentUpon>MatrixDataBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ObjectData.cs" />
+    <Compile Include="ObjectDataVisitorBase.cs" />
+    <Compile Include="StringDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringDataView.Designer.cs">
+      <DependentUpon>StringDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleArrayData.cs" />
+    <Compile Include="DoubleData.cs" />
+    <Compile Include="DoubleMatrixData.cs" />
+    <Compile Include="HeuristicLabDataPlugin.cs" />
+    <Compile Include="IntArrayData.cs" />
+    <Compile Include="IntData.cs" />
+    <Compile Include="IntMatrixData.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StringData.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ArrayDataBaseView.resx">
+      <DependentUpon>ArrayDataBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="BoolDataView.resx">
+      <DependentUpon>BoolDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedIntDataView.resx">
+      <DependentUpon>ConstrainedIntDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedDoubleDataView.resx">
+      <DependentUpon>ConstrainedDoubleDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedItemListView.resx">
+      <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DoubleDataView.resx">
+      <DependentUpon>DoubleDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="IntDataView.resx">
+      <DependentUpon>IntDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemListView.resx">
+      <DependentUpon>ItemListView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MatrixDataBaseView.resx">
+      <DependentUpon>MatrixDataBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StringDataView.resx">
+      <DependentUpon>StringDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Data/HeuristicLabDataPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/HeuristicLabDataPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/HeuristicLabDataPlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Data {
+  [ClassInfo(Name = "HeuristicLab.Data")]
+  [PluginFile(Filename = "HeuristicLab.Data.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  public class HeuristicLabDataPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IObjectData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IObjectData.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public interface IObjectData : IItem, IComparable {
+    object Data { get; set; }
+
+    void Accept(IObjectDataVisitor visitor);
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IObjectDataVisitor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IObjectDataVisitor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IObjectDataVisitor.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Data {
+  public interface IObjectDataVisitor {
+    void Visit(BoolData data);
+    void Visit(IntData data);
+    void Visit(DoubleData data);
+    void Visit(StringData data);
+
+    void Visit(BoolArrayData data);
+    void Visit(IntArrayData data);
+    void Visit(DoubleArrayData data);
+
+    void Visit(BoolMatrixData data);
+    void Visit(IntMatrixData data);
+    void Visit(DoubleMatrixData data);
+
+    void Visit(ConstrainedIntData data);
+    void Visit(ConstrainedDoubleData data);
+
+    void Visit(ConstrainedObjectData constrainedObjectData);
+    void Visit(ObjectData objectData);
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntArrayData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntArrayData.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class IntArrayData : ArrayDataBase {
+    public new int[] Data {
+      get { return (int[])base.Data; }
+      set { base.Data = value; }
+    }
+
+    public IntArrayData() {
+      Data = new int[0];
+    }
+    public IntArrayData(int[] data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new IntArrayDataView(this);
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      if (!node.InnerText.Equals("")) {
+        string[] tokens = node.InnerText.Split(';');
+        int[] data = new int[tokens.Length];
+        for (int i = 0; i < data.Length; i++)
+          data[i] = int.Parse(tokens[i], CultureInfo.InvariantCulture.NumberFormat);
+        Data = data;
+      }
+    }
+
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.Length; i++) {
+        builder.Append(";");
+        builder.Append(Data[i].ToString(format));
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntArrayDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntArrayDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntArrayDataView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class IntArrayDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntArrayDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntArrayDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntArrayDataView.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  public partial class IntArrayDataView : ArrayDataBaseView {
+    public IntArrayData IntArrayData {
+      get { return (IntArrayData)base.Item; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    public IntArrayDataView() {
+      InitializeComponent();
+    }
+    public IntArrayDataView(IntArrayData intArrayData)
+      : this() {
+      IntArrayData = intArrayData;
+    }
+
+    protected override void SetArrayElement(int index, string element) {
+      int result;
+      int.TryParse(element, out result);
+
+      IntArrayData.Data[index] = result;
+    }
+
+    protected override bool ValidateData(string element) {
+      int result;
+      return element != null && int.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntData.cs	(revision 2)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class IntData : ObjectData {
+    public new int Data {
+      get { return (int)base.Data; }
+      set { base.Data = value; }
+    }
+
+    public IntData() {
+      Data = 0;
+    }
+    public IntData(int data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new IntDataView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      IntData clone = new IntData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = Data.ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Data = int.Parse(node.InnerText, CultureInfo.InvariantCulture.NumberFormat);
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntDataView.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class IntDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(265, 20);
+      this.dataTextBox.TabIndex = 1;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // IntDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "IntDataView";
+      this.Size = new System.Drawing.Size(265, 26);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntDataView.cs	(revision 2)
@@ -0,0 +1,80 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class IntDataView : ViewBase {
+    public IntData IntData {
+      get { return (IntData)Item; }
+      set { base.Item = value; }
+    }
+
+    public IntDataView() {
+      InitializeComponent();
+    }
+    public IntDataView(IntData intData)
+      : this() {
+      IntData = intData;
+    }
+
+    protected override void RemoveItemEvents() {
+      IntData.Changed -= new EventHandler(IntData_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      IntData.Changed += new EventHandler(IntData_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (IntData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = IntData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        IntData.Data = int.Parse(dataTextBox.Text);
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void IntData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntDataView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntDataView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/IntMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntMatrixData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntMatrixData.cs	(revision 2)
@@ -0,0 +1,92 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  public class IntMatrixData : ArrayDataBase {
+    public new int[,] Data {
+      get { return (int[,])base.Data; }
+      set { base.Data = value; }
+    }
+
+    public IntMatrixData() {
+      Data = new int[1, 1];
+    }
+    public IntMatrixData(int[,] data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new IntMatrixDataView(this);
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = Data.GetLength(0).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = Data.GetLength(1).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int dim1 = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      int dim2 = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      string[] tokens = node.InnerText.Split(';');
+      int[,] data = new int[dim1, dim2];
+      for (int i = 0; i < dim1; i++) {
+        for (int j = 0; j < dim2; j++) {
+          data[i, j] = int.Parse(tokens[i * dim2 + j], CultureInfo.InvariantCulture.NumberFormat);
+        }
+      }
+      Data = data;
+    }
+
+    public override string ToString() {
+      return ToString(CultureInfo.CurrentCulture.NumberFormat);
+    }
+
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.GetLength(0); i++) {
+        for (int j = 0; j < Data.GetLength(1); j++) {
+          builder.Append(";");
+          builder.Append(Data[i, j].ToString(format));
+        }
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntMatrixDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntMatrixDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntMatrixDataView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class IntMatrixDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/IntMatrixDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntMatrixDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/IntMatrixDataView.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  public partial class IntMatrixDataView : MatrixDataBaseView {
+    public IntMatrixData IntMatrixData {
+      get { return (IntMatrixData)base.Item; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    public IntMatrixDataView() {
+      InitializeComponent();
+    }
+    public IntMatrixDataView(IntMatrixData intMatrixData)
+      : this() {
+      IntMatrixData = intMatrixData;
+    }
+
+    protected override void SetArrayElement(int row, int column, string element) {
+      int result;
+      int.TryParse(element, out result);
+
+      IntMatrixData.Data[row, column] = result;
+    }
+
+    protected override bool ValidateData(string element) {
+      int result;
+      return element != null && int.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ItemList.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ItemList.cs	(revision 2)
@@ -0,0 +1,202 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class ItemList : ItemBase, IList<IItem> {
+    private List<IItem> list;
+
+    private Type myItemType;
+    public Type ItemType {
+      get { return myItemType; }
+      set {
+        if (value == null) value = typeof(IItem);
+        if (value != myItemType) {
+          if (!typeof(IItem).IsAssignableFrom(value))
+            throw new InvalidOperationException("Cannot set item type. Only types compatible to IItem are allowed.");
+          foreach (IItem item in list) {
+            if (!value.IsAssignableFrom(item.GetType()))
+              throw new InvalidOperationException("Cannot set item type. Items are incompatible.");
+          }
+          myItemType = value;
+          OnItemTypeChanged();
+        }
+      }
+    }
+
+    public ItemList() {
+      list = new List<IItem>();
+      myItemType = typeof(IItem);
+    }
+
+    public override IView CreateView() {
+      return new ItemListView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ItemList clone = new ItemList();
+      clonedObjects.Add(Guid, clone);
+      clone.myItemType = ItemType;
+      for (int i = 0; i < list.Count; i++)
+        clone.list.Add((IItem)Auxiliary.Clone(list[i], clonedObjects));
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      if (ItemType != null) {
+        XmlAttribute itemTypeAttribute = document.CreateAttribute("ItemType");
+        string typeString = ItemType.AssemblyQualifiedName;
+        string[] tokens = typeString.Split(new string[] { ", " }, StringSplitOptions.None);
+        typeString = tokens[0] + ", " + tokens[1];
+        itemTypeAttribute.Value = typeString;
+        node.Attributes.Append(itemTypeAttribute);
+      }
+      for (int i = 0; i < list.Count; i++)
+        node.AppendChild(PersistenceManager.Persist(list[i], document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlAttribute itemTypeAttribute = node.Attributes["ItemType"];
+      if (itemTypeAttribute != null)
+        myItemType = Type.GetType(itemTypeAttribute.Value);
+      for (int i = 0; i < node.ChildNodes.Count; i++)
+        list.Add((IItem)PersistenceManager.Restore(node.ChildNodes[i], restoredObjects));
+    }
+
+    public override string ToString() {
+      if (list.Count > 0) {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(list[0].ToString());
+        for (int i = 1; i < list.Count; i++) {
+          builder.Append(";");
+          builder.Append(list[i].ToString());
+        }
+        return builder.ToString();
+      } else {
+        return "Empty List";
+      }
+    }
+
+    #region IList<IItem> Members
+    public int IndexOf(IItem item) {
+      return list.IndexOf(item);
+    }
+    public void Insert(int index, IItem item) {
+      if ((ItemType != null) && (!ItemType.IsAssignableFrom(item.GetType())))
+        throw new InvalidOperationException("item type is incompatible to required item type");
+      list.Insert(index, item);
+      OnItemAdded(item, index);
+    }
+    public void RemoveAt(int index) {
+      IItem item = list[index];
+      list.RemoveAt(index);
+      OnItemRemoved(item, index);
+    }
+    public IItem this[int index] {
+      get { return list[index]; }
+      set {
+        if ((ItemType != null) && (!ItemType.IsAssignableFrom(value.GetType())))
+          throw new InvalidOperationException("item type is incompatible to required item type");
+        list[index] = value;
+      }
+    }
+    #endregion
+
+    #region ICollection<IItem> Members
+    public void Add(IItem item) {
+      if ((ItemType != null) && (!ItemType.IsAssignableFrom(item.GetType())))
+        throw new InvalidOperationException("item type is incompatible to required item type");
+      list.Add(item);
+      OnItemAdded(item, list.Count - 1);
+    }
+    public void Clear() {
+      list.Clear();
+      OnCleared();
+    }
+    public bool Contains(IItem item) {
+      return list.Contains(item);
+    }
+    public void CopyTo(IItem[] array, int arrayIndex) {
+      list.CopyTo(array, arrayIndex);
+    }
+    public int Count {
+      get { return list.Count; }
+    }
+    public bool IsReadOnly {
+      get { return false; }
+    }
+    public bool Remove(IItem item) {
+      int index = list.IndexOf(item);
+      if (list.Remove(item)) {
+        OnItemRemoved(item, index);
+        return true;
+      } else {
+        return false;
+      }
+    }
+    #endregion
+
+    #region IEnumerable<IItem> Members
+    public IEnumerator<IItem> GetEnumerator() {
+      return list.GetEnumerator();
+    }
+    #endregion
+
+    #region IEnumerable Members
+    IEnumerator IEnumerable.GetEnumerator() {
+      return list.GetEnumerator();
+    }
+    #endregion
+
+    public event EventHandler ItemTypeChanged;
+    protected virtual void OnItemTypeChanged() {
+      if (ItemTypeChanged != null)
+        ItemTypeChanged(this, new EventArgs());
+      OnChanged();
+    }
+    public event EventHandler<ItemIndexEventArgs> ItemAdded;
+    protected virtual void OnItemAdded(IItem item, int index) {
+      if (ItemAdded != null)
+        ItemAdded(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    public event EventHandler<ItemIndexEventArgs> ItemRemoved;
+    protected virtual void OnItemRemoved(IItem item, int index) {
+      if (ItemRemoved != null)
+        ItemRemoved(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    public event EventHandler Cleared;
+    protected virtual void OnCleared() {
+      if (Cleared != null)
+        Cleared(this, new EventArgs());
+      OnChanged();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ItemListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ItemListView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ItemListView.Designer.cs	(revision 2)
@@ -0,0 +1,223 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  partial class ItemListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseItemDialog != null) chooseItemDialog.Dispose();
+      foreach (ListViewItem item in itemsListView.Items)
+        ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed);
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.itemTypeLabel = new System.Windows.Forms.Label();
+      this.setTypeButton = new System.Windows.Forms.Button();
+      this.typeTextBox = new System.Windows.Forms.TextBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer.Enabled = false;
+      this.splitContainer.Location = new System.Drawing.Point(0, 27);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.itemsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 246);
+      this.splitContainer.SplitterDistance = 198;
+      this.splitContainer.TabIndex = 3;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.removeButton);
+      this.itemsGroupBox.Controls.Add(this.addButton);
+      this.itemsGroupBox.Controls.Add(this.itemsListView);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(198, 246);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "&Items:";
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Location = new System.Drawing.Point(87, 217);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 2;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addButton.Location = new System.Drawing.Point(6, 217);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(75, 23);
+      this.addButton.TabIndex = 1;
+      this.addButton.Text = "&Add...";
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(6, 19);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.Size = new System.Drawing.Size(186, 192);
+      this.itemsListView.TabIndex = 0;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.elementsListView_SelectedIndexChanged);
+      this.itemsListView.SizeChanged += new System.EventHandler(this.elementsListView_SizeChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.elementsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.elementsListView_DragEnter);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.elementsListView_KeyDown);
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.elementsListView_ItemDrag);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.elementsListView_DragOver);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Enabled = false;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(221, 246);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "&Details:";
+      // 
+      // itemTypeLabel
+      // 
+      this.itemTypeLabel.AutoSize = true;
+      this.itemTypeLabel.Location = new System.Drawing.Point(3, 3);
+      this.itemTypeLabel.Name = "itemTypeLabel";
+      this.itemTypeLabel.Size = new System.Drawing.Size(57, 13);
+      this.itemTypeLabel.TabIndex = 0;
+      this.itemTypeLabel.Text = "&Item Type:";
+      // 
+      // setTypeButton
+      // 
+      this.setTypeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.setTypeButton.Location = new System.Drawing.Point(380, 0);
+      this.setTypeButton.Name = "setTypeButton";
+      this.setTypeButton.Size = new System.Drawing.Size(43, 20);
+      this.setTypeButton.TabIndex = 1;
+      this.setTypeButton.Text = "&Set...";
+      this.setTypeButton.UseVisualStyleBackColor = true;
+      this.setTypeButton.Click += new System.EventHandler(this.setTypeButton_Click);
+      // 
+      // typeTextBox
+      // 
+      this.typeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.typeTextBox.Location = new System.Drawing.Point(66, 0);
+      this.typeTextBox.Name = "typeTextBox";
+      this.typeTextBox.ReadOnly = true;
+      this.typeTextBox.Size = new System.Drawing.Size(308, 20);
+      this.typeTextBox.TabIndex = 2;
+      // 
+      // ItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.typeTextBox);
+      this.Controls.Add(this.setTypeButton);
+      this.Controls.Add(this.itemTypeLabel);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ItemListView";
+      this.Size = new System.Drawing.Size(423, 273);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.GroupBox itemsGroupBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.ListView itemsListView;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private Label itemTypeLabel;
+    private Button setTypeButton;
+    private TextBox typeTextBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ItemListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ItemListView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ItemListView.cs	(revision 2)
@@ -0,0 +1,251 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class ItemListView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    public ItemList ItemList {
+      get { return (ItemList)Item; }
+      set { base.Item = value; }
+    }
+
+    public ItemListView() {
+      InitializeComponent();
+      itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
+    }
+    public ItemListView(ItemList itemList)
+      : this() {
+      ItemList = itemList;
+    }
+
+    protected override void RemoveItemEvents() {
+      ItemList.ItemTypeChanged -= new EventHandler(ItemList_ItemTypeChanged);
+      ItemList.ItemAdded -= new EventHandler<ItemIndexEventArgs>(ItemList_ItemInserted);
+      ItemList.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(ItemList_ItemRemoved);
+      ItemList.Cleared -= new EventHandler(ItemList_Cleared);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ItemList.ItemTypeChanged += new EventHandler(ItemList_ItemTypeChanged);
+      ItemList.ItemAdded += new EventHandler<ItemIndexEventArgs>(ItemList_ItemInserted);
+      ItemList.ItemRemoved += new EventHandler<ItemIndexEventArgs>(ItemList_ItemRemoved);
+      ItemList.Cleared += new EventHandler(ItemList_Cleared);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if (ItemList == null) {
+        typeTextBox.Text = "";
+        setTypeButton.Enabled = false;
+        splitContainer.Enabled = false;
+      } else {
+        typeTextBox.Text = ItemList.ItemType.FullName;
+        setTypeButton.Enabled = true;
+        splitContainer.Enabled = true;
+        foreach (ListViewItem item in itemsListView.Items) {
+          ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed);
+        }
+        itemsListView.Items.Clear();
+        foreach (IItem data in ItemList) {
+          ListViewItem item = new ListViewItem();
+          item.Text = data.ToString();
+          item.Tag = data;
+          itemsListView.Items.Add(item);
+          data.Changed += new EventHandler(Item_Changed);
+        }
+      }
+    }
+
+    private void elementsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (detailsGroupBox.Controls.Count > 0)
+        detailsGroupBox.Controls[0].Dispose();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if (itemsListView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+      if (itemsListView.SelectedItems.Count == 1) {
+        IItem data = (IItem)itemsListView.SelectedItems[0].Tag;
+        Control view = (Control)data.CreateView();
+        detailsGroupBox.Controls.Add(view);
+        view.Dock = DockStyle.Fill;
+        detailsGroupBox.Enabled = true;
+      }
+    }
+
+    #region Size Changed Events
+    private void elementsListView_SizeChanged(object sender, EventArgs e) {
+      if (itemsListView.Columns.Count > 0)
+        itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void elementsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        while (itemsListView.SelectedIndices.Count > 0)
+          ItemList.RemoveAt(itemsListView.SelectedIndices[0]);
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void setTypeButton_Click(object sender, EventArgs e) {
+      ChooseTypeDialog dialog = new ChooseTypeDialog();
+      dialog.Caption = "Set Item Type";
+      if (dialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          ItemList.ItemType = dialog.Type;
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+      dialog.Dispose();
+    }
+    private void addButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog(ItemList.ItemType);
+        chooseItemDialog.Caption = "Add Item";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          ItemList.Add(chooseItemDialog.Item);
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      while (itemsListView.SelectedIndices.Count > 0)
+        ItemList.RemoveAt(itemsListView.SelectedIndices[0]);
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void elementsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem item = (ListViewItem)e.Item;
+      IItem data = (IItem)item.Tag;
+      DataObject dataObject = new DataObject();
+      dataObject.SetData("IItem", data);
+      dataObject.SetData("DragSource", itemsListView);
+      DoDragDrop(dataObject, DragDropEffects.Move);
+    }
+    private void elementsListView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IItem")) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem item = itemsListView.GetItemAt(p.X, p.Y);
+        if (item != null)
+          e.Effect = DragDropEffects.Move;
+      }
+    }
+    private void elementsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IItem")) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem item = itemsListView.GetItemAt(p.X, p.Y);
+        if (item != null)
+          e.Effect = DragDropEffects.Move;
+      }
+    }
+    private void elementsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IItem")) {
+          IItem data = (IItem)e.Data.GetData("IItem");
+          Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+          ListViewItem item = itemsListView.GetItemAt(p.X, p.Y);
+          if (item != null) {
+            int index = item.Index;
+            ItemList.Remove(data);
+            ItemList.Insert(index, data);
+            itemsListView.SelectedIndices.Clear();
+            itemsListView.SelectedIndices.Add(index);
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Item and Item List Events
+    private void ItemList_ItemTypeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(ItemList_ItemTypeChanged), sender, e);
+      else {
+        typeTextBox.Text = ItemList.ItemType.FullName;
+        if (chooseItemDialog != null) chooseItemDialog.Dispose();
+        chooseItemDialog = new ChooseItemDialog(ItemList.ItemType);
+        chooseItemDialog.Caption = "Add Item";
+      }
+    }
+    private void ItemList_ItemInserted(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ItemList_ItemInserted), sender, e);
+      else {
+        ListViewItem item = new ListViewItem();
+        item.Text = e.Item.ToString();
+        item.Tag = e.Item;
+        itemsListView.Items.Insert(e.Index, item);
+        e.Item.Changed += new EventHandler(Item_Changed);
+      }
+    }
+    private void ItemList_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ItemList_ItemRemoved), sender, e);
+      else {
+        itemsListView.Items.RemoveAt(e.Index);
+        e.Item.Changed -= new EventHandler(Item_Changed);
+      }
+    }
+    private void ItemList_Cleared(object sender, EventArgs e) {
+      Refresh();
+    }
+    private void Item_Changed(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_Changed), sender, e);
+      else {
+        IItem data = (IItem)sender;
+        foreach (ListViewItem item in itemsListView.Items) {
+          if (item.Tag == data)
+            item.Text = data.ToString();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ItemListView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/ItemListView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ItemListView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.Designer.cs	(revision 2)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+namespace HeuristicLab.Data {
+  partial class MatrixDataBaseView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.rowsLabel = new System.Windows.Forms.Label();
+      this.rowsTextBox = new System.Windows.Forms.TextBox();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.columnsTextBox = new System.Windows.Forms.TextBox();
+      this.columnsLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // rowsLabel
+      // 
+      this.rowsLabel.AutoSize = true;
+      this.rowsLabel.Location = new System.Drawing.Point(3, 4);
+      this.rowsLabel.Name = "rowsLabel";
+      this.rowsLabel.Size = new System.Drawing.Size(37, 13);
+      this.rowsLabel.TabIndex = 0;
+      this.rowsLabel.Text = "Rows:";
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.AcceptsReturn = true;
+      this.rowsTextBox.Location = new System.Drawing.Point(39, 1);
+      this.rowsTextBox.Name = "rowsTextBox";
+      this.rowsTextBox.Size = new System.Drawing.Size(110, 20);
+      this.rowsTextBox.TabIndex = 1;
+      this.rowsTextBox.Text = "0";
+      this.rowsTextBox.Validated += new System.EventHandler(this.textBox_Validated);
+      this.rowsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox_KeyDown);
+      this.rowsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.ColumnHeadersVisible = false;
+      this.dataGridView.Location = new System.Drawing.Point(3, 27);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(383, 293);
+      this.dataGridView.TabIndex = 2;
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.AcceptsReturn = true;
+      this.columnsTextBox.Location = new System.Drawing.Point(215, 1);
+      this.columnsTextBox.Name = "columnsTextBox";
+      this.columnsTextBox.Size = new System.Drawing.Size(110, 20);
+      this.columnsTextBox.TabIndex = 4;
+      this.columnsTextBox.Text = "0";
+      this.columnsTextBox.Validated += new System.EventHandler(this.textBox_Validated);
+      this.columnsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox_KeyDown);
+      this.columnsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.AutoSize = true;
+      this.columnsLabel.Location = new System.Drawing.Point(159, 4);
+      this.columnsLabel.Name = "columnsLabel";
+      this.columnsLabel.Size = new System.Drawing.Size(50, 13);
+      this.columnsLabel.TabIndex = 3;
+      this.columnsLabel.Text = "Columns:";
+      // 
+      // MatrixDataBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.columnsTextBox);
+      this.Controls.Add(this.columnsLabel);
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.rowsTextBox);
+      this.Controls.Add(this.rowsLabel);
+      this.Name = "MatrixDataBaseView";
+      this.Size = new System.Drawing.Size(391, 323);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label rowsLabel;
+    private System.Windows.Forms.TextBox rowsTextBox;
+    private System.Windows.Forms.DataGridView dataGridView;
+    private System.Windows.Forms.TextBox columnsTextBox;
+    private System.Windows.Forms.Label columnsLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.cs	(revision 2)
@@ -0,0 +1,134 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class MatrixDataBaseView : ViewBase {
+    public ArrayDataBase ArrayDataBase {
+      get { return (ArrayDataBase)Item; }
+      protected set { base.Item = value; }
+    }
+
+    public MatrixDataBaseView() {
+      InitializeComponent();
+    }
+
+    protected override void RemoveItemEvents() {
+      ArrayDataBase.Changed -= new EventHandler(ArrayDataBase_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ArrayDataBase.Changed += new EventHandler(ArrayDataBase_Changed);
+    }
+
+    protected virtual bool ValidateData(string element) {
+      throw new InvalidOperationException("ValidateData has to be overridden in each inherited class");
+    }
+    protected virtual void SetArrayElement(int row, int column, string element) {
+      throw new InvalidOperationException("SetArrayElement has to be overridden in each inherited class");
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ArrayDataBase != null) {
+        int rows = ArrayDataBase.Data.GetLength(0);
+        int columns = ArrayDataBase.Data.GetLength(1);
+
+        rowsTextBox.Text = rows + "";
+        columnsTextBox.Text = columns + "";
+        dataGridView.ColumnCount = columns;
+        dataGridView.RowCount = rows;
+        for (int i = 0; i < rows; i++) {
+          for (int j = 0; j < columns; j++) {
+            dataGridView.Rows[i].Cells[j].Value = ArrayDataBase.Data.GetValue(i, j);
+          }
+        }
+      } else {
+        rowsTextBox.Text = "1";
+        columnsTextBox.Text = "1";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = 1;
+      }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      int newValue;
+      TextBox source = (TextBox)sender;
+      if (int.TryParse(source.Text, out newValue)) {
+        if (newValue > 0) {
+          e.Cancel = false;
+        } else {
+          e.Cancel = true;
+        }
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private void CreateAndCopyArray(int newRows, int newColumns) {
+      Array newArray = Array.CreateInstance(ArrayDataBase.Data.GetType().GetElementType(), newRows, newColumns);
+      Array.Copy(ArrayDataBase.Data, newArray, Math.Min(newArray.Length, ArrayDataBase.Data.Length));
+      ArrayDataBase.Data = newArray;
+    }
+
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (ValidateData((string)e.FormattedValue)) {
+        SetArrayElement(e.RowIndex, e.ColumnIndex, (string)e.FormattedValue);
+        e.Cancel = false;
+        Refresh();
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private void textBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) {
+        e.SuppressKeyPress = true;
+        dataGridView.Focus();
+      }
+    }
+
+    private void textBox_Validated(object sender, EventArgs e) {
+      int newRows;
+      int newColumns;
+      if (int.TryParse(columnsTextBox.Text, out newColumns) && int.TryParse(rowsTextBox.Text, out newRows)) {
+        CreateAndCopyArray(newRows, newColumns);
+      } else {
+        throw new FormatException();
+      }
+    }
+
+    #region ArrayDataBase Events
+    private void ArrayDataBase_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/MatrixDataBaseView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/ObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ObjectData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ObjectData.cs	(revision 2)
@@ -0,0 +1,75 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class ObjectData : ItemBase, IObjectData {
+    private object myData;
+    public virtual object Data {
+      get { return myData; }
+      set {
+        if (myData != value) {
+          myData = value;
+          OnChanged();
+        }
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ObjectData clone = (ObjectData)base.Clone(clonedObjects);
+      if (Data is IStorable)
+        clone.myData = Auxiliary.Clone((IStorable)Data, clonedObjects);
+      else if (Data is ICloneable)
+        clone.myData = ((ICloneable)Data).Clone();
+      else
+        throw new InvalidOperationException("contained object is not cloneable");
+      return clone;
+    }
+
+    public int CompareTo(object obj) {
+      IComparable comparable = Data as IComparable;
+      if (comparable != null) {
+        IObjectData other = obj as IObjectData;
+        if (other != null)
+          return comparable.CompareTo(other.Data);
+        else
+          return comparable.CompareTo(obj);
+      }
+      throw new InvalidOperationException("Cannot compare as contained object doesn't implement IComparable");
+    }
+
+    public override string ToString() {
+      if (Data == null)
+        return "null";
+      else
+        return Data.ToString();
+    }
+
+    public virtual void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/ObjectDataVisitorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ObjectDataVisitorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/ObjectDataVisitorBase.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Data {
+  public class ObjectDataVisitorBase : IObjectDataVisitor{
+    #region IObjectDataVisitor Members
+    public virtual void Visit(BoolData data) {
+    }
+
+    public virtual void Visit(IntData data) {
+    }
+
+    public virtual void Visit(DoubleData data) {
+    }
+
+    public virtual void Visit(StringData data) {
+    }
+
+    public virtual void Visit(BoolArrayData data) {
+    }
+
+    public virtual void Visit(IntArrayData data) {
+    }
+
+    public virtual void Visit(DoubleArrayData data) {
+    }
+
+    public virtual void Visit(BoolMatrixData data) {
+    }
+
+    public virtual void Visit(IntMatrixData data) {
+    }
+
+    public virtual void Visit(DoubleMatrixData data) {
+    }
+
+    public virtual void Visit(ConstrainedIntData data) {
+    }
+
+    public virtual void Visit(ConstrainedDoubleData data) {
+    }
+    public void Visit(ConstrainedObjectData constrainedObjectData) {
+      throw new NotImplementedException();
+    }
+
+    public void Visit(ObjectData objectData) {
+      throw new NotImplementedException();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Data")]
+[assembly: AssemblyDescription("HeuristicLab data classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f1be1f44-c421-4749-9d25-160611dc18b3")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Data/StringData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/StringData.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/StringData.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public class StringData : ObjectData {
+    public new string Data {
+      get { return (string)base.Data; }
+      set { base.Data = value; }
+    }
+
+    public StringData() {
+      Data = this.GetType().Name;
+    }
+    public StringData(string data) {
+      Data = data;
+    }
+
+    public override IView CreateView() {
+      return new StringDataView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      StringData clone = new StringData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = Data;
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Data = node.InnerText;
+    }
+
+    public override string ToString() {
+      return Data;
+    }
+
+    public override void Accept(IObjectDataVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/StringDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/StringDataView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/StringDataView.Designer.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data {
+  partial class StringDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(200, 20);
+      this.dataTextBox.TabIndex = 1;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // StringDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "StringDataView";
+      this.Size = new System.Drawing.Size(200, 25);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/StringDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/StringDataView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/StringDataView.cs	(revision 2)
@@ -0,0 +1,74 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public partial class StringDataView : ViewBase {
+    public StringData StringData {
+      get { return (StringData)Item; }
+      set { base.Item = value; }
+    }
+
+    public StringDataView() {
+      InitializeComponent();
+    }
+    public StringDataView(StringData stringData)
+      : this() {
+      StringData = stringData;
+    }
+
+    protected override void RemoveItemEvents() {
+      StringData.Changed -= new EventHandler(StringData_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      StringData.Changed += new EventHandler(StringData_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (StringData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = StringData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      StringData.Data = dataTextBox.Text;
+    }
+
+    private void StringData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/StringDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/StringDataView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Data/StringDataView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.DataAnalysis/Dataset.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/Dataset.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/Dataset.cs	(revision 2)
@@ -0,0 +1,269 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System.Globalization;
+using System.Text;
+
+namespace HeuristicLab.DataAnalysis {
+  public class Dataset : ItemBase {
+
+    private string name;
+    public string Name {
+      get { return name; }
+      set { name = value; }
+    }
+
+    private double[] samples;
+    private int rows;
+
+    public int Rows {
+      get { return rows; }
+      set { rows = value; }
+    }
+    private int columns;
+
+    public int Columns {
+      get { return columns; }
+      set { columns = value; }
+    }
+    private Dictionary<int, double[]>[] ranges;
+    private Dictionary<int, double[]>[] means;
+
+    public double GetValue(int i, int j) {
+      return samples[columns * i + j];
+    }
+
+    public void SetValue(int i, int j, double v) {
+      if(v != samples[columns * i + j]) {
+        samples[columns * i + j] = v;
+        FireChanged();
+      }
+    }
+
+    public double[] Samples {
+      get { return samples; }
+      set { 
+        samples = value;
+        CreateDictionaries();
+        FireChanged();
+      }
+    }
+
+    private string[] variableNames;
+    public string[] VariableNames {
+      get { return variableNames; }
+      set { variableNames = value; }
+    }
+
+    public Dataset() {
+      Name = "-";
+      VariableNames = new string[] {"Var0"};
+      Columns = 1;
+      Rows = 1;
+      Samples = new double[1];
+    }
+
+    void samples_Changed(object sender, EventArgs e) {
+      CreateDictionaries();
+    }
+
+    private void CreateDictionaries() {
+      // keep a means and ranges dictionary for each column (possible target variable) of the dataset.
+
+      means = new Dictionary<int, double[]>[columns];
+      ranges = new Dictionary<int, double[]>[columns];
+
+      for(int i = 0; i < columns; i++) {
+        means[i] = new Dictionary<int, double[]>();
+        ranges[i] = new Dictionary<int, double[]>();
+      }
+    }
+
+    public override IView CreateView() {
+      return new DatasetView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Dataset clone = new Dataset();
+      clonedObjects.Add(Guid, clone);
+      double[] cloneSamples = new double[rows * columns];
+      Array.Copy(samples, cloneSamples, samples.Length);
+      clone.rows = rows;
+      clone.columns = columns;
+      clone.Samples = cloneSamples;
+      clone.Name = Name;
+      clone.VariableNames = new string[VariableNames.Length];
+      Array.Copy(VariableNames, clone.VariableNames, VariableNames.Length);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute problemName = document.CreateAttribute("Name");
+      problemName.Value = Name;
+      node.Attributes.Append(problemName);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = rows.ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = columns.ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+
+      XmlAttribute variableNames = document.CreateAttribute("VariableNames");
+      variableNames.Value = GetVariableNamesString();
+      node.Attributes.Append(variableNames);
+
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Name = node.Attributes["Name"].Value;
+      rows = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      columns = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      
+      VariableNames = ParseVariableNamesString(node.Attributes["VariableNames"].Value);
+
+      string[] tokens = node.InnerText.Split(';');
+      if(tokens.Length != rows * columns) throw new FormatException();
+      samples = new double[rows * columns];
+      for(int row = 0; row < rows; row++) {
+        for(int column = 0; column < columns; column++) {
+          if(double.TryParse(tokens[row * columns + column], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out samples[row*columns + column]) == false) {
+            throw new FormatException("Can't parse " + tokens[row * columns + column] + " as double value.");
+          }
+        }
+      }
+      CreateDictionaries();
+    }
+
+    public override string ToString() {
+      return ToString(CultureInfo.CurrentCulture.NumberFormat);
+    }
+
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for(int row = 0; row < rows; row++) {
+        for(int column = 0; column < columns; column++) {
+          builder.Append(";");
+          builder.Append(samples[row*columns+column].ToString(format));
+        }
+      }
+      if(builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+
+    private string GetVariableNamesString() {
+      string s = "";
+      for (int i = 0; i < variableNames.Length; i++) {
+        s += variableNames[i] + "; ";
+      }
+
+      if (variableNames.Length > 0) {
+        s = s.TrimEnd(';', ' ');
+      }
+      return s;
+    }
+
+    private string[] ParseVariableNamesString(string p) {
+      p = p.Trim();
+      string[] tokens = p.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries);
+      return tokens;
+    }
+
+
+    // return value of GetMean should be memoized because it is called repeatedly in Evaluators
+    public double GetMean(int column, int from, int to) {
+      Dictionary<int, double[]> columnMeans = means[column];
+      if(columnMeans.ContainsKey(from)) {
+        double[] fromMeans = columnMeans[from];
+        if(fromMeans[to-from] >= 0.0) {
+          // already calculated
+          return fromMeans[to-from];
+        } else {
+          // not yet calculated => calculate
+          fromMeans[to-from] = CalculateMean(column, from, to);
+          return fromMeans[to-from];
+        }
+      } else {
+        // never saw this from-index => create a new array, initialize and recalculate for to-index
+        double[] fromMeans = new double[rows - from];
+        // fill with negative values to indicate which means have already been calculated
+        for(int i=0;i<fromMeans.Length;i++) {fromMeans[i] = -1.0;}
+        // store new array in the dictionary
+        columnMeans[from] = fromMeans;
+        // calculate for specific to-index
+        fromMeans[to-from] = CalculateMean(column, from, to);
+        return fromMeans[to-from];
+      }
+    }
+
+    private double CalculateMean(int column, int from, int to) {
+      double[] values = new double[to - from +1];
+      for(int sample = from; sample <= to; sample++) {
+        values[sample - from] = GetValue(sample, column);
+      }
+
+      return Statistics.Mean(values);
+    }
+
+    // return value of GetRange should be memoized because it is called repeatedly in Evaluators
+    public double GetRange(int column, int from, int to) {
+      Dictionary<int, double[]> columnRanges = ranges[column];
+      if(columnRanges.ContainsKey(from)) {
+        double[] fromRanges = columnRanges[from];
+        if(fromRanges[to-from] >= 0.0) {
+          // already calculated
+          return fromRanges[to-from];
+        } else {
+          // not yet calculated => calculate
+          fromRanges[to-from] = CalculateRange(column, from, to);
+          return fromRanges[to-from];
+        }
+      } else {
+        // never saw this from-index => create a new array, initialize and recalculate for to-index
+        double[] fromRanges = new double[rows - from];
+        // fill with negative values to indicate which means have already been calculated
+        for(int i = 0; i < fromRanges.Length; i++) { fromRanges[i] = -1.0; }
+        // store in dictionary
+        columnRanges[from] = fromRanges;
+        // calculate for specific to-index
+        fromRanges[to-from] = CalculateRange(column, from, to);
+        return fromRanges[to-from];
+      }
+    }
+
+    private double CalculateRange(int column, int from, int to) {
+      double[] values = new double[to - from + 1];
+      for(int sample = from; sample <= to; sample++) {
+        values[sample - from] = GetValue(sample, column);
+      }
+
+      return Statistics.Range(values);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs	(revision 2)
@@ -0,0 +1,341 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.DataAnalysis {
+  public class DatasetParser {
+    private Tokenizer tokenizer;
+    private Dictionary<string, List<Token>> metadata;
+    private List<List<double>> samplesList;
+
+    private int rows;
+    public int Rows {
+      get { return rows; }
+      set { rows = value; }
+    }
+
+    private int columns;
+    public int Columns {
+      get { return columns; }
+      set { columns = value; }
+    }
+
+    private double[] samples;
+    public double[] Samples {
+      get {
+        return samples;
+      }
+    }
+
+    public string ProblemName {
+      get {
+        return metadata["PROBLEMNAME"][0].stringValue;
+      }
+    }
+
+    public string[] VariableNames {
+      get {
+        List<Token> nameList = metadata["VARIABLENAMES"];
+        string[] names = new string[nameList.Count];
+        for (int i = 0; i < names.Length; i++) {
+          names[i] = nameList[i].stringValue;
+        }
+
+        return names;
+      }
+    }
+
+    public int TargetVariable {
+      get {
+        return metadata["TARGETVARIABLE"][0].intValue;
+      }
+    }
+
+    public int MaxTreeHeight {
+      get {
+        return metadata["MAXIMUMTREEHEIGHT"][0].intValue;
+      }
+    }
+
+    public int MaxTreeSize {
+      get {
+        return metadata["MAXIMUMTREESIZE"][0].intValue;
+      }
+    }
+
+    public int TrainingSamplesStart {
+      get {
+        return metadata["TRAININGSAMPLESSTART"][0].intValue;
+      }
+    }
+
+    public int TrainingSamplesEnd {
+      get {
+        return metadata["TRAININGSAMPLESEND"][0].intValue;
+      }
+    }
+
+    public DatasetParser() {
+      this.metadata = new Dictionary<string, List<Token>>();
+      samplesList = new List<List<double>>();
+    }
+
+    public void Import(string importFileName, bool strict) {
+      StreamReader reader = new StreamReader(importFileName);
+      this.tokenizer = new Tokenizer(reader);
+      tokenizer.Separators = new string[] { " ", ";", "\t" };
+
+      // parse the file
+      Parse(strict);
+
+      // translate the list of samples into a DoubleMatrixData item
+      samples = new double[samplesList.Count * samplesList[0].Count];
+      rows = samplesList.Count;
+      columns = samplesList[0].Count;
+
+      int i = 0;
+      int j = 0;
+      foreach (List<double> row in samplesList) {
+        j = 0;
+        foreach (double element in row) {
+          samples[i * columns + j] = element;
+          j++;
+        }
+        i++;
+      }
+    }
+
+    #region tokenizer
+    internal enum TokenTypeEnum {
+      At, Assign, NewLine, String, Double, Int
+    }
+
+    internal class Token {
+      public TokenTypeEnum type;
+      public string stringValue;
+      public double doubleValue;
+      public int intValue;
+
+      public Token(TokenTypeEnum type, string value) {
+        this.type = type;
+        stringValue = value;
+        doubleValue = 0.0;
+        intValue = 0;
+      }
+
+      public override string ToString() {
+        return stringValue;
+      }
+    }
+
+
+    class Tokenizer {
+      private StreamReader reader;
+      private List<Token> tokens;
+      private string[] separators;
+
+      public int CurrentLineNumber = 0;
+      public string CurrentLine;
+
+      public static Token NewlineToken = new Token(TokenTypeEnum.NewLine, "\n");
+      public static Token AtToken = new Token(TokenTypeEnum.At, "@");
+      public static Token AssignmentToken = new Token(TokenTypeEnum.Assign, "=");
+
+      public string[] Separators {
+        get { return separators; }
+        set { separators = value; }
+      }
+
+
+      public Tokenizer(StreamReader reader) {
+        this.reader = reader;
+        tokens = new List<Token>();
+        ReadNextTokens();
+      }
+
+      private void ReadNextTokens() {
+        if (!reader.EndOfStream) {
+          CurrentLine = reader.ReadLine();
+          Token[] newTokens = Array.ConvertAll(CurrentLine.Split(separators, StringSplitOptions.RemoveEmptyEntries), delegate(string str) {
+            return MakeToken(str);
+          });
+
+          tokens.AddRange(newTokens);
+          tokens.Add(NewlineToken);
+          CurrentLineNumber++;
+        }
+      }
+
+      private Token MakeToken(string strToken) {
+        if (strToken == "@")
+          return AtToken;
+        else if (strToken == "=")
+          return AssignmentToken;
+        else {
+          Token token = new Token(TokenTypeEnum.String, strToken);
+
+          // try invariant culture
+          NumberFormatInfo currentNumberFormatInfo = CultureInfo.InvariantCulture.NumberFormat;
+          if (int.TryParse(strToken, NumberStyles.Integer, currentNumberFormatInfo, out token.intValue)) {
+            token.type = TokenTypeEnum.Int;
+            return token;
+          } else if (double.TryParse(strToken, NumberStyles.Float, currentNumberFormatInfo, out token.doubleValue)) {
+            token.type = TokenTypeEnum.Double;
+            return token;
+          }
+          // try german culture
+          currentNumberFormatInfo = CultureInfo.GetCultureInfo("de-DE").NumberFormat;
+          if (int.TryParse(strToken, NumberStyles.Integer, currentNumberFormatInfo, out token.intValue)) {
+            token.type = TokenTypeEnum.Int;
+            return token;
+          } else if (double.TryParse(strToken, NumberStyles.Float, currentNumberFormatInfo, out token.doubleValue)) {
+            token.type = TokenTypeEnum.Double;
+            return token;
+          }
+
+          // try current culture
+          currentNumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat;
+          if (int.TryParse(strToken, NumberStyles.Integer, currentNumberFormatInfo, out token.intValue)) {
+            token.type = TokenTypeEnum.Int;
+            return token;
+          } else if (double.TryParse(strToken, NumberStyles.Float, currentNumberFormatInfo, out token.doubleValue)) {
+            token.type = TokenTypeEnum.Double;
+            return token;
+          }
+
+          // nothing worked
+          return token;
+        }
+      }
+
+      public Token Peek() {
+        return tokens[0];
+      }
+
+      public Token Next() {
+        Token next = tokens[0];
+        tokens.RemoveAt(0);
+        if (tokens.Count == 0) {
+          ReadNextTokens();
+        }
+        return next;
+      }
+
+      public bool HasNext() {
+        return tokens.Count > 0 || !reader.EndOfStream;
+      }
+    }
+    #endregion
+
+    #region parsing
+    private void Parse(bool strict) {
+      ParseMetaData(strict);
+      ParseSampleData(strict);
+    }
+
+    private void ParseSampleData(bool strict) {
+      List<double> row = new List<double>();
+      while (tokenizer.HasNext()) {
+        Token current = tokenizer.Next();
+        if (current.type == TokenTypeEnum.Double) {
+          // just take the value
+          row.Add(current.doubleValue);
+        } else if (current.type == TokenTypeEnum.Int) {
+          // translate the int value to double
+          row.Add((double)current.intValue);
+        } else if (current == Tokenizer.NewlineToken) {
+          // when parsing strictly all rows have to have the same number of values            
+          if (strict) {
+            // the first row defines how many samples are needed
+            if (samplesList.Count > 0 && samplesList[0].Count != row.Count) {
+              Error("The first row of the dataset has " + samplesList[0].Count + " columns." +
+                "\nLine " + tokenizer.CurrentLineNumber + " has " + row.Count + " columns.");
+            }
+          } else if (samplesList.Count > 0) {
+            // when we are not strict then fill or drop elements as needed
+            if (samplesList[0].Count > row.Count) {
+              // fill with NAN
+              for (int i = row.Count; i < samplesList[0].Count; i++) {
+                row.Add(double.NaN);
+              }
+            } else if (samplesList[0].Count < row.Count) {
+              // drop last k elements where k = n - length of first row
+              row.RemoveRange(samplesList[0].Count - 1, row.Count - samplesList[0].Count);
+            }
+          }
+
+          // add the current row to the collection of rows and start a new row
+          samplesList.Add(row);
+          row = new List<double>();
+        } else {
+          // found an unexpected token => return false when parsing strictly
+          // when we are parsing non-strictly we also allow unreadable values inserting NAN instead
+          if (strict) {
+            Error("Unkown value " + current + " in line " + tokenizer.CurrentLineNumber +
+              "\n" + tokenizer.CurrentLine);
+          } else {
+            row.Add(double.NaN);
+          }
+        }
+      }
+    }
+
+    private void ParseMetaData(bool strict) {
+      while (tokenizer.Peek() == Tokenizer.AtToken) {
+        Expect(Tokenizer.AtToken);
+
+        Token nameToken = tokenizer.Next();
+        if (nameToken.type != TokenTypeEnum.String)
+          throw new Exception("Expected a variable name; got " + nameToken +
+            "\nLine " + tokenizer.CurrentLineNumber + ": " + tokenizer.CurrentLine);
+
+        Expect(Tokenizer.AssignmentToken);
+
+        List<Token> tokens = new List<Token>();
+        Token valueToken = tokenizer.Next();
+        while (valueToken != Tokenizer.NewlineToken) {
+          tokens.Add(valueToken);
+          valueToken = tokenizer.Next();
+        }
+
+        metadata[nameToken.stringValue] = tokens;
+      }
+    }
+
+    private void Expect(Token expectedToken) {
+      Token actualToken = tokenizer.Next();
+      if (actualToken != expectedToken) {
+        Error("Expected: " + expectedToken + " got: " + actualToken +
+          "\nLine " + tokenizer.CurrentLineNumber + ": " + tokenizer.CurrentLine);
+      }
+    }
+
+    private void Error(string message) {
+      throw new Exception("Error while parsing.\n" + message);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.cs	(revision 2)
@@ -0,0 +1,110 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataAnalysis {
+  public partial class DatasetView : ViewBase {
+
+    private OpenFileDialog openFileDialog;
+
+    public Dataset Dataset {
+      get { return (Dataset)Item; }
+      set {
+        Item = value;
+        Item.Changed += new EventHandler(Item_Changed);
+      }
+    }
+
+    void Item_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    public DatasetView() : base() {
+      InitializeComponent();
+      openFileDialog = new OpenFileDialog();
+    }
+
+    public DatasetView(Dataset dataset) :this() {
+      this.Dataset = dataset;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if(Dataset != null) {
+        int rows = Dataset.Rows;
+        int columns = Dataset.Columns;
+
+        nameTextBox.Text = Dataset.Name;
+        rowsTextBox.Text = rows + "";
+        columnsTextBox.Text = columns + "";
+        dataGridView.ColumnCount = columns;
+        dataGridView.RowCount = rows;
+        for(int i = 0; i < rows; i++) {
+          for(int j = 0; j < columns; j++) {
+            dataGridView.Rows[i].Cells[j].Value = Dataset.GetValue(i, j);
+          }
+        }
+        if (Dataset.VariableNames.Length == dataGridView.Columns.Count) {
+          for (int i = 0; i < columns; i++) {
+            dataGridView.Columns[i].Name = Dataset.VariableNames[i];
+          }
+        } else {
+          for (int i = 0; i < columns; i++) {
+            dataGridView.Columns[i].Name = "Var" + i;
+          }
+        }
+
+      } else {
+        rowsTextBox.Text = "1";
+        columnsTextBox.Text = "1";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = 1;
+      }
+    }
+
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if(ValidateData((string)e.FormattedValue)) {
+        SetArrayElement(e.RowIndex, e.ColumnIndex, (string)e.FormattedValue);
+        e.Cancel = false;
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+
+    private void SetArrayElement(int row, int column, string element) {
+      double result;
+      double.TryParse(element, out result);
+      if(result != Dataset.GetValue(row, column)) {
+        Dataset.SetValue(row, column, result);
+        Dataset.FireChanged();
+      }
+    }
+
+    private bool ValidateData(string element) {
+      double result;
+      return element != null && double.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.designer.cs	(revision 2)
@@ -0,0 +1,151 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.DataAnalysis {
+  partial class DatasetView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.rowsTextBox = new System.Windows.Forms.TextBox();
+      this.columnsTextBox = new System.Windows.Forms.TextBox();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.rowsLabel = new System.Windows.Forms.Label();
+      this.columnsLabel = new System.Windows.Forms.Label();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.Location = new System.Drawing.Point(46, 32);
+      this.rowsTextBox.Name = "rowsTextBox";
+      this.rowsTextBox.ReadOnly = true;
+      this.rowsTextBox.Size = new System.Drawing.Size(100, 20);
+      this.rowsTextBox.TabIndex = 1;
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.Location = new System.Drawing.Point(208, 32);
+      this.columnsTextBox.Name = "columnsTextBox";
+      this.columnsTextBox.ReadOnly = true;
+      this.columnsTextBox.Size = new System.Drawing.Size(100, 20);
+      this.columnsTextBox.TabIndex = 2;
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.Location = new System.Drawing.Point(3, 58);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(554, 482);
+      this.dataGridView.TabIndex = 3;
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      // 
+      // rowsLabel
+      // 
+      this.rowsLabel.AutoSize = true;
+      this.rowsLabel.Location = new System.Drawing.Point(3, 35);
+      this.rowsLabel.Name = "rowsLabel";
+      this.rowsLabel.Size = new System.Drawing.Size(37, 13);
+      this.rowsLabel.TabIndex = 4;
+      this.rowsLabel.Text = "Rows:";
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.AutoSize = true;
+      this.columnsLabel.Location = new System.Drawing.Point(152, 35);
+      this.columnsLabel.Name = "columnsLabel";
+      this.columnsLabel.Size = new System.Drawing.Size(50, 13);
+      this.columnsLabel.TabIndex = 5;
+      this.columnsLabel.Text = "Columns:";
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(3, 6);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(41, 13);
+      this.nameLabel.TabIndex = 6;
+      this.nameLabel.Text = "Name: ";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Location = new System.Drawing.Point(46, 3);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.ReadOnly = true;
+      this.nameTextBox.Size = new System.Drawing.Size(262, 20);
+      this.nameTextBox.TabIndex = 7;
+      // 
+      // DatasetView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.columnsLabel);
+      this.Controls.Add(this.rowsLabel);
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.columnsTextBox);
+      this.Controls.Add(this.rowsTextBox);
+      this.Name = "DatasetView";
+      this.Size = new System.Drawing.Size(560, 543);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox rowsTextBox;
+    private System.Windows.Forms.TextBox columnsTextBox;
+    private System.Windows.Forms.DataGridView dataGridView;
+    private System.Windows.Forms.Label rowsLabel;
+    private System.Windows.Forms.Label columnsLabel;
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.resx
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/DatasetView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.DataAnalysis/HeuristicLab.DataAnalysis.csproj
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/HeuristicLab.DataAnalysis.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/HeuristicLab.DataAnalysis.csproj	(revision 2)
@@ -0,0 +1,96 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataAnalysis</RootNamespace>
+    <AssemblyName>HeuristicLab.DataAnalysis</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Dataset.cs" />
+    <Compile Include="DatasetParser.cs" />
+    <Compile Include="DatasetView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DatasetView.designer.cs">
+      <DependentUpon>DatasetView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabDataAnalysisPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Regression.cs" />
+    <Compile Include="Statistics.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DatasetView.resx">
+      <DependentUpon>DatasetView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.DataAnalysis/HeuristicLabDataAnalysisPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/HeuristicLabDataAnalysisPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/HeuristicLabDataAnalysisPlugin.cs	(revision 2)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataAnalysis {
+  [ClassInfo(Name = "HeuristicLab.DataAnalysis")]
+  [PluginFile(Filename = "HeuristicLab.DataAnalysis.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  public class HeuristicLabDataAnalysisPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.DataAnalysis/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataAnalysis")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.DataAnalysis")]
+[assembly: AssemblyCopyright("Copyright Â©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("6db21047-d1dc-4b21-9064-45c4d114ff9f")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /trunk/sources/HeuristicLab.DataAnalysis/Regression.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/Regression.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/Regression.cs	(revision 2)
@@ -0,0 +1,155 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.DataAnalysis {
+  public class LinearStatistics {
+    /// <summary>
+    /// Calculates linear regression for the given data. The result is given as regression values, which are returned,
+    /// as well as the characteristic coefficients <paramref name="a"/> and <paramref name="b"/>.
+    /// </summary>
+    /// <param name="Data">The data that is given; linear regression is calculated for these data samples.</param>
+    /// <param name="a">Regression coefficient 'a' (output parameter).</param>
+    /// <param name="b">Regression coefficient 'b' (output parameter).</param>
+    /// <returns>Calculated linear regression values.</returns>
+    public static double[] LinearRegression(double[] data, out double a, out double b) {
+      int n = data.Length;
+      double xMean = n / 2.0;
+      double yMean = Statistics.Mean(data);
+      double[] xMinusMean = new double[n];
+      double[] yMinusMean = new double[n];
+      double[] xMinusMeanSquared = new double[n];
+      double[] xMinusMeanTimesYMinusMean = new double[n];
+
+      double ssxx = 0;
+      double ssxy = 0;
+      for(int i = 0; i < n; i++) {
+        xMinusMean[i] = i - xMean;
+        yMinusMean[i] = data[i] - yMean;
+        xMinusMeanSquared[i] = xMinusMean[i] * xMinusMean[i];
+        xMinusMeanTimesYMinusMean[i] = xMinusMean[i] * yMinusMean[i];
+        ssxx += xMinusMeanSquared[i];
+        ssxy += xMinusMeanTimesYMinusMean[i];
+      }
+      b = ssxy / ssxx;
+      a = yMean - b * xMean;
+      double[] result = new double[n];
+      for(int x = 0; x < n; x++)
+        result[x] = a + x * b;
+      return result;
+    }
+
+    /// <summary>
+    /// Calculates linear regression for the given data. The result is given as regression values, which are returned,
+    /// as well as the characteristic coefficients <paramref name="a"/> and <paramref name="b"/>.
+    /// </summary>
+    /// <param name="Data">The data that is given; linear regression is calculated for these data samples.</param>
+    /// <returns>Calculated linear regression values.</returns>
+    public static double[] LinearRegression(double[] data) {
+      double a, b;
+      return LinearRegression(data, out a, out b);
+    }
+
+    public static double CorrelationCoefficient(double[] xValues, double[] yValues) {
+      if(xValues.Length != yValues.Length)
+        throw new Exception("ERROR in CorrelationCoefficient: The given variables have to be equally long!");
+      int n = xValues.Length;
+      double[] x = new double[n];
+      double[] y = new double[n];
+      for(int i = 0; i < n; i++) {
+        if(double.IsNaN(xValues[i]))
+          throw new NotFiniteNumberException();
+        else
+          x[i] = xValues[i];
+        if(double.IsNaN(yValues[i]))
+          throw new NotFiniteNumberException();
+        else
+          y[i] = yValues[i];
+      }
+      double OneOverN = 1.0 / (n + 1);
+      double xMean = Statistics.Mean(x);
+      double yMean = Statistics.Mean(y);
+      double[] xMinusMean = new double[n];
+      double[] yMinusMean = new double[n];
+      double[] xMinusMeanSquared = new double[n];
+      double xMinusMeanSquaredSum = 0.0;
+      double[] yMinusMeanSquared = new double[n];
+      double yMinusMeanSquaredSum = 0.0;
+      double[] xMinusMeanTimesYMinusMean = new double[n];
+      double xMinusMeanTimesYMinusMeanSum = 0.0;
+      for(int i = 0; i < n; i++) {
+        xMinusMean[i] = x[i] - xMean;
+        yMinusMean[i] = y[i] - yMean;
+        xMinusMeanSquared[i] = xMinusMean[i] * xMinusMean[i];
+        xMinusMeanSquaredSum += xMinusMeanSquared[i];
+        yMinusMeanSquared[i] = yMinusMean[i] * yMinusMean[i];
+        yMinusMeanSquaredSum += yMinusMeanSquared[i];
+        xMinusMeanTimesYMinusMean[i] = xMinusMean[i] * yMinusMean[i];
+        xMinusMeanTimesYMinusMeanSum += xMinusMeanTimesYMinusMean[i];
+      }
+      return (OneOverN * xMinusMeanTimesYMinusMeanSum) /
+        (Math.Sqrt(OneOverN * xMinusMeanSquaredSum) * Math.Sqrt(OneOverN * yMinusMeanSquaredSum));
+    }
+
+    #region Coefficient of Determination (R-squared)
+    /// <summary>
+    /// In statistics, the coefficient of determination (R-squared) is the proportion of a sample variance
+    /// of a response variable that is "explained" by the predictor (explanatory) variables when regression is done.
+    /// </summary>
+    /// <param name="originalValues">The original values for which a model shall be created.</param>
+    /// <param name="residuals">The errors between original and predicted values.</param>
+    /// <returns></returns>
+    public static double CoefficientOfDetermination(double[] originalValues, double[] residuals) {
+      int n = originalValues.Length;
+
+      double originalValuesMean = Statistics.Mean(originalValues);
+
+      double[] originalValuesMinusMeanSquared = new double[n];
+      originalValuesMinusMeanSquared = Array.ConvertAll<double, double>(originalValues, delegate(double v) {
+        double t = v - originalValuesMean;
+        return t * t;
+      });
+
+      double totalSumOfSquares = Statistics.Sum(originalValuesMinusMeanSquared);
+
+      double[] residualsSquared = new double[residuals.Length];
+      residualsSquared = Array.ConvertAll<double, double>(residuals, delegate(double r) {
+        return r * r;
+      });
+
+      double sumOfSquaredResiduals = Statistics.Sum(residualsSquared);
+
+      return (1.0 - sumOfSquaredResiduals / totalSumOfSquares);
+    }
+    #endregion
+
+    #region Adjusted Coefficient of Determination (Adjusted R-squared)
+    public static double AdjustedCoefficientOfDetermination(double[] originalValues, double[] residuals, int numberOfExplanatoryTerms) {
+      double rSquared = CoefficientOfDetermination(originalValues, residuals);
+      double n = originalValues.Length;
+      return (1 - (1 - rSquared) * (n - 1) / (n - numberOfExplanatoryTerms - 1));
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.DataAnalysis/Statistics.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/Statistics.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DataAnalysis/Statistics.cs	(revision 2)
@@ -0,0 +1,244 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.DataAnalysis {
+  public class Statistics {
+
+    /// <summary>
+    /// Minimum returns the smalles entry of values.
+    /// Throws and exception if values is empty.
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static T Minimum<T>(IEnumerable<T> values) where T : struct, IComparable, IComparable<T> {
+      IEnumerator<T> enumerator = values.GetEnumerator();
+
+      // this will throw an exception if the values collection is empty
+      enumerator.MoveNext();
+      T minimum = enumerator.Current;
+
+      while(enumerator.MoveNext()) {
+        T current = enumerator.Current;
+        if(current.CompareTo(minimum) < 0) {
+          minimum = current;
+        }
+      }
+
+      return minimum;
+    }
+
+    /// <summary>
+    /// Maximum returns the largest entry of values.
+    /// Throws an exception if values is empty.
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static T Maximum<T>(IEnumerable<T> values) where T : struct, IComparable, IComparable<T> {
+      IEnumerator<T> enumerator = values.GetEnumerator();
+
+      // this will throw an exception if the values collection is empty
+      enumerator.MoveNext();
+      T maximum = enumerator.Current;
+
+      while(enumerator.MoveNext()) {
+        T current = enumerator.Current;
+        if(current.CompareTo(maximum) > 0) {
+          maximum = current;
+        }
+      }
+
+      return maximum;
+    }
+
+    /// <summary>
+    /// Range calculates the difference between the larges and smallest entry of values.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double Range(double[] values) {
+      return Range(values, 0, values.Length);
+    }
+
+    /// <summary>
+    /// Range calculates the difference between the larges and smallest entry of values.
+    /// </summary>
+    public static double Range(List<double> values) {
+      return Range(values.ToArray(), 0, values.Count);
+    }
+
+    /// <summary>
+    /// Range calculates the difference between the largest and smallest entry of values between start and end.
+    /// </summary>
+    /// <param name="values">collection of values</param>
+    /// <param name="start">start index (inclusive)</param>
+    /// <param name="end">end index (exclusive)</param>
+    /// <returns></returns>
+    public static double Range(double[] values, int start, int end) {
+      if(start < 0 || start > values.Length || end < 0 || end > values.Length || start > end) {
+        throw new InvalidOperationException();
+      }
+
+      double minimum = values[start];
+      double maximum = minimum;
+      for(int i = start; i < end; i++) {
+        if(values[i] > maximum) {
+          maximum = values[i];
+        }
+        if(values[i] < minimum) {
+          minimum = values[i];
+        }
+      }
+      return (maximum - minimum);
+    }
+
+    /// <summary>
+    /// calculates the sum of all values.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double Sum(double[] values) {
+      int n = values.Length;
+      double sum = 0.0;
+      for(int i = 0; i < n; i++) {
+        if(double.IsNaN(values[i])) {
+          throw new NotFiniteNumberException();
+        } else {
+          sum += values[i];
+        }
+      }
+      return sum;
+    }
+
+    /// <summary>
+    /// Calculates the mean of all values.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double Mean(List<double> values) {
+      return Mean(values.ToArray(), 0, values.Count);
+    }
+
+    // Calculates the mean of all values.
+    public static double Mean(double[] values) {
+      return Mean(values, 0, values.Length);
+    }
+
+    /// <summary>
+    /// Calculates the mean of the values between start and end.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <param name="start">start index (inclusive)</param>
+    /// <param name="end">end index(exclusive)</param>
+    /// <returns></returns>
+    public static double Mean(double[] values, int start, int end) {
+      if(values.Length == 0) throw new InvalidOperationException();
+      double sum = 0.0;
+      int n = end - start;
+      for(int i = start; i < end; i++) {
+        if(double.IsNaN(values[i])) {
+          throw new NotFiniteNumberException();
+        } else {
+          sum += values[i];
+        }
+      }
+      return sum / n;
+    }
+
+    /// <summary>
+    /// Calculates the median of the values.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double Median(double[] values) {
+      if(values.Length == 0) throw new InvalidOperationException();
+      int n = values.Length;
+      if(n == 0)
+        return 0;
+
+      double[] sortedValues = new double[n];
+
+      Array.Copy(values, sortedValues, n);
+      Array.Sort(sortedValues);
+
+      // return the middle element (if n is uneven) or the average of the two middle elements if n is even.
+      if(n % 2 == 1) {
+        return sortedValues[n / 2];
+      } else {
+        return (sortedValues[n / 2] + sortedValues[n / 2 + 1]) / 2.0;
+      }
+    }
+
+
+    /// <summary>
+    /// Calculates the standard deviation of values.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double StandardDeviation(double[] values) {
+      return Math.Sqrt(Variance(values));
+    }
+
+    /// <summary>
+    /// Calculates the variance of values.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double Variance(double[] values) {
+      return Variance(values, 0, values.Length);
+    }
+
+
+    /// <summary>
+    /// Calculates the variance of the entries of values between start and end.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <param name="start">start index (inclusive)</param>
+    /// <param name="end">end index (exclusive)</param>
+    /// <returns></returns>
+    public static double Variance(double[] values, int start, int end) {
+      int n = end - start;
+      if(n == 0) {
+        throw new InvalidOperationException();
+      }
+      if(n == 1)
+        return 0.0;
+
+      double mean = Mean(values, start, end);
+      double squaredErrorsSum = 0.0;
+
+      for(int i = start; i < end; i++) {
+        if(double.IsNaN(values[i])) {
+          throw new NotFiniteNumberException();
+        } else {
+        }
+        double d = values[i] - mean;
+        squaredErrorsSum += d * d;
+      }
+      return squaredErrorsSum / (n - 1);      
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngine.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngine.cs	(revision 2)
@@ -0,0 +1,177 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Threading;
+using HeuristicLab.Core;
+using HeuristicLab.Grid;
+using System.ServiceModel;
+using System.IO;
+using System.IO.Compression;
+
+namespace HeuristicLab.DistributedEngine {
+  public class DistributedEngine : EngineBase, IEditable {
+    // currently executed operators
+    private IOperator[] currentOperators;
+    private int operatorIndex;
+    private IGridServer server;
+
+    private string serverAddress;
+    public string ServerAddress {
+      get { return serverAddress; }
+      set {
+        if(value != serverAddress) {
+          serverAddress = value;
+        }
+      }
+    }
+
+    public DistributedEngine() {
+      currentOperators = new IOperator[1000];
+    }
+
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      DistributedEngine clone = (DistributedEngine)base.Clone(clonedObjects);
+      clone.ServerAddress = serverAddress;
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new DistributedEngineEditor(this);
+    }
+    public virtual IEditor CreateEditor() {
+      return new DistributedEngineEditor(this);
+    }
+
+    public override void Execute() {
+      NetTcpBinding binding = new NetTcpBinding();
+      binding.MaxReceivedMessageSize = 100000000; // 100Mbytes
+      binding.ReaderQuotas.MaxStringContentLength = 100000000; // also 100M chars
+      binding.ReaderQuotas.MaxArrayLength = 100000000; // also 100M elements;
+      ChannelFactory<IGridServer> factory = new ChannelFactory<IGridServer>(binding);
+      server = factory.CreateChannel(new EndpointAddress(serverAddress));
+
+      base.Execute();
+    }
+
+    public override void ExecuteSteps(int steps) {
+      throw new InvalidOperationException("DistributedEngine doesn't support stepwise execution");
+    }
+
+    public override void Abort() {
+      base.Abort();
+      for(int i = 0; i < currentOperators.Length; i++) {
+        if(currentOperators[i] != null)
+          currentOperators[i].Abort();
+      }
+    }
+
+    protected override void ProcessNextOperation() {
+      operatorIndex = 1;
+      ProcessNextOperation(myExecutionStack, 0);
+    }
+    private void ProcessNextOperation(Stack<IOperation> stack, int currentOperatorIndex) {
+      IOperation operation = stack.Pop();
+      if(operation is AtomicOperation) {
+        AtomicOperation atomicOperation = (AtomicOperation)operation;
+        IOperation next = null;
+        try {
+          currentOperators[currentOperatorIndex] = atomicOperation.Operator;
+          next = atomicOperation.Operator.Execute(atomicOperation.Scope);
+        } catch(Exception ex) {
+          // push operation on stack again
+          stack.Push(atomicOperation);
+          Abort();
+          ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex); });
+        }
+        if(next != null)
+          stack.Push(next);
+        OnOperationExecuted(atomicOperation);
+        if(atomicOperation.Operator.Breakpoint) Abort();
+      } else if(operation is CompositeOperation) {
+        CompositeOperation compositeOperation = (CompositeOperation)operation;
+        if(compositeOperation.ExecuteInParallel) {
+          Dictionary<Guid, AtomicOperation> runningEngines = new Dictionary<Guid, AtomicOperation>();
+          foreach(AtomicOperation parOperation in compositeOperation.Operations) {
+            ProcessingEngine engine = new ProcessingEngine(OperatorGraph, GlobalScope, parOperation); // OperatorGraph not needed?
+            MemoryStream memStream = new MemoryStream();
+            GZipStream stream = new GZipStream(memStream, CompressionMode.Compress, true);
+            PersistenceManager.Save(engine, stream);
+            stream.Close();
+            Guid currentEngineGuid = server.BeginExecuteEngine(memStream.ToArray());
+            runningEngines[currentEngineGuid] = parOperation;
+          }
+          foreach(Guid engineGuid in runningEngines.Keys) {
+            byte[] scopeXml = server.EndExecuteEngine(engineGuid);
+            GZipStream stream = new GZipStream(new MemoryStream(scopeXml), CompressionMode.Decompress);
+            IScope newScope = (IScope)PersistenceManager.Load(stream);
+            IScope oldScope = runningEngines[engineGuid].Scope;
+            oldScope.Clear();
+            foreach(IVariable variable in newScope.Variables) {
+              oldScope.AddVariable(variable);
+            }
+            foreach(IScope subScope in newScope.SubScopes) {
+              oldScope.AddSubScope(subScope);
+            }
+          }
+
+          // TASK (gkronber 12.2.08)
+          //if (Canceled) {
+          //  // write back not finished tasks
+          //  CompositeOperation remaining = new CompositeOperation();
+          //  remaining.ExecuteInParallel = true;
+          //  for (int i = 0; i < list.tasks.Length; i++) {
+          //    if (list.tasks[i].Count > 0) {
+          //      CompositeOperation task = new CompositeOperation();
+          //      while (list.tasks[i].Count > 0)
+          //        task.AddOperation(list.tasks[i].Pop());
+          //      remaining.AddOperation(task);
+          //    }
+          //  }
+          //  if (remaining.Operations.Count > 0)
+          //    stack.Push(remaining);
+          //}
+        } else {
+          for(int i = compositeOperation.Operations.Count - 1; i >= 0; i--)
+            stack.Push(compositeOperation.Operations[i]);
+        }
+      }
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute addressAttribute = document.CreateAttribute("ServerAddress");
+      addressAttribute.Value = ServerAddress;
+      node.Attributes.Append(addressAttribute);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      ServerAddress = node.Attributes["ServerAddress"].Value;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.Designer.cs	(revision 2)
@@ -0,0 +1,121 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.DistributedEngine {
+  partial class DistributedEngineEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.serverLabel = new System.Windows.Forms.Label();
+      this.addressTextBox = new System.Windows.Forms.TextBox();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.operatorGraphGroupBox.SuspendLayout();
+      this.globalScopeGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.TabIndex = 7;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.TabIndex = 6;
+      // 
+      // splitContainer1
+      // 
+      // 
+      // abortButton
+      // 
+      this.abortButton.Text = "&Stop";
+      // 
+      // serverLabel
+      // 
+      this.serverLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.serverLabel.AutoSize = true;
+      this.serverLabel.Location = new System.Drawing.Point(333, 444);
+      this.serverLabel.Name = "serverLabel";
+      this.serverLabel.Size = new System.Drawing.Size(81, 13);
+      this.serverLabel.TabIndex = 4;
+      this.serverLabel.Text = "&Server address:";
+      // 
+      // addressTextBox
+      // 
+      this.addressTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.addressTextBox.Location = new System.Drawing.Point(336, 460);
+      this.addressTextBox.Name = "addressTextBox";
+      this.addressTextBox.Size = new System.Drawing.Size(157, 20);
+      this.addressTextBox.TabIndex = 8;
+      this.addressTextBox.TextChanged += new System.EventHandler(this.addressTextBox_TextChanged);
+      // 
+      // DistributedEngineEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.addressTextBox);
+      this.Controls.Add(this.serverLabel);
+      this.Name = "DistributedEngineEditor";
+      this.Controls.SetChildIndex(this.serverLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executeButton, 0);
+      this.Controls.SetChildIndex(this.abortButton, 0);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.splitContainer1, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.addressTextBox, 0);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.operatorGraphGroupBox.ResumeLayout(false);
+      this.globalScopeGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label serverLabel;
+    private System.Windows.Forms.TextBox addressTextBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.cs	(revision 2)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DistributedEngine {
+  public partial class DistributedEngineEditor : EngineBaseEditor {
+    public DistributedEngine DistributedEngine {
+      get { return (DistributedEngine)Engine; }
+      set { base.Engine = value; }
+    }
+
+    public DistributedEngineEditor() {
+      InitializeComponent();
+    }
+    public DistributedEngineEditor(DistributedEngine distributedEngine)
+      : this() {
+      DistributedEngine = distributedEngine;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (DistributedEngine == null) {
+        addressTextBox.Text = "";
+        addressTextBox.Enabled = false;
+      } else {
+        addressTextBox.Text = DistributedEngine.ServerAddress;
+        addressTextBox.Enabled = true;
+      }
+    }
+
+    private void addressTextBox_TextChanged(object sender, EventArgs e) {
+      DistributedEngine.ServerAddress = addressTextBox.Text;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/DistributedEngineEditor.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.DistributedEngine/HeuristicLab.DistributedEngine.csproj
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/HeuristicLab.DistributedEngine.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/HeuristicLab.DistributedEngine.csproj	(revision 2)
@@ -0,0 +1,92 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E66D1EAA-525C-4F6D-BD25-DBCAE3750E25}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DistributedEngine</RootNamespace>
+    <AssemblyName>HeuristicLab.DistributedEngine</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.ServiceModel">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="HeuristicLabDistributedEnginePlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="DistributedEngine.cs" />
+    <Compile Include="DistributedEngineEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DistributedEngineEditor.Designer.cs">
+      <DependentUpon>DistributedEngineEditor.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Grid\HeuristicLab.Grid.csproj">
+      <Project>{545CE756-98D8-423B-AC2E-6E7D70926E5C}</Project>
+      <Name>HeuristicLab.Grid</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.ThreadParallelEngine\HeuristicLab.ThreadParallelEngine.csproj">
+      <Project>{6E757D0E-20F9-4E89-AF06-D7DA256870DB}</Project>
+      <Name>HeuristicLab.ThreadParallelEngine</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DistributedEngineEditor.resx">
+      <DependentUpon>DistributedEngineEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.DistributedEngine/HeuristicLabDistributedEnginePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/HeuristicLabDistributedEnginePlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/HeuristicLabDistributedEnginePlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DistributedEngine {
+  [ClassInfo(Name = "HeuristicLab.DistributedEngine")]
+  [PluginFile(Filename = "HeuristicLab.DistributedEngine.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Grid")]
+  [Dependency(Dependency = "HeuristicLab.ThreadParallelEngine.dll")]
+  public class HeuristicLabDistributedEnginePlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.DistributedEngine/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.DistributedEngine/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.DistributedEngine/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DistributedEngine")]
+[assembly: AssemblyDescription("HeuristicLab Plugin that provides an engine for distributed algorithm execution.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("755e22ba-d62a-47d4-aade-f3f40b41eb33")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Evolutionary/CrossoverBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/CrossoverBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/CrossoverBase.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Evolutionary {                
+  public abstract class CrossoverBase : OperatorBase {
+    public CrossoverBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+
+      if ((scope.SubScopes.Count % 2) != 0)
+        throw new InvalidOperationException("Number of parents is not even");
+
+      int children = scope.SubScopes.Count / 2;
+      for (int i = 0; i < children; i++) {
+        IScope parent1 = scope.SubScopes[0];
+        scope.RemoveSubScope(parent1);
+        IScope parent2 = scope.SubScopes[0];
+        scope.RemoveSubScope(parent2);
+        IScope child = new Scope(i.ToString());
+        Cross(scope, random, parent1, parent2, child);
+        scope.AddSubScope(child);
+      }
+
+      return null;
+    }
+
+    protected abstract void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child);
+  }
+}
Index: /trunk/sources/HeuristicLab.Evolutionary/HeuristicLab.Evolutionary.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/HeuristicLab.Evolutionary.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/HeuristicLab.Evolutionary.csproj	(revision 2)
@@ -0,0 +1,82 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F5614C53-153C-4A37-A608-121E1C087F07}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Evolutionary</RootNamespace>
+    <AssemblyName>HeuristicLab.Evolutionary</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Evolutionary.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SASEGASAReunificator.cs" />
+    <Compile Include="CrossoverBase.cs" />
+    <Compile Include="HeuristicLabEvolutionaryPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SubScopesStorer.cs" />
+    <Compile Include="SuccessRuleMutationStrengthAdjuster.cs" />
+    <Compile Include="UnidirectionalRingMigrator.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Evolutionary/HeuristicLabEvolutionaryPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/HeuristicLabEvolutionaryPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/HeuristicLabEvolutionaryPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Evolutionary {
+  [ClassInfo(Name = "HeuristicLab.Evolutionary")]
+  [PluginFile(Filename = "HeuristicLab.Evolutionary.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  public class HeuristicLabEvolutionaryPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Evolutionary/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Evolutionary")]
+[assembly: AssemblyDescription("HeuristicLab classes for evolutionary algorithms")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("75ed50d2-6d31-4308-a373-c3820769afb8")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Evolutionary/SASEGASAReunificator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/SASEGASAReunificator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/SASEGASAReunificator.cs	(revision 2)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Evolutionary {
+  public class SASEGASAReunificator : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int subScopes = scope.SubScopes.Count;
+      if (subScopes <= 1)
+        throw new InvalidOperationException("SASEGASA reunification requires 2 or more sub-scopes");
+
+      // get all sub-sub-scopes
+      IList<IScope> subSubScopes = new List<IScope>();
+      for (int i = 0; i < scope.SubScopes.Count; i++) {
+        while (scope.SubScopes[i].SubScopes.Count > 0) {
+          subSubScopes.Add(scope.SubScopes[i].SubScopes[0]);
+          scope.SubScopes[i].RemoveSubScope(scope.SubScopes[i].SubScopes[0]);
+        }
+      }
+
+      // reduce number of sub-scopes by 1 and partition sub-sub-scopes again
+      scope.RemoveSubScope(scope.SubScopes[scope.SubScopes.Count - 1]);
+      subScopes--;
+      int subSubScopesCount = subSubScopes.Count / subScopes;
+      for (int i = 0; i < subScopes; i++) {
+        for (int j = 0; j < subSubScopesCount; j++) {
+          scope.SubScopes[i].AddSubScope(subSubScopes[0]);
+          subSubScopes.RemoveAt(0);
+        }
+      }
+
+      // add remaining sub-sub-scopes to last sub-scope
+      while (subSubScopes.Count > 0) {
+        scope.SubScopes[scope.SubScopes.Count - 1].AddSubScope(subSubScopes[0]);
+        subSubScopes.RemoveAt(0);
+      }
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Evolutionary/SubScopesStorer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/SubScopesStorer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/SubScopesStorer.cs	(revision 2)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Evolutionary {
+  public class SubScopesStorer : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public SubScopesStorer()
+      : base() {
+      AddVariableInfo(new VariableInfo("SubScopes", "Number of sub-scopes that should be available", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SubScopesStore", "Temporarily stored sub-scopes", typeof(ItemList), VariableKind.New | VariableKind.In | VariableKind.Out | VariableKind.Deleted));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IntData subScopes = GetVariableValue<IntData>("SubScopes", scope, true);
+      ItemList subScopesStore = GetVariableValue<ItemList>("SubScopesStore", scope, false);
+
+      if (subScopesStore == null) {
+        subScopesStore = new ItemList();
+        subScopesStore.ItemType = typeof(IScope);
+        IVariableInfo info = GetVariableInfo("SubScopesStore");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, subScopesStore));
+        else
+          scope.AddVariable(new Variable(info.ActualName, subScopesStore));
+      }
+
+      IScope left = scope.SubScopes[0];
+      IScope right = scope.SubScopes[1];
+
+      if (right.SubScopes.Count + subScopesStore.Count
+          >= subScopes.Data) {  // enough sub-scopes available
+        // restore sub-scopes
+        for (int i = 0; i < subScopesStore.Count; i++) {
+          right.AddSubScope((IScope)subScopesStore[i]);
+          IVariableInfo info = GetVariableInfo("SubScopesStore");
+          if (info.Local)
+            RemoveVariable(info.ActualName);
+          else
+            scope.RemoveVariable(info.ActualName);
+        }
+        return null;
+      } else {  // not enough sub-scopes available
+        // store sub-scopes
+        for (int i = 0; i < right.SubScopes.Count; i++) {
+          IScope s = right.SubScopes[0];
+          right.RemoveSubScope(s);
+          subScopesStore.Add(s);
+        }
+
+        // shift left on level up
+        scope.RemoveSubScope(right);
+        scope.RemoveSubScope(left);
+        for (int i = 0; i < left.SubScopes.Count; i++)
+          scope.AddSubScope(left.SubScopes[i]);
+
+        return new AtomicOperation(SubOperators[0], scope);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Evolutionary/SuccessRuleMutationStrengthAdjuster.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/SuccessRuleMutationStrengthAdjuster.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/SuccessRuleMutationStrengthAdjuster.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Evolutionary {
+  public class SuccessRuleMutationStrengthAdjuster : OperatorBase {
+    public override string Description {
+      get { return @"Adjusts the mutation strength based on the ratio of successful offsprings"; }
+    }
+
+    public SuccessRuleMutationStrengthAdjuster() {
+      AddVariableInfo(new VariableInfo("ShakingFactor", "The mutation strength to adjust", typeof(DoubleData), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("SuccessfulChild", "Variable that tells if a child has become better than its parent", typeof(BoolData), VariableKind.In | VariableKind.Deleted));
+      AddVariableInfo(new VariableInfo("TargetSuccessProbability", "The targeted probability to create a successful offsrping", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SuccessProbability", "The measured probability to create a successful offspring", typeof(DoubleData), VariableKind.New | VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("LearningRate", "The speed at which the success probability changes", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("DampeningFactor", "Influences the strength of the adjustment to the mutation strength", typeof(DoubleData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      DoubleData shakingFactor = GetVariableValue<DoubleData>("ShakingFactor", scope, true);
+      DoubleData targetSuccessProb = GetVariableValue<DoubleData>("TargetSuccessProbability", scope, true);
+      DoubleData successProb = GetVariableValue<DoubleData>("SuccessProbability", scope, true);
+      if (successProb == null) {
+        IVariableInfo successProbInfo = GetVariableInfo("SuccessProbability");
+        Variable successProbVar = new Variable(successProbInfo.ActualName, new DoubleData(targetSuccessProb.Data));
+        if (successProbInfo.Local)
+          AddVariable(successProbVar);
+        else
+          scope.AddVariable(successProbVar);
+        successProb = (DoubleData)successProbVar.Value;
+      }
+      DoubleData learningRate = GetVariableValue<DoubleData>("LearningRate", scope, true);
+      DoubleData dampeningFactor = GetVariableValue<DoubleData>("DampeningFactor", scope, true);
+
+      double success = 0.0;
+      for (int i = 0 ; i < scope.SubScopes.Count ; i++) {
+        if (scope.SubScopes[i].GetVariableValue<BoolData>(GetVariableInfo("SuccessfulChild").ActualName, false).Data) {
+          success++;
+        }
+        scope.SubScopes[i].RemoveVariable(GetVariableInfo("SuccessfulChild").ActualName);
+      }
+      if (scope.SubScopes.Count > 0) success /= scope.SubScopes.Count;
+
+      successProb.Data = (1.0 - learningRate.Data) * successProb.Data + success * learningRate.Data;
+      shakingFactor.Data *= Math.Exp((successProb.Data - ((targetSuccessProb.Data * (1.0 - successProb.Data)) / (1.0 - targetSuccessProb.Data))) / dampeningFactor.Data);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Evolutionary/UnidirectionalRingMigrator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/UnidirectionalRingMigrator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Evolutionary/UnidirectionalRingMigrator.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Evolutionary {
+  public class UnidirectionalRingMigrator : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IList<IScope> emigrantsList = new List<IScope>();
+
+      for (int i = 0; i < scope.SubScopes.Count; i++) {
+        IScope emigrants = scope.SubScopes[i].SubScopes[1];
+        scope.SubScopes[i].RemoveSubScope(emigrants);
+        emigrantsList.Add(emigrants);
+      }
+
+      // shift first emigrants to end of list
+      emigrantsList.Add(emigrantsList[0]);
+      emigrantsList.RemoveAt(0);
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        scope.SubScopes[i].AddSubScope(emigrantsList[i]);
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Addition.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Addition.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Addition.cs	(revision 2)
@@ -0,0 +1,74 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using System.Linq;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Addition : FunctionBase {
+    public override string Description {
+      get {
+        return @"Returns the sum of all sub-operator results.
+    (+ 3) => 3
+    (+ 2 3) => 5
+    (+ 3 4 5) => 12";
+      }
+    }
+
+    public Addition()
+      : base() {
+      // 2 - 3 seems like an reasonable defaut (used for +,-,*,/) (discussion with swinkler and maffenze)
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public Addition(Addition source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      // (+ 3) => 3
+      // (+ 2 3) => 5
+      // (+ 3 4 5) => 12
+      double sum = 0.0;
+      for (int i = SubFunctions.Count - 1; i >= 0; i--) {
+        sum += SubFunctions[i].Evaluate(dataset, sampleIndex);
+      }
+      return sum;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Addition clone = new Addition(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/And.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/And.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/And.cs	(revision 2)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class And : FunctionBase {
+    public override string Description {
+      get {
+        return @"Logical AND operation. Only defined for sub-operator-results 0.0 and 1.0.";
+      }
+    }
+
+    public And()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public And(And source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      foreach(IFunction subFunction in SubFunctions) {
+        double result = Math.Round(subFunction.Evaluate(dataset, sampleIndex));
+        if(result == 0.0) return 0.0;
+        else if(result != 1.0) return double.NaN;
+      }
+      return 1.0;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      And clone = new And(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Average.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Average.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Average.cs	(revision 2)
@@ -0,0 +1,65 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAnalysis;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.Functions {
+  public class Average : FunctionBase {
+    public override string Description {
+      get {
+        return @"Returns the average (arithmetic mean) of all sub-operator results.";
+      }
+    }
+
+    public Average()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public Average(Average source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      double sum = 0.0;
+      for(int i = 0; i < SubFunctions.Count; i++) {
+        sum += SubFunctions[i].Evaluate(dataset, sampleIndex);
+      }
+      return sum / SubFunctions.Count;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Average clone = new Average(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Constant.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Constant.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Constant.cs	(revision 2)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Core;
+using System.Xml;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Constant : FunctionBase {
+
+    private IVariable value;
+
+    public override string Description {
+      get { return "Returns the value of local variable 'Value'."; }
+    }
+
+    public ConstrainedDoubleData Value {
+      get {
+        return (ConstrainedDoubleData)value.Value;
+      }
+    }
+
+    public Constant()
+      : base() {
+      AddVariableInfo(new VariableInfo("Value", "The constant value", typeof(ConstrainedDoubleData), VariableKind.None));
+      GetVariableInfo("Value").Local = true;
+
+      ConstrainedDoubleData valueData = new ConstrainedDoubleData();
+      // initialize a default range for the contant value
+      valueData.AddConstraint(new DoubleBoundedConstraint(-20.0, 20.0));
+
+      // create the local variable
+      value = new HeuristicLab.Core.Variable("Value", valueData);
+      AddLocalVariable(value);
+
+      // constant can't have suboperators
+      AddConstraint(new NumberOfSubOperatorsConstraint(0, 0));
+    }
+
+    public Constant(Constant source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+      value = GetVariable("Value");
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Constant clone = new Constant(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      value = GetVariable("Value");
+    }
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return ((ConstrainedDoubleData)value.Value).Data;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Cosinus.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Cosinus.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Cosinus.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Cosinus : FunctionBase {
+    public override string Description {
+      get { return "Returns the cosinus of the first sub-operator."; }
+    }
+
+    public Cosinus()
+      : base() {
+
+      // must have exactly one subfunction
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Cosinus(Cosinus source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Cos(SubFunctions[0].Evaluate(dataset, sampleIndex));
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Cosinus clone = new Cosinus(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Division.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Division.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Division.cs	(revision 2)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using System.Linq;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Division : FunctionBase {
+    private const double EPSILON = 10.0E-20; // if any divisor is < EPSILON return 0
+
+    public override string Description {
+      get {
+        return @"Protected division
+Divides the result of the first sub-operator by the results of the following sub-operators.
+In case one of the divisors is 0 returns 0.
+    (/ 3) => 1/3
+    (/ 2 3) => 2/3
+    (/ 3 4 5) => 3/20
+    (/ 2 0 4) => 0
+";
+      }
+    }
+
+    public Division()
+      : base() {
+
+      // 2 - 3 seems like an reasonable defaut (used for +,-,*,/) (discussion with swinkler and maffenze)
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public Division(Division source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      // (/ 3) => 1/3
+      // (/ 2 3) => 2/3
+      // (/ 3 4 5) => 3/20
+
+      if(SubFunctions.Count == 1) {
+        double divisor = SubFunctions[0].Evaluate(dataset, sampleIndex);
+        if(Math.Abs(divisor) < EPSILON) return 0;
+        else return 1.0 / divisor;
+      } else {
+        double result = SubFunctions[0].Evaluate(dataset, sampleIndex);
+        for(int i = 1; i < SubFunctions.Count; i++) {
+          double divisor = SubFunctions[i].Evaluate(dataset, sampleIndex);
+          if(Math.Abs(divisor) < EPSILON) return 0.0;
+          result /= divisor;
+        }
+        return result;
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Division clone = new Division(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Equal.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Equal.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Equal.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Equal : FunctionBase {
+    public override string Description {
+      get {
+        return @"Equal condition. Returns 1.0 if both sub-functions evaluate to the same value and 0.0 if they differ.";
+      }
+    }
+
+    public Equal()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 2));
+    }
+
+    public Equal(Equal source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      if(SubFunctions[0].Evaluate(dataset, sampleIndex) == SubFunctions[1].Evaluate(dataset, sampleIndex)) return 1.0;
+      else return 0.0;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Equal clone = new Equal(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Exponential.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Exponential.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Exponential.cs	(revision 2)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Exponential : FunctionBase {
+    public override string Description {
+      get { return "Returns returns exponential of the first sub-operator (power(e, x))."; }
+    }
+
+    public Exponential()
+      : base() {
+      // must have exactly one sub-operator
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+    public Exponential(Exponential source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Exp(SubFunctions[0].Evaluate(dataset, sampleIndex));
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Exponential clone = new Exponential(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/FunctionBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/FunctionBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/FunctionBase.cs	(revision 2)
@@ -0,0 +1,334 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Core;
+using System.Xml;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public abstract class FunctionBase : OperatorBase, IFunction {
+    private List<IFunction> subFunctions;
+    // instance subfunctions
+    public IList<IFunction> SubFunctions {
+      get {
+        return subFunctions;
+      }
+    }
+
+    // instance variables
+    private List<IVariable> variables;
+    public ICollection<IVariable> LocalVariables {
+      get { return variables.AsReadOnly(); }
+    }
+
+    // reference to the 'type' of the function
+    private FunctionBase metaObject;
+    public IFunction MetaObject {
+      get { return metaObject; }
+    }
+
+    public FunctionBase() {
+      metaObject = this; // (FunctionBase)Activator.CreateInstance(this.GetType());
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset from which to read samples", typeof(DoubleMatrixData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SampleIndex", "Gives the row index from which to read the sample", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Result", "The result of the evaluation of the function", typeof(DoubleData), VariableKind.Out));
+
+      subFunctions = new List<IFunction>();
+      variables = new List<IVariable>();
+    }
+
+    public FunctionBase(FunctionBase source, IDictionary<Guid, object> clonedObjects)
+      : base() {
+      this.metaObject = source.metaObject;
+      variables = new List<IVariable>();
+      subFunctions = new List<IFunction>();
+      foreach (IFunction subFunction in source.SubFunctions) {
+        subFunctions.Add((IFunction)Auxiliary.Clone(subFunction, clonedObjects));
+      }
+      foreach (IVariable variable in source.variables) {
+        variables.Add((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      }
+    }
+
+    public abstract double Evaluate(Dataset dataset, int sampleIndex);
+
+    public override IOperation Apply(IScope scope) {
+      DoubleData result = this.GetVariableValue<DoubleData>("Result", scope, false);
+      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
+      IntData sampleIndex = GetVariableValue<IntData>("SampleIndex", scope, true);
+      result.Data = Evaluate(dataset, sampleIndex.Data);
+      return null;
+    }
+
+    public virtual void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+
+    public override void AddSubOperator(IOperator subOperator) {
+      subFunctions.Add((IFunction)subOperator);
+    }
+
+    public override bool TryAddSubOperator(IOperator subOperator) {
+      subFunctions.Add((IFunction)subOperator);
+      bool valid = IsValid();
+      if (!valid) {
+        subFunctions.RemoveAt(subFunctions.Count - 1);
+      }
+
+      return valid;
+    }
+
+    public override bool TryAddSubOperator(IOperator subOperator, int index) {
+      subFunctions.Insert(index, (IFunction)subOperator);
+      bool valid = IsValid();
+      if (!valid) {
+        subFunctions.RemoveAt(index);
+      }
+      return valid;
+    }
+
+    public override bool TryAddSubOperator(IOperator subOperator, int index, out ICollection<IConstraint> violatedConstraints) {
+      subFunctions.Insert(index, (IFunction)subOperator);
+      bool valid = IsValid(out violatedConstraints);
+      if (!valid) {
+        subFunctions.RemoveAt(index);
+      }
+      return valid;
+    }
+
+    public override bool TryAddSubOperator(IOperator subOperator, out ICollection<IConstraint> violatedConstraints) {
+      subFunctions.Add((IFunction)subOperator);
+      bool valid = IsValid(out violatedConstraints);
+      if (!valid) {
+        subFunctions.RemoveAt(subFunctions.Count - 1);
+      }
+
+      return valid;
+    }
+
+    public override void AddSubOperator(IOperator subOperator, int index) {
+      subFunctions.Insert(index, (IFunction)subOperator);
+    }
+
+    public override void RemoveSubOperator(int index) {
+      if (index >= subFunctions.Count) throw new InvalidOperationException();
+      subFunctions.RemoveAt(index);
+    }
+
+    public override IList<IOperator> SubOperators {
+      get { return subFunctions.ConvertAll(f => (IOperator)f); }
+    }
+
+    public override ICollection<IVariable> Variables {
+      get {
+        List<IVariable> mergedVariables = new List<IVariable>(variables);
+        if (this == metaObject) {
+          foreach (IVariable variable in base.Variables) {
+            if (!IsLocalVariable(variable.Name)) {
+              mergedVariables.Add(variable);
+            }
+          }
+        } else {
+          foreach (IVariable variable in metaObject.Variables) {
+            if (!IsLocalVariable(variable.Name)) {
+              mergedVariables.Add(variable);
+            }
+          }
+        }
+        return mergedVariables;
+      }
+    }
+
+    private bool IsLocalVariable(string name) {
+      foreach (IVariable variable in variables) {
+        if (variable.Name == name) return true;
+      }
+      return false;
+    }
+
+
+    public override bool TryRemoveSubOperator(int index) {
+      IFunction removedFunction = subFunctions[index];
+      subFunctions.RemoveAt(index);
+      bool valid = IsValid();
+      if (!valid) {
+        subFunctions.Insert(index, removedFunction);
+      }
+
+      return valid;
+    }
+
+    public override bool TryRemoveSubOperator(int index, out ICollection<IConstraint> violatedConstraints) {
+      IFunction removedFunction = subFunctions[index];
+      subFunctions.RemoveAt(index);
+      bool valid = IsValid(out violatedConstraints);
+      if (!valid) {
+        subFunctions.Insert(index, removedFunction);
+      }
+
+      return valid;
+    }
+
+    public override void AddVariable(IVariable variable) {
+      if (metaObject == this) {
+        base.AddVariable(variable);
+      } else {
+        metaObject.AddVariable(variable);
+      }
+    }
+
+    public override IVariable GetVariable(string name) {
+      foreach (IVariable variable in variables) {
+        if (variable.Name == name) return variable;
+      }
+      if (metaObject == this) {
+        return base.GetVariable(name);
+      } else {
+        return metaObject.GetVariable(name);
+      }
+    }
+
+    public void AddLocalVariable(IVariable variable) {
+      variables.Add(variable);
+    }
+
+    public override void RemoveVariable(string name) {
+      foreach (IVariable variable in variables) {
+        if (variable.Name == name) {
+          variables.Remove(variable);
+          return;
+        }
+      }
+      if (metaObject == this) {
+        base.RemoveVariable(name);
+      } else {
+        metaObject.RemoveVariable(name);
+      }
+    }
+
+    public override IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) {
+      foreach (IVariable variable in Variables) {
+        if (variable.Name == formalName) {
+          return variable.Value;
+        }
+      }
+      return metaObject.GetVariableValue(formalName, scope, recursiveLookup, throwOnError);
+    }
+
+    public override ICollection<IVariableInfo> VariableInfos {
+      get {
+        if (metaObject == this) {
+          return base.VariableInfos;
+        } else {
+          return metaObject.VariableInfos;
+        }
+      }
+    }
+
+    public override void AddVariableInfo(IVariableInfo variableInfo) {
+      if (metaObject == this) {
+        base.AddVariableInfo(variableInfo);
+      } else {
+        metaObject.AddVariableInfo(variableInfo);
+      }
+    }
+
+    public override void RemoveVariableInfo(string formalName) {
+      if (metaObject == this) {
+        base.RemoveVariableInfo(formalName);
+      } else {
+        metaObject.RemoveVariableInfo(formalName);
+      }
+    }
+
+    public override ICollection<IConstraint> Constraints {
+      get {
+        if (metaObject == this) {
+          return base.Constraints;
+        } else {
+          return metaObject.Constraints;
+        }
+      }
+    }
+
+    public override void AddConstraint(IConstraint constraint) {
+      if (metaObject == this) {
+        base.AddConstraint(constraint);
+      } else {
+        metaObject.AddConstraint(constraint);
+      }
+    }
+    public override void RemoveConstraint(IConstraint constraint) {
+      if (metaObject == this) {
+        base.RemoveConstraint(constraint);
+      } else {
+        metaObject.RemoveConstraint(constraint);
+      }
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      if (metaObject != this) {
+        XmlNode functionTemplateNode = document.CreateElement("FunctionTemplate");
+        functionTemplateNode.AppendChild(PersistenceManager.Persist(metaObject, document, persistedObjects));
+        node.AppendChild(functionTemplateNode);
+      } 
+
+      // don't need to persist the sub-functions because OperatorBase.GetXmlNode already persisted the sub-operators
+
+      // persist local variables
+      XmlNode variablesNode = document.CreateNode(XmlNodeType.Element, "LocalVariables", null);
+      foreach (IVariable variable in variables) {
+        variablesNode.AppendChild(PersistenceManager.Persist(variable, document, persistedObjects));
+      }
+      node.AppendChild(variablesNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode functionTemplateNode = node.SelectSingleNode("FunctionTemplate");
+      if (functionTemplateNode != null) {
+        metaObject = (FunctionBase)PersistenceManager.Restore(functionTemplateNode.ChildNodes[0], restoredObjects);
+      } else {
+        metaObject = this;
+      }
+      // don't need to explicitly load the sub-functions because that has already been done in OperatorBase.Populate()
+
+      // load local variables
+      XmlNode variablesNode = node.SelectSingleNode("LocalVariables");
+      
+      // remove the variables that have been added in a constructor
+      variables.Clear();
+      // load the persisted variables
+      foreach (XmlNode variableNode in variablesNode.ChildNodes)
+        variables.Add((IVariable)PersistenceManager.Restore(variableNode, restoredObjects));
+    }
+
+    public override IView CreateView() {
+      return new FunctionView(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/FunctionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/FunctionView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/FunctionView.Designer.cs	(revision 2)
@@ -0,0 +1,211 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+namespace HeuristicLab.Functions {
+  partial class FunctionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      if(selectedVariable != null) {
+        selectedVariable.Value.Changed -= new EventHandler(selectedVariable_ValueChanged);
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.functionTreeView = new System.Windows.Forms.TreeView();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.variablesListBox = new System.Windows.Forms.ListBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.templateTextBox = new System.Windows.Forms.TextBox();
+      this.editButton = new System.Windows.Forms.Button();
+      this.treeNodeContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.copyToClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
+      this.variablesSplitContainer.Panel1.SuspendLayout();
+      this.variablesSplitContainer.SuspendLayout();
+      this.treeNodeContextMenu.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // functionTreeView
+      // 
+      this.functionTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.functionTreeView.HideSelection = false;
+      this.functionTreeView.Location = new System.Drawing.Point(0, 0);
+      this.functionTreeView.Name = "functionTreeView";
+      this.functionTreeView.Size = new System.Drawing.Size(182, 532);
+      this.functionTreeView.TabIndex = 0;
+      this.functionTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.functionTreeView_AfterSelect);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.functionTreeView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variablesGroupBox);
+      this.splitContainer.Panel2.Controls.Add(this.label1);
+      this.splitContainer.Panel2.Controls.Add(this.templateTextBox);
+      this.splitContainer.Panel2.Controls.Add(this.editButton);
+      this.splitContainer.Size = new System.Drawing.Size(735, 532);
+      this.splitContainer.SplitterDistance = 182;
+      this.splitContainer.TabIndex = 1;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.variablesGroupBox.Controls.Add(this.variablesSplitContainer);
+      this.variablesGroupBox.Location = new System.Drawing.Point(3, 31);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(543, 498);
+      this.variablesGroupBox.TabIndex = 5;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Local variables";
+      // 
+      // variablesSplitContainer
+      // 
+      this.variablesSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesSplitContainer.Location = new System.Drawing.Point(3, 16);
+      this.variablesSplitContainer.Name = "variablesSplitContainer";
+      // 
+      // variablesSplitContainer.Panel1
+      // 
+      this.variablesSplitContainer.Panel1.Controls.Add(this.variablesListBox);
+      this.variablesSplitContainer.Size = new System.Drawing.Size(537, 479);
+      this.variablesSplitContainer.SplitterDistance = 179;
+      this.variablesSplitContainer.TabIndex = 0;
+      // 
+      // variablesListBox
+      // 
+      this.variablesListBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesListBox.FormattingEnabled = true;
+      this.variablesListBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesListBox.Name = "variablesListBox";
+      this.variablesListBox.Size = new System.Drawing.Size(179, 472);
+      this.variablesListBox.TabIndex = 0;
+      this.variablesListBox.SelectedIndexChanged += new System.EventHandler(this.variablesListBox_SelectedIndexChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(96, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Function definition:";
+      // 
+      // templateTextBox
+      // 
+      this.templateTextBox.Location = new System.Drawing.Point(105, 7);
+      this.templateTextBox.Name = "templateTextBox";
+      this.templateTextBox.ReadOnly = true;
+      this.templateTextBox.Size = new System.Drawing.Size(190, 20);
+      this.templateTextBox.TabIndex = 2;
+      // 
+      // editButton
+      // 
+      this.editButton.Location = new System.Drawing.Point(301, 5);
+      this.editButton.Name = "editButton";
+      this.editButton.Size = new System.Drawing.Size(49, 23);
+      this.editButton.TabIndex = 1;
+      this.editButton.Text = "Edit...";
+      this.editButton.UseVisualStyleBackColor = true;
+      this.editButton.Click += new System.EventHandler(this.editButton_Click);
+      // 
+      // treeNodeContextMenu
+      // 
+      this.treeNodeContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.copyToClipboardMenuItem});
+      this.treeNodeContextMenu.Name = "treeNodeContextMenu";
+      this.treeNodeContextMenu.Size = new System.Drawing.Size(259, 26);
+      // 
+      // copyToClipboardMenuItem
+      // 
+      this.copyToClipboardMenuItem.Name = "copyToClipboardMenuItem";
+      this.copyToClipboardMenuItem.Size = new System.Drawing.Size(258, 22);
+      this.copyToClipboardMenuItem.Text = "Copy to clip-board (Model-Analyzer)";
+      this.copyToClipboardMenuItem.Click += new System.EventHandler(this.copyToClipboardMenuItem_Click);
+      // 
+      // FunctionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "FunctionView";
+      this.Size = new System.Drawing.Size(735, 532);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.Panel2.PerformLayout();
+      this.splitContainer.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.variablesSplitContainer.Panel1.ResumeLayout(false);
+      this.variablesSplitContainer.ResumeLayout(false);
+      this.treeNodeContextMenu.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView functionTreeView;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.TextBox templateTextBox;
+    private System.Windows.Forms.Button editButton;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.SplitContainer variablesSplitContainer;
+    private System.Windows.Forms.ListBox variablesListBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ContextMenuStrip treeNodeContextMenu;
+    private System.Windows.Forms.ToolStripMenuItem copyToClipboardMenuItem;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/FunctionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/FunctionView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/FunctionView.cs	(revision 2)
@@ -0,0 +1,374 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Functions {
+  public partial class FunctionView : ViewBase {
+    private IFunction function;
+
+    private IFunction selectedFunction;
+    private IVariable selectedVariable;
+
+    private FunctionNameVisitor functionNameVisitor;
+    public FunctionView() {
+      InitializeComponent();
+      functionNameVisitor = new FunctionNameVisitor();
+    }
+
+    public FunctionView(IFunction function)
+      : this() {
+      this.function = function;
+      Refresh();
+    }
+
+    protected override void UpdateControls() {
+      functionTreeView.Nodes.Clear();
+      function.Accept(functionNameVisitor);
+      TreeNode rootNode = new TreeNode();
+      rootNode.Name = function.Name;
+      rootNode.Text = functionNameVisitor.Name;
+      rootNode.Tag = function;
+      rootNode.ContextMenuStrip = treeNodeContextMenu;
+      functionTreeView.Nodes.Add(rootNode);
+
+      foreach(IFunction subFunction in function.SubFunctions) {
+        CreateTree(rootNode, subFunction);
+      }
+      functionTreeView.ExpandAll();
+    }
+
+    private void CreateTree(TreeNode rootNode, IFunction function) {
+      TreeNode node = new TreeNode();
+      function.Accept(functionNameVisitor);
+      node.Tag = function;
+      node.Name = function.Name;
+      node.Text = functionNameVisitor.Name;
+      node.ContextMenuStrip = treeNodeContextMenu;
+      rootNode.Nodes.Add(node);
+      foreach(IFunction subFunction in function.SubFunctions) {
+        CreateTree(node, subFunction);
+      }
+    }
+
+    private void functionTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      variablesListBox.Items.Clear();
+      variablesSplitContainer.Panel2.Controls.Clear();
+      templateTextBox.Clear();
+      editButton.Enabled = false;
+      if(functionTreeView.SelectedNode != null && functionTreeView.SelectedNode.Tag != null) {
+        IFunction selectedFunction = (IFunction)functionTreeView.SelectedNode.Tag;
+        UpdateVariablesList(selectedFunction);
+        templateTextBox.Text = selectedFunction.MetaObject.Name;
+        this.selectedFunction = selectedFunction;
+        editButton.Enabled = true;
+      }
+    }
+
+    private void UpdateVariablesList(IFunction function) {
+      foreach(IVariable variable in function.LocalVariables) {
+        variablesListBox.Items.Add(variable.Name);
+      }
+    }
+
+    private void variablesListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      // in case we had an event-handler registered for a different variable => unregister the event-handler
+      if(selectedVariable != null) {
+        selectedVariable.Value.Changed -= new EventHandler(selectedVariable_ValueChanged);
+      }
+      if(variablesListBox.SelectedItem != null) {
+        string selectedVariableName = (string)variablesListBox.SelectedItem;
+        selectedVariable = selectedFunction.GetVariable(selectedVariableName);
+        variablesSplitContainer.Panel2.Controls.Clear();
+        Control editor = (Control)selectedVariable.CreateView();
+        variablesSplitContainer.Panel2.Controls.Add(editor);
+        editor.Dock = DockStyle.Fill;
+        // register an event handler that updates the treenode when the value of the variable is changed by the user
+        selectedVariable.Value.Changed += new EventHandler(selectedVariable_ValueChanged);
+      } else {
+        variablesSplitContainer.Panel2.Controls.Clear();
+      }
+    }
+
+    void selectedVariable_ValueChanged(object sender, EventArgs e) {
+      if(functionTreeView.SelectedNode != null && functionTreeView.SelectedNode.Tag != null) {
+        TreeNode node = functionTreeView.SelectedNode;
+        selectedFunction.Accept(functionNameVisitor);
+        node.Text = functionNameVisitor.Name;
+      }
+    }
+
+    private void editButton_Click(object sender, EventArgs e) {
+      OperatorBaseView operatorView = new OperatorBaseView(selectedFunction.MetaObject);
+      PluginManager.ControlManager.ShowControl(operatorView);
+    }
+
+    private void copyToClipboardMenuItem_Click(object sender, EventArgs e) {
+      TreeNode node = functionTreeView.SelectedNode;
+      if(node == null || node.Tag == null) return;
+
+      ModelAnalyzerExportVisitor visitor = new ModelAnalyzerExportVisitor();
+      ((IFunction)node.Tag).Accept(visitor);
+      Clipboard.SetText(visitor.ModelAnalyzerPrefix);
+    }
+
+    private class FunctionNameVisitor : IFunctionVisitor {
+      string name;
+
+      public string Name {
+        get { return name; }
+      }
+
+      #region IFunctionVisitor Members
+
+      public void Visit(IFunction function) {
+        name = function.Name;
+      }
+
+      public void Visit(Addition addition) {
+        name = "+";
+      }
+
+      public void Visit(Constant constant) {
+        name = constant.Value + "";
+      }
+
+      public void Visit(Cosinus cosinus) {
+        name = "Sin";
+      }
+
+      public void Visit(Division division) {
+        name = "/";
+      }
+
+      public void Visit(Exponential exponential) {
+        name = "Exp";
+      }
+
+      public void Visit(Logarithm logarithm) {
+        name = "Log";
+      }
+
+      public void Visit(Multiplication multiplication) {
+        name = "*";
+      }
+
+      public void Visit(Power power) {
+        name = "Pow";
+      }
+
+      public void Visit(Signum signum) {
+        name = "Sign";
+      }
+
+      public void Visit(Sinus sinus) {
+        name = "Sin";
+      }
+
+      public void Visit(Sqrt sqrt) {
+        name = "Sqrt";
+      }
+
+      public void Visit(Substraction substraction) {
+        name = "-";
+      }
+
+      public void Visit(Tangens tangens) {
+        name = "Tan";
+      }
+
+      public void Visit(Variable variable) {
+        string timeOffset = "";
+        if(variable.SampleOffset < 0) {
+          timeOffset = "(t" + variable.SampleOffset + ")";
+        } else if(variable.SampleOffset > 0) {
+          timeOffset = "(t+" + variable.SampleOffset + ")";
+        } else {
+          timeOffset = "";
+        }
+        name = "Var" + variable.VariableIndex + timeOffset + " * " + variable.Weight;
+      }
+
+      public void Visit(And and) {
+        name = "And";
+      }
+
+      public void Visit(Average average) {
+        name = "Avg";
+      }
+
+      public void Visit(IfThenElse ifThenElse) {
+        name = "IFTE";
+      }
+
+      public void Visit(Not not) {
+        name = "Not";
+      }
+
+      public void Visit(Or or) {
+        name = "Or";
+      }
+
+      public void Visit(Xor xor) {
+        name = "Xor";
+      }
+
+      public void Visit(Equal equal) {
+        name = "eq?";
+      }
+
+      public void Visit(LessThan lessThan) {
+        name = "<";
+      }
+
+      #endregion
+    }
+
+    private class ModelAnalyzerExportVisitor : IFunctionVisitor {
+      private string prefix;
+      private string currentIndend = "";
+      public string ModelAnalyzerPrefix {
+        get { return prefix; }
+      }
+      public void Reset() {
+        prefix = "";
+      }
+
+      private void VisitFunction(string name, IFunction f) {
+        prefix += currentIndend + "[F]"+name+"(\n";
+        currentIndend += "  ";
+        foreach(IFunction subFunction in f.SubFunctions) {
+          subFunction.Accept(this);
+          prefix += ";\n";
+        }
+        prefix = prefix.TrimEnd(';','\n');
+        prefix += ")";
+        currentIndend = currentIndend.Remove(0, 2);
+      }
+
+      #region IFunctionVisitor Members
+
+      public void Visit(IFunction function) {
+        prefix += function.Name;
+      }
+
+      public void Visit(Addition addition) {
+        VisitFunction("Addition[0]", addition);
+      }
+
+      public void Visit(Constant constant) {
+        prefix += currentIndend + "[T]Constant(" + constant.Value.Data.ToString() + ";0;0)";
+      }
+
+      public void Visit(Cosinus cosinus) {
+        VisitFunction("Trigonometrics[1]", cosinus);
+      }
+
+      public void Visit(Division division) {
+        VisitFunction("Division[0]", division);
+      }
+
+      public void Visit(Exponential exponential) {
+        VisitFunction("Exponential[0]", exponential);
+      }
+
+      public void Visit(Logarithm logarithm) {
+        VisitFunction("Logarithm[0]", logarithm);
+      }
+
+      public void Visit(Multiplication multiplication) {
+        VisitFunction("Multiplication[0]", multiplication);
+      }
+
+      public void Visit(Power power) {
+        VisitFunction("Power[0]", power);
+      }
+
+      public void Visit(Signum signum) {
+        VisitFunction("Signum[0]", signum);
+      }
+
+      public void Visit(Sinus sinus) {
+        VisitFunction("Trigonometrics[0]", sinus);
+      }
+
+      public void Visit(Sqrt sqrt) {
+        VisitFunction("Sqrt[0]", sqrt);
+      }
+
+      public void Visit(Substraction substraction) {
+        VisitFunction("Substraction[0]", substraction);
+      }
+
+      public void Visit(Tangens tangens) {
+        VisitFunction("Trigonometrics[2]", tangens);
+      }
+
+      public void Visit(HeuristicLab.Functions.Variable variable) {
+        prefix += currentIndend + "[T]Variable(" + variable.Weight + ";" + variable.VariableIndex + ";" + -variable.SampleOffset + ")";
+      }
+
+      public void Visit(And and) {
+        VisitFunction("Logical[0]", and);
+      }
+
+      public void Visit(Average average) {
+        VisitFunction("N/A (average)", average);
+      }
+
+      public void Visit(IfThenElse ifThenElse) {
+        VisitFunction("Conditional[0]", ifThenElse);
+      }
+
+      public void Visit(Not not) {
+        VisitFunction("Logical[2]", not);
+      }
+
+      public void Visit(Or or) {
+        VisitFunction("Logical[1]", or);
+      }
+
+      public void Visit(Xor xor) {
+        VisitFunction("N/A (xor)", xor);
+      }
+
+      public void Visit(Equal equal) {
+        VisitFunction("Boolean[2]", equal);
+      }
+
+      public void Visit(LessThan lessThan) {
+        VisitFunction("Boolean[0]", lessThan);
+      }
+
+      #endregion
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/FunctionView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Functions/FunctionView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/FunctionView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="treeNodeContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Functions/HeuristicLab.Functions.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Functions/HeuristicLab.Functions.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/HeuristicLab.Functions.csproj	(revision 2)
@@ -0,0 +1,122 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B95CA6E2-34BC-4430-994D-BD6E99375319}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Functions</RootNamespace>
+    <AssemblyName>HeuristicLab.Functions</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Addition.cs" />
+    <Compile Include="And.cs" />
+    <Compile Include="Average.cs" />
+    <Compile Include="Constant.cs" />
+    <Compile Include="Equal.cs" />
+    <Compile Include="FunctionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FunctionView.Designer.cs">
+      <DependentUpon>FunctionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IfThenElse.cs" />
+    <Compile Include="IFunctionVisitor.cs" />
+    <Compile Include="LessThan.cs" />
+    <Compile Include="Not.cs" />
+    <Compile Include="Or.cs" />
+    <Compile Include="Signum.cs" />
+    <Compile Include="Logarithm.cs" />
+    <Compile Include="Exponential.cs" />
+    <Compile Include="Sqrt.cs" />
+    <Compile Include="Substraction.cs" />
+    <Compile Include="Power.cs" />
+    <Compile Include="Division.cs" />
+    <Compile Include="Tangens.cs" />
+    <Compile Include="Cosinus.cs" />
+    <Compile Include="Sinus.cs" />
+    <Compile Include="Multiplication.cs" />
+    <Compile Include="FunctionBase.cs" />
+    <Compile Include="HeuristicLabFunctionsPlugin.cs" />
+    <Compile Include="IFunction.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Variable.cs" />
+    <Compile Include="Xor.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataAnalysis\HeuristicLab.DataAnalysis.csproj">
+      <Project>{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}</Project>
+      <Name>HeuristicLab.DataAnalysis</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="FunctionView.resx">
+      <DependentUpon>FunctionView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Functions/HeuristicLabFunctionsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/HeuristicLabFunctionsPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/HeuristicLabFunctionsPlugin.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Functions {
+  [ClassInfo(Name = "HeuristicLab.Functions")]
+  [PluginFile(Filename = "HeuristicLab.Functions.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Constraints")]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.DataAnalysis")]
+  public class HeuristicLabFunctionsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/IFunction.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/IFunction.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/IFunction.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public interface IFunction : IOperator {
+    IList<IFunction> SubFunctions { get;}
+    ICollection<IVariable> LocalVariables { get; }
+    IFunction MetaObject { get; }
+    double Evaluate(Dataset dataset, int sampleIndex);
+    void Accept(IFunctionVisitor visitor);
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/IFunctionVisitor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/IFunctionVisitor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/IFunctionVisitor.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Functions {
+  public interface IFunctionVisitor {
+    void Visit(IFunction function);
+    void Visit(Addition addition);
+    void Visit(And and);
+    void Visit(Average average);
+    void Visit(Constant constant);
+    void Visit(Cosinus cosinus);
+    void Visit(Division division);
+    void Visit(Equal equal);
+    void Visit(Exponential exponential);
+    void Visit(IfThenElse ifThenElse);
+    void Visit(LessThan lessThan);
+    void Visit(Logarithm logarithm);
+    void Visit(Multiplication multiplication);
+    void Visit(Not not);
+    void Visit(Or or);
+    void Visit(Power power);
+    void Visit(Signum signum);
+    void Visit(Sinus sinus);
+    void Visit(Sqrt sqrt);
+    void Visit(Substraction substraction);
+    void Visit(Tangens tangens);
+    void Visit(Variable variable);
+    void Visit(Xor xor);
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/IfThenElse.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/IfThenElse.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/IfThenElse.cs	(revision 2)
@@ -0,0 +1,65 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class IfThenElse : FunctionBase {
+    public override string Description {
+      get {
+        return @"Returns the result of the second branch if the first branch evaluates to a value >= 0.5 and the result
+of the third branch if the first branch evaluates to < 0.5.";
+      }
+    }
+
+    public IfThenElse()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(3, 3));
+    }
+
+    public IfThenElse(IfThenElse source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      double condition = Math.Round(SubFunctions[0].Evaluate(dataset, sampleIndex));
+      if(condition >= .5) return SubFunctions[2].Evaluate(dataset, sampleIndex);
+      else if(condition < .5) return SubFunctions[1].Evaluate(dataset, sampleIndex);
+      else return double.NaN;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      IfThenElse clone = new IfThenElse(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/LessThan.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/LessThan.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/LessThan.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class LessThan : FunctionBase {
+    public override string Description {
+      get {
+        return @"Less-than condition. Returns 1.0 if the value of the first sub-function is less than the value of the second sub-function and 0.0 otherwise.";
+      }
+    }
+
+    public LessThan()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 2));
+    }
+
+    public LessThan(LessThan source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      if(SubFunctions[0].Evaluate(dataset, sampleIndex) < SubFunctions[1].Evaluate(dataset, sampleIndex)) return 1.0;
+      else return 0.0;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      LessThan clone = new LessThan(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Logarithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Logarithm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Logarithm.cs	(revision 2)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Logarithm : FunctionBase {
+    public override string Description {
+      get { return "Returns the natural (base e) logarithm of the first sub-operator."; }
+    }
+
+    public Logarithm()
+      : base() {
+      // must have exactly 1 suboperator
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Logarithm(Logarithm source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Logarithm clone = new Logarithm(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Log(SubFunctions[0].Evaluate(dataset, sampleIndex));
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Multiplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Multiplication.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Multiplication.cs	(revision 2)
@@ -0,0 +1,74 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using System.Linq;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Multiplication : FunctionBase {
+    public override string Description {
+      get {
+        return @"Returns the product of the results of all sub-operators.
+  (* 3) => 3
+  (* 2 3) => 6
+  (* 3 4 5) => 60";
+      }
+    }
+
+    public Multiplication()
+      : base() {
+      // 2 - 3 seems like an reasonable defaut (used for +,-,*,/) (discussion with swinkler and maffenze)
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public Multiplication(Multiplication source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      // (* 3) => 3
+      // (* 2 3) => 6
+      // (* 3 4 5) => 60
+      double result = 1.0;
+      for(int i = SubFunctions.Count - 1; i >= 0; i--) {
+        result *= SubFunctions[i].Evaluate(dataset, sampleIndex);
+      }
+      return result;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Multiplication clone = new Multiplication(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Not.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Not.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Not.cs	(revision 2)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Not : FunctionBase {
+    public override string Description {
+      get {
+        return @"Logical NOT operation. Only defined for sub-operator-results 0.0 and 1.0.";
+      }
+    }
+
+    public Not()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Not(Not source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      double result = Math.Round(SubFunctions[0].Evaluate(dataset, sampleIndex));
+      if(result == 0.0) return 1.0;
+      else if(result == 1.0) return 0.0;
+      else return double.NaN;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Not clone = new Not(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Or.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Or.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Or.cs	(revision 2)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Or : FunctionBase {
+    public override string Description {
+      get {
+        return @"Logical OR operation. Only defined for sub-operator-results 0.0 and 1.0.";
+      }
+    }
+
+    public Or()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public Or(Or source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      foreach(IFunction subFunction in SubFunctions) {
+        double result = Math.Round(subFunction.Evaluate(dataset, sampleIndex));
+        if(result == 1.0) return 1.0;
+        else if(result != 0.0) return double.NaN;
+      }
+      return 0.0;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Or clone = new Or(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Power.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Power.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Power.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Power : FunctionBase {
+    public override string Description {
+      get { return "Returns the result of the first sub-operator to the power of the second sub-operator (power(x, y))."; }
+    }
+
+    public Power()
+      : base() {
+      // must have exactly 2 suboperators base ^ exponent
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 2));
+    }
+
+    public Power(Power source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Pow(SubFunctions[0].Evaluate(dataset, sampleIndex), SubFunctions[1].Evaluate(dataset, sampleIndex));
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Power clone = new Power(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Functions")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Functions")]
+[assembly: AssemblyCopyright("Copyright Â©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("863021a4-3cde-48be-8af6-dac1077f5fb5")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /trunk/sources/HeuristicLab.Functions/Signum.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Signum.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Signum.cs	(revision 2)
@@ -0,0 +1,65 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Signum : FunctionBase {
+    public override string Description {
+      get { return "Returns the signum of the first sub-operator."; }
+    }
+
+    public Signum()
+      : base() {
+      // must have exactly 1 suboperator
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Signum(Signum source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      double value = SubFunctions[0].Evaluate(dataset, sampleIndex);
+      if(value < 0) return -1;
+      if(value > 0) return 1;
+      return 0;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Signum clone = new Signum(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Sinus.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Sinus.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Sinus.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Sinus : FunctionBase {
+    public override string Description {
+      get { return "Returns the sinus of the first sub-operator."; }
+    }
+
+    public Sinus()
+      : base() {
+      // must have exactly 1 suboperator
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Sinus(Sinus source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Sin(SubFunctions[0].Evaluate(dataset, sampleIndex));
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Sinus clone = new Sinus(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Sqrt.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Sqrt.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Sqrt.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Sqrt : FunctionBase {
+    public override string Description {
+      get { return "Returns the square root of the first sub-operator."; }
+    }
+
+    public Sqrt()
+      : base() {
+      // must have exactly 1 suboperator
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Sqrt(Sqrt source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Sqrt(SubFunctions[0].Evaluate(dataset, sampleIndex));
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Sqrt clone = new Sqrt(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Substraction.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Substraction.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Substraction.cs	(revision 2)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using System.Linq;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Substraction : FunctionBase {
+    public override string Description {
+      get {
+        return @"Substracts the results of sub-operators 2..n from the result of the first sub-operator.
+    (- 3) => -3
+    (- 2 3) => -1
+    (- 3 4 5) => -6";
+      }
+    }
+
+    public Substraction()
+      : base() {
+      // 2 - 3 seems like an reasonable defaut (used for +,-,*,/) (discussion with swinkler and maffenze)
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 3));
+    }
+
+    public Substraction(Substraction source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+
+      if(SubFunctions.Count == 1) {
+        return -SubFunctions[0].Evaluate(dataset, sampleIndex);
+      } else {
+        double result = SubFunctions[0].Evaluate(dataset, sampleIndex);
+        for(int i = 1; i < SubFunctions.Count; i++) {
+          result -= SubFunctions[i].Evaluate(dataset, sampleIndex);
+        }
+        return result;
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Substraction clone = new Substraction(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Tangens.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Tangens.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Tangens.cs	(revision 2)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Tangens : FunctionBase {
+    public override string Description {
+      get { return "Returns the tangens of the first sub-operator."; }
+    }
+
+    public Tangens()
+      : base() {
+      // must have exactly one suboperator
+      AddConstraint(new NumberOfSubOperatorsConstraint(1, 1));
+    }
+
+    public Tangens(Tangens source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      return Math.Tan(SubFunctions[0].Evaluate(dataset, sampleIndex));
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Tangens clone = new Tangens(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Variable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Variable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Variable.cs	(revision 2)
@@ -0,0 +1,118 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Variable : FunctionBase {
+
+    private ConstrainedIntData variable;
+    private ConstrainedDoubleData weight;
+    private ConstrainedIntData sampleOffset;
+
+    public double SampleOffset {
+      get { return sampleOffset.Data; }
+    }
+
+    public int VariableIndex {
+      get { return variable.Data; }
+    }
+
+    public double Weight {
+      get { return weight.Data; }
+    }
+
+    public override string Description {
+      get { return @"Variable reads a value from a dataset, multiplies that value with a given factor and returns the result.
+The variable 'SampleOffset' can be used to read a value from previous or following rows.
+The index of the row that is actually read is SampleIndex+SampleOffset)."; }
+    }
+
+    public Variable()
+      : base() {
+      AddVariableInfo(new VariableInfo("Variable", "Index of the variable in the dataset representing this feature", typeof(ConstrainedIntData), VariableKind.None));
+      GetVariableInfo("Variable").Local = true;
+      AddVariableInfo(new VariableInfo("Weight", "Weight is multiplied to the feature value", typeof(ConstrainedDoubleData), VariableKind.None));
+      GetVariableInfo("Weight").Local = true;
+      AddVariableInfo(new VariableInfo("SampleOffset", "SampleOffset is added to the sample index", typeof(ConstrainedIntData), VariableKind.None));
+      GetVariableInfo("SampleOffset").Local = true;
+
+      variable = new ConstrainedIntData();
+      AddLocalVariable(new HeuristicLab.Core.Variable("Variable", variable));
+
+      weight = new ConstrainedDoubleData();
+      // initialize a totally arbitrary range for the weight = [-20.0, 20.0]
+      weight.AddConstraint(new DoubleBoundedConstraint(-20.0, 20.0));
+      AddLocalVariable(new HeuristicLab.Core.Variable("Weight", weight));
+
+      sampleOffset = new ConstrainedIntData();
+      // initialize a totally arbitrary default range for sampleoffset = [-10, 10]
+      sampleOffset.AddConstraint(new IntBoundedConstraint(0, 0));
+      AddLocalVariable(new HeuristicLab.Core.Variable("SampleOffset", sampleOffset));
+
+      // samplefeature can't have suboperators
+      AddConstraint(new NumberOfSubOperatorsConstraint(0, 0));
+    }
+
+    public Variable(Variable source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+
+      variable = (ConstrainedIntData)GetVariable("Variable").Value;
+      weight = (ConstrainedDoubleData)GetVariable("Weight").Value;
+      sampleOffset = (ConstrainedIntData)GetVariable("SampleOffset").Value;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Variable clone = new Variable(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Populate(System.Xml.XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      variable = (ConstrainedIntData)GetVariable("Variable").Value;
+      weight = (ConstrainedDoubleData)GetVariable("Weight").Value;
+      sampleOffset = (ConstrainedIntData)GetVariable("SampleOffset").Value;
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      // local variables
+      int v = variable.Data;
+      double w = weight.Data;
+      int offset = sampleOffset.Data;
+
+      return w * dataset.GetValue(sampleIndex + offset, v);
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Functions/Xor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/Xor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Functions/Xor.cs	(revision 2)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Constraints;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.Functions {
+  public class Xor : FunctionBase {
+    public override string Description {
+      get {
+        return @"Logical XOR operation. Only defined for sub-operator-results 0.0 and 1.0.";
+      }
+    }
+
+    public Xor()
+      : base() {
+      AddConstraint(new NumberOfSubOperatorsConstraint(2, 2));
+    }
+
+    public Xor(Xor source, IDictionary<Guid, object> clonedObjects)
+      : base(source, clonedObjects) {
+    }
+
+
+    public override double Evaluate(Dataset dataset, int sampleIndex) {
+      double r0 = Math.Round(SubFunctions[0].Evaluate(dataset, sampleIndex));
+      double r1 = Math.Round(SubFunctions[1].Evaluate(dataset, sampleIndex));
+      if((r0 == 0.0 && r1 == 0.0) ||
+        (r0 == 1.0 && r1 == 1.0)) return 0.0;
+      else if((r0 == 0.0 && r1 == 1.0) ||
+        (r0 == 1.0 && r1 == 0.0)) return 1.0;
+      else return double.NaN;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Xor clone = new Xor(this, clonedObjects);
+      clonedObjects.Add(clone.Guid, clone);
+      return clone;
+    }
+
+    public override void Accept(IFunctionVisitor visitor) {
+      visitor.Visit(this);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/ClientForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ClientForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ClientForm.cs	(revision 2)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.ServiceModel;
+using HeuristicLab.Core;
+using System.Xml;
+using System.Threading;
+using System.IO;
+using System.IO.Compression;
+
+namespace HeuristicLab.Grid {
+  public partial class ClientForm : Form {
+
+    private ChannelFactory<IEngineStore> factory;
+    private System.Timers.Timer fetchOperationTimer;
+    private IEngineStore engineStore;
+
+    public ClientForm() {
+      InitializeComponent();
+      fetchOperationTimer = new System.Timers.Timer();
+      fetchOperationTimer.Interval = 200;
+      fetchOperationTimer.Elapsed += new System.Timers.ElapsedEventHandler(fetchOperationTimer_Elapsed);
+      statusTextBox.Text = "Stopped";
+    }
+
+    private void startButton_Click(object sender, EventArgs e) {
+      try {
+        NetTcpBinding binding = new NetTcpBinding();
+        binding.MaxReceivedMessageSize = 100000000; // 100Mbytes
+        binding.ReaderQuotas.MaxStringContentLength = 100000000; // also 100M chars
+        binding.ReaderQuotas.MaxArrayLength = 100000000; // also 100M elements;
+        factory = new ChannelFactory<IEngineStore>(binding);
+        engineStore = factory.CreateChannel(new EndpointAddress(addressTextBox.Text));
+
+        fetchOperationTimer.Start();
+        startButton.Enabled = false;
+        stopButton.Enabled = true;
+        statusTextBox.Text = "Waiting for engine";
+
+      } catch (Exception ex) {
+        MessageBox.Show("Exception while connecting to the server: " + ex.Message);
+        startButton.Enabled = true;
+        stopButton.Enabled = false;
+        fetchOperationTimer.Stop();
+      }
+    }
+
+    private void stopButton_Click(object sender, EventArgs e) {
+      fetchOperationTimer.Stop();
+      factory.Abort();
+      statusTextBox.Text = "Stopped";
+      stopButton.Enabled = false;
+      startButton.Enabled = true;
+    }
+
+    private void fetchOperationTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
+      byte[] engineXml;
+      Guid guid;
+      fetchOperationTimer.Stop();
+      if (engineStore.TryTakeEngine(out guid, out engineXml)) {
+        ProcessingEngine engine = RestoreEngine(engineXml);
+        if (InvokeRequired) { Invoke((MethodInvoker)delegate() { statusTextBox.Text = "Executing engine"; }); } else statusTextBox.Text = "Executing engine";
+        engine.Finished += delegate(object src, EventArgs args) {
+          byte[] resultScopeXml = SaveScope(engine.InitialOperation.Scope);
+          engineStore.StoreResult(guid, resultScopeXml);
+          fetchOperationTimer.Interval = 100;
+          fetchOperationTimer.Start();
+        };
+        engine.Execute();
+      } else {
+        if(InvokeRequired) { Invoke((MethodInvoker)delegate() { statusTextBox.Text = "Waiting for engine"; }); } else statusTextBox.Text = "Waiting for engine";
+        fetchOperationTimer.Interval = 5000;
+        fetchOperationTimer.Start();
+      }
+    }
+    private ProcessingEngine RestoreEngine(byte[] engine) {
+      GZipStream stream = new GZipStream(new MemoryStream(engine), CompressionMode.Decompress);
+      return (ProcessingEngine)PersistenceManager.Load(stream);
+    }
+    private byte[] SaveScope(IScope scope) {
+      MemoryStream memStream = new MemoryStream();
+      GZipStream stream = new GZipStream(memStream, CompressionMode.Compress, true);
+      PersistenceManager.Save(scope, stream);
+      stream.Close();
+      return memStream.ToArray();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/ClientForm.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ClientForm.designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ClientForm.designer.cs	(revision 2)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Grid {
+  partial class ClientForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.label1 = new System.Windows.Forms.Label();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.startButton = new System.Windows.Forms.Button();
+      this.addressTextBox = new System.Windows.Forms.TextBox();
+      this.statusLabel = new System.Windows.Forms.Label();
+      this.statusTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(9, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(81, 13);
+      this.label1.TabIndex = 7;
+      this.label1.Text = "&Server address:";
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Enabled = false;
+      this.stopButton.Location = new System.Drawing.Point(99, 74);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(75, 23);
+      this.stopButton.TabIndex = 6;
+      this.stopButton.Text = "St&op";
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Location = new System.Drawing.Point(15, 74);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(75, 23);
+      this.startButton.TabIndex = 5;
+      this.startButton.Text = "St&art";
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // addressTextBox
+      // 
+      this.addressTextBox.Location = new System.Drawing.Point(96, 6);
+      this.addressTextBox.Name = "addressTextBox";
+      this.addressTextBox.Size = new System.Drawing.Size(222, 20);
+      this.addressTextBox.TabIndex = 4;
+      // 
+      // statusLabel
+      // 
+      this.statusLabel.AutoSize = true;
+      this.statusLabel.Location = new System.Drawing.Point(9, 36);
+      this.statusLabel.Name = "statusLabel";
+      this.statusLabel.Size = new System.Drawing.Size(67, 13);
+      this.statusLabel.TabIndex = 8;
+      this.statusLabel.Text = "&Client status:";
+      // 
+      // statusTextBox
+      // 
+      this.statusTextBox.Location = new System.Drawing.Point(96, 33);
+      this.statusTextBox.Name = "statusTextBox";
+      this.statusTextBox.ReadOnly = true;
+      this.statusTextBox.Size = new System.Drawing.Size(222, 20);
+      this.statusTextBox.TabIndex = 9;
+      // 
+      // ClientForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(330, 109);
+      this.Controls.Add(this.statusTextBox);
+      this.Controls.Add(this.statusLabel);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.addressTextBox);
+      this.Name = "ClientForm";
+      this.Text = "Grid Client";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.TextBox addressTextBox;
+    private System.Windows.Forms.Label statusLabel;
+    private System.Windows.Forms.TextBox statusTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/ClientForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ClientForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ClientForm.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Grid/EngineStore.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/EngineStore.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/EngineStore.cs	(revision 2)
@@ -0,0 +1,145 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.ServiceModel;
+
+namespace HeuristicLab.Grid {
+  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=false)]
+  public class EngineStore : IEngineStore {
+    private Queue<Guid> engineQueue;
+    private Dictionary<Guid, byte[]> waitingEngines;
+    private Dictionary<Guid, byte[]> runningEngines;
+    private Dictionary<Guid, byte[]> results;
+    private object bigLock;
+
+    private event EventHandler ResultRecieved;
+
+    public int WaitingJobs {
+      get {
+        return waitingEngines.Count;
+      }
+    }
+
+    public int RunningJobs {
+      get {
+        return runningEngines.Count;
+      }
+    }
+
+    public int WaitingResults {
+      get {
+        return results.Count;
+      }
+    }
+
+    public EngineStore() {
+      engineQueue = new Queue<Guid>();
+      waitingEngines = new Dictionary<Guid, byte[]>();
+      runningEngines = new Dictionary<Guid, byte[]>();
+      results = new Dictionary<Guid, byte[]>();
+      bigLock = new object();
+    }
+
+    public bool TryTakeEngine(out Guid guid, out byte[] engine) {
+      lock (bigLock) {
+        if (engineQueue.Count == 0) {
+          guid = Guid.Empty;
+          engine = null;
+          return false;
+        } else {
+          guid = engineQueue.Dequeue();
+          engine = waitingEngines[guid];
+          waitingEngines.Remove(guid);
+          runningEngines[guid] = engine;
+          return true;
+        }
+      }
+    }
+
+    public void StoreResult(Guid guid, byte[] result) {
+      lock (bigLock) {
+        if (!runningEngines.ContainsKey(guid)) return; // ignore result when the engine is not known to be running
+
+        runningEngines.Remove(guid);
+        results[guid] = result;
+        OnResultRecieved(guid);
+      }
+    }
+
+    internal void AddEngine(Guid guid, byte[] engine) {
+      lock (bigLock) {
+        engineQueue.Enqueue(guid);
+        waitingEngines.Add(guid, engine);
+      }
+    }
+
+    internal byte[] RemoveResult(Guid guid) {
+      lock (bigLock) {
+        byte[] result = results[guid];
+        results.Remove(guid);
+        return result;
+      }
+    }
+
+    internal byte[] GetResult(Guid guid) {
+      ManualResetEvent waitHandle = new ManualResetEvent(false);
+      lock (bigLock) {
+        if (results.ContainsKey(guid)) {
+          byte[] result = results[guid];
+          results.Remove(guid);
+          return result;
+        } else {
+          ResultRecieved += delegate(object source, EventArgs args) {
+            ResultRecievedEventArgs resultArgs = (ResultRecievedEventArgs)args;
+            if (resultArgs.resultGuid == guid) {
+              waitHandle.Set();
+            }
+          };
+        }
+      }
+
+      waitHandle.WaitOne();
+      waitHandle.Close();
+
+      lock (bigLock) {
+        byte[] result = results[guid];
+        results.Remove(guid);
+        return result;
+      }
+    }
+
+    private void OnResultRecieved(Guid guid) {
+      ResultRecievedEventArgs args = new ResultRecievedEventArgs();
+      args.resultGuid = guid;
+      if (ResultRecieved != null) {
+        ResultRecieved(this, args);
+      }
+    }
+
+    private class ResultRecievedEventArgs : EventArgs {
+      public Guid resultGuid;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/GridClientApplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/GridClientApplication.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/GridClientApplication.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Grid {
+  [ClassInfo(Name = "Grid Client", Description="Client application for the distributed engine grid.")]
+  class GridClientApplication : ApplicationBase {
+    public override void Run() {
+      Form mainForm = new ClientForm();
+      Application.Run(mainForm);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/GridServer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/GridServer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/GridServer.cs	(revision 2)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ServiceModel;
+
+namespace HeuristicLab.Grid {
+  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=false)]
+  public class GridServer : IGridServer {
+
+    private EngineStore engineStore;
+
+    public GridServer(EngineStore engineStore) {
+      this.engineStore = engineStore;
+    }
+
+    public Guid BeginExecuteEngine(byte[] engine) {
+      Guid guid = Guid.NewGuid();
+      engineStore.AddEngine(guid, engine);
+      return guid;
+    }
+
+    public byte[] EndExecuteEngine(Guid guid) {
+      return engineStore.GetResult(guid);
+    }
+
+    public void AbortEngine(Guid engine) {
+      throw new NotImplementedException();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/GridServerApplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/GridServerApplication.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/GridServerApplication.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Grid {
+  [ClassInfo(Name = "Grid Server", Description="Server application for the distributed engine grid.")]
+  class GridServerApplication : ApplicationBase {
+    public override void Run() {
+      Form mainForm = new ServerForm();
+      Application.Run(mainForm);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/HeuristicLab.Grid.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Grid/HeuristicLab.Grid.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/HeuristicLab.Grid.csproj	(revision 2)
@@ -0,0 +1,107 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{545CE756-98D8-423B-AC2E-6E7D70926E5C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Grid</RootNamespace>
+    <AssemblyName>HeuristicLab.Grid</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.ServiceModel">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ClientForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ClientForm.designer.cs">
+      <DependentUpon>ClientForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EngineStore.cs" />
+    <Compile Include="GridClientApplication.cs" />
+    <Compile Include="GridServer.cs" />
+    <Compile Include="GridServerApplication.cs" />
+    <Compile Include="HeuristicLabGridPlugin.cs" />
+    <Compile Include="IEngineStore.cs" />
+    <Compile Include="IGridServer.cs" />
+    <Compile Include="ProcessingEngine.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ServerForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ServerForm.designer.cs">
+      <DependentUpon>ServerForm.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.ThreadParallelEngine\HeuristicLab.ThreadParallelEngine.csproj">
+      <Project>{6E757D0E-20F9-4E89-AF06-D7DA256870DB}</Project>
+      <Name>HeuristicLab.ThreadParallelEngine</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ClientForm.resx">
+      <DependentUpon>ClientForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ServerForm.resx">
+      <DependentUpon>ServerForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Grid/HeuristicLabGridPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/HeuristicLabGridPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/HeuristicLabGridPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Grid {
+  [ClassInfo(Name = "HeuristicLab.Grid")]
+  [PluginFile(Filename = "HeuristicLab.Grid.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.ThreadParallelEngine")]
+  public class HeuristicLabGridPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/IEngineStore.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/IEngineStore.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/IEngineStore.cs	(revision 2)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ServiceModel;
+
+namespace HeuristicLab.Grid {
+
+  [ServiceContract(Namespace = "http://HeuristicLab.Grid")]
+  interface IEngineStore {
+
+    [OperationContract]
+    bool TryTakeEngine(out Guid guid, out byte[] engine);
+
+    [OperationContract]
+    void StoreResult(Guid guid, byte[] result);
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/IGridServer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/IGridServer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/IGridServer.cs	(revision 2)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+using System.Text;
+
+namespace HeuristicLab.Grid {
+  [ServiceContract(Namespace = "http://HeuristicLab.Grid")]
+  public interface IGridServer {
+    [OperationContract]
+    Guid BeginExecuteEngine(byte[] engine);
+    
+    [OperationContract]
+    byte[] EndExecuteEngine(Guid engineGuid);
+
+    [OperationContract]
+    void AbortEngine(Guid engineGuid);
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/ProcessingEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ProcessingEngine.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ProcessingEngine.cs	(revision 2)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using System.Xml;
+
+namespace HeuristicLab.Grid {
+  public class ProcessingEngine : ThreadParallelEngine.ThreadParallelEngine {
+
+    private AtomicOperation initialOperation;
+    public AtomicOperation InitialOperation {
+      get { return initialOperation; }
+    }
+
+    public ProcessingEngine()
+      : base() {
+    }
+
+    public ProcessingEngine(IOperatorGraph graph, IScope globalScope, AtomicOperation initialOperation)
+      : base() {
+      this.initialOperation = initialOperation;
+      myGlobalScope = globalScope;
+      myOperatorGraph = graph;
+      myExecutionStack.Push(initialOperation);
+    }
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("InitialOperation", initialOperation, document, persistedObjects));
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      initialOperation = (AtomicOperation)PersistenceManager.Restore(node.SelectSingleNode("InitialOperation"), restoredObjects);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Grid")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("FH Hagenberg ")]
+[assembly: AssemblyProduct("HeuristicLab.Grid")]
+[assembly: AssemblyCopyright("Copyright Â© FH Hagenberg  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("390a4020-8f30-4c57-b039-6f3647df86b0")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /trunk/sources/HeuristicLab.Grid/ServerForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ServerForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ServerForm.cs	(revision 2)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.ServiceModel;
+using System.ServiceModel.Description;
+using HeuristicLab.PluginInfrastructure;
+using System.Net;
+
+namespace HeuristicLab.Grid {
+  public partial class ServerForm : Form {
+
+    private EngineStore jobStore;
+    private GridServer server;
+    private ServiceHost externalHost;
+    private ServiceHost internalHost;
+
+    public ServerForm() {
+      InitializeComponent();
+      externalAddressTextBox.Text = "net.tcp://"+Dns.GetHostAddresses(Dns.GetHostName())[0]+":8000/Grid/Service";
+      internalAddressTextBox.Text = "net.tcp://" + Dns.GetHostAddresses(Dns.GetHostName())[0] + ":8001/Grid/JobStore";
+      jobStore = new EngineStore();
+      server = new GridServer(jobStore);
+      
+    }
+
+    private void startButton_Click(object sender, EventArgs e) {
+      externalHost = new ServiceHost(server, new Uri(externalAddressTextBox.Text));
+      internalHost = new ServiceHost(jobStore, new Uri(internalAddressTextBox.Text));
+      try {
+        NetTcpBinding binding = new NetTcpBinding();
+        binding.MaxReceivedMessageSize = 100000000; // 100Mbytes
+        binding.ReaderQuotas.MaxStringContentLength = 100000000; // also 100M chars
+        binding.ReaderQuotas.MaxArrayLength = 100000000; // also 100M elements;
+
+        externalHost.AddServiceEndpoint(typeof(IGridServer), binding, externalAddressTextBox.Text);
+        externalHost.Open();
+
+        internalHost.AddServiceEndpoint(typeof(IEngineStore), binding, internalAddressTextBox.Text);
+        internalHost.Open();
+
+        startButton.Enabled = false;
+        stopButton.Enabled = true;
+      } catch (CommunicationException ex) {
+        MessageBox.Show("An exception occurred: " + ex.Message);
+        externalHost.Abort();
+        internalHost.Abort();
+      }
+    }
+
+    private void stopButton_Click(object sender, EventArgs e) {
+      externalHost.Close();
+      internalHost.Close();
+      stopButton.Enabled = false;
+      startButton.Enabled = true;
+    }
+
+    private void statusUpdateTimer_Tick(object sender, EventArgs e) {
+      waitingJobsTextBox.Text = jobStore.WaitingJobs+"";
+      waitingResultsTextBox.Text = jobStore.WaitingResults+"";
+      runningJobsTextBox.Text = jobStore.RunningJobs+"";
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/ServerForm.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ServerForm.designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ServerForm.designer.cs	(revision 2)
@@ -0,0 +1,223 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Grid {
+  partial class ServerForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.externalAddressTextBox = new System.Windows.Forms.TextBox();
+      this.startButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.externalAddressLabel = new System.Windows.Forms.Label();
+      this.internalAddressLabel = new System.Windows.Forms.Label();
+      this.internalAddressTextBox = new System.Windows.Forms.TextBox();
+      this.runningJobsLabel = new System.Windows.Forms.Label();
+      this.runningJobsTextBox = new System.Windows.Forms.TextBox();
+      this.waitingJobsLabel = new System.Windows.Forms.Label();
+      this.waitingJobsTextBox = new System.Windows.Forms.TextBox();
+      this.waitingResultsLabel = new System.Windows.Forms.Label();
+      this.waitingResultsTextBox = new System.Windows.Forms.TextBox();
+      this.statusUpdateTimer = new System.Windows.Forms.Timer(this.components);
+      this.SuspendLayout();
+      // 
+      // externalAddressTextBox
+      // 
+      this.externalAddressTextBox.Location = new System.Drawing.Point(106, 6);
+      this.externalAddressTextBox.Name = "externalAddressTextBox";
+      this.externalAddressTextBox.ReadOnly = true;
+      this.externalAddressTextBox.Size = new System.Drawing.Size(229, 20);
+      this.externalAddressTextBox.TabIndex = 0;
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Location = new System.Drawing.Point(12, 160);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(75, 23);
+      this.startButton.TabIndex = 1;
+      this.startButton.Text = "St&art";
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Enabled = false;
+      this.stopButton.Location = new System.Drawing.Point(99, 160);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(75, 23);
+      this.stopButton.TabIndex = 2;
+      this.stopButton.Text = "St&op";
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // externalAddressLabel
+      // 
+      this.externalAddressLabel.AutoSize = true;
+      this.externalAddressLabel.Location = new System.Drawing.Point(12, 9);
+      this.externalAddressLabel.Name = "externalAddressLabel";
+      this.externalAddressLabel.Size = new System.Drawing.Size(88, 13);
+      this.externalAddressLabel.TabIndex = 3;
+      this.externalAddressLabel.Text = "&External address:";
+      // 
+      // internalAddressLabel
+      // 
+      this.internalAddressLabel.AutoSize = true;
+      this.internalAddressLabel.Location = new System.Drawing.Point(12, 34);
+      this.internalAddressLabel.Name = "internalAddressLabel";
+      this.internalAddressLabel.Size = new System.Drawing.Size(85, 13);
+      this.internalAddressLabel.TabIndex = 5;
+      this.internalAddressLabel.Text = "&Internal address:";
+      // 
+      // internalAddressTextBox
+      // 
+      this.internalAddressTextBox.Location = new System.Drawing.Point(106, 31);
+      this.internalAddressTextBox.Name = "internalAddressTextBox";
+      this.internalAddressTextBox.ReadOnly = true;
+      this.internalAddressTextBox.Size = new System.Drawing.Size(229, 20);
+      this.internalAddressTextBox.TabIndex = 4;
+      // 
+      // runningJobsLabel
+      // 
+      this.runningJobsLabel.AutoSize = true;
+      this.runningJobsLabel.Location = new System.Drawing.Point(12, 99);
+      this.runningJobsLabel.Name = "runningJobsLabel";
+      this.runningJobsLabel.Size = new System.Drawing.Size(72, 13);
+      this.runningJobsLabel.TabIndex = 9;
+      this.runningJobsLabel.Text = "&Running jobs:";
+      // 
+      // runningJobsTextBox
+      // 
+      this.runningJobsTextBox.Location = new System.Drawing.Point(106, 96);
+      this.runningJobsTextBox.Name = "runningJobsTextBox";
+      this.runningJobsTextBox.ReadOnly = true;
+      this.runningJobsTextBox.Size = new System.Drawing.Size(90, 20);
+      this.runningJobsTextBox.TabIndex = 8;
+      this.runningJobsTextBox.Text = "0";
+      this.runningJobsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // waitingJobsLabel
+      // 
+      this.waitingJobsLabel.AutoSize = true;
+      this.waitingJobsLabel.Location = new System.Drawing.Point(12, 74);
+      this.waitingJobsLabel.Name = "waitingJobsLabel";
+      this.waitingJobsLabel.Size = new System.Drawing.Size(68, 13);
+      this.waitingJobsLabel.TabIndex = 7;
+      this.waitingJobsLabel.Text = "&Waiting jobs:";
+      // 
+      // waitingJobsTextBox
+      // 
+      this.waitingJobsTextBox.Location = new System.Drawing.Point(106, 71);
+      this.waitingJobsTextBox.Name = "waitingJobsTextBox";
+      this.waitingJobsTextBox.ReadOnly = true;
+      this.waitingJobsTextBox.Size = new System.Drawing.Size(90, 20);
+      this.waitingJobsTextBox.TabIndex = 6;
+      this.waitingJobsTextBox.Text = "0";
+      this.waitingJobsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // waitingResultsLabel
+      // 
+      this.waitingResultsLabel.AutoSize = true;
+      this.waitingResultsLabel.Location = new System.Drawing.Point(12, 125);
+      this.waitingResultsLabel.Name = "waitingResultsLabel";
+      this.waitingResultsLabel.Size = new System.Drawing.Size(79, 13);
+      this.waitingResultsLabel.TabIndex = 11;
+      this.waitingResultsLabel.Text = "&Waiting results:";
+      // 
+      // waitingResultsTextBox
+      // 
+      this.waitingResultsTextBox.Location = new System.Drawing.Point(106, 122);
+      this.waitingResultsTextBox.Name = "waitingResultsTextBox";
+      this.waitingResultsTextBox.ReadOnly = true;
+      this.waitingResultsTextBox.Size = new System.Drawing.Size(90, 20);
+      this.waitingResultsTextBox.TabIndex = 10;
+      this.waitingResultsTextBox.Text = "0";
+      this.waitingResultsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // statusUpdateTimer
+      // 
+      this.statusUpdateTimer.Enabled = true;
+      this.statusUpdateTimer.Interval = 1000;
+      this.statusUpdateTimer.Tick += new System.EventHandler(this.statusUpdateTimer_Tick);
+      // 
+      // ServerForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(347, 195);
+      this.Controls.Add(this.waitingResultsLabel);
+      this.Controls.Add(this.waitingResultsTextBox);
+      this.Controls.Add(this.runningJobsLabel);
+      this.Controls.Add(this.runningJobsTextBox);
+      this.Controls.Add(this.waitingJobsLabel);
+      this.Controls.Add(this.waitingJobsTextBox);
+      this.Controls.Add(this.internalAddressLabel);
+      this.Controls.Add(this.internalAddressTextBox);
+      this.Controls.Add(this.externalAddressLabel);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.externalAddressTextBox);
+      this.Name = "ServerForm";
+      this.Text = "Grid Server";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox externalAddressTextBox;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Label externalAddressLabel;
+    private System.Windows.Forms.Label internalAddressLabel;
+    private System.Windows.Forms.TextBox internalAddressTextBox;
+    private System.Windows.Forms.Label runningJobsLabel;
+    private System.Windows.Forms.TextBox runningJobsTextBox;
+    private System.Windows.Forms.Label waitingJobsLabel;
+    private System.Windows.Forms.TextBox waitingJobsTextBox;
+    private System.Windows.Forms.Label waitingResultsLabel;
+    private System.Windows.Forms.TextBox waitingResultsTextBox;
+    private System.Windows.Forms.Timer statusUpdateTimer;
+  }
+}
Index: /trunk/sources/HeuristicLab.Grid/ServerForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.Grid/ServerForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Grid/ServerForm.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="statusUpdateTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Logging/BestAverageWorstQualityCalculator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/BestAverageWorstQualityCalculator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/BestAverageWorstQualityCalculator.cs	(revision 2)
@@ -0,0 +1,85 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  public class BestAverageWorstQualityCalculator : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public BestAverageWorstQualityCalculator()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BestQuality", "Quality value of best solution", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("AverageQuality", "Average quality value", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("WorstQuality", "Quality value of worst solution", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      double[] qualities = new double[scope.SubScopes.Count];
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        qualities[i] = scope.SubScopes[i].GetVariableValue<DoubleData>(GetVariableInfo("Quality").ActualName, false).Data;
+
+      double worst = qualities[0];
+      double best = qualities[0];
+      double average = qualities[0];
+      for (int i = 1; i < qualities.Length; i++) {
+        if (qualities[i] < worst) worst = qualities[i];
+        if (qualities[i] > best) best = qualities[i];
+        average += qualities[i];
+      }
+      average = average / qualities.Length;
+
+      if (!GetVariableValue<BoolData>("Maximization", scope, true).Data) {
+        double temp = worst;
+        worst = best;
+        best = temp;
+      }
+
+      SetValue(GetVariableInfo("BestQuality"), best, scope);
+      SetValue(GetVariableInfo("AverageQuality"), average, scope);
+      SetValue(GetVariableInfo("WorstQuality"), worst, scope);
+
+      return null;
+    }
+
+    private void SetValue(IVariableInfo info, double value, IScope scope) {
+      DoubleData data = GetVariableValue<DoubleData>(info.FormalName, scope, false, false);
+      if (data == null) {
+        data = new DoubleData();
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, data));
+        else
+          scope.AddVariable(new Variable(info.ActualName, data));
+      }
+      data.Data = value;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/HeuristicLab.Logging.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Logging/HeuristicLab.Logging.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/HeuristicLab.Logging.csproj	(revision 2)
@@ -0,0 +1,114 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Logging</RootNamespace>
+    <AssemblyName>HeuristicLab.Logging</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Logging.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BestAverageWorstQualityCalculator.cs" />
+    <Compile Include="Linechart.cs" />
+    <Compile Include="HeuristicLabLoggingPlugin.cs" />
+    <Compile Include="LinechartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LinechartView.Designer.cs">
+      <DependentUpon>LinechartView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LogView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LogView.Designer.cs">
+      <DependentUpon>LogView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="QualityLogger.cs" />
+    <Compile Include="Log.cs" />
+    <Compile Include="LinechartInjector.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Charting.Data\HeuristicLab.Charting.Data.csproj">
+      <Project>{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}</Project>
+      <Name>HeuristicLab.Charting.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Charting\HeuristicLab.Charting.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="LinechartView.resx">
+      <DependentUpon>LinechartView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LogView.resx">
+      <DependentUpon>LogView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Logging/HeuristicLabLoggingPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/HeuristicLabLoggingPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/HeuristicLabLoggingPlugin.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Logging {
+  [ClassInfo(Name = "HeuristicLab.Logging")]
+  [PluginFile(Filename = "HeuristicLab.Logging.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  [Dependency(Dependency = "HeuristicLab.Charting")]
+  [Dependency(Dependency = "HeuristicLab.Charting.Data")]
+  public class HeuristicLabLoggingPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/Linechart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/Linechart.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/Linechart.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  public class Linechart : ItemBase, IVisualizationItem {
+    private IntData myNumberOfLines;
+    public int NumberOfLines {
+      get { return myNumberOfLines.Data; }
+      set {
+        if (value != myNumberOfLines.Data) {
+          myNumberOfLines.Data = value;
+          OnNumberOfLinesChanged();
+        }
+      }
+    }
+    private ItemList myValues;
+    public ItemList Values {
+      get { return myValues; }
+      set {
+        if (value != myValues) {
+          myValues = value;
+          OnValuesChanged();
+        }
+      }
+    }
+
+
+    public Linechart() {
+      myNumberOfLines = new IntData(0);
+    }
+    public Linechart(int numberOfLines, ItemList values) {
+      myNumberOfLines = new IntData(numberOfLines);
+      myValues = values;
+    }
+
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Linechart clone = (Linechart)base.Clone(clonedObjects);
+      clone.myNumberOfLines = (IntData)Auxiliary.Clone(myNumberOfLines, clonedObjects);
+      clone.myValues = (ItemList)Auxiliary.Clone(Values, clonedObjects);
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new LinechartView(this);
+    }
+
+    public event EventHandler NumberOfLinesChanged;
+    protected virtual void OnNumberOfLinesChanged() {
+      if (NumberOfLinesChanged != null)
+        NumberOfLinesChanged(this, new EventArgs());
+    }
+    public event EventHandler ValuesChanged;
+    protected virtual void OnValuesChanged() {
+      if (ValuesChanged != null)
+        ValuesChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("NumberOfLines", myNumberOfLines, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Values", Values, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myNumberOfLines = (IntData)PersistenceManager.Restore(node.SelectSingleNode("NumberOfLines"), restoredObjects);
+      myValues = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Values"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LinechartInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LinechartInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LinechartInjector.cs	(revision 2)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  public class LinechartInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public LinechartInjector() {
+      VariableInfo numberOfLinesInfo = new VariableInfo("NumberOfLines", "Number of lines the linechart consists of", typeof(IntData), VariableKind.In);
+      numberOfLinesInfo.Local = true;
+      AddVariableInfo(numberOfLinesInfo);
+      AddVariable(new Variable("NumberOfLines", new IntData(1)));
+      AddVariableInfo(new VariableInfo("Values", "Item list holding the values of the linechart", typeof(ItemList), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Linechart", "Object representing a linechart", typeof(Linechart), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int numberOfLines = GetVariableValue<IntData>("NumberOfLines", scope, true).Data;
+      ItemList values = GetVariableValue<ItemList>("Values", scope, true);
+      Linechart linechart = GetVariableValue<Linechart>("Linechart", scope, false, false);
+      if (linechart == null) {
+        linechart = new Linechart(numberOfLines, values);
+        IVariableInfo info = GetVariableInfo("Linechart");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, linechart));
+        else
+          scope.AddVariable(new Variable(info.ActualName, linechart));
+      } else
+        linechart.Values = values;
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LinechartView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LinechartView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LinechartView.Designer.cs	(revision 2)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Logging {
+  partial class LinechartView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataChartControl = new HeuristicLab.Charting.Data.DataChartControl();
+      this.SuspendLayout();
+      // 
+      // dataChartControl
+      // 
+      this.dataChartControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataChartControl.BackColor = System.Drawing.SystemColors.Control;
+      this.dataChartControl.Chart = null;
+      this.dataChartControl.Location = new System.Drawing.Point(0, 0);
+      this.dataChartControl.Name = "dataChartControl";
+      this.dataChartControl.ScaleOnResize = true;
+      this.dataChartControl.Size = new System.Drawing.Size(160, 147);
+      this.dataChartControl.TabIndex = 0;
+      // 
+      // LinechartScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataChartControl);
+      this.Name = "LinechartScopeView";
+      this.Size = new System.Drawing.Size(160, 147);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Charting.Data.DataChartControl dataChartControl;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LinechartView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LinechartView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LinechartView.cs	(revision 2)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Charting;
+using HeuristicLab.Charting.Data;
+
+namespace HeuristicLab.Logging {
+  public partial class LinechartView : ViewBase {
+    public Linechart Linechart {
+      get { return (Linechart)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public LinechartView() {
+      InitializeComponent();
+      Caption = "Linechart View";
+    }
+    public LinechartView(Linechart linechart)
+      : this() {
+      Linechart = linechart;
+    }
+
+    protected override void RemoveItemEvents() {
+      if (Linechart != null) {
+        Linechart.Values.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Values_ItemAdded);
+        Linechart.Values.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Values_ItemRemoved);
+      }
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      if (Linechart != null) {
+        Linechart.Values.ItemAdded += new EventHandler<ItemIndexEventArgs>(Values_ItemAdded);
+        Linechart.Values.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Values_ItemRemoved);
+      }
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      Datachart datachart = new Datachart(-50, -5000, 1000, 55000);
+      datachart.Title = "Line Chart";
+      dataChartControl.ScaleOnResize = false;
+      dataChartControl.Chart = datachart;
+      datachart.Group.Clear();
+      datachart.Group.Add(new Axis(datachart, 0, 0, AxisType.Both));
+      if (Linechart != null) {
+        datachart.UpdateEnabled = false;
+        for (int i = 0; i < Linechart.NumberOfLines; i++)
+          datachart.AddDataRow(DataRowType.Lines, Pens.Black, Brushes.Blue);
+
+        for (int i = 0; i < Linechart.Values.Count; i++) {
+          ItemList list = (ItemList)Linechart.Values[i];
+          for (int j = 0; j < list.Count; j++)
+            datachart.AddDataPoint(j, i, ((DoubleData)list[j]).Data);
+        }
+        datachart.UpdateEnabled = true;
+        datachart.EnforceUpdate();
+      }
+    }
+
+    #region Values Events
+    private delegate void ItemIndexDelegate(object sender, ItemIndexEventArgs e);
+    private void Values_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new ItemIndexDelegate(Values_ItemRemoved), sender, e);
+      } else {
+        Datachart datachart = dataChartControl.Chart;
+      }
+    }
+    private void Values_ItemAdded(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new ItemIndexDelegate(Values_ItemAdded), sender, e);
+      } else {
+        Datachart datachart = dataChartControl.Chart;
+        ItemList list = (ItemList)e.Item;
+        datachart.UpdateEnabled = false;
+        for (int i = 0; i < list.Count; i++)
+          datachart.AddDataPoint(i, e.Index, ((DoubleData)list[i]).Data);
+        datachart.UpdateEnabled = true;
+        datachart.EnforceUpdate();
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LinechartView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LinechartView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LinechartView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Logging/Log.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/Log.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/Log.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  public class Log : ItemBase, IVisualizationItem {
+    private ItemList myItems;
+    public ItemList Items {
+      get { return myItems; }
+      set { myItems = value; }
+    }
+
+
+    public Log() { }
+    public Log(ItemList items) {
+      myItems = items;
+    }
+
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Log clone = (Log)base.Clone(clonedObjects);
+      clone.myItems = (ItemList)Auxiliary.Clone(Items, clonedObjects);
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new LogView(this);
+    }
+
+    public event EventHandler ItemsChanged;
+    protected virtual void OnItemsChanged() {
+      if (ItemsChanged != null)
+        ItemsChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Items", Items, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myItems = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Items"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LogView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LogView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LogView.Designer.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Logging {
+  partial class LogView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.qualityLogTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // qualityLogTextBox
+      // 
+      this.qualityLogTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.qualityLogTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.qualityLogTextBox.Location = new System.Drawing.Point(0, 0);
+      this.qualityLogTextBox.Multiline = true;
+      this.qualityLogTextBox.Name = "qualityLogTextBox";
+      this.qualityLogTextBox.ReadOnly = true;
+      this.qualityLogTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.qualityLogTextBox.Size = new System.Drawing.Size(150, 150);
+      this.qualityLogTextBox.TabIndex = 0;
+      // 
+      // QualityLogDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.qualityLogTextBox);
+      this.Name = "QualityLogDataView";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox qualityLogTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LogView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LogView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LogView.cs	(revision 2)
@@ -0,0 +1,115 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  public partial class LogView : ViewBase {
+    public Log Log {
+      get { return (Log)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public LogView() {
+      InitializeComponent();
+      Caption = "Log View";
+    }
+    public LogView(Log log)
+      : this() {
+      Log = log;
+    }
+
+    protected override void RemoveItemEvents() {
+      if (Log != null) {
+        Log.Items.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Items_ItemAdded);
+        Log.Items.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Items_ItemRemoved);
+      }
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      if (Log != null) {
+        Log.Items.ItemAdded += new EventHandler<ItemIndexEventArgs>(Items_ItemAdded);
+        Log.Items.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Items_ItemRemoved);
+      }
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      qualityLogTextBox.Clear();
+      if (Log == null) {
+        qualityLogTextBox.Enabled = false;
+      } else {
+        string[] lines = new string[Log.Items.Count];
+        for (int i = 0; i < Log.Items.Count; i++) {
+          double[] values = ((DoubleArrayData)Log.Items[i]).Data;
+          lines[i] = values[0].ToString() + "     " +
+                     values[1].ToString() + "     " +
+                     values[2].ToString();
+        }
+        qualityLogTextBox.Lines = lines;
+        qualityLogTextBox.Enabled = true;
+      }
+    }
+
+    #region ItemList Events
+    private delegate void IndexDelegate(int index);
+    private void Items_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      RemoveItem(e.Index);
+    }
+    private void RemoveItem(int index) {
+      if (InvokeRequired)
+        Invoke(new IndexDelegate(RemoveItem), index);
+      else {
+        string[] lines = new string[qualityLogTextBox.Lines.Length - 1];
+        Array.Copy(qualityLogTextBox.Lines, 0, lines, 0, index);
+        Array.Copy(qualityLogTextBox.Lines, index + 1, lines, index, lines.Length - index);
+        qualityLogTextBox.Lines = lines;
+      }
+    }
+    private void Items_ItemAdded(object sender, ItemIndexEventArgs e) {
+      AddItem(e.Index);
+    }
+    private void AddItem(int index) {
+      if (InvokeRequired)
+        Invoke(new IndexDelegate(AddItem), index);
+      else {
+        string[] lines = new string[qualityLogTextBox.Lines.Length + 1];
+        Array.Copy(qualityLogTextBox.Lines, 0, lines, 0, index);
+        Array.Copy(qualityLogTextBox.Lines, index, lines, index + 1, qualityLogTextBox.Lines.Length - index);
+        double[] values = ((DoubleArrayData)Log.Items[index]).Data;
+        lines[index] = values[0].ToString() + "     " +
+                       values[1].ToString() + "     " +
+                       values[2].ToString();
+        qualityLogTextBox.Lines = lines;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/LogView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Logging/LogView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/LogView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Logging/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Logging")]
+[assembly: AssemblyDescription("HeuristicLab logging classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f9718239-4d37-4410-84d7-9c3468b01cbf")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Logging/QualityLogger.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/QualityLogger.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Logging/QualityLogger.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  public class QualityLogger : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public QualityLogger()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("QualityLog", "Log of best, average and worst quality values", typeof(Log), VariableKind.In | VariableKind.Out | VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      double[] qualities = new double[scope.SubScopes.Count];
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        qualities[i] = scope.SubScopes[i].GetVariableValue<DoubleData>(GetVariableInfo("Quality").ActualName, false).Data;
+
+      double min = qualities[0];
+      double max = qualities[0];
+      double average = qualities[0];
+      for (int i = 1; i < qualities.Length; i++) {
+        if (qualities[i] < min) min = qualities[i];
+        if (qualities[i] > max) max = qualities[i];
+        average += qualities[i];
+      }
+      average = average / qualities.Length;
+
+      Log log = GetVariableValue<Log>("QualityLog", scope, false, false);
+      if (log == null) {
+        log = new Log(new ItemList());
+        IVariableInfo info = GetVariableInfo("QualityLog");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, log));
+        else
+          scope.AddVariable(new Variable(info.ActualName, log));
+      }
+      log.Items.Add(new DoubleArrayData(new double[] { min, average, max } ));
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.Designer.cs	(revision 2)
@@ -0,0 +1,265 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Operators.Programmable {
+  partial class AddVariableInfoDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.formalNameLabel = new System.Windows.Forms.Label();
+      this.formalNameTextBox = new System.Windows.Forms.TextBox();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.kindLabel = new System.Windows.Forms.Label();
+      this.kindNewCheckBox = new System.Windows.Forms.CheckBox();
+      this.kindInCheckBox = new System.Windows.Forms.CheckBox();
+      this.kindOutCheckBox = new System.Windows.Forms.CheckBox();
+      this.kindDeletedCheckBox = new System.Windows.Forms.CheckBox();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.setDataTypeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(311, 210);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 13;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(230, 210);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 12;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // formalNameLabel
+      // 
+      this.formalNameLabel.AutoSize = true;
+      this.formalNameLabel.Location = new System.Drawing.Point(12, 9);
+      this.formalNameLabel.Name = "formalNameLabel";
+      this.formalNameLabel.Size = new System.Drawing.Size(72, 13);
+      this.formalNameLabel.TabIndex = 0;
+      this.formalNameLabel.Text = "&Formal Name:";
+      // 
+      // formalNameTextBox
+      // 
+      this.formalNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.formalNameTextBox.Location = new System.Drawing.Point(90, 6);
+      this.formalNameTextBox.Name = "formalNameTextBox";
+      this.formalNameTextBox.Size = new System.Drawing.Size(296, 20);
+      this.formalNameTextBox.TabIndex = 1;
+      this.formalNameTextBox.Text = "Name";
+      this.formalNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.formalNameTextBox_Validating);
+      // 
+      // descriptionLabel
+      // 
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(12, 35);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 2;
+      this.descriptionLabel.Text = "&Description:";
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(90, 32);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(296, 123);
+      this.descriptionTextBox.TabIndex = 3;
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(12, 164);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 4;
+      this.dataTypeLabel.Text = "Data &Type:";
+      // 
+      // kindLabel
+      // 
+      this.kindLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindLabel.AutoSize = true;
+      this.kindLabel.Location = new System.Drawing.Point(12, 188);
+      this.kindLabel.Name = "kindLabel";
+      this.kindLabel.Size = new System.Drawing.Size(72, 13);
+      this.kindLabel.TabIndex = 7;
+      this.kindLabel.Text = "Variable &Kind:";
+      // 
+      // kindNewCheckBox
+      // 
+      this.kindNewCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindNewCheckBox.AutoSize = true;
+      this.kindNewCheckBox.Location = new System.Drawing.Point(90, 187);
+      this.kindNewCheckBox.Name = "kindNewCheckBox";
+      this.kindNewCheckBox.Size = new System.Drawing.Size(48, 17);
+      this.kindNewCheckBox.TabIndex = 8;
+      this.kindNewCheckBox.Text = "&New";
+      this.kindNewCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // kindInCheckBox
+      // 
+      this.kindInCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindInCheckBox.AutoSize = true;
+      this.kindInCheckBox.Checked = true;
+      this.kindInCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.kindInCheckBox.Location = new System.Drawing.Point(144, 187);
+      this.kindInCheckBox.Name = "kindInCheckBox";
+      this.kindInCheckBox.Size = new System.Drawing.Size(35, 17);
+      this.kindInCheckBox.TabIndex = 9;
+      this.kindInCheckBox.Text = "&In";
+      this.kindInCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // kindOutCheckBox
+      // 
+      this.kindOutCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindOutCheckBox.AutoSize = true;
+      this.kindOutCheckBox.Location = new System.Drawing.Point(185, 187);
+      this.kindOutCheckBox.Name = "kindOutCheckBox";
+      this.kindOutCheckBox.Size = new System.Drawing.Size(43, 17);
+      this.kindOutCheckBox.TabIndex = 10;
+      this.kindOutCheckBox.Text = "&Out";
+      this.kindOutCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // kindDeletedCheckBox
+      // 
+      this.kindDeletedCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindDeletedCheckBox.AutoSize = true;
+      this.kindDeletedCheckBox.Location = new System.Drawing.Point(234, 187);
+      this.kindDeletedCheckBox.Name = "kindDeletedCheckBox";
+      this.kindDeletedCheckBox.Size = new System.Drawing.Size(63, 17);
+      this.kindDeletedCheckBox.TabIndex = 11;
+      this.kindDeletedCheckBox.Text = "&Deleted";
+      this.kindDeletedCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(90, 161);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(247, 20);
+      this.dataTypeTextBox.TabIndex = 6;
+      this.dataTypeTextBox.Text = "HeuristicLab.Data.BoolData";
+      // 
+      // setDataTypeButton
+      // 
+      this.setDataTypeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.setDataTypeButton.Location = new System.Drawing.Point(343, 161);
+      this.setDataTypeButton.Name = "setDataTypeButton";
+      this.setDataTypeButton.Size = new System.Drawing.Size(43, 20);
+      this.setDataTypeButton.TabIndex = 5;
+      this.setDataTypeButton.Text = "&Set...";
+      this.setDataTypeButton.UseVisualStyleBackColor = true;
+      this.setDataTypeButton.Click += new System.EventHandler(this.setDataTypeButton_Click);
+      // 
+      // AddVariableInfoDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(398, 245);
+      this.Controls.Add(this.setDataTypeButton);
+      this.Controls.Add(this.kindDeletedCheckBox);
+      this.Controls.Add(this.kindOutCheckBox);
+      this.Controls.Add(this.kindInCheckBox);
+      this.Controls.Add(this.kindNewCheckBox);
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.formalNameTextBox);
+      this.Controls.Add(this.kindLabel);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.formalNameLabel);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "AddVariableInfoDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Add Variable Info";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Label formalNameLabel;
+    private System.Windows.Forms.TextBox formalNameTextBox;
+    private System.Windows.Forms.Label descriptionLabel;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.Label kindLabel;
+    private System.Windows.Forms.CheckBox kindNewCheckBox;
+    private System.Windows.Forms.CheckBox kindInCheckBox;
+    private System.Windows.Forms.CheckBox kindOutCheckBox;
+    private System.Windows.Forms.CheckBox kindDeletedCheckBox;
+    private System.Windows.Forms.TextBox dataTypeTextBox;
+    private System.Windows.Forms.Button setDataTypeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.cs	(revision 2)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators.Programmable {
+  public partial class AddVariableInfoDialog : Form {
+    private IVariableInfo myVariableInfo;
+    public IVariableInfo VariableInfo {
+      get { return myVariableInfo; }
+    }
+
+    public AddVariableInfoDialog() {
+      InitializeComponent();
+      dataTypeTextBox.Text = typeof(BoolData).FullName;
+      dataTypeTextBox.Tag = typeof(BoolData);
+    }
+
+    private void formalNameTextBox_Validating(object sender, CancelEventArgs e) {
+      if (formalNameTextBox.Text == "")
+        e.Cancel = true;
+    }
+
+    private void setDataTypeButton_Click(object sender, EventArgs e) {
+      ChooseTypeDialog dialog = new ChooseTypeDialog();
+      dialog.Caption = "Set Data Type";
+      if (dialog.ShowDialog(this) == DialogResult.OK) {
+        dataTypeTextBox.Text = dialog.Type.FullName;
+        dataTypeTextBox.Tag = dialog.Type;
+      }
+      dialog.Dispose();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      VariableKind kind = VariableKind.None;
+      if (kindNewCheckBox.Checked) kind = kind | VariableKind.New;
+      if (kindInCheckBox.Checked) kind = kind | VariableKind.In;
+      if (kindOutCheckBox.Checked) kind = kind | VariableKind.Out;
+      if (kindDeletedCheckBox.Checked) kind = kind | VariableKind.Deleted;
+
+      myVariableInfo = new VariableInfo(formalNameTextBox.Text, descriptionTextBox.Text, (Type)dataTypeTextBox.Tag, kind);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/AddVariableInfoDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Operators.Programmable/HeuristicLab.Operators.Programmable.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/HeuristicLab.Operators.Programmable.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/HeuristicLab.Operators.Programmable.csproj	(revision 2)
@@ -0,0 +1,97 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E3CCBFC6-900C-41B6-AFB8-6646DB097435}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Operators.Programmable</RootNamespace>
+    <AssemblyName>HeuristicLab.Operators.Programmable</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Operators.Programmable.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AddVariableInfoDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddVariableInfoDialog.Designer.cs">
+      <DependentUpon>AddVariableInfoDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabOperatorsProgrammablePlugin.cs" />
+    <Compile Include="ProgrammableOperator.cs" />
+    <Compile Include="ProgrammableOperatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProgrammableOperatorView.Designer.cs">
+      <DependentUpon>ProgrammableOperatorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AddVariableInfoDialog.resx">
+      <DependentUpon>AddVariableInfoDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProgrammableOperatorView.resx">
+      <DependentUpon>ProgrammableOperatorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Operators.Programmable/HeuristicLabOperatorsProgrammablePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/HeuristicLabOperatorsProgrammablePlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/HeuristicLabOperatorsProgrammablePlugin.cs	(revision 2)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Operators {
+  [ClassInfo(Name = "HeuristicLab.Operators.Programmable")]
+  [PluginFile(Filename = "HeuristicLab.Operators.Programmable.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  public class HeuristicLabOperatorsProgrammablePlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperator.cs	(revision 2)
@@ -0,0 +1,213 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.IO;
+using System.Reflection;
+using System.CodeDom;
+using System.CodeDom.Compiler;
+using Microsoft.CSharp;
+using System.Text.RegularExpressions;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators.Programmable {
+  public class ProgrammableOperator : OperatorBase {
+    private MethodInfo executeMethod;
+
+    private string myDescription;
+    public override string Description {
+      get { return myDescription; }
+    }
+    private string myCode;
+    public string Code {
+      get { return myCode; }
+      set {
+        if (value != myCode) {
+          myCode = value;
+          executeMethod = null;
+          OnCodeChanged();
+        }
+      }
+    }
+
+    public ProgrammableOperator() {
+      myCode = "Result.Data = true;";
+      myDescription = "An operator that can be programmed for arbitrary needs.";
+
+      AddVariableInfo(new VariableInfo("Result", "A computed variable", typeof(BoolData), VariableKind.New | VariableKind.Out));
+      Compile();
+    }
+
+    public void SetDescription(string description) {
+      if (description == null)
+        throw new NullReferenceException("description must not be null");
+
+      if (description != myDescription) {
+        myDescription = description;
+        OnDescriptionChanged();
+      }
+    }
+
+    public void Compile() {
+      CodeNamespace ns = new CodeNamespace("HeuristicLab.Operators.Programmable.CustomOperators");
+      CodeTypeDeclaration typeDecl = new CodeTypeDeclaration("Operator");
+      typeDecl.IsClass = true;
+      typeDecl.TypeAttributes = TypeAttributes.Public;
+
+      CodeMemberMethod method = new CodeMemberMethod();
+      method.Name = "Execute";
+      method.ReturnType = new CodeTypeReference(typeof(IOperation));
+      method.Attributes = MemberAttributes.Public | MemberAttributes.Static;
+      method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(IOperator), "op"));
+      method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(IScope), "scope"));
+      foreach (IVariableInfo info in VariableInfos)
+        method.Parameters.Add(new CodeParameterDeclarationExpression(info.DataType, info.FormalName));
+      string code = myCode + "\r\n" + "return null;";
+      method.Statements.Add(new CodeSnippetStatement(code));
+      typeDecl.Members.Add(method);
+
+      ns.Types.Add(typeDecl);
+      ns.Imports.Add(new CodeNamespaceImport("System"));
+      ns.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
+      ns.Imports.Add(new CodeNamespaceImport("System.Text"));
+      ns.Imports.Add(new CodeNamespaceImport("HeuristicLab.Core"));
+      foreach (IVariableInfo variableInfo in VariableInfos)
+        ns.Imports.Add(new CodeNamespaceImport(variableInfo.DataType.Namespace));
+
+      CodeCompileUnit unit = new CodeCompileUnit();
+      unit.Namespaces.Add(ns);
+      CompilerParameters parameters = new CompilerParameters();
+      parameters.GenerateExecutable = false;
+      parameters.GenerateInMemory = true;
+      parameters.IncludeDebugInformation = false;
+      Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
+      foreach (Assembly loadedAssembly in loadedAssemblies)
+        parameters.ReferencedAssemblies.Add(loadedAssembly.Location);
+      CodeDomProvider provider = new CSharpCodeProvider();
+      CompilerResults results = provider.CompileAssemblyFromDom(parameters, unit);
+
+      executeMethod = null;
+      if (results.Errors.HasErrors) {
+        StringWriter writer = new StringWriter();
+        CodeGeneratorOptions options = new CodeGeneratorOptions();
+        options.BlankLinesBetweenMembers = false;
+        options.ElseOnClosing = true;
+        options.IndentString = "  ";
+        provider.GenerateCodeFromCompileUnit(unit, writer, options);
+        writer.Flush();
+        string[] source = writer.ToString().Split(new string[] { "\r\n" }, StringSplitOptions.None);
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < source.Length; i++)
+          builder.AppendLine((i + 1).ToString("###") + "     " + source[i]);
+        builder.AppendLine();
+        builder.AppendLine();
+        builder.AppendLine();
+        foreach (CompilerError error in results.Errors) {
+          builder.Append("Line " + error.Line.ToString());
+          builder.Append(", Column " + error.Column.ToString());
+          builder.AppendLine(": " + error.ErrorText);
+        }
+        throw new Exception("Compile Errors:\n\n" + builder.ToString());
+      } else {
+        Assembly assembly = results.CompiledAssembly;
+        Type[] types = assembly.GetTypes();
+        executeMethod = types[0].GetMethod("Execute");
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ProgrammableOperator clone = (ProgrammableOperator)base.Clone(clonedObjects);
+      clone.myDescription = Description;
+      clone.myCode = Code;
+      clone.executeMethod = executeMethod;
+      return clone;
+    }
+
+    public override IOperation Apply(IScope scope) {
+      if (executeMethod == null)
+        throw new InvalidOperationException("No compiled code available.");
+
+      // collect parameters
+      object[] parameters = new object[VariableInfos.Count + 2];
+      parameters[0] = this;
+      parameters[1] = scope;
+      int i = 2;
+      foreach (IVariableInfo info in VariableInfos) {
+        if ((info.Kind & VariableKind.New) == VariableKind.New) {
+          parameters[i] = GetVariableValue(info.FormalName, scope, false, false);
+          if (parameters[i] == null) {
+            IItem value = (IItem)Activator.CreateInstance(info.DataType);
+            if (info.Local) {
+              AddVariable(new Variable(info.ActualName, value));
+            } else {
+              scope.AddVariable(new Variable(info.ActualName, value));
+            }
+            parameters[i] = value;
+          }
+        } else
+          parameters[i] = GetVariableValue(info.FormalName, scope, true);
+        i++;
+      }
+
+      return (IOperation)executeMethod.Invoke(null, parameters);
+    }
+
+    public override IView CreateView() {
+      return new ProgrammableOperatorView(this);
+    }
+
+    public event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged() {
+      if (DescriptionChanged != null)
+        DescriptionChanged(this, new EventArgs());
+    }
+    public event EventHandler CodeChanged;
+    protected virtual void OnCodeChanged() {
+      if (CodeChanged != null)
+        CodeChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode descriptionNode = document.CreateNode(XmlNodeType.Element, "Description", null);
+      descriptionNode.InnerText = myDescription;
+      node.AppendChild(descriptionNode);
+      XmlNode codeNode = document.CreateNode(XmlNodeType.Element, "Code", null);
+      codeNode.InnerText = myCode;
+      node.AppendChild(codeNode);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode descriptionNode = node.SelectSingleNode("Description");
+      myDescription = descriptionNode.InnerText;
+      XmlNode codeNode = node.SelectSingleNode("Code");
+      myCode = codeNode.InnerText;
+      Compile();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.Designer.cs	(revision 2)
@@ -0,0 +1,290 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Operators.Programmable {
+  partial class ProgrammableOperatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProgrammableOperatorView));
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.codeTabPage = new System.Windows.Forms.TabPage();
+      this.infoTextBox = new System.Windows.Forms.TextBox();
+      this.compileButton = new System.Windows.Forms.Button();
+      this.codeTextBox = new System.Windows.Forms.TextBox();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.removeVariableInfoButton = new System.Windows.Forms.Button();
+      this.addVariableInfoButton = new System.Windows.Forms.Button();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.variablesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariablesView = new HeuristicLab.Core.OperatorBaseVariablesView();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl.SuspendLayout();
+      this.codeTabPage.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.variablesTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.codeTabPage);
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.variablesTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(435, 351);
+      this.tabControl.TabIndex = 0;
+      // 
+      // codeTabPage
+      // 
+      this.codeTabPage.Controls.Add(this.infoTextBox);
+      this.codeTabPage.Controls.Add(this.compileButton);
+      this.codeTabPage.Controls.Add(this.codeTextBox);
+      this.codeTabPage.Location = new System.Drawing.Point(4, 22);
+      this.codeTabPage.Name = "codeTabPage";
+      this.codeTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.codeTabPage.Size = new System.Drawing.Size(427, 325);
+      this.codeTabPage.TabIndex = 5;
+      this.codeTabPage.Text = "Code";
+      this.codeTabPage.UseVisualStyleBackColor = true;
+      // 
+      // infoTextBox
+      // 
+      this.infoTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoTextBox.BackColor = System.Drawing.SystemColors.ControlLight;
+      this.infoTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.infoTextBox.Location = new System.Drawing.Point(6, 253);
+      this.infoTextBox.Multiline = true;
+      this.infoTextBox.Name = "infoTextBox";
+      this.infoTextBox.ReadOnly = true;
+      this.infoTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.infoTextBox.Size = new System.Drawing.Size(334, 66);
+      this.infoTextBox.TabIndex = 2;
+      this.infoTextBox.Text = resources.GetString("infoTextBox.Text");
+      // 
+      // compileButton
+      // 
+      this.compileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.compileButton.Location = new System.Drawing.Point(346, 296);
+      this.compileButton.Name = "compileButton";
+      this.compileButton.Size = new System.Drawing.Size(75, 23);
+      this.compileButton.TabIndex = 1;
+      this.compileButton.Text = "&Compile";
+      this.compileButton.UseVisualStyleBackColor = true;
+      this.compileButton.Click += new System.EventHandler(this.compileButton_Click);
+      // 
+      // codeTextBox
+      // 
+      this.codeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.codeTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.codeTextBox.Location = new System.Drawing.Point(3, 3);
+      this.codeTextBox.Multiline = true;
+      this.codeTextBox.Name = "codeTextBox";
+      this.codeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.codeTextBox.Size = new System.Drawing.Size(421, 244);
+      this.codeTextBox.TabIndex = 0;
+      this.codeTextBox.Validated += new System.EventHandler(this.codeTextBox_Validated);
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.removeVariableInfoButton);
+      this.variableInfosTabPage.Controls.Add(this.addVariableInfoButton);
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(427, 325);
+      this.variableInfosTabPage.TabIndex = 1;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // removeVariableInfoButton
+      // 
+      this.removeVariableInfoButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeVariableInfoButton.Enabled = false;
+      this.removeVariableInfoButton.Location = new System.Drawing.Point(84, 299);
+      this.removeVariableInfoButton.Name = "removeVariableInfoButton";
+      this.removeVariableInfoButton.Size = new System.Drawing.Size(75, 23);
+      this.removeVariableInfoButton.TabIndex = 2;
+      this.removeVariableInfoButton.Text = "&Remove";
+      this.removeVariableInfoButton.UseVisualStyleBackColor = true;
+      this.removeVariableInfoButton.Click += new System.EventHandler(this.removeVariableInfoButton_Click);
+      // 
+      // addVariableInfoButton
+      // 
+      this.addVariableInfoButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addVariableInfoButton.Location = new System.Drawing.Point(3, 299);
+      this.addVariableInfoButton.Name = "addVariableInfoButton";
+      this.addVariableInfoButton.Size = new System.Drawing.Size(75, 23);
+      this.addVariableInfoButton.TabIndex = 1;
+      this.addVariableInfoButton.Text = "&Add...";
+      this.addVariableInfoButton.UseVisualStyleBackColor = true;
+      this.addVariableInfoButton.Click += new System.EventHandler(this.addVariableInfoButton_Click);
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(421, 290);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      this.operatorBaseVariableInfosView.SelectedVariableInfosChanged += new System.EventHandler(this.operatorBaseVariableInfosView_SelectedVariableInfosChanged);
+      // 
+      // variablesTabPage
+      // 
+      this.variablesTabPage.Controls.Add(this.operatorBaseVariablesView);
+      this.variablesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variablesTabPage.Name = "variablesTabPage";
+      this.variablesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variablesTabPage.Size = new System.Drawing.Size(427, 325);
+      this.variablesTabPage.TabIndex = 2;
+      this.variablesTabPage.Text = "Local Variables";
+      this.variablesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariablesView
+      // 
+      this.operatorBaseVariablesView.Caption = "Operator";
+      this.operatorBaseVariablesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariablesView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariablesView.Name = "operatorBaseVariablesView";
+      this.operatorBaseVariablesView.Operator = null;
+      this.operatorBaseVariablesView.Size = new System.Drawing.Size(421, 319);
+      this.operatorBaseVariablesView.TabIndex = 0;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(427, 325);
+      this.constraintsTabPage.TabIndex = 3;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constrainedItemBaseView
+      // 
+      this.constrainedItemBaseView.Caption = "Constrained Item";
+      this.constrainedItemBaseView.ConstrainedItem = null;
+      this.constrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constrainedItemBaseView.Name = "constrainedItemBaseView";
+      this.constrainedItemBaseView.Size = new System.Drawing.Size(421, 319);
+      this.constrainedItemBaseView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.descriptionTextBox);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(427, 325);
+      this.descriptionTabPage.TabIndex = 4;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(3, 3);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(421, 319);
+      this.descriptionTextBox.TabIndex = 0;
+      this.descriptionTextBox.Validated += new System.EventHandler(this.descriptionTextBox_Validated);
+      // 
+      // ProgrammableOperatorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "ProgrammableOperatorView";
+      this.Size = new System.Drawing.Size(435, 351);
+      this.tabControl.ResumeLayout(false);
+      this.codeTabPage.ResumeLayout(false);
+      this.codeTabPage.PerformLayout();
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.variablesTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.descriptionTabPage.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage codeTabPage;
+    private System.Windows.Forms.TextBox codeTextBox;
+    private System.Windows.Forms.TabPage variableInfosTabPage;
+    private HeuristicLab.Core.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    private System.Windows.Forms.TabPage variablesTabPage;
+    private HeuristicLab.Core.OperatorBaseVariablesView operatorBaseVariablesView;
+    private System.Windows.Forms.TabPage constraintsTabPage;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedItemBaseView;
+    private System.Windows.Forms.TabPage descriptionTabPage;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private System.Windows.Forms.Button compileButton;
+    private System.Windows.Forms.Button removeVariableInfoButton;
+    private System.Windows.Forms.Button addVariableInfoButton;
+    private System.Windows.Forms.TextBox infoTextBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.cs	(revision 2)
@@ -0,0 +1,133 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators.Programmable {
+  public partial class ProgrammableOperatorView : ViewBase {
+    public ProgrammableOperator ProgrammableOperator {
+      get { return (ProgrammableOperator)Item; }
+      set { base.Item = value; }
+    }
+
+    public ProgrammableOperatorView() {
+      InitializeComponent();
+    }
+    public ProgrammableOperatorView(ProgrammableOperator programmableOperator)
+      : this() {
+      ProgrammableOperator = programmableOperator;
+    }
+
+    protected override void RemoveItemEvents() {
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseVariablesView.Operator = null;
+      constrainedItemBaseView.ConstrainedItem = null;
+      ProgrammableOperator.CodeChanged -= new EventHandler(ProgrammableOperator_CodeChanged);
+      ProgrammableOperator.DescriptionChanged -= new EventHandler(ProgrammableOperator_DescriptionChanged);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorBaseVariableInfosView.Operator = ProgrammableOperator;
+      operatorBaseVariablesView.Operator = ProgrammableOperator;
+      constrainedItemBaseView.ConstrainedItem = ProgrammableOperator;
+      ProgrammableOperator.CodeChanged += new EventHandler(ProgrammableOperator_CodeChanged);
+      ProgrammableOperator.DescriptionChanged += new EventHandler(ProgrammableOperator_DescriptionChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ProgrammableOperator == null) {
+        codeTextBox.Text = "";
+        codeTextBox.Enabled = false;
+        addVariableInfoButton.Enabled = false;
+        removeVariableInfoButton.Enabled = false;
+        descriptionTextBox.Text = "";
+        descriptionTextBox.Enabled = false;
+      } else {
+        codeTextBox.Text = ProgrammableOperator.Code;
+        codeTextBox.Enabled = true;
+        addVariableInfoButton.Enabled = true;
+        removeVariableInfoButton.Enabled = operatorBaseVariableInfosView.SelectedVariableInfos.Count > 0;
+        descriptionTextBox.Text = ProgrammableOperator.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+
+    private void operatorBaseVariableInfosView_SelectedVariableInfosChanged(object sender, EventArgs e) {
+      removeVariableInfoButton.Enabled = operatorBaseVariableInfosView.SelectedVariableInfos.Count > 0;
+    }
+
+    #region Validated Events
+    private void codeTextBox_Validated(object sender, EventArgs e) {
+      ProgrammableOperator.Code = codeTextBox.Text;
+    }
+    private void descriptionTextBox_Validated(object sender, EventArgs e) {
+      ProgrammableOperator.SetDescription(descriptionTextBox.Text);
+    }
+    #endregion
+
+    #region Click Events
+    private void compileButton_Click(object sender, EventArgs e) {
+      try {
+        ProgrammableOperator.Compile();
+        MessageBox.Show("Compilation successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
+      }
+      catch (Exception ex) {
+        Auxiliary.ShowErrorMessageBox(ex);
+      }
+    }
+    private void addVariableInfoButton_Click(object sender, EventArgs e) {
+      AddVariableInfoDialog dialog = new AddVariableInfoDialog();
+      if (dialog.ShowDialog(this) == DialogResult.OK) {
+        if (ProgrammableOperator.GetVariableInfo(dialog.VariableInfo.FormalName) != null)
+          Auxiliary.ShowErrorMessageBox("A variable info with the same formal name already exists.");
+        else
+          ProgrammableOperator.AddVariableInfo(dialog.VariableInfo);
+      }
+      dialog.Dispose();
+    }
+    private void removeVariableInfoButton_Click(object sender, EventArgs e) {
+      IVariableInfo[] selected = new IVariableInfo[operatorBaseVariableInfosView.SelectedVariableInfos.Count];
+      operatorBaseVariableInfosView.SelectedVariableInfos.CopyTo(selected, 0);
+      for (int i = 0; i < selected.Length; i++)
+        ProgrammableOperator.RemoveVariableInfo(selected[i].FormalName);
+    }
+    #endregion
+
+    #region ProgrammableOperator Events
+    private void ProgrammableOperator_CodeChanged(object sender, EventArgs e) {
+      codeTextBox.Text = ProgrammableOperator.Code;
+    }
+    private void ProgrammableOperator_DescriptionChanged(object sender, EventArgs e) {
+      descriptionTextBox.Text = ProgrammableOperator.Description;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/ProgrammableOperatorView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="infoTextBox.Text" xml:space="preserve">
+    <value>All variables corresponding to declared variable infos can be accessed directly using their formal names. Additionally there are two special variables: "op" referring to the programmable operator itself (this) and "scope" referring to the scope the operator is applied on.</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.Operators.Programmable/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Operators.Programmable")]
+[assembly: AssemblyDescription("HeuristicLab programmable operator classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8cf313d4-db6c-41bb-a43a-c684951e7020")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Operators/CombinedOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/CombinedOperator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/CombinedOperator.cs	(revision 2)
@@ -0,0 +1,121 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class CombinedOperator : OperatorBase {
+    private string myDescription;
+    public override string Description {
+      get { return myDescription; }
+    }
+    private IOperatorGraph myOperatorGraph;
+    public IOperatorGraph OperatorGraph {
+      get { return myOperatorGraph; }
+    }
+
+    public CombinedOperator()
+      : base() {
+      myDescription =
+        "A combined operator contains a whole operator graph. It is useful for modularization to assemble complex operators out of simpler ones.\r\n\r\n" +
+        "A combined operator can automatically inject its sub-operators into the scope it is applied on. Those operators can be extracted again in the contained operator graph by using an OperatorExtractor. So it is possible to parameterize a combined operator with custom operators. To activate sub-operator injection take a look at the local variables InjectSubOperators and SubOperatorNames.";
+      myOperatorGraph = new OperatorGraph();
+      AddVariableInfo(new VariableInfo("InjectSubOperators", "true if the sub-operators of this combined operator should be injected into the scope", typeof(BoolData), VariableKind.In));
+      GetVariableInfo("InjectSubOperators").Local = true;
+      AddVariable(new Variable("InjectSubOperators", new BoolData(false)));
+      AddVariableInfo(new VariableInfo("SubOperatorNames", "Variable names for injecting the sub-operators", typeof(ItemList), VariableKind.In));
+      GetVariableInfo("SubOperatorNames").Local = true;
+      ItemList subOperatorNames = new ItemList();
+      subOperatorNames.ItemType = typeof(StringData);
+      AddVariable(new Variable("SubOperatorNames", subOperatorNames));
+    }
+
+    public void SetDescription(string description) {
+      if (description == null)
+        throw new NullReferenceException("description must not be null");
+
+      if (description != myDescription) {
+        myDescription = description;
+        OnDescriptionChanged();
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      CombinedOperator clone = (CombinedOperator)base.Clone(clonedObjects);
+      clone.myDescription = Description;
+      clone.myOperatorGraph = (IOperatorGraph)Auxiliary.Clone(OperatorGraph, clonedObjects);
+      return clone;
+    }
+
+    public override IOperation Apply(IScope scope) {
+      if (OperatorGraph.InitialOperator != null) {
+        bool inject = GetVariableValue<BoolData>("InjectSubOperators", scope, false).Data;
+        if (inject) {
+          ItemList names = GetVariableValue<ItemList>("SubOperatorNames", scope, false);
+          for (int i = 0; i < SubOperators.Count; i++) {
+            if (scope.GetVariable(names[i].ToString()) != null)
+              scope.RemoveVariable(names[i].ToString());
+            scope.AddVariable(new Variable(names[i].ToString(), SubOperators[i]));
+          }
+        }
+        return new AtomicOperation(OperatorGraph.InitialOperator, scope);
+      } else {
+        return null;
+      }
+    }
+    public override void Reset() {
+      OperatorGraph.Reset();
+      base.Reset();
+    }
+
+    public override IView CreateView() {
+      return new CombinedOperatorView(this);
+    }
+
+    public event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged() {
+      if (DescriptionChanged != null)
+        DescriptionChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode descriptionNode = document.CreateNode(XmlNodeType.Element, "Description", null);
+      descriptionNode.InnerText = myDescription;
+      node.AppendChild(descriptionNode);
+      node.AppendChild(PersistenceManager.Persist("OperatorGraph", OperatorGraph, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode descriptionNode = node.SelectSingleNode("Description");
+      if (descriptionNode != null) myDescription = descriptionNode.InnerText;
+      myOperatorGraph = (IOperatorGraph)PersistenceManager.Restore(node.SelectSingleNode("OperatorGraph"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.Designer.cs	(revision 2)
@@ -0,0 +1,220 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Operators {
+  partial class CombinedOperatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.operatorGraphView = new HeuristicLab.Core.OperatorGraphView();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.variablesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariablesView = new HeuristicLab.Core.OperatorBaseVariablesView();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl.SuspendLayout();
+      this.operatorGraphTabPage.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.variablesTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.operatorGraphTabPage);
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.variablesTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(397, 335);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorGraphTabPage
+      // 
+      this.operatorGraphTabPage.Controls.Add(this.operatorGraphView);
+      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
+      this.operatorGraphTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(389, 309);
+      this.operatorGraphTabPage.TabIndex = 0;
+      this.operatorGraphTabPage.Text = "Operator Graph";
+      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorGraphView
+      // 
+      this.operatorGraphView.Caption = "Operator Graph";
+      this.operatorGraphView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphView.Location = new System.Drawing.Point(3, 3);
+      this.operatorGraphView.Name = "operatorGraphView";
+      this.operatorGraphView.OperatorGraph = null;
+      this.operatorGraphView.Size = new System.Drawing.Size(383, 303);
+      this.operatorGraphView.TabIndex = 0;
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(389, 309);
+      this.variableInfosTabPage.TabIndex = 1;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(383, 303);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      // 
+      // variablesTabPage
+      // 
+      this.variablesTabPage.Controls.Add(this.operatorBaseVariablesView);
+      this.variablesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variablesTabPage.Name = "variablesTabPage";
+      this.variablesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variablesTabPage.Size = new System.Drawing.Size(389, 309);
+      this.variablesTabPage.TabIndex = 2;
+      this.variablesTabPage.Text = "Local Variables";
+      this.variablesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariablesView
+      // 
+      this.operatorBaseVariablesView.Caption = "Operator";
+      this.operatorBaseVariablesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariablesView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariablesView.Name = "operatorBaseVariablesView";
+      this.operatorBaseVariablesView.Operator = null;
+      this.operatorBaseVariablesView.Size = new System.Drawing.Size(383, 303);
+      this.operatorBaseVariablesView.TabIndex = 0;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(389, 309);
+      this.constraintsTabPage.TabIndex = 3;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constrainedItemBaseView
+      // 
+      this.constrainedItemBaseView.Caption = "Constrained Item";
+      this.constrainedItemBaseView.ConstrainedItem = null;
+      this.constrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constrainedItemBaseView.Name = "constrainedItemBaseView";
+      this.constrainedItemBaseView.Size = new System.Drawing.Size(383, 303);
+      this.constrainedItemBaseView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.descriptionTextBox);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(389, 309);
+      this.descriptionTabPage.TabIndex = 4;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(3, 3);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(383, 303);
+      this.descriptionTextBox.TabIndex = 0;
+      this.descriptionTextBox.Validated += new System.EventHandler(this.descriptionTextBox_Validated);
+      // 
+      // CombinedOperatorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "CombinedOperatorView";
+      this.Size = new System.Drawing.Size(397, 335);
+      this.tabControl.ResumeLayout(false);
+      this.operatorGraphTabPage.ResumeLayout(false);
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.variablesTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.descriptionTabPage.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorGraphTabPage;
+    private System.Windows.Forms.TabPage variableInfosTabPage;
+    private System.Windows.Forms.TabPage variablesTabPage;
+    private System.Windows.Forms.TabPage constraintsTabPage;
+    private System.Windows.Forms.TabPage descriptionTabPage;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private HeuristicLab.Core.OperatorGraphView operatorGraphView;
+    private HeuristicLab.Core.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    private HeuristicLab.Core.OperatorBaseVariablesView operatorBaseVariablesView;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedItemBaseView;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.cs	(revision 2)
@@ -0,0 +1,82 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  public partial class CombinedOperatorView : ViewBase {
+    public CombinedOperator CombinedOperator {
+      get { return (CombinedOperator)Item; }
+      set { base.Item = value; }
+    }
+
+    protected override void RemoveItemEvents() {
+      operatorGraphView.OperatorGraph = null;
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseVariablesView.Operator = null;
+      constrainedItemBaseView.ConstrainedItem = null;
+      CombinedOperator.DescriptionChanged -= new EventHandler(CombinedOperator_DescriptionChanged);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorGraphView.OperatorGraph = CombinedOperator.OperatorGraph;
+      operatorBaseVariableInfosView.Operator = CombinedOperator;
+      operatorBaseVariablesView.Operator = CombinedOperator;
+      constrainedItemBaseView.ConstrainedItem = CombinedOperator;
+      CombinedOperator.DescriptionChanged += new EventHandler(CombinedOperator_DescriptionChanged);
+    }
+
+    public CombinedOperatorView() {
+      InitializeComponent();
+    }
+    public CombinedOperatorView(CombinedOperator combinedOperator)
+      : this() {
+      CombinedOperator = combinedOperator;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (CombinedOperator == null) {
+        descriptionTextBox.Text = "";
+        descriptionTextBox.Enabled = false;
+      } else {
+        descriptionTextBox.Text = CombinedOperator.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+
+    private void CombinedOperator_DescriptionChanged(object sender, EventArgs e) {
+      descriptionTextBox.Text = CombinedOperator.Description;
+    }
+    private void descriptionTextBox_Validated(object sender, EventArgs e) {
+      CombinedOperator.SetDescription(descriptionTextBox.Text);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/CombinedOperatorView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Operators/ComparatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/ComparatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/ComparatorBase.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public abstract class ComparatorBase : OperatorBase {
+    protected ComparatorBase() {
+      AddVariableInfo(new VariableInfo("LeftSide", "Variable on the left side of the comparison", typeof(IItem), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RightSide", "Variable on the right side of the comparison", typeof(IItem), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Result", "Result of the comparison", typeof(BoolData), VariableKind.Out | VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      BoolData result = GetVariableValue<BoolData>("Result", scope, false, false);
+      if (result == null) {
+        result = new BoolData(true);
+        IVariableInfo info = GetVariableInfo("Result");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, result));
+        else
+          scope.AddVariable(new Variable(info.ActualName, result));
+      }
+      IItem leftSide = GetVariableValue<IItem>("LeftSide", scope, true);
+      if (!(leftSide is IComparable)) throw new InvalidOperationException("Comparator: Left side needs to be of type IComparable");
+      IComparable left = (IComparable)leftSide;
+      IItem rightSide = GetVariableValue<IItem>("RightSide", scope, true);
+      result.Data = Compare(left, rightSide);
+      return null;
+    }
+
+    protected abstract bool Compare(IComparable left, IItem right);
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/ConditionalBranch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/ConditionalBranch.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/ConditionalBranch.cs	(revision 2)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class ConditionalBranch : OperatorBase {
+    public override string Description {
+      get { return @"ConditionalBranch expects to have 1 or 2 sub operators.\r\n
+It will return the 1st sub operator if ""Condition"" is true and the 2nd sub operator if ""Condition"" equals to false.\r\n
+\r\nIn case a 2nd sub operator does not exist and ""Condition"" would equal to false, Conditional Branch will not return a new operation."; }
+    }
+
+    public ConditionalBranch()
+      : base() {
+      AddVariableInfo(new VariableInfo("Condition", "A boolean variable that decides the branch", typeof(BoolData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      BoolData resultData = GetVariableValue<BoolData>("Condition", scope, true);
+      bool result = resultData.Data;
+
+      if ((result) && (SubOperators.Count > 0) && (SubOperators[0] != null))
+        return new AtomicOperation(SubOperators[0], scope);
+      else if ((!result) && (SubOperators.Count > 1) && (SubOperators[1] != null))
+        return new AtomicOperation(SubOperators[1], scope);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/Counter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/Counter.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/Counter.cs	(revision 2)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class Counter : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public Counter()
+      : base() {
+      AddVariableInfo(new VariableInfo("Value", "Counter value", typeof(IntData), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IntData value = GetVariableValue<IntData>("Value", scope, true);
+      value.Data++;
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/DataCollector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/DataCollector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/DataCollector.cs	(revision 2)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class DataCollector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public DataCollector() {
+      IVariableInfo variableNamesVariableInfo = new VariableInfo("VariableNames", "Names of variables whose values should be collected", typeof(ItemList), VariableKind.In);
+      variableNamesVariableInfo.Local = true;
+      AddVariableInfo(variableNamesVariableInfo);
+      ItemList variableNames = new ItemList();
+      variableNames.ItemType = typeof(StringData);
+      AddVariable(new Variable("VariableNames", variableNames));
+      AddVariableInfo(new VariableInfo("Values", "Collected values", typeof(ItemList), VariableKind.New | VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ItemList names = GetVariableValue<ItemList>("VariableNames", scope, false);
+      ItemList values = GetVariableValue<ItemList>("Values", scope, false, false);
+      if (values == null) {
+        values = new ItemList();
+        IVariableInfo info = GetVariableInfo("Values");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, values));
+        else
+          scope.AddVariable(new Variable(info.ActualName, values));
+      }
+
+      ItemList currentValues = new ItemList();
+      for (int i = 0; i < names.Count; i++)
+        currentValues.Add((IItem)scope.GetVariableValue(((StringData)names[i]).Data, true).Clone());
+      values.Add(currentValues);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/EmptyOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/EmptyOperator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/EmptyOperator.cs	(revision 2)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  public class EmptyOperator : OperatorBase {
+    public override string Description {
+      get { return "An empty operator just does nothing. Useful for testing and as a place holder for sub-operators of SequentialSubScopesProcessor and ParallelSubScopesProcessor."; }
+    }
+
+    public EmptyOperator()
+      : base() {
+    }
+
+    public override IOperation Apply(IScope scope) {
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/EqualToComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/EqualToComparator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/EqualToComparator.cs	(revision 2)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class EqualToComparator : ComparatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public EqualToComparator()
+      : base() {
+    }
+
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) == 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/GreaterOrEqualThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/GreaterOrEqualThanComparator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/GreaterOrEqualThanComparator.cs	(revision 2)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class GreaterOrEqualThanComparator : ComparatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public GreaterOrEqualThanComparator()
+      : base() {
+    }
+
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) >= 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/GreaterThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/GreaterThanComparator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/GreaterThanComparator.cs	(revision 2)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class GreaterThanComparator : ComparatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public GreaterThanComparator()
+      : base() {
+    }
+
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) > 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/HeuristicLab.Operators.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Operators/HeuristicLab.Operators.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/HeuristicLab.Operators.csproj	(revision 2)
@@ -0,0 +1,126 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Operators</RootNamespace>
+    <AssemblyName>HeuristicLab.Operators</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Operators.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CombinedOperator.cs" />
+    <Compile Include="CombinedOperatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CombinedOperatorView.Designer.cs">
+      <DependentUpon>CombinedOperatorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComparatorBase.cs" />
+    <Compile Include="ConditionalBranch.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SubScopesMixer.cs" />
+    <Compile Include="DataCollector.cs" />
+    <Compile Include="EqualToComparator.cs" />
+    <Compile Include="GreaterOrEqualThanComparator.cs" />
+    <Compile Include="GreaterThanComparator.cs" />
+    <Compile Include="LessOrEqualThanComparator.cs" />
+    <Compile Include="LessThanComparator.cs" />
+    <Compile Include="OperatorExtractor.cs" />
+    <Compile Include="ParallelProcessor.cs" />
+    <Compile Include="EmptyOperator.cs" />
+    <Compile Include="SequentialProcessor.cs" />
+    <Compile Include="SingleObjectiveEvaluatorBase.cs" />
+    <Compile Include="Sorter.cs" />
+    <Compile Include="StochasticBranch.cs" />
+    <Compile Include="UnequalToComparator.cs" />
+    <Compile Include="UniformSequentialSubScopesProcessor.cs" />
+    <Compile Include="UniformParallelSubScopesProcessor.cs" />
+    <Compile Include="ParallelSubScopesProcessor.cs" />
+    <Compile Include="SequentialSubScopesProcessor.cs" />
+    <Compile Include="SubScopesCreater.cs" />
+    <Compile Include="Counter.cs" />
+    <Compile Include="HeuristicLabOperatorsPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VariableInjector.cs" />
+    <Compile Include="VariableInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableInjectorView.Designer.cs">
+      <DependentUpon>VariableInjectorView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CombinedOperatorView.resx">
+      <DependentUpon>CombinedOperatorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Operators/HeuristicLabOperatorsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/HeuristicLabOperatorsPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/HeuristicLabOperatorsPlugin.cs	(revision 2)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Operators {
+  [ClassInfo(Name = "HeuristicLab.Operators")]
+  [PluginFile(Filename = "HeuristicLab.Operators.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  public class HeuristicLabOperatorsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/LessOrEqualThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/LessOrEqualThanComparator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/LessOrEqualThanComparator.cs	(revision 2)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class LessOrEqualThanComparator : ComparatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public LessOrEqualThanComparator()
+      : base() {
+    }
+
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) <= 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/LessThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/LessThanComparator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/LessThanComparator.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class LessThanComparator : ComparatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public LessThanComparator()
+      : base() {
+    }
+
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) < 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/OperatorExtractor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/OperatorExtractor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/OperatorExtractor.cs	(revision 2)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class OperatorExtractor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public OperatorExtractor()
+      : base() {
+      AddVariableInfo(new VariableInfo("Name", "Variable name of the operator to extract and execute from the scope", typeof(StringData), VariableKind.In));
+      GetVariableInfo("Name").Local = true;
+      AddVariable(new Variable("Name", new StringData("Name")));
+      AddVariableInfo(new VariableInfo("ReplaceSubOperators", "True if the sub-operators of the extracted operator should be replaced with the sub-operators of the operator extractor", typeof(BoolData), VariableKind.In));
+      GetVariableInfo("ReplaceSubOperators").Local = true;
+      AddVariable(new Variable("ReplaceSubOperators", new BoolData(false)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      string name = GetVariableValue<StringData>("Name", scope, false).Data;
+      bool replace = GetVariableValue<BoolData>("ReplaceSubOperators", scope, false).Data;
+      IOperator op = scope.GetVariableValue<IOperator>(name, true);
+
+      if (replace) {
+        while (op.SubOperators.Count > 0)
+          op.RemoveSubOperator(0);
+        foreach (IOperator subOperator in SubOperators)
+          op.AddSubOperator(subOperator);
+      }
+
+      return new AtomicOperation(op, scope);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/ParallelProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/ParallelProcessor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/ParallelProcessor.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class ParallelProcessor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+      for (int i = 0; i < SubOperators.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/ParallelSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/ParallelSubScopesProcessor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/ParallelSubScopesProcessor.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class ParallelSubScopesProcessor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Operators")]
+[assembly: AssemblyDescription("Various HeuristicLab operator classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("72c5cb1e-abed-4a66-b520-8a6b6ad9fba1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Operators/SequentialProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/SequentialProcessor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/SequentialProcessor.cs	(revision 2)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class SequentialProcessor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      for (int i = 0; i < SubOperators.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/SequentialSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/SequentialSubScopesProcessor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/SequentialSubScopesProcessor.cs	(revision 2)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class SequentialSubScopesProcessor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/SingleObjectiveEvaluatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/SingleObjectiveEvaluatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/SingleObjectiveEvaluatorBase.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public abstract class SingleObjectiveEvaluatorBase : OperatorBase {
+    public SingleObjectiveEvaluatorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      double qualityValue = Evaluate(scope);
+      DoubleData quality = GetVariableValue<DoubleData>("Quality", scope, false, false);
+      if (quality == null) {
+        quality = new DoubleData(qualityValue);
+        IVariableInfo qualityInfo = GetVariableInfo("Quality");
+        if (qualityInfo.Local)
+          AddVariable(new Variable(qualityInfo.ActualName, quality));
+        else
+          scope.AddVariable(new Variable(qualityInfo.ActualName, quality));
+      } else {
+        quality.Data = qualityValue;
+      }
+      return null;
+    }
+
+    protected abstract double Evaluate(IScope scope);
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/Sorter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/Sorter.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/Sorter.cs	(revision 2)
@@ -0,0 +1,65 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class Sorter : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public Sorter()
+      : base() {
+      AddVariableInfo(new VariableInfo("Descending", "Sort in descending order", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Value", "Sorting value", typeof(DoubleData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      bool descending = GetVariableValue<BoolData>("Descending", scope, true).Data;
+      double[] keys = new double[scope.SubScopes.Count];
+      int[] sequence = new int[keys.Length];
+
+      for (int i = 0; i < keys.Length; i++) {
+        keys[i] = scope.SubScopes[i].GetVariableValue<DoubleData>(GetVariableInfo("Value").ActualName, false).Data;
+        sequence[i] = i;
+      }
+
+      Array.Sort<double, int>(keys, sequence);
+
+      if (descending) {
+        int temp;
+        for (int i = 0; i < sequence.Length / 2; i++) {
+          temp = sequence[i];
+          sequence[i] = sequence[sequence.Length - 1 - i];
+          sequence[sequence.Length - 1 - i] = temp;
+        }
+      }
+      scope.ReorderSubScopes(sequence);
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/StochasticBranch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/StochasticBranch.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/StochasticBranch.cs	(revision 2)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class StochasticBranch : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public StochasticBranch()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Probability", "Probability to choose first branch", typeof(DoubleData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      DoubleData probability = GetVariableValue<DoubleData>("Probability", scope, true);
+
+      bool result = random.NextDouble() < probability.Data;
+      if ((result) && (SubOperators.Count > 0) && (SubOperators[0] != null))
+        return new AtomicOperation(SubOperators[0], scope);
+      else if ((!result) && (SubOperators.Count > 1) && (SubOperators[1] != null))
+        return new AtomicOperation(SubOperators[1], scope);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/SubScopesCreater.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/SubScopesCreater.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/SubScopesCreater.cs	(revision 2)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class SubScopesCreater : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public SubScopesCreater()
+      : base() {
+      AddVariableInfo(new VariableInfo("SubScopes", "Number of sub-scopes", typeof(IntData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IntData count = GetVariableValue<IntData>("SubScopes", scope, true);
+
+      for (int i = 0; i < count.Data; i++)
+        scope.AddSubScope(new Scope(i.ToString()));
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/SubScopesMixer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/SubScopesMixer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/SubScopesMixer.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class SubScopesMixer : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public SubScopesMixer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Partitions", "Number of partitions to mix", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Partitions").Local = true;
+      AddVariable(new Variable("Partitions", new IntData(2)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int partitions = GetVariableValue<IntData>("Partitions", scope, true).Data;
+      int[] sequence = new int[scope.SubScopes.Count];
+      int partitionSize = sequence.Length / partitions;
+
+      // mix sub-scopes -> alternately take one sub-scope from each partition
+      for (int i = 0; i < partitionSize; i++) {
+        for (int j = 0; j < partitions; j++)
+          sequence[i * partitions + j] = j * partitionSize + i;
+      }
+      scope.ReorderSubScopes(sequence);
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/UnequalToComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/UnequalToComparator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/UnequalToComparator.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class UnequalToComparator : ComparatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public UnequalToComparator()
+      : base() {
+    }
+
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) != 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/UniformParallelSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/UniformParallelSubScopesProcessor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/UniformParallelSubScopesProcessor.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class UniformParallelSubScopesProcessor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[0], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/UniformSequentialSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/UniformSequentialSubScopesProcessor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/UniformSequentialSubScopesProcessor.cs	(revision 2)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  public class UniformSequentialSubScopesProcessor : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[0], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/VariableInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/VariableInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/VariableInjector.cs	(revision 2)
@@ -0,0 +1,119 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  public class VariableInjector : OperatorBase {
+    private Dictionary<IVariable, IVariableInfo> variableVariableInfoTable;
+    private Dictionary<IVariableInfo, IVariable> variableInfoVariableTable;
+
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public VariableInjector()
+      : base() {
+      variableVariableInfoTable = new Dictionary<IVariable, IVariableInfo>();
+      variableInfoVariableTable = new Dictionary<IVariableInfo, IVariable>();
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      VariableInjector clone = new VariableInjector();
+      clonedObjects.Add(Guid, clone);
+      clone.Name = Name;
+      foreach (IVariable variable in Variables)
+        clone.AddVariable((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      return clone;
+    }
+
+    public override void AddVariable(IVariable variable) {
+      base.AddVariable(variable);
+      CreateVariableInfo(variable);
+    }
+
+    public override void RemoveVariable(string name) {
+      DeleteVariableInfo(name);
+      base.RemoveVariable(name);
+    }
+
+    public override IOperation Apply(IScope scope) {
+      foreach (IVariable variable in Variables) {
+        if (scope.GetVariable(variable.Name) != null)
+          scope.RemoveVariable(variable.Name);
+        scope.AddVariable((IVariable)variable.Clone());
+      }
+      return null;
+    }
+
+    public override IView CreateView() {
+      return new VariableInjectorView(this);
+    }
+
+    private void CreateVariableInfo(IVariable variable) {
+      IVariableInfo info = new VariableInfo(Guid.NewGuid().ToString(), "Injected variable", variable.Value.GetType(), VariableKind.New);
+      info.ActualName = variable.Name;
+      AddVariableInfo(info);
+      variableVariableInfoTable.Add(variable, info);
+      variableInfoVariableTable.Add(info, variable);
+      info.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+      variable.NameChanged += new EventHandler(Variable_NameChanged);
+    }
+    private void DeleteVariableInfo(string name) {
+      IVariable variable = GetVariable(name);
+      if (variable != null) {
+        IVariableInfo info = variableVariableInfoTable[variable];
+        RemoveVariableInfo(info.FormalName);
+        variableVariableInfoTable.Remove(variable);
+        variableInfoVariableTable.Remove(info);
+        info.ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+        variable.NameChanged -= new EventHandler(Variable_NameChanged);
+      }
+    }
+
+    #region VariableInfo and Variable Events
+    private void VariableInfo_ActualNameChanged(object sender, EventArgs e) {
+      IVariableInfo info = (IVariableInfo)sender;
+      IVariable variable = variableInfoVariableTable[info];
+      variable.Name = info.ActualName;
+    }
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      IVariableInfo info = variableVariableInfoTable[variable];
+      info.ActualName = variable.Name;
+    }
+    #endregion
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      // variable infos should not be persisted
+      XmlNode infosNode = node.SelectSingleNode("VariableInfos");
+      infosNode.RemoveAll();
+      return node;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/VariableInjectorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/VariableInjectorView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/VariableInjectorView.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Operators {
+  partial class VariableInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/VariableInjectorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/VariableInjectorView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Operators/VariableInjectorView.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  public partial class VariableInjectorView : OperatorBaseView {
+    public VariableInjector VariableInjector {
+      get { return (VariableInjector)Item; }
+      set { base.Operator = value; }
+    }
+
+    public VariableInjectorView() {
+      InitializeComponent();
+      tabControl.SelectedTab = variablesTabPage;
+    }
+    public VariableInjectorView(VariableInjector variableInjector)
+      : this() {
+      VariableInjector = variableInjector;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.Designer.cs	(revision 2)
@@ -0,0 +1,117 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationFrontend {
+  partial class AboutDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.okButton = new System.Windows.Forms.Button();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.textBox1 = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(295, 147);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.pictureBox.Image = global::HeuristicLab.OptimizationFrontend.Properties.Resources.Logo_gray;
+      this.pictureBox.Location = new System.Drawing.Point(12, 12);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(159, 158);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+      this.pictureBox.TabIndex = 1;
+      this.pictureBox.TabStop = false;
+      // 
+      // textBox1
+      // 
+      this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.textBox1.Location = new System.Drawing.Point(177, 57);
+      this.textBox1.Multiline = true;
+      this.textBox1.Name = "textBox1";
+      this.textBox1.ReadOnly = true;
+      this.textBox1.Size = new System.Drawing.Size(193, 60);
+      this.textBox1.TabIndex = 3;
+      this.textBox1.Text = "HeuristicLab\r\nv. 3.0.0.0\r\n\r\n(c) 2002-2008 HEAL";
+      // 
+      // AboutDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(382, 182);
+      this.Controls.Add(this.textBox1);
+      this.Controls.Add(this.pictureBox);
+      this.Controls.Add(this.okButton);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "AboutDialog";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "About HeuristicLab";
+      this.TopMost = true;
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.TextBox textBox1;
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.cs	(revision 2)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.OptimizationFrontend {
+  public partial class AboutDialog : Form {
+    public AboutDialog() {
+      InitializeComponent();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/AboutDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.Designer.cs	(revision 2)
@@ -0,0 +1,309 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationFrontend {
+  partial class AvailableOperatorsForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AvailableOperatorsForm));
+      this.builtinOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.builtinOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.builtinOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorLibrariesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorLibraryTextBox = new System.Windows.Forms.TextBox();
+      this.operatorLibraryLabel = new System.Windows.Forms.Label();
+      this.operatorLibraryOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorLibraryOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.operatorLibraryOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.loadButton = new System.Windows.Forms.Button();
+      this.builtinTabPage = new System.Windows.Forms.TabPage();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.builtinOperatorsGroupBox.SuspendLayout();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.operatorLibrariesTabPage.SuspendLayout();
+      this.operatorLibraryOperatorsGroupBox.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.builtinTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // builtinOperatorsGroupBox
+      // 
+      this.builtinOperatorsGroupBox.Controls.Add(this.splitContainer2);
+      this.builtinOperatorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.builtinOperatorsGroupBox.Name = "builtinOperatorsGroupBox";
+      this.builtinOperatorsGroupBox.Size = new System.Drawing.Size(594, 390);
+      this.builtinOperatorsGroupBox.TabIndex = 0;
+      this.builtinOperatorsGroupBox.TabStop = false;
+      this.builtinOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.builtinOperatorsTreeView);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.builtinOperatorsDescriptionTextBox);
+      this.splitContainer2.Size = new System.Drawing.Size(588, 371);
+      this.splitContainer2.SplitterDistance = 272;
+      this.splitContainer2.TabIndex = 2;
+      // 
+      // builtinOperatorsTreeView
+      // 
+      this.builtinOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsTreeView.HideSelection = false;
+      this.builtinOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsTreeView.Name = "builtinOperatorsTreeView";
+      this.builtinOperatorsTreeView.Size = new System.Drawing.Size(588, 272);
+      this.builtinOperatorsTreeView.TabIndex = 0;
+      this.builtinOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.builtinOperatorsTreeView_AfterSelect);
+      this.builtinOperatorsTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.builtinOperatorsTreeView_ItemDrag);
+      // 
+      // builtinOperatorsDescriptionTextBox
+      // 
+      this.builtinOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.builtinOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsDescriptionTextBox.Multiline = true;
+      this.builtinOperatorsDescriptionTextBox.Name = "builtinOperatorsDescriptionTextBox";
+      this.builtinOperatorsDescriptionTextBox.ReadOnly = true;
+      this.builtinOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.builtinOperatorsDescriptionTextBox.Size = new System.Drawing.Size(588, 95);
+      this.builtinOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.operatorLibrariesTabPage);
+      this.tabControl.Controls.Add(this.builtinTabPage);
+      this.tabControl.Location = new System.Drawing.Point(12, 12);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(608, 422);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorLibrariesTabPage
+      // 
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryTextBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryLabel);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryOperatorsGroupBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.loadButton);
+      this.operatorLibrariesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorLibrariesTabPage.Name = "operatorLibrariesTabPage";
+      this.operatorLibrariesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorLibrariesTabPage.Size = new System.Drawing.Size(600, 396);
+      this.operatorLibrariesTabPage.TabIndex = 0;
+      this.operatorLibrariesTabPage.Text = "Operator Libraries";
+      this.operatorLibrariesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorLibraryTextBox
+      // 
+      this.operatorLibraryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryTextBox.Location = new System.Drawing.Point(97, 8);
+      this.operatorLibraryTextBox.Name = "operatorLibraryTextBox";
+      this.operatorLibraryTextBox.ReadOnly = true;
+      this.operatorLibraryTextBox.Size = new System.Drawing.Size(416, 20);
+      this.operatorLibraryTextBox.TabIndex = 2;
+      // 
+      // operatorLibraryLabel
+      // 
+      this.operatorLibraryLabel.AutoSize = true;
+      this.operatorLibraryLabel.Location = new System.Drawing.Point(6, 11);
+      this.operatorLibraryLabel.Name = "operatorLibraryLabel";
+      this.operatorLibraryLabel.Size = new System.Drawing.Size(85, 13);
+      this.operatorLibraryLabel.TabIndex = 1;
+      this.operatorLibraryLabel.Text = "&Operator Library:";
+      // 
+      // operatorLibraryOperatorsGroupBox
+      // 
+      this.operatorLibraryOperatorsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryOperatorsGroupBox.Controls.Add(this.splitContainer1);
+      this.operatorLibraryOperatorsGroupBox.Enabled = false;
+      this.operatorLibraryOperatorsGroupBox.Location = new System.Drawing.Point(6, 35);
+      this.operatorLibraryOperatorsGroupBox.Name = "operatorLibraryOperatorsGroupBox";
+      this.operatorLibraryOperatorsGroupBox.Size = new System.Drawing.Size(588, 355);
+      this.operatorLibraryOperatorsGroupBox.TabIndex = 3;
+      this.operatorLibraryOperatorsGroupBox.TabStop = false;
+      this.operatorLibraryOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorLibraryOperatorsTreeView);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.operatorLibraryOperatorsDescriptionTextBox);
+      this.splitContainer1.Size = new System.Drawing.Size(582, 336);
+      this.splitContainer1.SplitterDistance = 237;
+      this.splitContainer1.TabIndex = 1;
+      // 
+      // operatorLibraryOperatorsTreeView
+      // 
+      this.operatorLibraryOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsTreeView.HideSelection = false;
+      this.operatorLibraryOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsTreeView.Name = "operatorLibraryOperatorsTreeView";
+      this.operatorLibraryOperatorsTreeView.ShowNodeToolTips = true;
+      this.operatorLibraryOperatorsTreeView.Size = new System.Drawing.Size(582, 237);
+      this.operatorLibraryOperatorsTreeView.TabIndex = 0;
+      this.operatorLibraryOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.operatorsTreeView_AfterSelect);
+      this.operatorLibraryOperatorsTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.operatorLibraryOperatorsTreeView_ItemDrag);
+      // 
+      // operatorLibraryOperatorsDescriptionTextBox
+      // 
+      this.operatorLibraryOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.operatorLibraryOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsDescriptionTextBox.Multiline = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.Name = "operatorLibraryOperatorsDescriptionTextBox";
+      this.operatorLibraryOperatorsDescriptionTextBox.ReadOnly = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.operatorLibraryOperatorsDescriptionTextBox.Size = new System.Drawing.Size(582, 95);
+      this.operatorLibraryOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // loadButton
+      // 
+      this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.loadButton.Location = new System.Drawing.Point(519, 6);
+      this.loadButton.Name = "loadButton";
+      this.loadButton.Size = new System.Drawing.Size(75, 23);
+      this.loadButton.TabIndex = 0;
+      this.loadButton.Text = "&Load...";
+      this.loadButton.UseVisualStyleBackColor = true;
+      this.loadButton.Click += new System.EventHandler(this.loadButton_Click);
+      // 
+      // builtinTabPage
+      // 
+      this.builtinTabPage.Controls.Add(this.builtinOperatorsGroupBox);
+      this.builtinTabPage.Location = new System.Drawing.Point(4, 22);
+      this.builtinTabPage.Name = "builtinTabPage";
+      this.builtinTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.builtinTabPage.Size = new System.Drawing.Size(600, 396);
+      this.builtinTabPage.TabIndex = 1;
+      this.builtinTabPage.Text = "Built-In";
+      this.builtinTabPage.UseVisualStyleBackColor = true;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "library";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Open file ...";
+      // 
+      // AvailableOperatorsForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(632, 446);
+      this.Controls.Add(this.tabControl);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "AvailableOperatorsForm";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Available Operators";
+      this.builtinOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      this.splitContainer2.Panel2.PerformLayout();
+      this.splitContainer2.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.operatorLibrariesTabPage.ResumeLayout(false);
+      this.operatorLibrariesTabPage.PerformLayout();
+      this.operatorLibraryOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.Panel2.PerformLayout();
+      this.splitContainer1.ResumeLayout(false);
+      this.builtinTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox builtinOperatorsGroupBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorLibrariesTabPage;
+    private System.Windows.Forms.TabPage builtinTabPage;
+    private System.Windows.Forms.TextBox operatorLibraryTextBox;
+    private System.Windows.Forms.Label operatorLibraryLabel;
+    private System.Windows.Forms.GroupBox operatorLibraryOperatorsGroupBox;
+    private System.Windows.Forms.TreeView operatorLibraryOperatorsTreeView;
+    private System.Windows.Forms.Button loadButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.TreeView builtinOperatorsTreeView;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private System.Windows.Forms.TextBox builtinOperatorsDescriptionTextBox;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.TextBox operatorLibraryOperatorsDescriptionTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.cs	(revision 2)
@@ -0,0 +1,164 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.OptimizationFrontend {
+  public partial class AvailableOperatorsForm : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    private IOperatorLibrary operatorLibrary;
+
+    public AvailableOperatorsForm() {
+      InitializeComponent();
+      operatorLibrary = null;
+      TreeNodeSorter nodeSorter = new TreeNodeSorter();
+      operatorLibraryOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+      builtinOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      PluginInfo[] plugins = discoveryService.Plugins;
+      foreach(PluginInfo plugin in plugins) {
+        TreeNode pluginItem = new TreeNode();
+        pluginItem.Text = plugin.Name;
+        pluginItem.Tag = plugin;
+
+        Type[] operators = discoveryService.GetTypes(typeof(IOperator), plugin);
+        foreach(Type type in operators) {
+          if(!type.IsAbstract) {
+            TreeNode operatorItem = new TreeNode();
+            operatorItem.Text = type.Name;
+            operatorItem.Tag = type;
+            pluginItem.Nodes.Add(operatorItem);
+          }
+        }
+        // add plugin node only if it contains operators
+        if(pluginItem.Nodes.Count > 0) {
+          builtinOperatorsTreeView.Nodes.Add(pluginItem);
+        }
+      }
+      if (builtinOperatorsTreeView.Nodes.Count == 0) {
+        builtinOperatorsTreeView.Enabled = false;
+        builtinOperatorsTreeView.Nodes.Add("No operators available");
+      }
+      builtinOperatorsTreeView.Sort();
+    }
+
+    private void UpdateOperatorsTreeView() {
+      operatorLibraryOperatorsTreeView.Nodes.Clear();
+      operatorLibraryOperatorsTreeView.Nodes.Add(CreateTreeNode(operatorLibrary.Group));
+      operatorLibraryOperatorsTreeView.Sort();
+    }
+
+    private TreeNode CreateTreeNode(IOperatorGroup group) {
+      TreeNode node = new TreeNode();
+      node.Text = group.Name;
+      node.ForeColor = Color.LightGray;
+      node.Tag = group;
+
+      foreach (IOperator op in group.Operators)
+        node.Nodes.Add(CreateTreeNode(op));
+      foreach (IOperatorGroup subGroup in group.SubGroups)
+        node.Nodes.Add(CreateTreeNode(subGroup));
+      return node;
+    }
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.ToolTipText = op.GetType().Name;
+      node.Tag = op;
+      return node;
+    }
+
+    #region Selection Events
+    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      operatorLibraryOperatorsDescriptionTextBox.Text = "";
+      if ((operatorLibraryOperatorsTreeView.SelectedNode != null) && (operatorLibraryOperatorsTreeView.SelectedNode.Tag is IOperator))
+        operatorLibraryOperatorsDescriptionTextBox.Text = ((IOperator)operatorLibraryOperatorsTreeView.SelectedNode.Tag).Description;
+    }
+    private void builtinOperatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      builtinOperatorsDescriptionTextBox.Text = "";
+      if ((builtinOperatorsTreeView.SelectedNode != null) && (builtinOperatorsTreeView.SelectedNode.Tag is Type))
+        builtinOperatorsDescriptionTextBox.Text = ((IOperator)Activator.CreateInstance((Type)builtinOperatorsTreeView.SelectedNode.Tag)).Description;
+    }
+    #endregion
+
+    #region Click Events
+    private void loadButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        operatorLibrary = (IOperatorLibrary)PersistenceManager.Load(openFileDialog.FileName);
+        operatorLibraryTextBox.Text = openFileDialog.FileName;
+        toolTip.SetToolTip(operatorLibraryTextBox, openFileDialog.FileName);
+        operatorLibraryOperatorsGroupBox.Enabled = true;
+        UpdateOperatorsTreeView();
+      }
+    }
+    private void closeButton_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void operatorLibraryOperatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = e.Item as TreeNode;
+      if ((node != null) && (node.Tag is IOperator)) {
+        IOperator op = (IOperator)node.Tag;
+        op = (IOperator)op.Clone();
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", operatorLibraryOperatorsTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    private void builtinOperatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = e.Item as TreeNode;
+      if ((node != null) && (node.Tag is Type)) {
+        IOperator op = (IOperator)Activator.CreateInstance((Type)node.Tag);
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", builtinOperatorsTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/AvailableOperatorsForm.resx	(revision 2)
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>141, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAQAEBAQAAAABAAoAQAARgAAACAgEAAAAAQA6AIAAG4BAAAQEAAAAAAYAGgDAABWBAAAICAAAAAA
+        GACoDAAAvgcAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+        AAAAAHZgAREQAAAAeGAJERAAAAB4YAkREAAAAHhwBxEQAAAAeHAHERAAAAd4dwd3EAAAdwCHeHcQAACA
+        hwh4iBAAAICAeHF3EAAAeICHcIYAAAAAAAhwhwBwAAAACIeHd3AAAAAIBwiHgAAAAAiAd3gAAAAAAAAA
+        AAD//wAA8YcAAPGHAADxhwAA8YcAAPGHAADghwAAzAcAANIHAADUBwAAxE8AAP5FAAD+AQAA/qEAAP5D
+        AAD//wAAKAAAACAAAABAAAAAAQAEAAAAAAAAAgAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAIAAAIAAAACA
+        gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3AAAREREAAAAAAAAAAAcIhgAAkRERAAAAAAAAAAAHCI
+        YAAJeZEQAAAAAAAAAABwiGAACXmREAAAAAAAAAAAcIhwAAl5kRAAAAAAAAAAAHCIcAAJeZEQAAAAAAAA
+        AACAiHAACXmREAAAAAAAAAAAgIhwAAd5mRAAAAAAAAAAAICIcAAHd3cQAAAAAAAAAACAiHAAB4d3EAAA
+        AAAAAAAHgIh3AAeHdxAAAAAAAAAAd4CId3AHh3cQAAAAAAAAB3iACIdnB4h3UAAAAAAAAAeAAAAIdweI
+        h3AAAAAAAAAIAId3AHYIiIdwAAAAAAAACAh3B4CGCIiHcAAAAAAAAAgIcACAhwgACHAAAAAAAAAIAIcH
+        AIcId3RwAAAAAAAACIAHAAh3CHh0gAAAAAAAAAB4dwh3cAh4dIAAAAAAAAAAAAAAAAAAeHYAAGAAAAAA
+        AAAAAHd3BniHYGZgAAAAAAAAAAB4h3eIh3d3cAAAAAAAAAAAcIiIiId3h3AAAAAAAAAAAHAIiACIiHdw
+        AAAAAAAAAABwCIgAAAd3AAAAAAAAAAAAd3d4d3d3cAAAAAAAAAAAAAAAB3d3dwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////weB//9Hgf//R4H//0eB//9Hgf//R4H//0eB//9H
+        gf//R4H//0eB//5Dgf/8QYH/+GCB//n4gf/7DIH/+iSB//p0uf/7LIH/+biB//whgf///8Pf//CBH//w
+        AB//9AAf//YwH//2Pj//8AB///+A////////////KAAAABAAAAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAALVxT7FgOaVYMgAAAAAAAC8UjigRgCgRgC8UjgAAAAAAAAAAAAAAAAAAAAAAAAAAALtw
+        TP+zi6pdOAAAAAAAACwyzi0Tjy0Tjy4TjgAAAAAAAAAAAAAAAAAAAAAAAAAAAMR2Uf+4lK9iPAAAAAAA
+        AD9F0zMgnjMgni4TjgAAAAAAAAAAAAAAAAAAAAAAAAAAAMp9WP++nrZoQwAAAAAAAFJY2DgurTgurS4T
+        jgAAAAAAAAAAAAAAAAAAAAAAAAAAAM+DX/7Gqb5xSwAAAAAAAGds3z49vz49vy4TjgAAAAAAAAAAAAAA
+        AAAAAAAAALhvTdWKZv/NtLd0U7hvTQAAAHuA5ENMzkNMzjMgngAAAAAAAAAAAAAAAAAAALhvTdyTcf3h
+        0v3h0v3Uvq1pSLhvTY6T6UhZ3UhZ3TMgngAAAAAAAAAAAAAAAAAAAOagfv3y6/bVxNGLa/vu5v3Yw7hv
+        TZ6j7sPK+KGt9DMgngAAAAAAAAAAAAAAAAAAAOGff/vu5uGaeAAAANWLZ+XEs793Vi8UjntvZWNTQy8U
+        jgAAAAAAAAAAAAAAAAAAALhvTemhf+effQAAAOCZeL55WLhvTQAAAMG5sVlLPAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAK+jmX1tXwAAALSpoWNTQyojHAAAAG5cSwAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAMnAuLaqmmNTQ7a5spyUiVpVUW5cS6OalAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMnAuPTw
+        6XxyaOrs5dHLwq2nonp1cb6soQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnSzby0rAAAAKegl5CKgm1o
+        Yr6soQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        AADxhwAA8YcAAPGHAADxhwAA8YcAAOCHAADABwAAwAcAAMQHAADETwAA/kUAAP4BAAD+AQAA/kMAAP//
+        AAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAoYh4eWBNdlxIclhEoYh4AAAAAAAAAAAAAAAAGR+sLyVtKyFqKR5oJhtk
+        HBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIFv7eXi
+        08K4vKSVZEk0AAAAAAAAAAAAAAAAISfKGR+sGB2rFxyqFhuqHBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoYd1AAAA08G5vKSVZ0w4AAAAAAAAAAAAAAAAJyzL
+        TFHWFx3HFBnGGiCtHBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAp418AAAA08G4vKOWalA8AAAAAAAAAAAAAAAALDLNU1fYHiTKGiDIICWwHBBaAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArpSEAAAA08G4vKOVb1RBAAAA
+        AAAAAAAAAAAAMzjPWl7ZJi3LISfKJiu0HBBaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAtZuMAAAA08K4vKOWdFpGAAAAAAAAAAAAAAAAOkDRYmbcMDbPKjDNLDK4
+        HhNcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKOXAAAA
+        08K4vKOWeGBMAAAAAAAAAAAAAAAAQUfTam/eOkDRNDnPNDm9IhdgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwqygAAAA08G5u6SWf2VSAAAAAAAAAAAAAAAASE7V
+        dHjhRkvVP0XTOj/BJxxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAybSpAAAA08G4vKOVg2tZAAAAAAAAAAAAAAAAUFXXfIDjUVfYS1DWQUfFLCNrAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0L20AAAA08G5vKOWinFgAAAA
+        AAAAAAAAAAAAV1zahormXmPbVlzaSU7KMilxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAoYh42Mi/AAAA2srDvKOVkHlnoYh4AAAAAAAAAAAAX2TckJPnaW/fY2jdUFXO
+        ODF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoYh4l39u2Mi/AAAA
+        4NLMxrGml39ufmNRoYh4AAAAAAAAZmzemp3rdnrjb3TgVlvTPzh/AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAoYh4l39uzLet2snDAAAA6+Lf39XQ1srDoIt8Y0gznIJwAAAAb3Th
+        oqbtgYbmeoDkW2HXRkCGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp5WJ
+        yLeu7+nlAAAAAAAAAAAAAAAA7+nl0sa+n4h6jnprAAAAdnvjrK7vjJHphovoYGbaTUiOAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwK6k7eXiAAAA08G4iXNiiXNirZyP/Pz87+nl
+        qZOGaEw4AAAAfYPltLfylpvskJXqZWvcVVGWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAx7OpAAAA3tTPdVtHoYh4AAAAoYh44NfTAAAAtaCUblRAAAAAhYrnvL/0ubvytLfxZWvc
+        XFqeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzLmvAAAA2M3HdVtHAAAA
+        AAAAAAAAzsG4AAAAtaCUd11KAAAAhYrn7Oz74uP62tv4tLfxXFqeAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAxbClAAAAAAAAtaCUdVtHAAAAk3xrAAAAAAAAtaCUo5GDAAAAo6bu
+        jHt3qZ2WjIF7TD83fXy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuqKV
+        y7itAAAAAAAAdVtHAAAAAAAAAAAAxLetqZSGm4JxAAAAubvyh3Rp2NTRloyHTD83ubvyAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoYh4xrKnsZqNpIt7AAAAxrKnsZqNo4p6
+        oYh4AAAAAAAAubvyl4aC3NfVm5GKTEA5ubvyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouA4dvao5iQVEdA
+        AAAAAAAAAAAAAAAAT0I5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAnouAhHFlfWlfnouAAAAAT0I5ppOJz8bDrKCYYVNLT0I5AAAAT0I5T0I5WEk/AAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouA2tHNxr+5o46EkH1xp5iQ
+        sZ+U2M/JvK+pe2phW01EW01EW01EW01EXE9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAnouAAAAA5d7a0MS94dXOx7eu5tzX283G0L61o46EkH1xhHFlv7axZ1xV
+        XVZTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouAAAAA
+        7ejm4tzZ0MS94dXO/fz79fDu3tHKy7etv6ea49vXi3tydWpmbmZiAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnouAAAAAAAAArKShwrm03c/H+/n5/f388+/s8ezp
+        6+TgloqDkoR+fnVxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAnouAnouAnouAlI2KlY6K3dTQpZ6apJyYoZiUnpWRloyJiYF9hX15AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlY6L
+        lo+LlY6LlI2KkoqHj4eEi4N/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+        ////B4H//weB//9Hgf//R4H//0eB//9Hgf//R4H//0eB//9Hgf//R4H//kOB//xBgf/4QIH/+PCB//kA
+        gf/6JIH/+nSB//ssgf/5uIH//CGB////w9//8IEf//AAH//0AB//9AAf//YAP//wAH///4D/////////
+        //8=
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.Designer.cs	(revision 2)
@@ -0,0 +1,84 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationFrontend {
+  partial class EditorForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (Editor != null) {
+        Editor.CaptionChanged -= new System.EventHandler(Editor_CaptionChanged);
+        Editor.FilenameChanged -= new System.EventHandler(Editor_FilenameChanged);
+      }
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditorForm));
+      this.editorPanel = new System.Windows.Forms.Panel();
+      this.SuspendLayout();
+      // 
+      // editorPanel
+      // 
+      this.editorPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.editorPanel.Location = new System.Drawing.Point(12, 12);
+      this.editorPanel.Name = "editorPanel";
+      this.editorPanel.Size = new System.Drawing.Size(608, 422);
+      this.editorPanel.TabIndex = 0;
+      // 
+      // EditorForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(632, 446);
+      this.Controls.Add(this.editorPanel);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "EditorForm";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Editor";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Panel editorPanel;
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.cs	(revision 2)
@@ -0,0 +1,81 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.OptimizationFrontend {
+  public partial class EditorForm : Form {
+    private IEditor myEditor;
+    public IEditor Editor {
+      get { return myEditor; }
+    }
+
+    public EditorForm() {
+      InitializeComponent();
+    }
+    public EditorForm(IEditor editor)
+      : this() {
+      myEditor = editor;
+      if (Editor != null) {
+        Control control = (Control)Editor;
+        control.Dock = DockStyle.Fill;
+        editorPanel.Controls.Add(control);
+        Editor.CaptionChanged += new EventHandler(Editor_CaptionChanged);
+        Editor.FilenameChanged += new EventHandler(Editor_FilenameChanged);
+        UpdateText();
+      } else {
+        Label errorLabel = new Label();
+        errorLabel.Name = "errorLabel";
+        errorLabel.Text = "No editor available";
+        errorLabel.AutoSize = false;
+        errorLabel.Dock = DockStyle.Fill;
+        editorPanel.Controls.Add(errorLabel);
+      }
+    }
+
+    private void UpdateText() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateText));
+      else {
+        if (Editor.Filename == null)
+          Text = "Untitled - " + Editor.Caption;
+        else
+          Text = Editor.Filename + " - " + Editor.Caption;
+      }
+    }
+
+    #region Editor Events
+    private void Editor_FilenameChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    private void Editor_CaptionChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/EditorForm.resx	(revision 2)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLab.OptimizationFrontend.csproj
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLab.OptimizationFrontend.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLab.OptimizationFrontend.csproj	(revision 2)
@@ -0,0 +1,140 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C2FB432A-07CA-45B5-BAFE-FEC172D1107B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.OptimizationFrontend</RootNamespace>
+    <AssemblyName>HeuristicLab.OptimizationFrontend</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.OptimizationFrontend.xml</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AboutDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AboutDialog.Designer.cs">
+      <DependentUpon>AboutDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="AvailableOperatorsForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AvailableOperatorsForm.Designer.cs">
+      <DependentUpon>AvailableOperatorsForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EditorForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="EditorForm.Designer.cs">
+      <DependentUpon>EditorForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabOptimizationFrontendApplication.cs" />
+    <Compile Include="HeuristicLabOptimizationFrontendPlugin.cs" />
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ViewForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ViewForm.Designer.cs">
+      <DependentUpon>ViewForm.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\HeuristicLab.ico" />
+    <Content Include="Resources\Logo_gray.gif" />
+    <Content Include="Resources\New.png" />
+    <Content Include="Resources\Open.png" />
+    <Content Include="Resources\Save.png" />
+    <Content Include="Resources\SaveAll.png" />
+    <Content Include="Resources\Tools.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AboutDialog.resx">
+      <DependentUpon>AboutDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AvailableOperatorsForm.resx">
+      <DependentUpon>AvailableOperatorsForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditorForm.resx">
+      <DependentUpon>EditorForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ViewForm.resx">
+      <DependentUpon>ViewForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLabOptimizationFrontendApplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLabOptimizationFrontendApplication.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLabOptimizationFrontendApplication.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.OptimizationFrontend {
+  [ClassInfo(Name = "HeuristicLab 3.0", Description="Next generation heuristic optimization environment.")]
+  class HeuristicLabOptimizationFrontendApplication : ApplicationBase {
+    public override void Run() {
+      Form mainForm = new MainForm();
+      PluginManager.ControlManager = (IControlManager)mainForm;
+      Application.Run(mainForm);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLabOptimizationFrontendPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLabOptimizationFrontendPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/HeuristicLabOptimizationFrontendPlugin.cs	(revision 2)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.OptimizationFrontend {
+  [ClassInfo(Name = "HeuristicLab.OptimizationFrontend")]
+  [PluginFile(Filename = "HeuristicLab.OptimizationFrontend.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  public class HeuristicLabOptimizationFrontendPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.Designer.cs	(revision 2)
@@ -0,0 +1,390 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationFrontend {
+  partial class MainForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+      this.menuStrip = new System.Windows.Forms.MenuStrip();
+      this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.closeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+      this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.availableOperatorsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collectGarbageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.windowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.cascadeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.tileHorizontallyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.tileVerticallyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.statusStrip = new System.Windows.Forms.StatusStrip();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.toolStrip = new System.Windows.Forms.ToolStrip();
+      this.newToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
+      this.openToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.saveToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.saveAllToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.menuStrip.SuspendLayout();
+      this.toolStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // menuStrip
+      // 
+      this.menuStrip.AllowMerge = false;
+      this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileToolStripMenuItem,
+            this.viewToolStripMenuItem,
+            this.toolsToolStripMenuItem,
+            this.windowToolStripMenuItem,
+            this.helpToolStripMenuItem});
+      this.menuStrip.Location = new System.Drawing.Point(0, 0);
+      this.menuStrip.Name = "menuStrip";
+      this.menuStrip.ShowItemToolTips = true;
+      this.menuStrip.Size = new System.Drawing.Size(792, 24);
+      this.menuStrip.TabIndex = 0;
+      // 
+      // fileToolStripMenuItem
+      // 
+      this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripMenuItem,
+            this.openToolStripMenuItem,
+            this.saveToolStripMenuItem,
+            this.saveAsToolStripMenuItem,
+            this.saveAllToolStripMenuItem,
+            this.closeToolStripMenuItem,
+            this.closeAllToolStripMenuItem,
+            this.toolStripMenuItem1,
+            this.exitToolStripMenuItem});
+      this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+      this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20);
+      this.fileToolStripMenuItem.Text = "&File";
+      // 
+      // newToolStripMenuItem
+      // 
+      this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+      this.newToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.newToolStripMenuItem.Text = "&New";
+      // 
+      // openToolStripMenuItem
+      // 
+      this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+      this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+      this.openToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.openToolStripMenuItem.Text = "&Open...";
+      this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+      // 
+      // saveToolStripMenuItem
+      // 
+      this.saveToolStripMenuItem.Enabled = false;
+      this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+      this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+      this.saveToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveToolStripMenuItem.Text = "&Save";
+      this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+      // 
+      // saveAsToolStripMenuItem
+      // 
+      this.saveAsToolStripMenuItem.Enabled = false;
+      this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+      this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveAsToolStripMenuItem.Text = "Save &As...";
+      this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
+      // 
+      // saveAllToolStripMenuItem
+      // 
+      this.saveAllToolStripMenuItem.Enabled = false;
+      this.saveAllToolStripMenuItem.Name = "saveAllToolStripMenuItem";
+      this.saveAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+                  | System.Windows.Forms.Keys.S)));
+      this.saveAllToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveAllToolStripMenuItem.Text = "Save Al&l";
+      this.saveAllToolStripMenuItem.Click += new System.EventHandler(this.saveAllToolStripMenuItem_Click);
+      // 
+      // closeToolStripMenuItem
+      // 
+      this.closeToolStripMenuItem.Enabled = false;
+      this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
+      this.closeToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.closeToolStripMenuItem.Text = "&Close";
+      this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
+      // 
+      // closeAllToolStripMenuItem
+      // 
+      this.closeAllToolStripMenuItem.Enabled = false;
+      this.closeAllToolStripMenuItem.Name = "closeAllToolStripMenuItem";
+      this.closeAllToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.closeAllToolStripMenuItem.Text = "Clos&e All";
+      this.closeAllToolStripMenuItem.Click += new System.EventHandler(this.closeAllToolStripMenuItem_Click);
+      // 
+      // toolStripMenuItem1
+      // 
+      this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(188, 6);
+      // 
+      // exitToolStripMenuItem
+      // 
+      this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.exitToolStripMenuItem.Text = "E&xit";
+      this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.availableOperatorsToolStripMenuItem});
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(41, 20);
+      this.viewToolStripMenuItem.Text = "&View";
+      // 
+      // availableOperatorsToolStripMenuItem
+      // 
+      this.availableOperatorsToolStripMenuItem.Name = "availableOperatorsToolStripMenuItem";
+      this.availableOperatorsToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+      this.availableOperatorsToolStripMenuItem.Text = "Available &Operators...";
+      this.availableOperatorsToolStripMenuItem.Click += new System.EventHandler(this.availableOperatorsToolStripMenuItem_Click);
+      // 
+      // toolsToolStripMenuItem
+      // 
+      this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.collectGarbageToolStripMenuItem});
+      this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem";
+      this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+      this.toolsToolStripMenuItem.Text = "&Tools";
+      // 
+      // collectGarbageToolStripMenuItem
+      // 
+      this.collectGarbageToolStripMenuItem.Name = "collectGarbageToolStripMenuItem";
+      this.collectGarbageToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+      this.collectGarbageToolStripMenuItem.Text = "Collect &Garbage";
+      this.collectGarbageToolStripMenuItem.Click += new System.EventHandler(this.collectGarbageToolStripMenuItem_Click);
+      // 
+      // windowToolStripMenuItem
+      // 
+      this.windowToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.cascadeToolStripMenuItem,
+            this.tileHorizontallyToolStripMenuItem,
+            this.tileVerticallyToolStripMenuItem});
+      this.windowToolStripMenuItem.Name = "windowToolStripMenuItem";
+      this.windowToolStripMenuItem.Size = new System.Drawing.Size(57, 20);
+      this.windowToolStripMenuItem.Text = "&Window";
+      // 
+      // cascadeToolStripMenuItem
+      // 
+      this.cascadeToolStripMenuItem.Enabled = false;
+      this.cascadeToolStripMenuItem.Name = "cascadeToolStripMenuItem";
+      this.cascadeToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+      this.cascadeToolStripMenuItem.Text = "&Cascade";
+      this.cascadeToolStripMenuItem.Click += new System.EventHandler(this.cascadeToolStripMenuItem_Click);
+      // 
+      // tileHorizontallyToolStripMenuItem
+      // 
+      this.tileHorizontallyToolStripMenuItem.Enabled = false;
+      this.tileHorizontallyToolStripMenuItem.Name = "tileHorizontallyToolStripMenuItem";
+      this.tileHorizontallyToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+      this.tileHorizontallyToolStripMenuItem.Text = "Tile &Horizontally";
+      this.tileHorizontallyToolStripMenuItem.Click += new System.EventHandler(this.tileHorizontallyToolStripMenuItem_Click);
+      // 
+      // tileVerticallyToolStripMenuItem
+      // 
+      this.tileVerticallyToolStripMenuItem.Enabled = false;
+      this.tileVerticallyToolStripMenuItem.Name = "tileVerticallyToolStripMenuItem";
+      this.tileVerticallyToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+      this.tileVerticallyToolStripMenuItem.Text = "Tile &Vertically";
+      this.tileVerticallyToolStripMenuItem.Click += new System.EventHandler(this.tileVerticallyToolStripMenuItem_Click);
+      // 
+      // helpToolStripMenuItem
+      // 
+      this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.aboutToolStripMenuItem});
+      this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+      this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20);
+      this.helpToolStripMenuItem.Text = "&Help";
+      // 
+      // aboutToolStripMenuItem
+      // 
+      this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+      this.aboutToolStripMenuItem.Text = "&About";
+      this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+      // 
+      // statusStrip
+      // 
+      this.statusStrip.Location = new System.Drawing.Point(0, 544);
+      this.statusStrip.Name = "statusStrip";
+      this.statusStrip.Size = new System.Drawing.Size(792, 22);
+      this.statusStrip.TabIndex = 1;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "item";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Open file ...";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.DefaultExt = "hl";
+      this.saveFileDialog.FileName = "item";
+      this.saveFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.saveFileDialog.Title = "Save file as ...";
+      // 
+      // toolStrip
+      // 
+      this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripDropDownButton,
+            this.openToolStripButton,
+            this.saveToolStripButton,
+            this.saveAllToolStripButton});
+      this.toolStrip.Location = new System.Drawing.Point(0, 24);
+      this.toolStrip.Name = "toolStrip";
+      this.toolStrip.Size = new System.Drawing.Size(792, 25);
+      this.toolStrip.TabIndex = 3;
+      this.toolStrip.Text = "toolStrip";
+      // 
+      // newToolStripDropDownButton
+      // 
+      this.newToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.newToolStripDropDownButton.Image = global::HeuristicLab.OptimizationFrontend.Properties.Resources.New;
+      this.newToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.newToolStripDropDownButton.Name = "newToolStripDropDownButton";
+      this.newToolStripDropDownButton.Size = new System.Drawing.Size(29, 22);
+      this.newToolStripDropDownButton.Text = "New...";
+      // 
+      // openToolStripButton
+      // 
+      this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.openToolStripButton.Image = global::HeuristicLab.OptimizationFrontend.Properties.Resources.Open;
+      this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.openToolStripButton.Name = "openToolStripButton";
+      this.openToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.openToolStripButton.Text = "Open...";
+      this.openToolStripButton.Click += new System.EventHandler(this.openToolStripButton_Click);
+      // 
+      // saveToolStripButton
+      // 
+      this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.saveToolStripButton.Enabled = false;
+      this.saveToolStripButton.Image = global::HeuristicLab.OptimizationFrontend.Properties.Resources.Save;
+      this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.saveToolStripButton.Name = "saveToolStripButton";
+      this.saveToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.saveToolStripButton.Text = "Save";
+      this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripButton_Click);
+      // 
+      // saveAllToolStripButton
+      // 
+      this.saveAllToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.saveAllToolStripButton.Enabled = false;
+      this.saveAllToolStripButton.Image = global::HeuristicLab.OptimizationFrontend.Properties.Resources.SaveAll;
+      this.saveAllToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.saveAllToolStripButton.Name = "saveAllToolStripButton";
+      this.saveAllToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.saveAllToolStripButton.Text = "Save all";
+      this.saveAllToolStripButton.Click += new System.EventHandler(this.saveAllToolStripButton_Click);
+      // 
+      // MainForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(792, 566);
+      this.Controls.Add(this.toolStrip);
+      this.Controls.Add(this.statusStrip);
+      this.Controls.Add(this.menuStrip);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.IsMdiContainer = true;
+      this.MainMenuStrip = this.menuStrip;
+      this.Name = "MainForm";
+      this.Text = "HeuristicLab";
+      this.MdiChildActivate += new System.EventHandler(this.MainForm_MdiChildActivate);
+      this.menuStrip.ResumeLayout(false);
+      this.menuStrip.PerformLayout();
+      this.toolStrip.ResumeLayout(false);
+      this.toolStrip.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.MenuStrip menuStrip;
+    private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+    private System.Windows.Forms.StatusStrip statusStrip;
+    private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+    private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem windowToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem cascadeToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem tileHorizontallyToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem tileVerticallyToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem closeAllToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem saveAllToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem collectGarbageToolStripMenuItem;
+    private System.Windows.Forms.ToolStrip toolStrip;
+    private System.Windows.Forms.ToolStripDropDownButton newToolStripDropDownButton;
+    private System.Windows.Forms.ToolStripButton openToolStripButton;
+    private System.Windows.Forms.ToolStripButton saveToolStripButton;
+    private System.Windows.Forms.ToolStripButton saveAllToolStripButton;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem availableOperatorsToolStripMenuItem;
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.cs	(revision 2)
@@ -0,0 +1,300 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.OptimizationFrontend {
+  public partial class MainForm : Form, IControlManager {
+    #region Inner Types
+    private class Task {
+      public string filename;
+      public IStorable storable;
+      public IEditor editor;
+
+      private Task() { }
+      public Task(string filename, IStorable storable, IEditor editor) {
+        this.filename = filename;
+        this.storable = storable;
+        this.editor = editor;
+      }
+    }
+    #endregion
+
+    private object locker;
+    private int runningTasks;
+
+    public MainForm() {
+      InitializeComponent();
+
+      locker = new object();
+      runningTasks = 0;
+
+      DiscoveryService discoveryService = new DiscoveryService();
+
+      // discover creatable items
+      Type[] creatables = discoveryService.GetTypes(typeof(IEditable));
+      string[] names = new string[creatables.Length];
+      for (int i = 0; i < creatables.Length; i++)
+        names[i] = creatables[i].Name;
+      Array.Sort(names, creatables);
+      foreach (Type type in creatables) {
+        if (!type.IsAbstract) {
+          ToolStripMenuItem item = new ToolStripMenuItem();
+          item.Tag = type;
+          item.Text = "&" + type.Name + "...";
+          item.Click += new EventHandler(newToolStripMenuItem_Click);
+          newToolStripMenuItem.DropDownItems.Add(item);
+
+          item = new ToolStripMenuItem();
+          item.Tag = type;
+          item.Text = "&" + type.Name + "...";
+          item.Click += new EventHandler(newToolStripMenuItem_Click);
+          newToolStripDropDownButton.DropDownItems.Add(item);
+        }
+      }
+    }
+
+    #region IControlManager Members
+    public void ShowControl(IControl control) {
+      if (control is IEditor) {
+        EditorForm form = new EditorForm((IEditor)control);
+        form.MdiParent = this;
+        form.Show();
+      } else if (control is IView) {
+        ViewForm form = new ViewForm((IView)control);
+        form.MdiParent = this;
+        form.Show();
+      } else {
+        throw new InvalidOperationException("Control is neither a view nor an editor.");
+      }
+    }
+    #endregion
+
+    private void EnableDisableItems() {
+      closeToolStripMenuItem.Enabled = false;
+      closeAllToolStripMenuItem.Enabled = false;
+      saveToolStripMenuItem.Enabled = false;
+      saveToolStripButton.Enabled = false;
+      saveAsToolStripMenuItem.Enabled = false;
+      saveAllToolStripMenuItem.Enabled = false;
+      saveAllToolStripButton.Enabled = false;
+      cascadeToolStripMenuItem.Enabled = false;
+      tileHorizontallyToolStripMenuItem.Enabled = false;
+      tileVerticallyToolStripMenuItem.Enabled = false;
+
+      if (ActiveMdiChild != null) {
+        closeToolStripMenuItem.Enabled = true;
+        closeAllToolStripMenuItem.Enabled = true;
+        saveAllToolStripMenuItem.Enabled = true;
+        saveAllToolStripButton.Enabled = true;
+        cascadeToolStripMenuItem.Enabled = true;
+        tileHorizontallyToolStripMenuItem.Enabled = true;
+        tileVerticallyToolStripMenuItem.Enabled = true;
+        EditorForm form = ActiveMdiChild as EditorForm;
+        if (form != null){
+          if (((Control)form.Editor).Enabled) {
+            saveToolStripMenuItem.Enabled = true;
+            saveToolStripButton.Enabled = true;
+            saveAsToolStripMenuItem.Enabled = true;
+          } else {
+            closeToolStripMenuItem.Enabled = false;
+            closeAllToolStripMenuItem.Enabled = false;
+          }
+        }
+      }
+    }
+
+    #region Open and Save Methods
+    private void Open() {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        lock (locker) runningTasks++;
+        Cursor = Cursors.AppStarting;
+        Task task = new Task(openFileDialog.FileName, null, null);
+        ThreadPool.QueueUserWorkItem(new WaitCallback(AsynchronousLoad), task);
+      }
+    }
+    private void AsynchronousLoad(object state) {
+      Task task = (Task)state;
+      task.storable = PersistenceManager.Load(task.filename);
+      LoadFinished(task);
+    }
+    private delegate void TaskFinishedDelegate(Task task);
+    private void LoadFinished(Task task) {
+      if (InvokeRequired)
+        Invoke(new TaskFinishedDelegate(LoadFinished), task);
+      else {
+        IEditor editor = null;
+        if (task.storable != null) {
+          IEditable editable = task.storable as IEditable;
+          if (editable != null)
+            editor = editable.CreateEditor();
+        }
+        if (editor == null)
+          MessageBox.Show("Could not open item. The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        else {
+          editor.Filename = task.filename;
+          PluginManager.ControlManager.ShowControl(editor);
+        }
+        lock (locker) {
+          runningTasks--;
+          if (runningTasks == 0)
+            Cursor = Cursors.Default;
+        }
+      }
+    }
+    private void Save(EditorForm form) {
+      if (form.Editor.Filename == null)
+        SaveAs(form);
+      else {
+        lock (locker) runningTasks++;
+        Cursor = Cursors.AppStarting;
+        ((Control)form.Editor).Enabled = false;
+        EnableDisableItems();
+        Task task = new Task(form.Editor.Filename, form.Editor.Item, form.Editor);
+        ThreadPool.QueueUserWorkItem(new WaitCallback(AsynchronousSave), task);
+      }
+    }
+    private void SaveAs(EditorForm form) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        form.Editor.Filename = saveFileDialog.FileName;
+        Save(form);
+      }
+    }
+    private void AsynchronousSave(object state) {
+      Task task = (Task)state;
+      PersistenceManager.Save(task.storable, task.filename);
+      SaveFinished(task);
+    }
+    private void SaveFinished(Task task) {
+      if (InvokeRequired)
+        Invoke(new TaskFinishedDelegate(SaveFinished), task);
+      else {
+        ((Control)task.editor).Enabled = true;
+        EnableDisableItems();
+        lock (locker) {
+          runningTasks--;
+          if (runningTasks == 0)
+            Cursor = Cursors.Default;
+        }
+      }
+    }
+    #endregion
+
+    private void MainForm_MdiChildActivate(object sender, EventArgs e) {
+      EnableDisableItems();
+    }
+
+    #region Menu Events
+    private void newToolStripMenuItem_Click(object sender, EventArgs e) {
+      ToolStripItem item = (ToolStripItem)sender;
+      Type type = (Type)item.Tag;
+      IEditable editable = (IEditable)Activator.CreateInstance(type);
+      if (editable == null) {
+        MessageBox.Show("The selected item is not editable.", "Editable Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+      } else {
+        IEditor editor = editable.CreateEditor();
+        if (editor == null) {
+          MessageBox.Show("The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        } else {
+          PluginManager.ControlManager.ShowControl(editor);
+          EnableDisableItems();
+        }
+      }
+    }
+    private void openToolStripMenuItem_Click(object sender, EventArgs e) {
+      Open();
+    }
+    private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
+      EditorForm form = ActiveMdiChild as EditorForm;
+      Save(form);
+    }
+    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) {
+      EditorForm form = ActiveMdiChild as EditorForm;
+      SaveAs(form);
+    }
+    private void saveAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      for (int i = 0; i < MdiChildren.Length; i++) {
+        EditorForm form = MdiChildren[i] as EditorForm;
+        if (((Control)form.Editor).Enabled) Save(form);
+      }
+    }
+    private void closeToolStripMenuItem_Click(object sender, EventArgs e) {
+      ActiveMdiChild.Close();
+      EnableDisableItems();
+    }
+    private void closeAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      while (MdiChildren.Length > 0)
+        MdiChildren[0].Close();
+      EnableDisableItems();
+    }
+    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
+      Application.Exit();
+    }
+    private void availableOperatorsToolStripMenuItem_Click(object sender, EventArgs e) {
+      AvailableOperatorsForm form = new AvailableOperatorsForm();
+      form.MdiParent = this;
+      form.Show();
+    }
+    private void collectGarbageToolStripMenuItem_Click(object sender, EventArgs e) {
+      GC.Collect();
+    }
+    private void cascadeToolStripMenuItem_Click(object sender, EventArgs e) {
+      LayoutMdi(MdiLayout.Cascade);
+    }
+    private void tileHorizontallyToolStripMenuItem_Click(object sender, EventArgs e) {
+      LayoutMdi(MdiLayout.TileHorizontal);
+    }
+    private void tileVerticallyToolStripMenuItem_Click(object sender, EventArgs e) {
+      LayoutMdi(MdiLayout.TileVertical);
+    }
+    private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
+      AboutDialog dialog = new AboutDialog();
+      dialog.ShowDialog(this);
+      dialog.Dispose();
+    }
+    #endregion
+
+    #region ToolStrip Events
+    private void openToolStripButton_Click(object sender, EventArgs e) {
+      Open();
+    }
+    private void saveToolStripButton_Click(object sender, EventArgs e) {
+      EditorForm form = ActiveMdiChild as EditorForm;
+      Save(form);
+    }
+    private void saveAllToolStripButton_Click(object sender, EventArgs e) {
+      for (int i = 0; i < MdiChildren.Length; i++) {
+        EditorForm form = MdiChildren[i] as EditorForm;
+        if (((Control)form.Editor).Enabled) Save(form);
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/MainForm.resx	(revision 2)
@@ -0,0 +1,449 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>212, 17</value>
+  </metadata>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>316, 17</value>
+  </metadata>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>440, 17</value>
+  </metadata>
+  <metadata name="toolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>119, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.OptimizationFrontend")]
+[assembly: AssemblyDescription("HeuristicLab application for heuristic optimization")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ca725686-f020-4a7e-82c7-1b4d03e61bab")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/Resources.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/Resources.Designer.cs	(revision 2)
@@ -0,0 +1,119 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.OptimizationFrontend.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.OptimizationFrontend.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Logo_gray {
+            get {
+                object obj = ResourceManager.GetObject("Logo_gray", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap New {
+            get {
+                object obj = ResourceManager.GetObject("New", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Open {
+            get {
+                object obj = ResourceManager.GetObject("Open", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Save {
+            get {
+                object obj = ResourceManager.GetObject("Save", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap SaveAll {
+            get {
+                object obj = ResourceManager.GetObject("SaveAll", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/Resources.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/Properties/Resources.resx	(revision 2)
@@ -0,0 +1,136 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Logo_gray" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Logo_gray.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="New" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\New.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Open" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Open.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Save" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SaveAll" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\SaveAll.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.Designer.cs	(revision 2)
@@ -0,0 +1,82 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationFrontend {
+  partial class ViewForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (View != null)
+        View.CaptionChanged -= new System.EventHandler(View_CaptionChanged);
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ViewForm));
+      this.viewPanel = new System.Windows.Forms.Panel();
+      this.SuspendLayout();
+      // 
+      // viewPanel
+      // 
+      this.viewPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewPanel.Location = new System.Drawing.Point(12, 12);
+      this.viewPanel.Name = "viewPanel";
+      this.viewPanel.Size = new System.Drawing.Size(608, 422);
+      this.viewPanel.TabIndex = 0;
+      // 
+      // ViewForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(632, 446);
+      this.Controls.Add(this.viewPanel);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "ViewForm";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "View";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Panel viewPanel;
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.OptimizationFrontend {
+  public partial class ViewForm : Form {
+    private IView myView;
+    public IView View {
+      get { return myView; }
+    }
+
+    public ViewForm() {
+      InitializeComponent();
+    }
+    public ViewForm(IView view)
+      : this() {
+      myView = view;
+      if (View != null) {
+        Control control = (Control)View;
+        control.Dock = DockStyle.Fill;
+        viewPanel.Controls.Add(control);
+        View.CaptionChanged += new EventHandler(View_CaptionChanged);
+        UpdateText();
+      } else {
+        Label errorLabel = new Label();
+        errorLabel.Name = "errorLabel";
+        errorLabel.Text = "No view available";
+        errorLabel.AutoSize = false;
+        errorLabel.Dock = DockStyle.Fill;
+        viewPanel.Controls.Add(errorLabel);
+      }
+    }
+
+    private void UpdateText() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateText));
+      else
+        Text = View.Caption;
+    }
+
+    #region View Events
+    private void View_CaptionChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.OptimizationFrontend/ViewForm.resx	(revision 2)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.Permutation/AbsolutePositionTopologicalCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/AbsolutePositionTopologicalCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/AbsolutePositionTopologicalCrossover.cs	(revision 2)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class AbsolutePositionTopologicalCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      bool[] numberCopied = new bool[length];
+      int index;
+
+      index = 0;
+      for (int i = 0; i < length; i++) {  // copy numbers from both parent permutations
+        if (!numberCopied[parent1[i]]) {
+          result[index] = parent1[i];
+          numberCopied[parent1[i]] = true;
+          index++;
+        }
+        if (!numberCopied[parent2[i]]) {
+          result[index] = parent2[i];
+          numberCopied[parent2[i]] = true;
+          index++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/CosaCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/CosaCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/CosaCrossover.cs	(revision 2)
@@ -0,0 +1,75 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class CosaCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      int crossPoint, startIndex, endIndex;
+
+      crossPoint = random.Next(length);
+      startIndex = (crossPoint + 1) % length;
+
+      int i = 0;
+      while ((i < parent2.Length) && (parent2[i] != parent1[startIndex])) {  // find index of start value in second permutation
+        i++;
+      }
+      i = (i + 1) % length;
+      int j = 0;
+      while ((j < parent1.Length) && (parent1[j] != parent2[i])) {  // find index of parent2[i] in first permutation
+        j++;
+      }
+      endIndex = (j - 1 + length) % length;
+
+      i = endIndex;
+      j = 0;
+      do {  // permutation from end to crosspoint (backwards)
+        result[j] = parent1[i];
+        i = (i - 1 + length) % length;
+        j++;
+      } while (i != crossPoint);
+
+      i = (endIndex + 1) % length;
+      while (i != crossPoint) {  // permutation from end to crosspoint (forwards)
+        result[j] = parent1[i];
+        i = (i + 1) % length;
+        j++;
+      }
+      result[j] = parent1[crossPoint];  // last station: crosspoint
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/CyclicCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/CyclicCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/CyclicCrossover.cs	(revision 2)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class CyclicCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      bool[] indexCopied = new bool[length];
+      int j, number;
+
+      j = random.Next(length);  // get number to start cycle
+      while (!indexCopied[j]) {  // copy whole cycle to new permutation
+        result[j] = parent1[j];
+        number = parent2[j];
+        indexCopied[j] = true;
+
+        j = 0;
+        while ((j < length) && (parent1[j] != number)) {  // search copied number in second permutation
+          j++;
+        }
+      }
+
+      for (int i = 0; i < length; i++) {  // copy rest of secound permutation to new permutation
+        if (!indexCopied[i]) {
+          result[i] = parent2[i];
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/EdgeRecombinationCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/EdgeRecombinationCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/EdgeRecombinationCrossover.cs	(revision 2)
@@ -0,0 +1,126 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class EdgeRecombinationCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      int[,] edgeList = new int[length, 4];
+      bool[] remainingNumbers = new bool[length];
+      int index, currentEdge, currentNumber, nextNumber, currentEdgeCount, minEdgeCount;
+
+      for (int i = 0; i < length; i++) {  // generate edge list for every number
+        remainingNumbers[i] = true;
+
+        index = 0;
+        while ((index < length) && (parent1[index] != i)) {  // search edges in parent1
+          index++;
+        }
+        if (index == length) {
+          throw (new InvalidOperationException("Permutation doesn't contain number " + i + "."));
+        } else {
+          edgeList[i, 0] = parent1[(index - 1 + length) % length];
+          edgeList[i, 1] = parent1[(index + 1) % length];
+        }
+        index = 0;
+        while ((index < length) && (parent2[index] != i)) {  // search edges in parent2
+          index++;
+        }
+        if (index == length) {
+          throw (new InvalidOperationException("Permutation doesn't contain number " + i + "."));
+        } else {
+          currentEdge = parent2[(index - 1 + length) % length];
+          if ((edgeList[i, 0] != currentEdge) && (edgeList[i, 1] != currentEdge)) {  // new edge found ?
+            edgeList[i, 2] = currentEdge;
+          } else {
+            edgeList[i, 2] = -1;
+          }
+          currentEdge = parent2[(index + 1) % length];
+          if ((edgeList[i, 0] != currentEdge) && (edgeList[i, 1] != currentEdge)) {  // new edge found ?
+            edgeList[i, 3] = currentEdge;
+          } else {
+            edgeList[i, 3] = -1;
+          }
+        }
+      }
+
+      currentNumber = random.Next(length);  // get number to start
+      for (int i = 0; i < length; i++) {
+        result[i] = currentNumber;
+        remainingNumbers[currentNumber] = false;
+
+        for (int j = 0; j < 4; j++) {  // remove all edges to / from currentNumber
+          if (edgeList[currentNumber, j] != -1) {
+            for (int k = 0; k < 4; k++) {
+              if (edgeList[edgeList[currentNumber, j], k] == currentNumber) {
+                edgeList[edgeList[currentNumber, j], k] = -1;
+              }
+            }
+          }
+        }
+
+        minEdgeCount = 5;  // every number hasn't more than 4 edges
+        nextNumber = -1;
+        for (int j = 0; j < 4; j++) {  // find next number with least edges
+          if (edgeList[currentNumber, j] != -1) {  // next number found
+            currentEdgeCount = 0;
+            for (int k = 0; k < 4; k++) {  // count edges of next number
+              if (edgeList[edgeList[currentNumber, j], k] != -1) {
+                currentEdgeCount++;
+              }
+            }
+            if ((currentEdgeCount < minEdgeCount) ||
+              ((currentEdgeCount == minEdgeCount) && (random.NextDouble() < 0.5))) {
+              nextNumber = edgeList[currentNumber, j];
+              minEdgeCount = currentEdgeCount;
+            }
+          }
+        }
+        currentNumber = nextNumber;
+        if (currentNumber == -1) {  // current number has no more edge
+          index = 0;
+          while ((index < length) && (!remainingNumbers[index])) {  // choose next remaining number
+            index++;
+          }
+          if (index < length) {
+            currentNumber = index;
+          }
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/HeuristicLab.Permutation.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/HeuristicLab.Permutation.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/HeuristicLab.Permutation.csproj	(revision 2)
@@ -0,0 +1,113 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Permutation</RootNamespace>
+    <AssemblyName>HeuristicLab.Permutation</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Permutation.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AbsolutePositionTopologicalCrossover.cs" />
+    <Compile Include="CosaCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CyclicCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="EdgeRecombinationCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="InsertionManipulator.cs" />
+    <Compile Include="InversionManipulator.cs" />
+    <Compile Include="MaximalPreservativeCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="OrderBasedCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="OrderCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PartiallyMatchedCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PermutationCrossoverBase.cs" />
+    <Compile Include="HeuristicLabPermutationPlugin.cs" />
+    <Compile Include="Permutation.cs" />
+    <Compile Include="PermutationManipulatorBase.cs" />
+    <Compile Include="PositionBasedCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RandomPermutationGenerator.cs" />
+    <Compile Include="ScrambleManipulator.cs" />
+    <Compile Include="Swap2Manipulator.cs" />
+    <Compile Include="Swap3Manipulator.cs" />
+    <Compile Include="TranslocationInversionManipulator.cs" />
+    <Compile Include="TranslocationManipulator.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Evolutionary\HeuristicLab.Evolutionary.csproj">
+      <Project>{F5614C53-153C-4A37-A608-121E1C087F07}</Project>
+      <Name>HeuristicLab.Evolutionary</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Permutation/HeuristicLabPermutationPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/HeuristicLabPermutationPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/HeuristicLabPermutationPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Permutation {
+  [ClassInfo(Name = "HeuristicLab.Permutation")]
+  [PluginFile(Filename = "HeuristicLab.Permutation.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Evolutionary")]
+  public class HeuristicLabRandomPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/InsertionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/InsertionManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/InsertionManipulator.cs	(revision 2)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class InsertionManipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int cutIndex, insertIndex, number;
+
+      cutIndex = random.Next(permutation.Length);
+      insertIndex = random.Next(permutation.Length);
+      number = permutation[cutIndex];
+
+      int i = 0;  // index in new permutation
+      int j = 0;  // index in old permutation
+      while (i < permutation.Length) {
+        if (j == cutIndex) {
+          j++;
+        }
+        if (i == insertIndex) {
+          result[i] = number;
+          i++;
+        }
+        if ((i < permutation.Length) && (j < permutation.Length)) {
+          result[i] = permutation[j];
+          i++;
+          j++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/InversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/InversionManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/InversionManipulator.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class InversionManipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int breakPoint1, breakPoint2;
+
+      breakPoint1 = random.Next(result.Length - 1);
+      do {
+        breakPoint2 = random.Next(result.Length - 1);
+      } while (breakPoint2 == breakPoint1);
+      if (breakPoint2 < breakPoint1) { int h = breakPoint1; breakPoint1 = breakPoint2; breakPoint2 = h; }
+
+      for (int i = 0; i <= (breakPoint2 - breakPoint1); i++) {  // reverse permutation between breakpoints
+        result[breakPoint1 + i] = permutation[breakPoint2 - i];
+      }
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/MaximalPreservativeCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/MaximalPreservativeCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/MaximalPreservativeCrossover.cs	(revision 2)
@@ -0,0 +1,69 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class MaximalPreservativeCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      bool[] numberCopied = new bool[length];
+      int breakPoint1, breakPoint2, subsegmentLength, index;
+
+      if (length >= 20) {  // length of subsegment must be >= 10 and <= length / 2
+        breakPoint1 = random.Next(length - 9);
+        subsegmentLength = random.Next(10, Math.Min((int)(length / 2), length - breakPoint1) + 1);
+        breakPoint2 = breakPoint1 + subsegmentLength - 1;
+      } else {
+        breakPoint1 = random.Next(length - 1);
+        breakPoint2 = random.Next(breakPoint1 + 1, length);
+      }
+
+      index = 0;
+      for (int i = breakPoint1; i <= breakPoint2; i++) {  // copy part of first permutation
+        result[index] = parent1[i];
+        numberCopied[result[index]] = true;
+        index++;
+      }
+
+      for (int i = 0; i < parent2.Length; i++) {  // copy remaining part of second permutation
+        if (!numberCopied[parent2[i]]) {
+          result[index] = parent2[i];
+          index++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/OrderBasedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/OrderBasedCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/OrderBasedCrossover.cs	(revision 2)
@@ -0,0 +1,82 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class OrderBasedCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      int[] selectedNumbers = new int[random.Next(length + 1)];
+      bool[] numberSelected = new bool[length];
+      int index, selectedIndex, currentIndex;
+
+      for (int i = 0; i < selectedNumbers.Length; i++) {  // select numbers for array
+        index = 0;
+        while (numberSelected[parent1[index]]) {  // find first valid index
+          index++;
+        }
+
+        selectedIndex = random.Next(length - i);
+        currentIndex = 0;
+        while ((index < parent1.Length) && (currentIndex != selectedIndex)) {  // find selected number
+          index++;
+          if (!numberSelected[parent1[index]]) {
+            currentIndex++;
+          }
+        }
+        numberSelected[parent1[index]] = true;
+      }
+
+      index = 0;
+      for (int i = 0; i < parent1.Length; i++) {  // copy selected numbers in array
+        if (numberSelected[parent1[i]]) {
+          selectedNumbers[index] = parent1[i];
+          index++;
+        }
+      }
+
+      index = 0;
+      for (int i = 0; i < result.Length; i++) {  // copy rest of second permutation and selected numbers in order of first permutation
+        if (numberSelected[parent2[i]]) {
+          result[i] = selectedNumbers[index];
+          index++;
+        } else {
+          result[i] = parent2[i];
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/OrderCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/OrderCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/OrderCrossover.cs	(revision 2)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class OrderCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int[] result = new int[parent1.Length];
+      bool[] copied = new bool[result.Length];
+
+      int breakPoint1 = random.Next(result.Length - 1);
+      int breakPoint2 = random.Next(breakPoint1 + 1, result.Length);
+
+      for (int i = breakPoint1; i <= breakPoint2; i++) {  // copy part of first permutation
+        result[i] = parent1[i];
+        copied[parent1[i]] = true;
+      }
+
+      int index = 0;
+      for (int i = 0; i < parent2.Length; i++) {  // copy remaining part of second permutation
+        if (index == breakPoint1) {  // skip already copied part
+          index = breakPoint2 + 1;
+        }
+        if (!copied[parent2[i]]) {
+          result[index] = parent2[i];
+          index++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/PartiallyMatchedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/PartiallyMatchedCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/PartiallyMatchedCrossover.cs	(revision 2)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class PartiallyMatchedCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      bool[] numbersCopied = new bool[length];
+
+      int breakPoint1 = random.Next(length - 1);
+      int breakPoint2 = random.Next(breakPoint1 + 1, length);
+
+      for (int j = breakPoint1; j <= breakPoint2; j++) {  // copy part of first permutation
+        result[j] = parent1[j];
+        numbersCopied[result[j]] = true;
+      }
+
+      int index = breakPoint1;
+      int i = (breakPoint1 == 0 ? (breakPoint2 + 1) : 0);
+      while (i < length) {  // copy rest from second permutation
+        if (!numbersCopied[parent2[i]]) {  // copy directly
+          result[i] = parent2[i];
+        } else {  // copy from area between breakpoints
+          while (numbersCopied[parent2[index]]) {  // find next valid index
+            index++;
+          }
+          result[i] = parent2[index];
+          index++;
+        }
+
+        i++;
+        if (i == breakPoint1) {  // skip area between breakpoints
+          i = breakPoint2 + 1;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/Permutation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/Permutation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/Permutation.cs	(revision 2)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class Permutation : IntArrayData {
+    public Permutation()
+      : base() {
+    }
+    public Permutation(int[] permutation)
+      : base(permutation) {
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Permutation clone = new Permutation((int[])Data.Clone());
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/PermutationCrossoverBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/PermutationCrossoverBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/PermutationCrossoverBase.cs	(revision 2)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.Permutation {
+  public abstract class PermutationCrossoverBase : CrossoverBase {
+    public PermutationCrossoverBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Permutation", "Parent and child permutations", typeof(Permutation), VariableKind.In | VariableKind.New));
+    }
+
+    protected sealed override void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child) {
+      IVariableInfo permutationInfo = GetVariableInfo("Permutation");
+      Permutation perm1 = parent1.GetVariableValue<Permutation>(permutationInfo.ActualName, false);
+      Permutation perm2 = parent2.GetVariableValue<Permutation>(permutationInfo.ActualName, false);
+
+      if (perm1.Data.Length != perm2.Data.Length) throw new InvalidOperationException("Cannot apply crossover to permutations of different length.");
+
+      int[] result = Cross(scope, random, perm1.Data, perm2.Data);
+      child.AddVariable(new Variable(permutationInfo.ActualName, new Permutation(result)));
+    }
+
+    protected abstract int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2);
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/PermutationManipulatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/PermutationManipulatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/PermutationManipulatorBase.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public abstract class PermutationManipulatorBase : OperatorBase {
+    public PermutationManipulatorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Permutation", "Permutation to manipulate", typeof(Permutation), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      Permutation perm = GetVariableValue<Permutation>("Permutation", scope, false);
+      perm.Data = Manipulate(scope, random, perm.Data);
+      return null;
+    }
+
+    protected abstract int[] Manipulate(IScope scope, IRandom random, int[] permutation);
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/PositionBasedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/PositionBasedCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/PositionBasedCrossover.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class PositionBasedCrossover : PermutationCrossoverBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] parent1, int[] parent2) {
+      int length = parent1.Length;
+      int[] result = new int[length];
+      bool[] randomPosition = new bool[length];
+      bool[] numberCopied = new bool[length];
+      int randomPosNumber = random.Next(length);
+
+      for (int i = 0; i < randomPosNumber; i++) {  // generate random bit mask
+        randomPosition[random.Next(length)] = true;
+      }
+
+      for (int i = 0; i < length; i++) {  // copy numbers masked as true from second permutation
+        if (randomPosition[i]) {
+          result[i] = parent2[i];
+          numberCopied[parent2[i]] = true;
+        }
+      }
+
+      int index = 0;
+      for (int i = 0; i < length; i++) {  // copy numbers masked as false from first permutation
+        if (!numberCopied[parent1[i]]) {
+          if (randomPosition[index]) {
+            while (randomPosition[index]) {
+              index++;
+            }
+          }
+          result[index] = parent1[i];
+          index++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Cross(IScope scope, IRandom random, int[] parent1, int[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Permutation")]
+[assembly: AssemblyDescription("HeuristicLab permutation operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8819e533-c557-42e0-8cee-09dda7686cd2")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Permutation/RandomPermutationGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/RandomPermutationGenerator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/RandomPermutationGenerator.cs	(revision 2)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Permutation {
+  public class RandomPermutationGenerator : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public RandomPermutationGenerator()
+      : base() {
+      AddVariableInfo(new VariableInfo("Length", "Permutation length", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Permutation", "Created random permutation", typeof(Permutation), VariableKind.New));
+    }
+
+    public static int[] Apply(IRandom random, int length) {
+      int[] perm = new int[length];
+
+      for (int i = 0; i < length; i++)
+        perm[i] = i;
+
+      // Knuth shuffle
+      int index, tmp;
+      for (int i = 0; i < length - 1; i++) {
+        index = random.Next(i, length);
+        tmp = perm[i];
+        perm[i] = perm[index];
+        perm[index] = tmp;
+      }
+      return perm;
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      IntData length = GetVariableValue<IntData>("Length", scope, true);
+
+      int[] perm = Apply(random, length.Data);
+      scope.AddVariable(new Variable(GetVariableInfo("Permutation").ActualName, new Permutation(perm)));
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/ScrambleManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/ScrambleManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/ScrambleManipulator.cs	(revision 2)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class ScrambleManipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int breakPoint1, breakPoint2;
+      int[] scrambledIndices, remainingIndices, temp;
+      int selectedIndex, index;
+
+      breakPoint1 = random.Next(permutation.Length - 1);
+      breakPoint2 = random.Next(breakPoint1 + 1, permutation.Length);
+
+      scrambledIndices = new int[breakPoint2 - breakPoint1 + 1];
+      remainingIndices = new int[breakPoint2 - breakPoint1 + 1];
+      for (int i = 0; i < remainingIndices.Length; i++) {  // initialise indices
+        remainingIndices[i] = i;
+      }
+      for (int i = 0; i < scrambledIndices.Length; i++) {  // generate permutation of indices
+        selectedIndex = random.Next(remainingIndices.Length);
+        scrambledIndices[i] = remainingIndices[selectedIndex];
+
+        temp = remainingIndices;
+        remainingIndices = new int[temp.Length - 1];
+        index = 0;
+        for (int j = 0; j < remainingIndices.Length; j++) {
+          if (index == selectedIndex) {
+            index++;
+          }
+          remainingIndices[j] = temp[index];
+          index++;
+        }
+      }
+
+      for (int i = 0; i <= (breakPoint2 - breakPoint1); i++) {  // scramble permutation between breakpoints
+        result[breakPoint1 + i] = permutation[breakPoint1 + scrambledIndices[i]];
+      }
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/Swap2Manipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/Swap2Manipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/Swap2Manipulator.cs	(revision 2)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class Swap2Manipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int index1, index2, temp;
+
+      index1 = random.Next(result.Length);
+      index2 = random.Next(result.Length);
+
+      temp = result[index1];
+      result[index1] = result[index2];
+      result[index2] = temp;
+
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/Swap3Manipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/Swap3Manipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/Swap3Manipulator.cs	(revision 2)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class Swap3Manipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int index1, index2, index3, temp;
+
+      index1 = random.Next(result.Length);
+      index2 = random.Next(result.Length);
+      index3 = random.Next(result.Length);
+
+      if (random.NextDouble() < 0.5) {
+        // swap edges 1 and 2
+        temp = result[index1];
+        result[index1] = result[index2];
+        result[index2] = temp;
+        // swap edges 2 and 3
+        temp = result[index2];
+        result[index2] = result[index3];
+        result[index3] = temp;
+      } else {
+        // swap edges 1 and 3
+        temp = result[index1];
+        result[index1] = result[index3];
+        result[index3] = temp;
+        // swap edges 2 and 3
+        temp = result[index2];
+        result[index2] = result[index3];
+        result[index3] = temp;
+      }
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/TranslocationInversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/TranslocationInversionManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/TranslocationInversionManipulator.cs	(revision 2)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class TranslocationInversionManipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int breakPoint1, breakPoint2, insertPoint, insertPointLimit;
+
+      breakPoint1 = random.Next(permutation.Length - 1);
+      breakPoint2 = random.Next(breakPoint1 + 1, permutation.Length);
+      insertPointLimit = permutation.Length - breakPoint2 + breakPoint1 - 1;  // get insertion point in remaining part
+      if (insertPointLimit > 0)
+        insertPoint = random.Next(insertPointLimit);
+      else
+        insertPoint = 0;
+
+      int i = 0;  // index in new permutation
+      int j = 0;  // index in old permutation
+      while (i < permutation.Length) {
+        if (i == insertPoint) {  // copy translocated area
+          for (int k = breakPoint2; k >= breakPoint1; k--) {
+            result[i] = permutation[k];
+            i++;
+          }
+        }
+        if (j == breakPoint1) {  // skip area between breakpoints
+          j = breakPoint2 + 1;
+        }
+        if ((i < permutation.Length) && (j < permutation.Length)) {
+          result[i] = permutation[j];
+          i++;
+          j++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Permutation/TranslocationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/TranslocationManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Permutation/TranslocationManipulator.cs	(revision 2)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Permutation {
+  public class TranslocationManipulator : PermutationManipulatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public static int[] Apply(IRandom random, int[] permutation) {
+      int[] result = (int[])permutation.Clone();
+      int breakPoint1, breakPoint2, insertPoint, insertPointLimit;
+
+      breakPoint1 = random.Next(permutation.Length - 1);
+      breakPoint2 = random.Next(breakPoint1 + 1, permutation.Length);
+      insertPointLimit = permutation.Length - breakPoint2 + breakPoint1 - 1;  // get insertion point in remaining part
+      if (insertPointLimit > 0)
+        insertPoint = random.Next(insertPointLimit);
+      else
+        insertPoint = 0;
+
+      int i = 0;  // index in new permutation
+      int j = 0;  // index in old permutation
+      while (i < permutation.Length) {
+        if (i == insertPoint) {  // copy translocated area
+          for (int k = breakPoint1; k <= breakPoint2; k++) {
+            result[i] = permutation[k];
+            i++;
+          }
+        }
+        if (j == breakPoint1) {  // skip area between breakpoints
+          j = breakPoint2 + 1;
+        }
+        if ((i < permutation.Length) && (j < permutation.Length)) {
+          result[i] = permutation[j];
+          i++;
+          j++;
+        }
+      }
+      return result;
+    }
+
+    protected override int[] Manipulate(IScope scope, IRandom random, int[] permutation) {
+      return Apply(random, permutation);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.Designer.cs	(revision 2)
@@ -0,0 +1,204 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  partial class AboutBox {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.logoPictureBox = new System.Windows.Forms.PictureBox();
+      this.labelProductName = new System.Windows.Forms.Label();
+      this.labelVersion = new System.Windows.Forms.Label();
+      this.labelCopyright = new System.Windows.Forms.Label();
+      this.labelCompanyName = new System.Windows.Forms.Label();
+      this.textBoxDescription = new System.Windows.Forms.TextBox();
+      this.okButton = new System.Windows.Forms.Button();
+      this.tableLayoutPanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // tableLayoutPanel
+      // 
+      this.tableLayoutPanel.ColumnCount = 2;
+      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
+      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
+      this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
+      this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
+      this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
+      this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
+      this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
+      this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
+      this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
+      this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9);
+      this.tableLayoutPanel.Name = "tableLayoutPanel";
+      this.tableLayoutPanel.RowCount = 6;
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel.Size = new System.Drawing.Size(482, 250);
+      this.tableLayoutPanel.TabIndex = 0;
+      // 
+      // logoPictureBox
+      // 
+      this.logoPictureBox.Image = global::HeuristicLab.PluginInfrastructure.GUI.Properties.Resources.Logo_gray;
+      this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
+      this.logoPictureBox.Name = "logoPictureBox";
+      this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
+      this.logoPictureBox.Size = new System.Drawing.Size(150, 150);
+      this.logoPictureBox.TabIndex = 12;
+      this.logoPictureBox.TabStop = false;
+      // 
+      // labelProductName
+      // 
+      this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.labelProductName.Location = new System.Drawing.Point(165, 0);
+      this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+      this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17);
+      this.labelProductName.Name = "labelProductName";
+      this.labelProductName.Size = new System.Drawing.Size(314, 17);
+      this.labelProductName.TabIndex = 19;
+      this.labelProductName.Text = "Product Name";
+      this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // labelVersion
+      // 
+      this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.labelVersion.Location = new System.Drawing.Point(165, 25);
+      this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+      this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17);
+      this.labelVersion.Name = "labelVersion";
+      this.labelVersion.Size = new System.Drawing.Size(314, 17);
+      this.labelVersion.TabIndex = 0;
+      this.labelVersion.Text = "Version";
+      this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // labelCopyright
+      // 
+      this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.labelCopyright.Location = new System.Drawing.Point(165, 50);
+      this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+      this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17);
+      this.labelCopyright.Name = "labelCopyright";
+      this.labelCopyright.Size = new System.Drawing.Size(314, 17);
+      this.labelCopyright.TabIndex = 21;
+      this.labelCopyright.Text = "Copyright";
+      this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // labelCompanyName
+      // 
+      this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.labelCompanyName.Location = new System.Drawing.Point(165, 75);
+      this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+      this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17);
+      this.labelCompanyName.Name = "labelCompanyName";
+      this.labelCompanyName.Size = new System.Drawing.Size(314, 17);
+      this.labelCompanyName.TabIndex = 22;
+      this.labelCompanyName.Text = "Company Name";
+      this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // textBoxDescription
+      // 
+      this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.textBoxDescription.Location = new System.Drawing.Point(165, 103);
+      this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
+      this.textBoxDescription.Multiline = true;
+      this.textBoxDescription.Name = "textBoxDescription";
+      this.textBoxDescription.ReadOnly = true;
+      this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.textBoxDescription.Size = new System.Drawing.Size(314, 119);
+      this.textBoxDescription.TabIndex = 23;
+      this.textBoxDescription.TabStop = false;
+      this.textBoxDescription.Text = "Description";
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.okButton.Location = new System.Drawing.Point(404, 228);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 19);
+      this.okButton.TabIndex = 24;
+      this.okButton.Text = "&OK";
+      // 
+      // AboutBox
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(500, 268);
+      this.Controls.Add(this.tableLayoutPanel);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "AboutBox";
+      this.Padding = new System.Windows.Forms.Padding(9);
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "AboutBox";
+      this.tableLayoutPanel.ResumeLayout(false);
+      this.tableLayoutPanel.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+    private System.Windows.Forms.PictureBox logoPictureBox;
+    private System.Windows.Forms.Label labelProductName;
+    private System.Windows.Forms.Label labelVersion;
+    private System.Windows.Forms.Label labelCopyright;
+    private System.Windows.Forms.Label labelCompanyName;
+    private System.Windows.Forms.TextBox textBoxDescription;
+    private System.Windows.Forms.Button okButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.cs	(revision 2)
@@ -0,0 +1,120 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  partial class AboutBox : Form {
+    public AboutBox() {
+      InitializeComponent();
+
+      //  Initialize the AboutBox to display the product information from the assembly information.
+      //  Change assembly information settings for your application through either:
+      //  - Project->Properties->Application->Assembly Information
+      //  - AssemblyInfo.cs
+      this.Text = String.Format("About {0}", AssemblyTitle);
+      this.labelProductName.Text = AssemblyProduct;
+      this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
+      this.labelCopyright.Text = AssemblyCopyright;
+      this.labelCompanyName.Text = AssemblyCompany;
+      this.textBoxDescription.Text = AssemblyDescription;
+    }
+
+    #region Assembly Attribute Accessors
+
+    public string AssemblyTitle {
+      get {
+        // Get all Title attributes on this assembly
+        object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
+        // If there is at least one Title attribute
+        if(attributes.Length > 0) {
+          // Select the first one
+          AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
+          // If it is not an empty string, return it
+          if(titleAttribute.Title != "")
+            return titleAttribute.Title;
+        }
+        // If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name
+        return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
+      }
+    }
+
+    public string AssemblyVersion {
+      get {
+        return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+      }
+    }
+
+    public string AssemblyDescription {
+      get {
+        // Get all Description attributes on this assembly
+        object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
+        // If there aren't any Description attributes, return an empty string
+        if(attributes.Length == 0)
+          return "";
+        // If there is a Description attribute, return its value
+        return ((AssemblyDescriptionAttribute)attributes[0]).Description;
+      }
+    }
+
+    public string AssemblyProduct {
+      get {
+        // Get all Product attributes on this assembly
+        object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+        // If there aren't any Product attributes, return an empty string
+        if(attributes.Length == 0)
+          return "";
+        // If there is a Product attribute, return its value
+        return ((AssemblyProductAttribute)attributes[0]).Product;
+      }
+    }
+
+    public string AssemblyCopyright {
+      get {
+        // Get all Copyright attributes on this assembly
+        object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+        // If there aren't any Copyright attributes, return an empty string
+        if(attributes.Length == 0)
+          return "";
+        // If there is a Copyright attribute, return its value
+        return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
+      }
+    }
+
+    public string AssemblyCompany {
+      get {
+        // Get all Company attributes on this assembly
+        object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
+        // If there aren't any Company attributes, return an empty string
+        if(attributes.Length == 0)
+          return "";
+        // If there is a Company attribute, return its value
+        return ((AssemblyCompanyAttribute)attributes[0]).Company;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/AboutBox.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.Designer.cs	(revision 2)
@@ -0,0 +1,102 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  partial class DownloaderDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DownloaderDialog));
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.downloadProgressBar = new System.Windows.Forms.ProgressBar();
+      this.downloadDescription = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.Location = new System.Drawing.Point(303, 99);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 0;
+      this.cancelButton.Text = "Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // downloadProgressBar
+      // 
+      this.downloadProgressBar.Location = new System.Drawing.Point(15, 25);
+      this.downloadProgressBar.Name = "downloadProgressBar";
+      this.downloadProgressBar.Size = new System.Drawing.Size(363, 23);
+      this.downloadProgressBar.TabIndex = 1;
+      // 
+      // downloadDescription
+      // 
+      this.downloadDescription.AutoSize = true;
+      this.downloadDescription.Location = new System.Drawing.Point(12, 9);
+      this.downloadDescription.Name = "downloadDescription";
+      this.downloadDescription.Size = new System.Drawing.Size(35, 13);
+      this.downloadDescription.TabIndex = 2;
+      this.downloadDescription.Text = "label1";
+      // 
+      // DownloaderDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(390, 134);
+      this.Controls.Add(this.downloadDescription);
+      this.Controls.Add(this.downloadProgressBar);
+      this.Controls.Add(this.cancelButton);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "DownloaderDialog";
+      this.Text = "DownloaderDialog";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.ProgressBar downloadProgressBar;
+    private System.Windows.Forms.Label downloadDescription;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+
+  public partial class DownloaderDialog : Form {
+
+    public event MethodInvoker OnCancel;
+
+    public DownloaderDialog() {
+      InitializeComponent();
+    }
+
+    public void SetDownloadDescription(string description) {
+      Invoke((MethodInvoker)delegate() {
+        downloadDescription.Text = description;
+      });
+    }
+
+    public void SetProgress(int progress) {
+      Invoke((MethodInvoker)delegate() {
+        downloadProgressBar.Value = progress;
+      });
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e)
+    {
+      if(OnCancel!=null) OnCancel();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/DownloaderDialog.resx	(revision 2)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.Designer.cs	(revision 2)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  partial class ErrorDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.messageTextBox = new System.Windows.Forms.TextBox();
+      this.okButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // messageTextBox
+      // 
+      this.messageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.messageTextBox.Location = new System.Drawing.Point(12, 12);
+      this.messageTextBox.Multiline = true;
+      this.messageTextBox.Name = "messageTextBox";
+      this.messageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal;
+      this.messageTextBox.Size = new System.Drawing.Size(392, 232);
+      this.messageTextBox.TabIndex = 0;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+      this.okButton.Location = new System.Drawing.Point(165, 250);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "Ok";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // ErrorDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(416, 285);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.messageTextBox);
+      this.Name = "ErrorDialog";
+      this.Text = "ErrorDialog";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox messageTextBox;
+    private System.Windows.Forms.Button okButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  public partial class ErrorDialog : Form {
+    public ErrorDialog(string message, string caption) {
+      InitializeComponent();
+
+      messageTextBox.Text = message;
+      this.Text = caption;
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      this.DialogResult = DialogResult.OK;
+      Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ErrorDialog.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/HeuristicLab.PluginInfrastructure.GUI.csproj
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/HeuristicLab.PluginInfrastructure.GUI.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/HeuristicLab.PluginInfrastructure.GUI.csproj	(revision 2)
@@ -0,0 +1,153 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.PluginInfrastructure.GUI</RootNamespace>
+    <AssemblyName>HeuristicLab.PluginInfrastructure.GUI</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ICSharpCode.SharpZipLib, Version=0.85.4.369, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>.\ICSharpCode.SharpZipLib.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AboutBox.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AboutBox.Designer.cs">
+      <DependentUpon>AboutBox.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DownloaderDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DownloaderDialog.Designer.cs">
+      <DependentUpon>DownloaderDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ErrorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ErrorDialog.Designer.cs">
+      <DependentUpon>ErrorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ManagerForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ManagerForm.designer.cs">
+      <DependentUpon>ManagerForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PluginAction.cs" />
+    <Compile Include="PluginDescription.cs" />
+    <Compile Include="PluginNameTransform.cs" />
+    <Compile Include="PluginSource.cs" />
+    <Compile Include="PluginSourceEditor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PluginSourceEditor.Designer.cs">
+      <DependentUpon>PluginSourceEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PluginTag.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="AboutBox.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>AboutBox.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DownloaderDialog.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>DownloaderDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ErrorDialog.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>ErrorDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ManagerForm.resx">
+      <DependentUpon>ManagerForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PluginSourceEditor.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>PluginSourceEditor.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="app.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\Logo_gray.gif" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Resources\HeuristicLab.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="ICSharpCode.SharpZipLib.dll" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs	(revision 2)
@@ -0,0 +1,1128 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+using System.Net;
+using System.IO;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  public partial class ManagerForm : Form {
+    private TreeNode installedPlugins;
+    private TreeNode availablePlugins;
+    private TreeNode allPlugins;
+
+    private List<PluginTag> allTags = new List<PluginTag>();
+    private Dictionary<PluginTag, PluginAction> actions = new Dictionary<PluginTag, PluginAction>();
+
+    private string pluginDir = Application.StartupPath +"/"+ HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.PluginDir;
+    private string cacheDir = Application.StartupPath + "/" + HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.CacheDir;
+    private string backupDir = Application.StartupPath + "/" + HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.BackupDir;
+    private string tempDir = Application.StartupPath + "/" + HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.TempDir;
+
+    public ManagerForm() {
+      InitializeComponent();
+
+      InitializePlugins();
+    }
+
+    private void InitializePlugins() {
+
+      pluginTreeView.Nodes.Clear();
+      allTags.Clear();
+      actions.Clear();
+
+      publishButton.Enabled = false;
+      publishMenuItem.Enabled = false;
+      installButton.Enabled = false;
+      installButton.Checked = false;
+      installMenuItem.Enabled = false;
+      installMenuItem.Checked = false;
+      removeButton.Enabled = false;
+      removeButton.Checked = false;
+      removeMenuItem.Enabled = false;
+      removeMenuItem.Checked = false;
+
+      installedPlugins = new TreeNode("Installed plugins");
+      installedPlugins.ImageIndex = 1;
+      installedPlugins.SelectedImageIndex = 1;
+      availablePlugins = new TreeNode("Available plugins");
+      availablePlugins.ImageIndex = 1;
+      availablePlugins.SelectedImageIndex = 1;
+      allPlugins = new TreeNode("All plugins");
+      allPlugins.ImageIndex = 1;
+      allPlugins.SelectedImageIndex = 1;
+
+      pluginTreeView.Nodes.Add(installedPlugins);
+      pluginTreeView.Nodes.Add(availablePlugins);
+      pluginTreeView.Nodes.Add(allPlugins);
+
+      foreach(PluginInfo pluginInfo in PluginManager.Manager.InstalledPlugins) {
+        // create a new PluginAction tag for the plugin
+        PluginTag tag = new PluginTag(allTags, pluginInfo, PluginState.Installed);
+        allTags.Add(tag);
+        // add to "installed plugins" node
+        TreeNode installedPluginsNode = new TreeNode(pluginInfo.Name);
+        installedPluginsNode.ContextMenuStrip = pluginContextMenuStrip;
+        installedPluginsNode.Tag = tag;
+        installedPluginsNode.ImageIndex = 0;
+        installedPlugins.Nodes.Add(installedPluginsNode);
+
+        // add to all "plugins node"
+        TreeNode allPluginsNode = new TreeNode(pluginInfo.Name);
+        allPluginsNode.ContextMenuStrip = pluginContextMenuStrip;
+        allPluginsNode.Tag = tag;
+        allPluginsNode.ImageIndex = 0;
+        allPlugins.Nodes.Add(allPluginsNode);
+      }
+
+      // TASK populate the "inactive plugins" node by reading a list of inactive plugins from the PluginManager
+    }
+
+    private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
+      AboutBox box = new AboutBox();
+      box.ShowDialog();
+    }
+
+    private void publishButton_Click(object sender, EventArgs args) {
+      Trace.Assert(pluginTreeView.SelectedNode.Tag is PluginTag);
+
+      PluginInfo plugin = ((PluginTag)pluginTreeView.SelectedNode.Tag).Plugin;
+
+      try {
+        string packageFileName = plugin.Name + "-" + plugin.Version + ".zip";
+        ZipFile zipFile = ZipFile.Create(packageFileName);
+        zipFile.NameTransform = new PluginNameTransform();
+        zipFile.BeginUpdate();
+
+        infoTextBox.Text = "Publishing plugin:\nCreating " + packageFileName + "...\n";
+        foreach(string filename in plugin.Files) {
+          infoTextBox.Text += "Adding " + filename + "\n";          
+          zipFile.Add(filename);
+        }
+
+        zipFile.CommitUpdate();
+        zipFile.Close();
+
+        FileInfo fileInfo = new FileInfo(packageFileName);
+
+        infoTextBox.Text += "\nCreated " + packageFileName + " (" + fileInfo.Length + " bytes)\n";
+        infoTextBox.Text += "Upload this file to your plugin source and add the following entry to" +
+" the file plugins.xml residing in the base directory of your plugin source.\n\n";
+        infoTextBox.Text += "  <Plugin Name=\"" + plugin.Name + "\" Version=\"" + plugin.Version + "\">\n";
+        foreach(PluginInfo dependency in plugin.Dependencies) {
+          infoTextBox.Text += "    <Dependency Name=\"" + dependency.Name + "\" />\n";
+        }
+        infoTextBox.Text += "  </Plugin>";
+      } catch(Exception exception) {
+        infoTextBox.Text += "\nThere was an error!\n" + exception;
+      }
+    }
+
+    private void updateButton_Click(object sender, EventArgs e) {
+
+      // connect to all plugin sources and get a list of available plugins
+      // log progress in the infoPane
+      BackgroundWorker worker = new BackgroundWorker();
+      worker.WorkerSupportsCancellation = true;
+      worker.WorkerReportsProgress = true;
+
+      DownloaderDialog dialog = new DownloaderDialog();
+      dialog.OnCancel += delegate() {
+        worker.CancelAsync();
+      };
+
+      worker.ProgressChanged += delegate(object progressChangedSender, ProgressChangedEventArgs args) {
+        dialog.SetProgress(args.ProgressPercentage);
+      };
+
+      worker.DoWork += delegate(object doWorkSender, DoWorkEventArgs args) {
+        List<PluginDescription> allAvailablePlugins = new List<PluginDescription>();
+
+        //infoTextBox.Text = "Updating available plugins...\n";
+        dialog.SetDownloadDescription("Updating available plugins...");
+
+        int i = 0;
+        int n = HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.PluginSources.Count;
+
+        foreach(string pluginSourceUrl in HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.PluginSources) {
+          if(!worker.CancellationPending) {
+            dialog.SetDownloadDescription("Connecting to " + pluginSourceUrl + "...");
+            PluginSource source = PluginSource.TryCreate(pluginSourceUrl);
+            if(source == null) {
+              Invoke((MethodInvoker)delegate() {
+                infoTextBox.Text += "Error! Couldn't access the plugin source " + pluginSourceUrl + ".\n";
+              });
+            } else {
+              dialog.SetDownloadDescription("Getting list of available plugins from " + pluginSourceUrl + "...");
+              List<PluginDescription> availablePlugins = source.AvailablePlugins();
+              allAvailablePlugins.AddRange(availablePlugins);
+              Invoke((MethodInvoker)delegate() {
+                infoTextBox.Text += pluginSourceUrl + " " + availablePlugins.Count + " plugins available.\n";
+              });
+
+              worker.ReportProgress((int)((++i / (double)n) * 100.0));
+            }
+          }
+        }
+        if(worker.CancellationPending) {
+          args.Cancel = true;
+        } else {
+          args.Cancel = false;
+          args.Result = allAvailablePlugins;
+        }
+      };
+
+      worker.RunWorkerCompleted += delegate(object runWorkerCompletedSender, RunWorkerCompletedEventArgs args) {
+        if(!args.Cancelled && args.Error == null) {
+          List<PluginDescription> allAvailablePlugins = (List<PluginDescription>)args.Result;
+          allAvailablePlugins = FilterMostRecentPluginVersions(allAvailablePlugins);
+
+          // find all plugins that are installed for which a new version is available
+          List<PluginDescription> upgrades = FindUpgrades(allTags, allAvailablePlugins);
+
+          // find all available plugins that are not installed and new (= new name not new version) since the last update
+          List<PluginDescription> newPlugins = FindNewPlugins(allTags, allAvailablePlugins);
+
+          // find all plugins that are available (not installed) for which a new version has been released since the last update
+          List<PluginDescription> overridingPlugins = FindOverridingPlugins(allTags, allAvailablePlugins);
+
+          newPlugins.ForEach(delegate(PluginDescription plugin) {
+            PluginTag tag = new PluginTag(allTags, plugin, PluginState.Available);
+            allTags.Add(tag);
+
+            TreeNode node = new TreeNode(plugin.Name);
+            node.ContextMenuStrip = pluginContextMenuStrip;
+            node.Tag = tag;
+            node.ImageIndex = 0;
+            allPlugins.Nodes.Add(node);
+
+            TreeNode availableNode = new TreeNode(plugin.Name);
+            availableNode.ContextMenuStrip = pluginContextMenuStrip;
+            availableNode.Tag = tag;
+            availablePlugins.Nodes.Add(availableNode);
+
+          });
+
+          upgrades.ForEach(delegate(PluginDescription upgrade) {
+            // find the installed plugins that have the same name
+            List<PluginTag> oldPlugins = allTags.FindAll(delegate(PluginTag tag) {
+              return tag.PluginName == upgrade.Name;
+            });
+            // only one plugin must be found
+            Trace.Assert(oldPlugins.Count == 1);
+            PluginTag oldPlugin = oldPlugins[0];
+
+            // the plugin must be installed already
+            Trace.Assert(oldPlugin.State == PluginState.Installed);
+            // the old plugin has to have an older version than the upgrade
+            Trace.Assert(oldPlugin.PluginVersion < upgrade.Version);
+
+            // store the upgrade in the old plugin
+            oldPlugin.UpgradePluginDescription = upgrade;
+
+            UpdateTreeNodes(oldPlugins);
+          });
+
+          overridingPlugins.ForEach(delegate(PluginDescription overridingPlugin) {
+            List<PluginTag> currentPlugins = allTags.FindAll(delegate(PluginTag tag) {
+              return tag.PluginName == overridingPlugin.Name;
+            });
+
+            // only one plugin must be found
+            Trace.Assert(currentPlugins.Count == 1);
+            PluginTag currentPlugin = currentPlugins[0];
+
+            // the plugin must be available already
+            Trace.Assert(currentPlugin.State == PluginState.Available);
+            // the old plugin has to have an older version than the overriding plugin
+            Trace.Assert(currentPlugin.PluginVersion < overridingPlugin.Version);
+
+            // replace the plugin description of the available plugin to point to the overriding plugin
+            currentPlugin.PluginDescription = overridingPlugin;
+          });
+
+          RebuildActionHulls();
+        }
+        dialog.Close();
+      };
+
+      dialog.Show();
+      worker.RunWorkerAsync();
+
+      // NOTE: ignore version conflicts
+    }
+
+
+    private List<PluginDescription> FilterMostRecentPluginVersions(List<PluginDescription> list) {
+      List<PluginDescription> newList = new List<PluginDescription>();
+
+      list.ForEach(delegate(PluginDescription tag) {
+        // find all entries with the same plugin name
+        List<PluginDescription> samePlugins = list.FindAll(delegate(PluginDescription otherTag) {
+          return tag.Name == otherTag.Name;
+        });
+
+        // keep only the most recent one
+        PluginDescription mostRecentVersion = samePlugins[0];
+        if(samePlugins.Count > 1) {
+          samePlugins.ForEach(delegate(PluginDescription tag2) {
+            if(tag2.Version > mostRecentVersion.Version) {
+              mostRecentVersion = tag2;
+            }
+          });
+        }
+        if(!newList.Contains(mostRecentVersion)) {
+          newList.Add(mostRecentVersion);
+        }
+
+      });
+
+      return newList;
+    }
+
+    private List<PluginDescription> FindNewPlugins(List<PluginTag> allTags, List<PluginDescription> allAvailablePlugins) {
+      List<PluginDescription> newPlugins = new List<PluginDescription>();
+      // for each of the available plugins check if there is an installed plugin that has the same name
+      // only if there is no installed plugin with the same name then it is a new plugin
+      // NOTE: make sure to keep only the most recent entry of a plugin in the allAvailablePlugins list
+      allAvailablePlugins.ForEach(delegate(PluginDescription availablePlugin) {
+        if(!allTags.Exists(delegate(PluginTag tag2) {
+          return availablePlugin.Name == tag2.PluginName;
+        })) {
+          newPlugins.Add(availablePlugin);
+        }
+      });
+
+      return newPlugins;
+    }
+
+    private List<PluginDescription> FindUpgrades(List<PluginTag> allTags, List<PluginDescription> allAvailablePlugins) {
+      List<PluginDescription> upgrades = new List<PluginDescription>();
+      // for each of the available plugins check if there is an installed plugin that has the same name
+      // only if there is an installed plugin with the same name and the available plugin has a more recent version it is an upgrade
+      // NOTE: make sure to keep only the most recent entry of a plugin in the allAvailablePlugins list
+      allAvailablePlugins.ForEach(delegate(PluginDescription availablePlugin) {
+        List<PluginTag> oldPlugins = allTags.FindAll(delegate(PluginTag currentPlugin) {
+          return currentPlugin.PluginName == availablePlugin.Name && currentPlugin.State == PluginState.Installed;
+        });
+
+        // either none or exactly one plugin to upgrade can be found
+        Trace.Assert(oldPlugins.Count <= 1);
+        if(oldPlugins.Count == 1) {
+          if(oldPlugins[0].PluginVersion < availablePlugin.Version) {
+            upgrades.Add(availablePlugin);
+          }
+        }
+      });
+
+      return upgrades;
+    }
+
+    private List<PluginDescription> FindOverridingPlugins(List<PluginTag> allTags, List<PluginDescription> allAvailablePlugins) {
+      List<PluginDescription> overrides = new List<PluginDescription>();
+      allAvailablePlugins.ForEach(delegate(PluginDescription availablePlugin) {
+        List<PluginTag> currentPlugins = allTags.FindAll(delegate(PluginTag currentPlugin) {
+          return currentPlugin.PluginName == availablePlugin.Name && currentPlugin.State == PluginState.Available;
+        });
+
+        // either none or exactly one plugin to override can be found
+        Trace.Assert(currentPlugins.Count <= 1);
+        if(currentPlugins.Count == 1) {
+          if(currentPlugins[0].PluginVersion < availablePlugin.Version) {
+            overrides.Add(availablePlugin);
+          }
+        }
+      });
+
+      return overrides;
+    }
+
+    private void RebuildActionHulls() {
+      Dictionary<PluginTag, PluginAction> oldActions = new Dictionary<PluginTag, PluginAction>(actions);
+      actions.Clear();
+
+      foreach(PluginAction action in oldActions.Values) {
+        if(action.Action == ManagerAction.Install) {
+          MarkInstall(action.Plugin);
+        } else if(action.Action == ManagerAction.Remove) {
+          MarkRemove(action.Plugin);
+        } else
+          Trace.Assert(false); // is not allowed to happen
+      }
+
+      // update the GUI to represent new state of the selected plugin
+      if(pluginTreeView.SelectedNode != null && pluginTreeView.SelectedNode.Tag is PluginTag) {
+        UpdateActionButtons((PluginTag)pluginTreeView.SelectedNode.Tag);
+        DisplayPluginInfo(((PluginTag)pluginTreeView.SelectedNode.Tag).GetPluginDetails());
+      }
+    }
+
+
+
+    private void MarkInstall(PluginTag actionTag) {
+
+      Trace.Assert(actionTag.State == PluginState.Available);
+
+      if(!CheckInstallConflicts(actionTag)) {
+        CreateNewInstallAction(actionTag);
+      } else {
+        HandleInstallConflict(actionTag);
+      }
+    }
+
+    private void UnmarkInstall(PluginTag actionTag) {
+      Trace.Assert(actionTag.State == PluginState.Available);
+
+      Trace.Assert(GetOverlappingActions(actionTag, ManagerAction.Any).TrueForAll(delegate(PluginAction fixedPoint) {
+        return fixedPoint.Action == ManagerAction.Install;
+      }));
+
+      if(!CheckNoActionConflict(actionTag)) {
+        List<PluginAction> rootActions = GetActionsInvolving(actionTag);
+        // if there is no conflict then there can only be one action connected to the pluginTag
+        Trace.Assert(rootActions.Count == 1);
+        PluginAction rootAction = rootActions[0];
+        actions.Remove(rootAction.Plugin);
+        UpdateTreeNodes(rootAction.Hull);
+      } else {
+        HandleNoActionConflict(actionTag);
+      }
+    }
+
+    private void HandleNoActionConflict(PluginTag actionTag) {
+      List<PluginAction> conflictingActions = GetOverlappingActions(actionTag, ManagerAction.Any);
+
+      Trace.Assert(conflictingActions.Count > 1);
+      PluginAction theAction = GetSmallestActionInvolving(actionTag, conflictingActions);
+      conflictingActions.Remove(theAction);
+
+
+      string action = theAction.GetInverseActionString();
+
+      DialogResult userResult = ShowGenericConflictDialog(action, theAction, conflictingActions);
+
+      if(userResult == DialogResult.OK) {
+        conflictingActions.ForEach(delegate(PluginAction conflictingAction) {
+          actions.Remove(conflictingAction.Plugin);
+          UpdateTreeNodes(conflictingAction.Hull);
+        });
+
+        PluginAction rootAction = GetSmallestActionInvolving(actionTag, GetOverlappingActions(actionTag, ManagerAction.Any));
+        actions.Remove(rootAction.Plugin);
+        UpdateTreeNodes(rootAction.Hull);
+      }
+    }
+
+    private bool CheckNoActionConflict(PluginTag actionTag) {
+      return GetOverlappingActions(actionTag, ManagerAction.Any).Count > 1;
+    }
+
+    private void MarkRemove(PluginTag actionTag) {
+
+      Trace.Assert((actionTag.State & (PluginState.Installed | PluginState.Upgradeable)) != 0);
+
+      if(!CheckRemoveConflicts(actionTag)) {
+        CreateNewRemoveAction(actionTag);
+      } else {
+        HandleRemoveConflict(actionTag);
+      }
+    }
+
+    private void UnmarkRemove(PluginTag pluginTag) {
+
+      Trace.Assert(pluginTag.State == PluginState.Installed);
+
+      Trace.Assert(GetOverlappingActions(pluginTag, ManagerAction.Any).TrueForAll(delegate(PluginAction action) {
+        return action.Action == ManagerAction.Remove;
+      }));
+
+      if(!CheckNoActionConflict(pluginTag)) {
+        Trace.Assert(GetOverlappingActions(pluginTag, ManagerAction.Remove).Count == 1);
+        List<PluginAction> rootActions = GetActionsInvolving(pluginTag);
+        // if there is no conflict then there can only be one action connected to the pluginTag
+        Trace.Assert(rootActions.Count == 1);
+        PluginAction rootAction = rootActions[0];
+
+        // kill the root action
+        actions.Remove(rootAction.Plugin);
+        UpdateTreeNodes(rootAction.Hull);
+      } else {
+        HandleNoActionConflict(pluginTag);
+      }
+    }
+
+    private void CreateNewRemoveAction(PluginTag actionTag) {
+      CreateNewAction(actionTag, ManagerAction.Remove, actionTag.GetDependentTags());
+    }
+
+    private void CreateNewInstallAction(PluginTag actionTag) {
+      CreateNewAction(actionTag, ManagerAction.Install, actionTag.GetDependencyTags());
+    }
+
+    private void CreateNewAction(PluginTag actionTag, ManagerAction action, List<PluginTag> hull) {
+      PluginAction newAction = new PluginAction();
+      newAction.Action = action;
+      newAction.Plugin = actionTag;
+      newAction.Hull = hull;
+      newAction.Hull.Add(actionTag);
+
+
+      actions[actionTag] = newAction;
+      UpdateTreeNodes(newAction.Hull);
+    }
+
+    private bool CheckRemoveConflicts(PluginTag actionTag) {
+      return GetOverlappingActions(actionTag, ManagerAction.Install).Count > 0;
+    }
+
+    private void HandleRemoveConflict(PluginTag actionTag) {
+      List<PluginAction> conflictingActions = GetOverlappingActions(actionTag, ManagerAction.Install);
+
+      // create a planned action to display in the conflict message box
+      PluginAction plannedRemoveAction = new PluginAction();
+      plannedRemoveAction.Action = ManagerAction.Remove;
+      plannedRemoveAction.Plugin = actionTag;
+
+      DialogResult userResult = ShowGenericConflictDialog("Remove", plannedRemoveAction, conflictingActions);
+      if(userResult == DialogResult.OK) {
+        // if user says ok then remove the old actions and create a new remove action
+        conflictingActions.ForEach(delegate(PluginAction conflictingAction) {
+          actions.Remove(conflictingAction.Plugin);
+          UpdateTreeNodes(conflictingAction.Hull);
+        });
+
+        CreateNewRemoveAction(actionTag);
+      }
+    }
+
+    private bool CheckInstallConflicts(PluginTag actionTag) {
+      return GetOverlappingActions(actionTag, ManagerAction.Remove).Count > 0;
+    }
+
+    private void HandleInstallConflict(PluginTag actionTag) {
+      List<PluginAction> conflictingActions = GetOverlappingActions(actionTag, ManagerAction.Remove);
+
+      // create a planned action to display in the conflict message box
+      PluginAction plannedInstallAction = new PluginAction();
+      plannedInstallAction.Action = ManagerAction.Install;
+      plannedInstallAction.Plugin = actionTag;
+
+      DialogResult userResult = ShowGenericConflictDialog("Install", plannedInstallAction, conflictingActions);
+
+      if(userResult == DialogResult.OK) {
+        conflictingActions.ForEach(delegate(PluginAction conflictingAction) {
+          actions.Remove(conflictingAction.Plugin);
+          UpdateTreeNodes(conflictingAction.Hull);
+        });
+
+        CreateNewInstallAction(actionTag);
+      }
+    }
+
+    private DialogResult ShowGenericConflictDialog(string action, PluginAction theAction, List<PluginAction> conflictingActions) {
+
+      Trace.Assert(conflictingActions.Count > 0);
+
+      string message = "The actions:\n\n";
+      conflictingActions.ForEach(delegate(PluginAction conflictingAction) {
+        message += " - " + conflictingAction.Action + " " + conflictingAction.Plugin.PluginName + "\n";
+      });
+      message += "\nconflict with the action: " + action + " " + theAction.Plugin.PluginName + ".\n\n";
+      message += "\nSolution:\n";
+      conflictingActions.ForEach(delegate(PluginAction conflictingAction) {
+        message += " - " + conflictingAction.GetInverseActionString() + " " + conflictingAction.Plugin.PluginName + "\n";
+      });
+      message += " - " + action + " " + theAction.Plugin.PluginName + "\n\n";
+      message += "Do you want to continue?";
+
+      return MessageBox.Show(message, "Resolve conflicting actions", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
+
+    }
+
+    private List<PluginAction> GetActionsInvolving(PluginTag actionTag) {
+      List<PluginAction> filteredActions = new List<PluginAction>();
+      foreach(PluginAction action in actions.Values) {
+        if(action.Hull.Contains(actionTag)) {
+          filteredActions.Add(action);
+        }
+      }
+      return filteredActions;
+    }
+
+    private PluginAction GetSmallestActionInvolving(PluginTag actionTag, List<PluginAction> actions) {
+      Trace.Assert(actions.Count > 0);
+      PluginAction smallestAction;
+      // if there is an action defined for which actionTag is the root then us it as root tag
+      // otherwise use the root of the action that contains pluginTag in its hull and has the smallest hull of all actions
+      smallestAction = actions.Find(delegate(PluginAction action) {
+        return action.Plugin == actionTag;
+      });
+      // if nothing is found then get the action with the smallest hull
+      if(smallestAction == null) {
+        // find the action with the smallest hull
+        smallestAction = actions[0];
+        actions.ForEach(delegate(PluginAction action) {
+          if(action.Hull.Count < smallestAction.Hull.Count)
+            smallestAction = action;
+        });
+      }
+
+      return smallestAction;
+    }
+
+    /// <summary>
+    /// Similar to GetRootActions but filter only specific ManagerActions 
+    /// </summary>
+    /// <param name="pluginTag"></param>
+    /// <param name="overlapAction"></param>
+    /// <returns></returns>
+    private List<PluginAction> GetOverlappingActions(PluginTag actionTag, ManagerAction overlapAction) {
+      List<PluginAction> overlappingActions = new List<PluginAction>();
+      foreach(PluginAction action in actions.Values) {
+        if(((action.Action & overlapAction) > 0) &&
+          action.Hull.Contains(actionTag)) {
+          overlappingActions.Add(action);
+        }
+      }
+
+      return overlappingActions;
+    }
+
+    private void UpdateTreeNodes(List<PluginTag> hull) {
+      hull.ForEach(delegate(PluginTag tag) {
+        FindPluginNodes(tag).ForEach(delegate(TreeNode node) {
+          ManagerAction action = GetAction(tag);
+          if(action != ManagerAction.None) {
+            node.Text = tag.PluginName + " - Action: " + action;
+            if(action == ManagerAction.Remove) {
+              node.ImageIndex = 3;
+              node.SelectedImageIndex = 3;
+            } else if(action == ManagerAction.Install) {
+              node.ImageIndex = 2;
+              node.SelectedImageIndex = 2;
+            }
+          } else if(tag.State == PluginState.Upgradeable) {
+            node.Text = tag.PluginName + " - Upgrade: " + tag.PluginVersion + " -> " + tag.UpgradePluginDescription.Version;
+            node.ImageIndex = 2;
+            node.SelectedImageIndex = 2;
+          } else {
+            node.Text = tag.PluginName;
+            node.ImageIndex = 0;
+            node.SelectedImageIndex = 0;
+          }
+        });
+      });
+    }
+
+    private void UpdateActionButtons(PluginTag tag) {
+
+      publishButton.Enabled = (tag.State & PluginState.Installed) == PluginState.Installed;
+      installButton.Enabled = (tag.State & PluginState.Available) == PluginState.Available;
+      removeButton.Enabled = (tag.State & (PluginState.Installed | PluginState.Upgradeable)) != 0;
+
+      installButton.Checked = GetAction(tag) == ManagerAction.Install;
+      removeButton.Checked = GetAction(tag) == ManagerAction.Remove;
+
+      publishMenuItem.Enabled = publishButton.Enabled;
+      installMenuItem.Enabled = installButton.Enabled;
+      removeMenuItem.Enabled = removeButton.Enabled;
+      installMenuItem.Checked = installButton.Checked;
+      removeMenuItem.Checked = removeButton.Checked;
+
+    }
+
+    private ManagerAction GetAction(PluginTag tag) {
+      ManagerAction plannedAction = ManagerAction.None;
+      if(actions.ContainsKey(tag)) {
+        plannedAction = actions[tag].Action;
+      } else {
+        foreach(PluginAction action in actions.Values) {
+          if(action.Hull.Contains(tag)) {
+            plannedAction = action.Action;
+          }
+        }
+      }
+
+      if(plannedAction == ManagerAction.Install
+        && (tag.State == PluginState.Installed || tag.State == PluginState.Upgradeable)) {
+        return ManagerAction.None;
+      } else if(plannedAction == ManagerAction.Remove
+        && tag.State == PluginState.Available) {
+        return ManagerAction.None;
+      } else {
+        return plannedAction;
+      }
+    }
+
+    private List<TreeNode> FindPluginNodes(PluginTag pluginTag) {
+      List<TreeNode> nodes = new List<TreeNode>();
+      foreach(TreeNode rootNode in new TreeNode[] { installedPlugins, availablePlugins, allPlugins }) {
+        foreach(TreeNode node in rootNode.Nodes) {
+          if(pluginTag.Equals(node.Tag)) {
+            nodes.Add(node);
+          }
+        }
+      }
+      return nodes;
+    }
+
+
+
+    private void DisplayPluginInfo(string pluginInformation) {
+      infoTextBox.Text = pluginInformation;
+    }
+
+
+    private void upgradeButton_Click(object sender, EventArgs args) {
+      try {
+        ClearTemporaryFiles();
+
+        if(!DownloadFiles()) {
+          return;
+        }
+
+        OnDeletePlugins();
+        OnPreUpgradePlugins();
+
+        PluginManager.Manager.UnloadAllPlugins();
+
+        BackupOldFiles();
+        DeleteOldFiles();
+        InstallNewFiles();
+
+        PluginManager.Manager.LoadAllPlugins();
+
+        OnPostUpgradePlugins();
+        OnInstallPlugins();
+
+        InitializePlugins();
+
+        ClearTemporaryFiles();
+      } catch(Exception e) {
+        ShowErrorDialog(e + "");
+      }
+
+    }
+
+    private void OnDeletePlugins() {
+      allTags.ForEach(delegate(PluginTag tag) {
+        if(tag.State == PluginState.Installed) {
+          List<PluginAction> actions = GetActionsInvolving(tag);
+          if(actions.Count > 0 && actions[0].Action == ManagerAction.Remove) {
+            PluginManager.Manager.OnDelete(tag.Plugin);
+          }
+        }
+      });
+    }
+
+    private void OnInstallPlugins() {
+      allTags.ForEach(delegate(PluginTag tag) {
+        if(tag.State == PluginState.Available) {
+          List<PluginAction> actions = GetActionsInvolving(tag);
+          if(actions.Count > 0 && actions[0].Action == ManagerAction.Install) {
+            PluginManager.Manager.OnInstall(tag.Plugin);
+          }
+        }
+      });
+    }
+
+
+    private List<string> upgradedPlugins = new List<string>();
+    private void OnPreUpgradePlugins() {
+      upgradedPlugins.Clear();
+      allTags.ForEach(delegate(PluginTag tag) {
+        if(tag.State==PluginState.Upgradeable) {
+          PluginManager.Manager.OnPreUpdate(tag.Plugin);
+
+          // save the name of the plugin in  a list that is used later to call OnPostUpdate for all plugins
+          upgradedPlugins.Add(tag.PluginName);
+        }
+      });
+    }
+
+    private void OnPostUpgradePlugins() {
+      allTags.ForEach(delegate(PluginTag tag) {
+        if(upgradedPlugins.Contains(tag.PluginName)) {
+          PluginManager.Manager.OnPostUpdate(tag.Plugin);
+        }
+      });
+      upgradedPlugins.Clear();
+    }
+
+    /// <summary>
+    /// Deletes all files in the directories cacheDir, backupDir, tempDir
+    /// </summary>
+    private void ClearTemporaryFiles() {
+      // can't really handle exceptions here -> let higher layer handle them
+      string[] filenames = Directory.GetFiles(cacheDir, "*", SearchOption.AllDirectories);
+      foreach(string filename in filenames) {
+        File.Delete(filename);
+      }
+      filenames = Directory.GetFiles(backupDir, "*", SearchOption.AllDirectories);
+      foreach(string filename in filenames) {
+        File.Delete(filename);
+      }
+      filenames = Directory.GetFiles(tempDir, "*", SearchOption.AllDirectories);
+      foreach(string filename in filenames) {
+        File.Delete(filename);
+      }
+    }
+
+    /// <summary>
+    /// Extracts zip packages in cacheDir to tempDir and then copies the files from tempDir to pluginDir
+    /// When there is a problem on extraction or later when copying the files to the pluginDir the method 
+    /// delets all files that have already been copied from tempDir to pluginDir (the filename exists in both
+    /// locations) and then copies all files in the backup directory back to the plugin directory.
+    /// </summary>
+    /// <returns></returns>
+    private void InstallNewFiles() {
+      try {
+        // extract all packages
+        string[] packages = Directory.GetFiles(cacheDir, "*", SearchOption.AllDirectories);
+        FastZip fastZip = new FastZip();
+        foreach(string package in packages) {
+          fastZip.ExtractZip(package, tempDir, String.Empty);
+        }
+
+        // copy extracted files to plugin dir
+        string[] extractedFiles = Directory.GetFiles(tempDir, "*", SearchOption.AllDirectories);
+        foreach(string extractedFile in extractedFiles) {
+          Trace.Assert(extractedFile.StartsWith(tempDir));
+          File.Copy(extractedFile, pluginDir + extractedFile.Remove(0, tempDir.Length));
+        }
+      } catch(Exception e) {
+        infoTextBox.Text = e + "";
+        // remove already copied files
+        string[] extractedFiles = Directory.GetFiles(tempDir, "*", SearchOption.AllDirectories);
+        foreach(string extractedFile in extractedFiles) {
+          Trace.Assert(extractedFile.StartsWith(tempDir));
+          string filename = pluginDir + extractedFile.Remove(0, tempDir.Length);
+          if(File.Exists(filename)) {
+            File.Delete(filename);
+          }
+        }
+
+        // restore files from backup
+        string[] backupFiles = Directory.GetFiles(backupDir, "*", SearchOption.AllDirectories);
+        foreach(string backupFile in backupFiles) {
+          Trace.Assert(backupFile.StartsWith(backupDir));
+          File.Copy(backupFile, pluginDir + backupFile.Remove(0, backupDir.Length));
+        }
+
+        throw e;
+      }
+    }
+
+    /// <summary>
+    /// Deletes all files of plugins that have been marked as 'Remove' or 'Upgrade'.
+    /// If there is a problem when removing the files then all files that have been removed earlier
+    /// (the filename existis in backupDir but not in pluginDir) are copied from the backupDir to the pluginDir
+    /// </summary>
+    /// <returns></returns>
+    private void DeleteOldFiles() {
+      try {
+        allTags.ForEach(delegate(PluginTag tag) {
+          List<PluginAction> involvingActions = GetActionsInvolving(tag);
+
+          if(tag.State == PluginState.Upgradeable || (involvingActions.Count > 0 && involvingActions[0].Action == ManagerAction.Remove)) {
+            tag.Plugin.Files.ForEach(delegate(string filename) {
+              Trace.Assert(filename.StartsWith(pluginDir));
+              DialogResult result = MessageBox.Show("Deleting: " + filename, "Warning: deleting file", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
+              if(result == DialogResult.OK) {
+                File.Delete(filename);
+              }
+            });
+          }
+        });
+      } catch(Exception e) {
+        infoTextBox.Text = e + "";
+        // restore deleted files from backup
+        string[] backupFiles = Directory.GetFiles(backupDir, "*", SearchOption.AllDirectories);
+        foreach(string backupFile in backupFiles) {
+          Trace.Assert(backupFile.StartsWith(backupDir));
+          string oldFileName = pluginDir + backupFile.Remove(0, backupDir.Length);
+          if(!File.Exists(oldFileName)) {
+            File.Move(backupFile, oldFileName);
+          }
+        }
+        throw e;
+      }
+    }
+
+    /// <summary>
+    /// Copies all files of plugins that are marked with 'Remove' or 'Upgrade' to the backup directory.
+    /// When there is a problem all files in the backup directory are deleted.
+    /// </summary>
+    /// <returns></returns>
+    private void BackupOldFiles() {
+      try {
+        allTags.ForEach(delegate(PluginTag tag) {
+          List<PluginAction> actionsInvolving = GetActionsInvolving(tag);
+
+          if(tag.State == PluginState.Upgradeable || (actionsInvolving.Count > 0 && actionsInvolving[0].Action == ManagerAction.Remove)) {
+            tag.Plugin.Files.ForEach(delegate(string filename) {
+              Trace.Assert(filename.StartsWith(pluginDir));
+              File.Copy(filename, backupDir + filename.Remove(0, pluginDir.Length));
+            });
+          }
+        });
+      } catch(Exception e) {
+        infoTextBox.Text = e + "";
+        // delete all files in the backup directory
+        string[] copiedFiles = Directory.GetFiles(backupDir, "*", SearchOption.AllDirectories);
+        string filesString = "";
+        foreach(string fs in copiedFiles) {
+          filesString += fs + "\n";
+        }
+        DialogResult result = MessageBox.Show("Deleting: " + filesString, "Warning: deleting files", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
+        if(result == DialogResult.OK) {
+          foreach(string copiedFile in copiedFiles) {
+            File.Delete(copiedFile);
+          }
+        }
+        throw e;
+      }
+    }
+
+    private bool DownloadFiles() {
+      DownloaderDialog dialog = new DownloaderDialog();
+      IEnumerator<PluginTag> pluginEnumerator = allTags.GetEnumerator();
+      BackgroundWorker worker = new BackgroundWorker();
+      worker.WorkerReportsProgress = true;
+      worker.WorkerSupportsCancellation = true;
+
+      worker.DoWork += delegate(object sender, DoWorkEventArgs args) {
+        // count number of plugins to download
+        int numberOfPlugins = 0;
+        allTags.ForEach(delegate(PluginTag current) {
+          if(current.UpgradeAvailable()) {
+            numberOfPlugins++;
+          } else {
+            List<PluginAction> actionsInvolving = GetActionsInvolving(current);
+
+            if(actionsInvolving.Count > 0 && actionsInvolving[0].Action == ManagerAction.Install && current.State == PluginState.Available) {
+              numberOfPlugins++;
+            }
+          }
+        });
+
+        // download
+        int downloaded = 0;
+        Invoke((MethodInvoker)delegate() {
+          infoTextBox.Text = "Downloading " + numberOfPlugins + " plugins.\n";
+        });
+
+        allTags.ForEach(delegate(PluginTag current) {
+          if(worker.CancellationPending) {
+            args.Cancel = true;
+            return;
+          }
+          List<PluginAction> actionsInvolving = GetActionsInvolving(current);
+          if(current.UpgradeAvailable() ||
+            (actionsInvolving.Count > 0 && actionsInvolving[0].Action == ManagerAction.Install && current.State == PluginState.Available)) {
+            dialog.SetDownloadDescription("Downloading " + current.PluginName + " ...");
+            Invoke((MethodInvoker)delegate() { infoTextBox.Text += "Downloading " + current.PluginName + " ..."; });
+
+            long nBytes = 0;
+            if(current.UpgradeAvailable()) {
+              nBytes = current.UpgradePluginDescription.Source.DownloadPlugin(current.UpgradePluginDescription);
+            } else {
+              nBytes = current.PluginDescription.Source.DownloadPlugin(current.PluginDescription);
+            }
+
+            worker.ReportProgress(downloaded / numberOfPlugins);
+            Invoke((MethodInvoker)delegate() { infoTextBox.Text += " " + nBytes + " bytes.\n"; });
+          }
+        });
+      };
+
+      worker.ProgressChanged += delegate(object sender, ProgressChangedEventArgs args) {
+        dialog.SetProgress(args.ProgressPercentage);
+      };
+
+      worker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs args) {
+        if(args.Cancelled) {
+          infoTextBox.Text += "Cancelled downloading plugins";
+          dialog.DialogResult = DialogResult.Cancel;
+        } else if(args.Error != null) {
+          infoTextBox.Text += "Error while downloading plugins:\n" + args.Error;
+          dialog.DialogResult = DialogResult.Cancel;
+        }
+        dialog.DialogResult = DialogResult.OK;
+        dialog.Close();
+      };
+
+
+      dialog.Shown += delegate(object sender, EventArgs args) {
+        worker.RunWorkerAsync();
+      };
+
+      dialog.OnCancel += delegate() {
+        worker.CancelAsync();
+        dialog.SetDownloadDescription("Cancelling download...");
+        infoTextBox.Text += "Cancelled!\n";
+      };
+
+      if(dialog.ShowDialog() == DialogResult.Cancel) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+
+    private void removeButton_Clicked(object sender, EventArgs e) {
+      AssertAction();
+      // get the tag of the selected treeNode
+      PluginTag actionTag = (PluginTag)pluginTreeView.SelectedNode.Tag;
+      List<PluginAction> rootActions = GetActionsInvolving(actionTag);
+      if(rootActions.Count>0) {
+        Trace.Assert(rootActions.TrueForAll(delegate(PluginAction rootAction) {
+          return rootAction.Action == ManagerAction.Remove;
+        }));
+        UnmarkRemove(actionTag);
+      } else {
+        MarkRemove(actionTag);
+      }
+
+      // reflect the change of plugin actions in the install/remove buttons
+      UpdateActionButtons(actionTag);
+      // update the plugin detail information of the selected plugin
+      DisplayPluginInfo(actionTag.GetPluginDetails());
+    }
+
+    private void installButton_Clicked(object sender, EventArgs e) {
+      AssertAction();
+      // get the tag of the selected treeNode
+      PluginTag actionTag = (PluginTag)pluginTreeView.SelectedNode.Tag;
+      List<PluginAction> rootActions = GetActionsInvolving(actionTag);
+
+      if(rootActions.Count > 0) {
+        Trace.Assert(rootActions.TrueForAll(delegate(PluginAction rootAction) {
+          return rootAction.Action == ManagerAction.Install;
+        }));
+        UnmarkInstall(actionTag);
+      } else {
+        MarkInstall(actionTag);
+      }
+
+      // reflect the change of plugin actions in the install/remove buttons
+      UpdateActionButtons(actionTag);
+      // update the plugin detail information of the selected plugin
+      DisplayPluginInfo(actionTag.GetPluginDetails());
+    }
+
+    private void AssertAction() {
+      Trace.Assert(pluginTreeView.SelectedNode != null);
+      Trace.Assert(pluginTreeView.SelectedNode.Tag is PluginTag);
+    }
+
+    private void ShowErrorDialog(string message) {
+      ErrorDialog dialog = new ErrorDialog(message, "Exception");
+      dialog.ShowDialog();
+    }
+
+    private void managePluginSourcesToolStripMenuItem_Click(object sender, EventArgs e) {
+      PluginSourceEditor sourceEditor = new PluginSourceEditor();
+      sourceEditor.ShowDialog();
+    }
+
+    private void refreshPluginListToolStripMenuItem_Click(object sender, EventArgs e) {
+      PluginManager.Manager.UnloadAllPlugins();
+      PluginManager.Manager.LoadAllPlugins();
+
+      InitializePlugins();
+    }
+
+    private void pluginTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e) {
+      if(e.Node.Tag != null) {
+
+        UpdateActionButtons((PluginTag)e.Node.Tag);
+        // display the plugin details in the lower pane
+        DisplayPluginInfo(((PluginTag)e.Node.Tag).GetPluginDetails());
+
+      } else {
+        // when a node was selected that doesn't represent a plugin (root node) then install and remove are not possible
+        publishButton.Enabled = false;
+        installButton.Enabled = false;
+        removeButton.Enabled = false;
+      }
+    }
+
+    private void pluginTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
+      // dumb solution to automatically select the node on right clicks which opens the context menu because 
+      // per default the treeview doesn't select nodes on right click
+      if(e.Button == MouseButtons.Right) {
+        pluginTreeView.SelectedNode = e.Node;
+      }
+    }
+
+    private void closeToolStripMenuItem_Click(object sender, EventArgs e) {
+      Close();
+    }
+
+    private void installPluginFromFileToolStripMenuItem_Click(object sender, EventArgs args) {
+      OpenFileDialog dialog = new OpenFileDialog();
+      dialog.Multiselect = false;
+      DialogResult result = dialog.ShowDialog();
+      if(result == DialogResult.OK) {
+        string packageName = dialog.FileName;
+        try {
+          ClearTemporaryFiles();
+
+          FastZip fastZip = new FastZip();
+          fastZip.ExtractZip(packageName, cacheDir, String.Empty);
+
+          // check if none of the files exist
+          foreach(string filename in Directory.GetFiles(cacheDir)) {
+            Trace.Assert(filename.StartsWith(cacheDir));
+            if(File.Exists(pluginDir + filename.Remove(0, cacheDir.Length))) {
+              ShowErrorDialog("Sorry can't install the plugin "+packageName+"\nThe file: "+filename.Remove(0, cacheDir.Length)+" already exist in "+pluginDir+"\nIt seems the plugin is already installed.");
+              ClearTemporaryFiles();
+              return;
+            }
+          }
+
+          PluginManager.Manager.UnloadAllPlugins();
+          // move the files
+          foreach(string filename in Directory.GetFiles(cacheDir)) {
+            File.Move(filename, pluginDir + filename.Remove(0, cacheDir.Length));
+          }
+          PluginManager.Manager.LoadAllPlugins();
+          InitializePlugins();
+
+        } catch(Exception e) {
+          ShowErrorDialog(e + "");
+        } finally {
+          ClearTemporaryFiles();
+        }
+      }
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.designer.cs	(revision 2)
@@ -0,0 +1,395 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  partial class ManagerForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ManagerForm));
+      this.menuStrip = new System.Windows.Forms.MenuStrip();
+      this.pluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.managePluginSourcesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.installPluginFromFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+      this.installedPluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.installNewPluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+      this.refreshPluginListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.pluginTreeView = new System.Windows.Forms.TreeView();
+      this.infoTextBox = new System.Windows.Forms.RichTextBox();
+      this.toolStrip = new System.Windows.Forms.ToolStrip();
+      this.updateButton = new System.Windows.Forms.ToolStripButton();
+      this.upgradeButton = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
+      this.installButton = new System.Windows.Forms.ToolStripButton();
+      this.removeButton = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+      this.publishButton = new System.Windows.Forms.ToolStripButton();
+      this.pluginContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.installMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.removeMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.publishMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.pluginIcons = new System.Windows.Forms.ImageList(this.components);
+      this.menuStrip.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.toolStrip.SuspendLayout();
+      this.pluginContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // menuStrip
+      // 
+      this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.pluginsToolStripMenuItem,
+            this.helpToolStripMenuItem});
+      this.menuStrip.Location = new System.Drawing.Point(0, 0);
+      this.menuStrip.Name = "menuStrip";
+      this.menuStrip.Size = new System.Drawing.Size(828, 24);
+      this.menuStrip.TabIndex = 0;
+      this.menuStrip.Text = "menuStrip";
+      // 
+      // pluginsToolStripMenuItem
+      // 
+      this.pluginsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.managePluginSourcesToolStripMenuItem,
+            this.installPluginFromFileToolStripMenuItem,
+            this.toolStripSeparator2,
+            this.installedPluginsToolStripMenuItem,
+            this.installNewPluginsToolStripMenuItem,
+            this.toolStripSeparator3,
+            this.refreshPluginListToolStripMenuItem,
+            this.exitToolStripMenuItem});
+      this.pluginsToolStripMenuItem.Name = "pluginsToolStripMenuItem";
+      this.pluginsToolStripMenuItem.Size = new System.Drawing.Size(52, 20);
+      this.pluginsToolStripMenuItem.Text = "Plugins";
+      // 
+      // managePluginSourcesToolStripMenuItem
+      // 
+      this.managePluginSourcesToolStripMenuItem.Name = "managePluginSourcesToolStripMenuItem";
+      this.managePluginSourcesToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
+      this.managePluginSourcesToolStripMenuItem.Text = "Edit plugin sources...";
+      this.managePluginSourcesToolStripMenuItem.Click += new System.EventHandler(this.managePluginSourcesToolStripMenuItem_Click);
+      // 
+      // installPluginFromFileToolStripMenuItem
+      // 
+      this.installPluginFromFileToolStripMenuItem.Name = "installPluginFromFileToolStripMenuItem";
+      this.installPluginFromFileToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
+      this.installPluginFromFileToolStripMenuItem.Text = "Install plugin from file...";
+      this.installPluginFromFileToolStripMenuItem.Click += new System.EventHandler(this.installPluginFromFileToolStripMenuItem_Click);
+      // 
+      // toolStripSeparator2
+      // 
+      this.toolStripSeparator2.Name = "toolStripSeparator2";
+      this.toolStripSeparator2.Size = new System.Drawing.Size(200, 6);
+      // 
+      // installedPluginsToolStripMenuItem
+      // 
+      this.installedPluginsToolStripMenuItem.Name = "installedPluginsToolStripMenuItem";
+      this.installedPluginsToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
+      this.installedPluginsToolStripMenuItem.Text = "Update";
+      this.installedPluginsToolStripMenuItem.Click += new System.EventHandler(this.updateButton_Click);
+      // 
+      // installNewPluginsToolStripMenuItem
+      // 
+      this.installNewPluginsToolStripMenuItem.Name = "installNewPluginsToolStripMenuItem";
+      this.installNewPluginsToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
+      this.installNewPluginsToolStripMenuItem.Text = "Remove/Upgrade/Install...";
+      this.installNewPluginsToolStripMenuItem.Click += new System.EventHandler(this.upgradeButton_Click);
+      // 
+      // toolStripSeparator3
+      // 
+      this.toolStripSeparator3.Name = "toolStripSeparator3";
+      this.toolStripSeparator3.Size = new System.Drawing.Size(200, 6);
+      // 
+      // refreshPluginListToolStripMenuItem
+      // 
+      this.refreshPluginListToolStripMenuItem.Name = "refreshPluginListToolStripMenuItem";
+      this.refreshPluginListToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
+      this.refreshPluginListToolStripMenuItem.Text = "Refresh plugin list";
+      this.refreshPluginListToolStripMenuItem.Click += new System.EventHandler(this.refreshPluginListToolStripMenuItem_Click);
+      // 
+      // exitToolStripMenuItem
+      // 
+      this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
+      this.exitToolStripMenuItem.Text = "Close";
+      this.exitToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
+      // 
+      // helpToolStripMenuItem
+      // 
+      this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.aboutToolStripMenuItem});
+      this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+      this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20);
+      this.helpToolStripMenuItem.Text = "Help";
+      // 
+      // aboutToolStripMenuItem
+      // 
+      this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(115, 22);
+      this.aboutToolStripMenuItem.Text = "About...";
+      this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer.Location = new System.Drawing.Point(0, 52);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.pluginTreeView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.infoTextBox);
+      this.splitContainer.Size = new System.Drawing.Size(828, 473);
+      this.splitContainer.SplitterDistance = 220;
+      this.splitContainer.TabIndex = 1;
+      // 
+      // pluginTreeView
+      // 
+      this.pluginTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.pluginTreeView.ImageIndex = 0;
+      this.pluginTreeView.ImageList = this.pluginIcons;
+      this.pluginTreeView.Location = new System.Drawing.Point(0, 0);
+      this.pluginTreeView.Name = "pluginTreeView";
+      this.pluginTreeView.SelectedImageIndex = 0;
+      this.pluginTreeView.Size = new System.Drawing.Size(828, 220);
+      this.pluginTreeView.TabIndex = 0;
+      this.pluginTreeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.pluginTreeView_NodeMouseClick);
+      this.pluginTreeView.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.pluginTreeView_BeforeSelect);
+      // 
+      // infoTextBox
+      // 
+      this.infoTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.infoTextBox.Location = new System.Drawing.Point(0, 0);
+      this.infoTextBox.Name = "infoTextBox";
+      this.infoTextBox.Size = new System.Drawing.Size(828, 249);
+      this.infoTextBox.TabIndex = 0;
+      this.infoTextBox.Text = "";
+      // 
+      // toolStrip
+      // 
+      this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.updateButton,
+            this.upgradeButton,
+            this.toolStripSeparator,
+            this.installButton,
+            this.removeButton,
+            this.toolStripSeparator1,
+            this.publishButton});
+      this.toolStrip.Location = new System.Drawing.Point(0, 24);
+      this.toolStrip.Name = "toolStrip";
+      this.toolStrip.Size = new System.Drawing.Size(828, 25);
+      this.toolStrip.TabIndex = 2;
+      this.toolStrip.Text = "toolStrip";
+      // 
+      // updateButton
+      // 
+      this.updateButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+      this.updateButton.Image = ((System.Drawing.Image)(resources.GetObject("updateButton.Image")));
+      this.updateButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.updateButton.Name = "updateButton";
+      this.updateButton.Size = new System.Drawing.Size(46, 22);
+      this.updateButton.Text = "Update";
+      this.updateButton.Click += new System.EventHandler(this.updateButton_Click);
+      // 
+      // upgradeButton
+      // 
+      this.upgradeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+      this.upgradeButton.Image = ((System.Drawing.Image)(resources.GetObject("upgradeButton.Image")));
+      this.upgradeButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.upgradeButton.Name = "upgradeButton";
+      this.upgradeButton.Size = new System.Drawing.Size(140, 22);
+      this.upgradeButton.Text = "Remove/Upgrade/Install...";
+      this.upgradeButton.Click += new System.EventHandler(this.upgradeButton_Click);
+      // 
+      // toolStripSeparator
+      // 
+      this.toolStripSeparator.Name = "toolStripSeparator";
+      this.toolStripSeparator.Size = new System.Drawing.Size(6, 25);
+      // 
+      // installButton
+      // 
+      this.installButton.CheckOnClick = true;
+      this.installButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+      this.installButton.Image = ((System.Drawing.Image)(resources.GetObject("installButton.Image")));
+      this.installButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.installButton.Name = "installButton";
+      this.installButton.Size = new System.Drawing.Size(40, 22);
+      this.installButton.Text = "Install";
+      this.installButton.Click += new System.EventHandler(this.installButton_Clicked);
+      // 
+      // removeButton
+      // 
+      this.removeButton.CheckOnClick = true;
+      this.removeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+      this.removeButton.Image = ((System.Drawing.Image)(resources.GetObject("removeButton.Image")));
+      this.removeButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(50, 22);
+      this.removeButton.Text = "Remove";
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Clicked);
+      // 
+      // toolStripSeparator1
+      // 
+      this.toolStripSeparator1.Name = "toolStripSeparator1";
+      this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+      // 
+      // publishButton
+      // 
+      this.publishButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+      this.publishButton.Image = ((System.Drawing.Image)(resources.GetObject("publishButton.Image")));
+      this.publishButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.publishButton.Name = "publishButton";
+      this.publishButton.Size = new System.Drawing.Size(44, 22);
+      this.publishButton.Text = "Publish";
+      this.publishButton.Click += new System.EventHandler(this.publishButton_Click);
+      // 
+      // pluginContextMenuStrip
+      // 
+      this.pluginContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.installMenuItem,
+            this.removeMenuItem,
+            this.publishMenuItem});
+      this.pluginContextMenuStrip.Name = "pluginContextMenuStrip";
+      this.pluginContextMenuStrip.Size = new System.Drawing.Size(114, 70);
+      // 
+      // installMenuItem
+      // 
+      this.installMenuItem.Name = "installMenuItem";
+      this.installMenuItem.Size = new System.Drawing.Size(113, 22);
+      this.installMenuItem.Text = "Install";
+      this.installMenuItem.Click += new System.EventHandler(this.installButton_Clicked);
+      // 
+      // removeMenuItem
+      // 
+      this.removeMenuItem.Name = "removeMenuItem";
+      this.removeMenuItem.Size = new System.Drawing.Size(113, 22);
+      this.removeMenuItem.Text = "Remove";
+      this.removeMenuItem.Click += new System.EventHandler(this.removeButton_Clicked);
+      // 
+      // publishMenuItem
+      // 
+      this.publishMenuItem.Name = "publishMenuItem";
+      this.publishMenuItem.Size = new System.Drawing.Size(113, 22);
+      this.publishMenuItem.Text = "Publish";
+      this.publishMenuItem.Click += new System.EventHandler(this.publishButton_Click);
+      // 
+      // pluginIcons
+      // 
+      this.pluginIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("pluginIcons.ImageStream")));
+      this.pluginIcons.TransparentColor = System.Drawing.Color.Magenta;
+      this.pluginIcons.Images.SetKeyName(0, "VSObject_Module.bmp");
+      this.pluginIcons.Images.SetKeyName(1, "VSObject_Namespace.bmp");
+      this.pluginIcons.Images.SetKeyName(2, "install.bmp");
+      this.pluginIcons.Images.SetKeyName(3, "delete.bmp");
+      this.pluginIcons.Images.SetKeyName(4, "genericInternet.bmp");
+      // 
+      // ManagerForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(828, 537);
+      this.Controls.Add(this.toolStrip);
+      this.Controls.Add(this.splitContainer);
+      this.Controls.Add(this.menuStrip);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.MainMenuStrip = this.menuStrip;
+      this.Name = "ManagerForm";
+      this.Text = "Heuristiclab Pluginmanager Console";
+      this.menuStrip.ResumeLayout(false);
+      this.menuStrip.PerformLayout();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.toolStrip.ResumeLayout(false);
+      this.toolStrip.PerformLayout();
+      this.pluginContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.MenuStrip menuStrip;
+    private System.Windows.Forms.ToolStripMenuItem pluginsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem installedPluginsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem installNewPluginsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem managePluginSourcesToolStripMenuItem;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.TreeView pluginTreeView;
+    private System.Windows.Forms.RichTextBox infoTextBox;
+    private System.Windows.Forms.ToolStripMenuItem refreshPluginListToolStripMenuItem;
+    private System.Windows.Forms.ToolStrip toolStrip;
+    private System.Windows.Forms.ToolStripButton updateButton;
+    private System.Windows.Forms.ToolStripButton upgradeButton;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator;
+    private System.Windows.Forms.ToolStripButton installButton;
+    private System.Windows.Forms.ToolStripButton removeButton;
+    private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+    private System.Windows.Forms.ToolStripButton publishButton;
+    private System.Windows.Forms.ContextMenuStrip pluginContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem installMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem removeMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem publishMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem installPluginFromFileToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+    private System.Windows.Forms.ImageList pluginIcons;
+  }
+}
+
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.resx	(revision 2)
@@ -0,0 +1,605 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="pluginIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>382, 17</value>
+  </metadata>
+  <data name="pluginIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAE
+        EgAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAMAAQEBAAEYBgABGBUAA/0D8QPPAaUBmwKQAXIBVQGIAWEBQwGBAVoBQAF1AVYBQQFoAVoBUgNv
+        A5cDxwPsA/yWAAPwAccBvgGxAbMBgAFHAckBaQEoAcQBZgFDAcQBZQFLAc0BZgFMAc4BaAFOAb4BWwE3
+        AYMBRwEqAV4BTwFIA3kDtwPrA/2QAAP3AdQBxAGpAc8BewElAbMBTQEkAawBQAEcAYcBUgEmAZABTwEi
+        Aa0BPwEUAa4BSAEhAbwBVgE2AcoBZAFIAa4BUQEvAWEBRAE2A3UDwAPzkAAB6QHiAdYBzAF+ASwBnQE3
+        AQoBnQE3AQABqQE7AQABewFOAQcBOwFdAQ4BngE/AQABowE5AQABngE4AQMBpgFBARUBvAFXATcBrAFS
+        ATMBXwFLAUEDjAPfkAAB5QG3AXUBowE9AQMBpwFBAQABsgFMAQABvQFRAQABoQFYAgABbgEAAUABYgEA
+        AbcBTgEAAa4BRwEAAaMBOwEAAZYBQwERAZYBaAFPAY4BSgErAWwCawPHkAAByAF6ATABqwFCAQABvAFW
+        AQABxgFgAQAB1AFmAQABUAF3AgABfwIAAXsBAAGaAWYBAAHLAVkBAAHFAUsBAAGNAU8BCwFeAWgBNQGQ
+        AV8BOQFpAVkBTwOzkAABwAFlARUBvgFXAQAB0QFoAQAB5QFwAQAB0wF6AQABPwGKAQABJQGLAQABnQF/
+        AQAB3AF1AQABrAFvAQABQwFqAQABJgFlAQMBLAFnARkBawFkATABdQFUAT4DqpAAAcQBYwELAdIBZwEA
+        AdMBeAEAAXMBjwEGAXYBlQEFAWMBmgEJAcQBkwEAAf8BiwEAAfIBhAEAAY0BfwIAAX8CAAFzAQABBQFo
+        AQQBRQFkAR0BeQFVATcDq5AAAdABbwEMAd8BcAEAAWIBlAEMAQABrQEiAU4BqgEjAZgBrAElAf8BqQEe
+        Af8BoAENAfsBkgEAAecBhQEAATIBhAEAARABeQEAATYBZgEAATwBYQENAXwBXQE7A7aQAAHgAYQBHwHX
+        AXgBAAEkAa0BKQEcAbsBQgEZAcIBUQEyAcMBVALJAWEB/wHBAU8B/wGoARwB/AGRAQABaQGKAQABBQGC
+        AQABBwFzAQABFAFoAQMBhgFrAUsDyZAAAe0BqwFWAX0BjgELAR0BvgFGATIBywJjAdYBeQFaAdgBfgF5
+        Ad0BiAH/Ad4BiwH/Ab0BSAH/AZwBCAGGAY4BAAEyAYUCAAF5AQABNAFtAQMBmwGMAX0D4ZAAAe8B8QHN
+        AS4BtwE9ASABxgFYAVIB2AF/AcAB5wGaAbwB8AGwAc4B+AHHAdMB6QGhAdABwwFUAcEBpwEbAeIBiwEC
+        AX4BgQIAAXwBAAGUAXsBJAPFA/WQAAL+AfwBvAHnAakBSgHAAVEBagHZAX8BrAHrAaMB2wH4Ab8B3wHz
+        AbUBfAHcAYYBIQHFAVcBhQGoAR4B7wGHAQABzwF2AQABjgGHAQ4BxQG2AaID7ZYAAv4B+AHXAeoBtAGN
+        AdEBcQGiAdkBgAG1AeUBmAGbAeIBkgFCAdUBeAEQAcMBUgFWAaIBHQHuAYMBAgHlAZUBKgHZAcMBoAPv
+        A/2ZAAL+Af0C+AHcAc8B5AGiAbgB2QF/AYcB1AF3AYYBwgFSAVoBwAFMAakBswFNAeoBwAF9AesB5AHZ
+        A/ioAAH9AfoB7AH5Ae8B0AH2AecBwwHzAegB0AH1AfQB8QP7/wADAAPvA8ADkgOEA48DoAOwA7cDqAOV
+        A5IDoQPEA+kD+5AAA/oDvgOZAa4CrQGMAYkBiwFzAnIBYwFiAWEBYwFfAV4BfwJoAZsCfAGeAoIBgwJt
+        AWMCWQNzA7AD6QMAAbUCjwGAAmYBmwKBAccCIhIAAdcCPgHTArkBqQKPAZ8CbSQAAeUCywGdAU0BJQGd
+        AU0BJQGdAU0BJQHdArsJAAP/AwAG/wkABv8DAAP/BgAD7AGmAqcB1wHVAdQB/wH9AfIB4gHyAdYB+QHz
+        AeEB7gHBAZ0BxgGGAX8B9wGpAasB/wLGAf8C2QH+AuwB1gLDAWUCVANyA8IBngFlAcABRwElAdQBRwEz
+        AaMBaAFlAXcBswKVAdACMwwAAdMCQQG4AZcBsQFtAVoBwQFXAT0BxwGoAo4GAAH7AcMB+wHLAR8BzQH8
+        AdUB/BIAAfAC4QGdAU0BJQH6AZ0BYgHhAYYBWAHhAYYBWAGdAU0BJQwAA+4DiAMzCQADMwOIA+4JAAPq
+        ArEBsgHUAs8B8AHrAdMBIQGtASUBKQGqASEBnAGaAWMB/wGdAaQB/wKgAf8BrQGsAf8BvgG9Af8C6gP/
+        AdUCwwFgAlYDlwGxAaIB8wEyAQoB4AEyARAB0AFRAUcBfAGDAYIBiAHEAqAB1QI+BgABzwFBAUUBpQF8
+        Aa4BWgFAAcwBRAEkAdMBfAFLAbEBygIlAwAB/QHpAf4BywEfAc0BywEfAc0BywEfAc0DAAHpAfAB6QEn
+        AW8BKAEaAWcBHAEaAWcBHAHpAfAB6QHnAZoBcwH8Ab4BlwH7AcABoQH7AbEBggGiAVYBMQHyAuQMAAOI
+        AwoD6AkAA+gDCgOICQAD6gO/AegB4gHhAfEB5QHJATEBwwFCAQABoAEHAZ8BnQF0Af8BtwG9Af8BoQGg
+        Af8BsQG6AfwBuwHQAf8B8wH3Bv8BiQJxA3gBzAE3AU0BbwFMAd8BMwEMAd8BPwEkAbkBYAFaAXsDlgHK
+        AqEB1gJDAc8BRAFJAZ8BbgGrAVQBOAHQAUwBLgHQAYsBWQGqAb0BGwE0BgAB2AFrAdcB/wFeAfwBywEf
+        Ac0BywEfAc0B6QHwAekBLAGCATMBWgGvAV8BWwGpAV8BTQGcAU8BGQF3ARwB9wLwAecBmgFzAecBmgFz
+        AecBmgFzAfMC5wwAA/8DTQMKDwADCgNNA/8GAAPrAsQBxQHsAeQB4gHzAeEBvgFTAeYBawEeAbEBLAHI
+        Aa0BnQH/AckBzAH/AckBygHmAccB0QHHAbABrwHxAeAB5AH4AfUB9AH4AfQB8gHBAacBpQNxAwABuQEn
+        AVMBaAE5AdUBOAEUAdwBTgE4Aa0BbAFnAYIDmgG5AYwBkAGZAWUBpQFVATgB0QFNAS4B0QGOAVcBowHF
+        ASwBOAkAAdgBawHXAeQBQgHmAf8BpgH/AcsBHwHNASsBggE5AYgB1wGTAX4BzQGIAWQBswFpASIBegEn
+        AekB8AHpBgABVgFQAUoPAAb/A00DCg8AAwoDTQb/AwAD6wHHAcoBzQHuAuoB8wHcAbMBXQHgAbUBNgGm
+        AcoBxgGlAbgB/wHPAc0B/wHdAd4B5AHVAd8BugGjAZoB7QHLAcwB+wLLAfoBywHKAc8CpgN8BgABsQEl
+        AVoBZgE0Ac4BQgEgAdgBUAE7AawBZwFgAYMBbgFiAaIBUAEzAcwBTgEwAdEBjgFTAaEBxAEvATwMAAHY
+        AWsB1wH/AaYB/wHYAWsB1wH8AdUB/AHpAfAB6QErAYIBOQEmAX4BLgEiAXoBJwHpAfAB6QFWAVABSgMA
+        AVYBUAFKDwAD/wMAA/gDCgO/DwADvwMKA/gGAAPsAc0BxwG8AfYB2gGzAfUB0gGvAWEBrQH1AToBlgH7
+        AacBoQHDAf8B9QHyAf8C+wH/AfMB/wHyAb4B3AH9AcEBywH/AZ8BngH/ArMBwgKMA6AJAAGvAScBYAFl
+        AS8ByAFEASIB1wE/ASYBrwE2ARkBuAE+ASABwAF+AXABvwHHAXUBgg8AAf0B6QH+AdgBawHXAf0B6QH+
+        AVYBUAFKEgABVgFQAUoSAAb/AwoDZBUAA2QDCgP/AwAB7AHtAe4B0QGmAWsB8gGrAVEB/wHSAaYB9gHJ
+        AZsB3QHCAaMBywGmAZ4B7QHpAe4E/wLwAf8BywHSAf8BswG0Af8BowGiAfwCnwGcAn0D0QwAAaoBaQGo
+        AU8BLgHdASsBBAHbATIBDQHTAVMBQAGoAZABjQGaAcQClwHTAkAYAAFWAVABSgwAAVYBUAFKAwABVgFQ
+        AUoB+wHDAfsBywEfAc0B/AHVAfwGAAP/AwAD+AMzA7oPAAO6AzMD+AYAAu0B7gHHAaoBiAHjAbcBiAH/
+        AcIBdgH/AbkBXgH/AcABaAH8AbYBaAHSAaQBhwHrAeQB6gH/AfIB9gH/AdsB3QH/As4B/AK2AbcCgAHI
+        AsQD8wkAAc8BPAFAAaEBdQGvAU4BLgHWATwBGAHZAUIBIQHTAVYBQAG0AXgBcgGUAZsBmgGeAb0ClAHO
+        AjcYAAOGARIBWwGFAYcBsAHIAVYBUAFKBgAB/QHpAf4BywEfAc0BywEfAc0BywEfAc0MAAP/A00DMw8A
+        AzMDTQP/BgAD7AG7Ab4BwAHYAdEBxgH/AccBcQH7AcsBggH6AcQBeAH8Ab8BaAH3AbABUAHVAZkBXQHi
+        AbYBmAHnAb4BrAG+ApgBoAKAAccCwQPzCQAB0AE2AToBpQGAAbYBTwEwAdMBRAEkAdABdQE3AaUBeAEi
+        AZQBXQEeAbkBXgFHAcIBdQFsAZoBjwGNAZYBtAKQAcoCLRUAASgBfAGrAQwBrQHuARoBZwGTAZsBvgHR
+        BgAB2AFrAdcB/wFeAfwBywEfAc0BywEfAc0MAAP/A00DMw8AAzMDTQP/BgAD6gLTAdQB7QHlAd8B4wHQ
+        AccB6QHoAfAB7APpAeUB4QHmAeIB2QHnAdQBtAHhAbkBgAHgAbEBcAGEAXkBdQGYApYD4gP8BgABzQEr
+        AS8BqQGMAb0BSwErAdEBOgEXAdUBfQFKAaEBvgEkATQDAAGeAQwBVQFdASEBwAFZAT4BzQFvAWMBogGH
+        AYUBkgGxApMB1QIwEgABDAGtAe4BKAF8AasBDAGtAe4BGgFnAZMGAAHYAWsB1wHkAUIB5gH/AaYB/wHL
+        AR8BzQ8AA4gDMwPeCQAD3gMzA4gJAAPhAdkB3AHfAdgBxAG4AbUBgAF0AbMBgwGAAbsCjQHFAZ4BnwHL
+        AacBqgHZAcwB0AHqAfEB+AHiAeQB6QGCAoMDnAPmBgAB0AEkASwBpgGSAb8BQwEkAc4BMwEOAdYBcAFA
+        AaUBugEZAS4JAAGqARcBUgFjAS4ByQFTATQB1wF3AWkBtAGhAZkBngHYApsSAAEEAbQB/AFmAcwB/wEo
+        AXwBqwEhAXIBoAYAAdgBawHXAf8BpgH/AdgBawHXAfwB1QH8DwAD7gOIAzMJAAMzA4gD7gkAA9QB9AHy
+        Ae4B/AHNAZMB/QHFAYsB+AHEAZ0B8gG9AaAB7AG3AaMB5wGwAaUB7AHEAcAB/wLqAf4C7gF+An0DmAPh
+        A/0DAAG1AaoB5wE/AR0B0AEuAQcB2gFfATIBqwG5ARABKA8AAb4BKgFPAX8BSwHNAWMBLQHFAdABjwGk
+        FQAB2QHlAewBBAG0AfwBZgHMAf8BKAF8AasGAAH9AekB/gHYAWsB1wH9AekB/g8AA/8DAAb/CQAG/wMA
+        A/8GAAHOAc0BywHzAcoBlQH7AccBjgH+AcwBoQH/Ac4BqQH/Ac4BsQH/AdABuwH/AdQBxwHNAbQBsQHs
+        AdoB2wH/Av4DxwPDA+4GAAFAARwB4AEtAQUB3wFKASEBuwG6AQgBIzYAAdkB5QHsAQQBtAH8AbgB0AHd
+        SAAB6wHqAugB5ALgAdwC2AHTAdAB3AHSAc8B3QHPAcsB0wHEAcMB0QLPA9gD3APdA/AD+wYAATYBEAHh
+        AUwBKgHhAcMBBgEcJwABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/wEAAYABAQYA
+        AYBYAAEBBgABgAEBBgABwAEHBgAB+AEfBgAE/wGAAQAG/wIAAYcB4QH/AeAB6QHLAgABAwHBAY8BwAHx
+        AccCAAEBAYEBCAEAAfEBxwMAAQMBAAEBAuMCAAGAAQcBAAE3AcMB4QIAAcABDwEAAS8BowHjAgAB4AEf
+        AQ8B3wGHAfECAAHwAQ8B9wGhAaMB4wIAAeABBwH4AWEC4wEAAQEBwAEDAfgBYQLjAQABAQGBAQEB+AFh
+        AfEBxwEAAgMBgQH4AWEB8QHHAQABAQEHAcMB+AFjAekBywEAAQMBDwH/AfwBfwL/AYABAwEfAf8L
+</value>
+  </data>
+  <metadata name="toolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>119, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="updateButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="upgradeButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="installButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="removeButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="publishButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
+        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
+        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
+        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
+        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
+        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
+        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
+        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
+        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
+        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <metadata name="pluginContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>212, 17</value>
+  </metadata>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginAction.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginAction.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginAction.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  [Flags]
+  enum ManagerAction {
+    Install = 1,
+    Remove = 2,
+    None = 4,
+    Any = Install | Remove
+  };
+
+  class PluginAction {
+    private ManagerAction action;
+
+    public ManagerAction Action {
+      get { return action; }
+      set { action = value; }
+    }
+
+    private List<PluginTag> hull;
+
+    public List<PluginTag> Hull {
+      get { return hull; }
+      set { hull = value; }
+    }
+
+    private PluginTag plugin;
+
+    public PluginTag Plugin {
+      get { return plugin; }
+      set { plugin = value; }
+    }
+
+    public string GetInverseActionString() {
+      switch(action) {
+        case ManagerAction.Install:
+          return "Don't install";
+        case ManagerAction.Remove:
+          return "Keep";
+        default:
+          // this method is not defined for actions other than "Install" and "Remove"
+          Trace.Assert(false);
+          return "";
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginDescription.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginDescription.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginDescription.cs	(revision 2)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  class PluginDescription {
+    private string name;
+
+    public string Name {
+      get { return name; }
+      set { name = value; }
+    }
+    private Version version;
+
+    public Version Version {
+      get { return version; }
+      set { version = value; }
+    }
+
+    private List<string> dependencies = new List<string>();
+    public List<string> Dependencies {
+      get { return dependencies; }
+    }
+
+    private PluginSource source;
+    public PluginSource Source {
+      get { return source; }
+    }
+
+    public PluginDescription(string name, Version version, PluginSource source) {
+      this.name = name;
+      this.version = version;
+      this.source = source;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginNameTransform.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginNameTransform.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginNameTransform.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.SharpZipLib.Core;
+using System.Diagnostics;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  /// <summary>
+  /// This classes is needed to prune the directory tree of zipped plugin packages by removing the path leading to the plugin directory.
+  /// </summary>
+  class PluginNameTransform : INameTransform{
+
+    private string pluginDir = HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.PluginDir+"\\";    
+    #region INameTransform Members
+
+    public string TransformDirectory(string name) {
+      if(name.StartsWith(pluginDir)) {
+      return name.Remove(0, pluginDir.Length);
+      } else {
+        return name;
+      }
+    }
+
+    public string TransformFile(string name) {
+      //Trace.Assert(name.StartsWith(pluginDir));
+      if(name.StartsWith(pluginDir)) {
+        return name.Remove(0, pluginDir.Length);
+      } else {
+        return name;
+      }
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSource.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSource.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSource.cs	(revision 2)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Net;
+using System.IO;
+using System.Xml;
+using System.ComponentModel;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  class PluginSource {
+
+    private string url;
+    private WebClient client;
+    private string cacheDir = HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.CacheDir;
+
+    private PluginSource(string url) {
+      this.url = url;
+    }
+
+    /// <summary>
+    /// Factory method for new PluginRepositories
+    /// </summary>
+    /// <param name="url"></param>
+    /// <returns></returns>
+    public static PluginSource TryCreate(string url) {
+      PluginSource newSource = new PluginSource(url);
+      if(newSource.VerifyRepositoryLocation()) {
+        return newSource;
+      } else {
+        return null;
+      }
+    }
+
+    private bool VerifyRepositoryLocation() {
+      try {
+        this.client = new WebClient();
+        client.DownloadData(url + "/plugins.xml");
+      } catch(Exception) {
+        return false;
+      }
+      return true;
+    }
+
+    public List<PluginDescription> AvailablePlugins() {
+      List<PluginDescription> availablePlugins = new List<PluginDescription>();
+
+      Stream xmlStream = client.OpenRead(url + "/plugins.xml");
+
+      XmlDocument pluginList = new XmlDocument();
+      pluginList.Load(xmlStream);
+
+      XmlNode list = pluginList.SelectSingleNode("/Plugins");
+      foreach(XmlNode child in list.ChildNodes) { 
+       
+        string name = child.Attributes["Name"].Value;
+        string version = child.Attributes["Version"].Value;
+
+        PluginDescription description = new PluginDescription(name, new Version(version), this);
+        availablePlugins.Add(description);
+
+        // retrieve the list of dependencies
+        XmlNodeList dependencies = child.SelectNodes("Dependency");
+        foreach(XmlNode dependencyNode in dependencies) {
+          string dependencyName = dependencyNode.Attributes["Name"].Value;
+          description.Dependencies.Add(dependencyName);
+        }
+
+      }
+
+      return availablePlugins;
+    }
+
+    internal long DownloadPlugin(PluginDescription description) {
+      string fileName = description.Name + "-" + description.Version + ".zip";
+      client.DownloadFile(url + "/" + fileName, cacheDir + "/" + fileName);
+
+      // return size of downloaded file
+      FileInfo info = new FileInfo(cacheDir + "/" + fileName);
+      return info.Length;
+    }
+
+    public void CancelAsyncDownload() {
+      client.CancelAsync();
+    }
+
+    public override string ToString() {
+      return url;
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.Designer.cs	(revision 2)
@@ -0,0 +1,101 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  partial class PluginSourceEditor {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PluginSourceEditor));
+      this.saveButton = new System.Windows.Forms.Button();
+      this.sourcesTextBox = new System.Windows.Forms.TextBox();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // saveButton
+      // 
+      this.saveButton.Location = new System.Drawing.Point(194, 198);
+      this.saveButton.Name = "saveButton";
+      this.saveButton.Size = new System.Drawing.Size(75, 23);
+      this.saveButton.TabIndex = 0;
+      this.saveButton.Text = "Save";
+      this.saveButton.UseVisualStyleBackColor = true;
+      this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // sourcesTextBox
+      // 
+      this.sourcesTextBox.Location = new System.Drawing.Point(12, 12);
+      this.sourcesTextBox.Multiline = true;
+      this.sourcesTextBox.Name = "sourcesTextBox";
+      this.sourcesTextBox.Size = new System.Drawing.Size(338, 180);
+      this.sourcesTextBox.TabIndex = 1;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Location = new System.Drawing.Point(275, 198);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // PluginSourceEditor
+      // 
+      this.ClientSize = new System.Drawing.Size(362, 233);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.sourcesTextBox);
+      this.Controls.Add(this.saveButton);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "PluginSourceEditor";
+      this.Text = "Edit plugin sources";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button saveButton;
+    private System.Windows.Forms.TextBox sourcesTextBox;
+    private System.Windows.Forms.Button cancelButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.cs	(revision 2)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections.Specialized;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+  public partial class PluginSourceEditor : Form {
+    private StringCollection settingsSources = HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.PluginSources;
+    public PluginSourceEditor() {     
+      InitializeComponent();
+
+      string[] sources = new string[settingsSources.Count];
+
+      settingsSources.CopyTo(sources, 0);
+      sourcesTextBox.Lines = sources;
+    }
+
+    private void saveButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.OK;
+      settingsSources.Clear();
+      foreach(string line in sourcesTextBox.Lines) {
+        settingsSources.Add(line);
+      }
+
+      HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.Save();
+      Close();
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.Cancel;
+      Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginSourceEditor.resx	(revision 2)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginTag.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginTag.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginTag.cs	(revision 2)
@@ -0,0 +1,223 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure.GUI {
+
+  [Flags]
+  enum PluginState { 
+    Installed = 1,
+    Available = 2,
+    Upgradeable = 4,
+  };
+
+  class PluginTag {
+    private PluginInfo plugin;
+
+    public PluginInfo Plugin {
+      get { return plugin; }
+    }
+
+    private PluginDescription pluginDescription;
+    internal PluginDescription PluginDescription {
+      get { return pluginDescription; }
+      set { 
+        pluginDescription = value;
+        pluginDependencies = GeneratePluginDependencies(pluginDescription);
+        pluginDetails = GeneratePluginDetails(pluginDescription);
+      }
+    }
+
+
+    private PluginDescription upgradePluginDescription;
+    public PluginDescription UpgradePluginDescription {
+      get { return upgradePluginDescription; }
+      set {
+        upgradePluginDescription = value;
+        pluginDependencies = GeneratePluginDependencies(upgradePluginDescription);
+        pluginDetails = GenerateUpgradeDetails(upgradePluginDescription);
+        state = PluginState.Upgradeable;
+      }
+    }
+
+    private string pluginName;
+    public string PluginName {
+      get { return pluginName; }
+      set { pluginName = value; }
+    }
+
+    private Version pluginVersion;
+    public Version PluginVersion {
+      get { return pluginVersion; }
+      set { pluginVersion = value; }
+    }
+
+    private string pluginDetails;
+    private List<string> pluginDependencies;
+    private List<PluginTag> allTags;
+
+    private PluginState state;
+    public PluginState State {
+      get { return state; }
+      set { state = value; }
+    }
+
+    public List<PluginTag> hull = new List<PluginTag>();
+
+    public PluginTag(List<PluginTag> allTags, PluginInfo plugin, PluginState state) {
+      this.plugin = plugin;
+      this.state = state;
+      this.allTags = allTags;
+
+      this.pluginName = plugin.Name;
+      this.pluginVersion = plugin.Version;
+      pluginDetails = GeneratePluginDetails(plugin);
+      pluginDependencies = GeneratePluginDependencies(plugin);
+    }
+
+    public PluginTag(List<PluginTag> allTags, PluginDescription plugin, PluginState state) {
+      this.pluginDescription = plugin;
+      this.state = state;
+      this.allTags = allTags;
+
+      this.pluginName = plugin.Name;
+      this.pluginVersion = plugin.Version;
+
+      pluginDetails = GeneratePluginDetails(plugin);
+      pluginDependencies = GeneratePluginDependencies(plugin);
+    }
+
+
+
+    private string GeneratePluginDetails(PluginInfo plugin) {
+      string filenames = "";
+      foreach (string filename in plugin.Files) {
+        filenames += filename + "\n";
+      }
+      string dependencies = "";
+      foreach (PluginInfo dependency in plugin.Dependencies) {
+        dependencies += dependency.Name + " (" + dependency.Version + ")\n";
+      }
+      string dependents = "";
+      PluginManager.Manager.GetDependentPlugins(plugin).ForEach(delegate(PluginInfo dependentPlugin) {
+        dependents += dependentPlugin.Name + " (" + dependentPlugin.Version + ")\n";
+      });
+      return "plugin: " + plugin.Name + "\n" +
+      "Version: " + plugin.Version + "\n\n" +
+      "Requires: \n" + dependencies + "\n" +
+      "Used by:\n" + dependents + "\n" +
+      "Files:\n" + filenames + "\n";
+    }
+
+    private string GeneratePluginDetails(PluginDescription plugin) {
+      string dependencies = "";
+      foreach (string dependency in plugin.Dependencies) {
+        dependencies += dependency + "\n";
+      }
+      return "plugin: " + plugin.Name + "\n" +
+      "Version: " + plugin.Version + "\n" +
+      "Installed from: " + plugin.Source + "\n" +
+      "Requires: \n" + dependencies;
+    }
+
+    private string GenerateUpgradeDetails(PluginDescription upgrade) {
+      string dependencies = "";
+      foreach(string dependency in upgrade.Dependencies) {
+        dependencies += dependency + "\n";
+      }
+      return "plugin: " + upgrade.Name + "\n" +
+      "Current version: " + plugin.Version + " will be upgraded to new version: " + upgrade.Version + "\n"+
+      "Upgraded from: " + upgrade.Source + "\n" +
+      "Requires: \n" + dependencies;
+    }
+
+    private List<string> GeneratePluginDependencies(PluginInfo plugin) {
+      List<string> dependencies = new List<string>();
+
+      plugin.Dependencies.ForEach(delegate(PluginInfo dependency) {
+        dependencies.Add(dependency.Name);
+      });
+
+      return dependencies;
+    }
+
+    private List<string> GeneratePluginDependencies(PluginDescription plugin) {
+      return new List<string>(plugin.Dependencies);
+    }
+
+    internal string GetPluginDetails() {
+      return pluginDetails;
+    }
+
+    internal List<PluginTag> GetDependentTags() {
+      List<PluginTag> dependentTags = new List<PluginTag>();
+      foreach(PluginTag tag in allTags) {
+        if (tag.pluginDependencies.Contains(pluginName)) {
+          if (!dependentTags.Contains(tag)) {
+            dependentTags.Add(tag);
+
+            tag.GetDependentTags().ForEach(delegate(PluginTag dependentTag) {
+              if (!dependentTags.Contains(dependentTag)) {
+                dependentTags.Add(dependentTag);
+              }
+            });
+          }
+        }
+      }
+      return dependentTags;
+    }
+
+    internal List<PluginTag> GetDependencyTags() {
+      List<PluginTag> dependencyTags = new List<PluginTag>();
+      foreach(PluginTag tag in allTags) {
+        if (pluginDependencies.Contains(tag.pluginName)) {
+          if (!dependencyTags.Contains(tag)) {
+            dependencyTags.Add(tag);
+
+            tag.GetDependencyTags().ForEach(delegate(PluginTag dependencyTag) {
+              if (!dependencyTags.Contains(dependencyTag)) {
+                dependencyTags.Add(dependencyTag);
+              }
+            });
+          }
+        }
+      };
+      return dependencyTags;
+    }
+
+    internal bool UpgradeAvailable() {
+      return UpgradePluginDescription != null;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj == null || !(obj is PluginTag)) return false;
+      PluginTag other = (PluginTag)obj;
+      return other.pluginName == pluginName && other.pluginVersion == pluginVersion;
+    }
+
+    public override int GetHashCode() {
+      return pluginName.GetHashCode() + pluginVersion.GetHashCode();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab Pluginmanager Console")]
+[assembly: AssemblyDescription("The PluginManager Console helps you to manage your collection of HeuristicLab plugins. You can remove plugins, install new plugins from web location and automatically download the latest version of your plugins.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("02326293-f40d-4f51-a298-014b3e9d2b19")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Resources.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Resources.Designer.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure.GUI.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.PluginInfrastructure.GUI.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Icon HeuristicLab {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLab", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Logo_gray {
+            get {
+                object obj = ResourceManager.GetObject("Logo_gray", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Resources.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Resources.resx	(revision 2)
@@ -0,0 +1,127 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="HeuristicLab" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\HeuristicLab.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Logo_gray" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Logo_gray.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Settings.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Settings.Designer.cs	(revision 2)
@@ -0,0 +1,109 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure.GUI.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3." +
+            "org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <s" +
+            "tring>http://update.heuristiclab.com/hl-nextgen/</string>\r\n</ArrayOfString>")]
+        public global::System.Collections.Specialized.StringCollection PluginSources {
+            get {
+                return ((global::System.Collections.Specialized.StringCollection)(this["PluginSources"]));
+            }
+            set {
+                this["PluginSources"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("plugins\\cache")]
+        public string CacheDir {
+            get {
+                return ((string)(this["CacheDir"]));
+            }
+            set {
+                this["CacheDir"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("plugins")]
+        public string PluginDir {
+            get {
+                return ((string)(this["PluginDir"]));
+            }
+            set {
+                this["PluginDir"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("plugins\\backup")]
+        public string BackupDir {
+            get {
+                return ((string)(this["BackupDir"]));
+            }
+            set {
+                this["BackupDir"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("plugins\\temp")]
+        public string TempDir {
+            get {
+                return ((string)(this["TempDir"]));
+            }
+            set {
+                this["TempDir"] = value;
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Settings.settings	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/Properties/Settings.settings	(revision 2)
@@ -0,0 +1,24 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.PluginInfrastructure.GUI.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="PluginSources" Type="System.Collections.Specialized.StringCollection" Scope="User">
+      <Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;string&gt;http://update.heuristiclab.com/hl-nextgen/&lt;/string&gt;
+&lt;/ArrayOfString&gt;</Value>
+    </Setting>
+    <Setting Name="CacheDir" Type="System.String" Scope="User">
+      <Value Profile="(Default)">plugins\cache</Value>
+    </Setting>
+    <Setting Name="PluginDir" Type="System.String" Scope="User">
+      <Value Profile="(Default)">plugins</Value>
+    </Setting>
+    <Setting Name="BackupDir" Type="System.String" Scope="User">
+      <Value Profile="(Default)">plugins\backup</Value>
+    </Setting>
+    <Setting Name="TempDir" Type="System.String" Scope="User">
+      <Value Profile="(Default)">plugins\temp</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/app.config
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/app.config	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/app.config	(revision 2)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.PluginInfrastructure.GUI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <HeuristicLab.PluginInfrastructure.GUI.Properties.Settings>
+            <setting name="PluginSources" serializeAs="Xml">
+                <value>
+                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+                        <string>http://update.heuristiclab.com/hl-nextgen/</string>
+                    </ArrayOfString>
+                </value>
+            </setting>
+            <setting name="CacheDir" serializeAs="String">
+                <value>plugins\cache</value>
+            </setting>
+            <setting name="PluginDir" serializeAs="String">
+                <value>plugins</value>
+            </setting>
+            <setting name="BackupDir" serializeAs="String">
+                <value>plugins\backup</value>
+            </setting>
+            <setting name="TempDir" serializeAs="String">
+                <value>plugins\temp</value>
+            </setting>
+        </HeuristicLab.PluginInfrastructure.GUI.Properties.Settings>
+    </userSettings>
+</configuration>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationInfo.cs	(revision 2)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  [Serializable]
+  public class ApplicationInfo {
+    private string name;
+
+    public string Name {
+      get { return name; }
+      set { name = value; }
+    }
+    private Version version;
+
+    public Version Version {
+      get { return version; }
+      set { version = value; }
+    }
+    private string description;
+
+    public string Description {
+      get { return description; }
+      set { description = value; }
+    }
+
+    private string pluginAssembly;
+    /// <summary>
+    /// Name of the assembly that contains the IApplication type.
+    /// NEEDED?
+    /// </summary>
+    public string PluginAssembly {
+      get { return pluginAssembly; }
+      set { pluginAssembly = value; }
+    }
+
+    private string pluginType;
+    /// <summary>
+    /// Name of the type that implements the interface IApplication.
+    /// NEEDED?
+    /// </summary>
+    public string PluginType {
+      get { return pluginType; }
+      set { pluginType = value; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs	(revision 2)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public abstract class ApplicationBase : IApplication {
+    private string name;
+    private Version version;
+    private string description;
+    
+    public ApplicationBase() {
+      ReadAttributes();
+    }
+
+    private void ReadAttributes() {
+      object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(ClassInfoAttribute), false);
+
+      // exactly one attribute of the type ClassInfoAttribute must be given
+      Trace.Assert(pluginAttributes.Length == 1);
+
+      // after the assertion we are sure that the array access will not fail
+      ClassInfoAttribute pluginAttribute = (ClassInfoAttribute)pluginAttributes[0];
+
+      // if the plugin name is not explicitly set in the attribute then the default plugin name is the FullName of the type
+      if(pluginAttribute != null && pluginAttribute.Name != null) {
+        this.name = pluginAttribute.Name;
+      } else {
+        this.name = this.GetType().FullName;
+      }
+
+      // if the version is not explicitly set in the attribute then the version of the assembly is used as default
+      if(pluginAttribute != null && pluginAttribute.Version != null) {
+        this.version = new Version(pluginAttribute.Version);
+      } else {
+        this.version = this.GetType().Assembly.GetName().Version;
+      }
+
+      // if the description is not explicitly set in the attribute then the name of name of the application is used as default
+      if(pluginAttribute != null && pluginAttribute.Description != null) {
+        this.description = pluginAttribute.Description;
+      } else {
+        this.description = name;
+      }
+    }
+
+
+    #region IApplication Members
+
+    public string Name {
+      get { return name; }
+    }
+
+    public Version Version {
+      get { return version; }
+    }
+
+    public string Description {
+      get { return description; }
+    }
+
+    public abstract void Run() ;
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/PluginBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/PluginBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/PluginBase.cs	(revision 2)
@@ -0,0 +1,123 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+using System.Diagnostics;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Default implementation of the IPlugin interface.
+  /// </summary>
+  public class PluginBase : IPlugin {
+    private string name;
+    private Version version;
+    private string[] files;
+    private string description;
+
+    public PluginBase() {
+      ReadAttributes();
+    }
+
+    private void ReadAttributes() {
+      object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(ClassInfoAttribute), false);
+
+      // exactly one attribute of the type ClassInfoAttribute must be given
+      Trace.Assert(pluginAttributes.Length == 1);
+
+      // after the assertion we are sure that the array access will not fail
+      ClassInfoAttribute pluginAttribute = (ClassInfoAttribute)pluginAttributes[0];
+
+      // if the plugin name is not explicitly set in the attribute then the default plugin name is the FullName of the type
+      if(pluginAttribute != null && pluginAttribute.Name != null) {
+        this.name = pluginAttribute.Name;
+      } else {
+        this.name = this.GetType().FullName;
+      }
+
+      // if the version is not explicitly set in the attribute then the version of the assembly is used as default
+      if(pluginAttribute != null && pluginAttribute.Version != null) {
+        this.version = new Version(pluginAttribute.Version);
+      } else {
+        this.version = this.GetType().Assembly.GetName().Version;
+      }
+
+      // if the description is not explicitly set in the attribute then the name of name of the plugin is used as default
+      if(pluginAttribute != null && pluginAttribute.Description != null) {
+        this.description = pluginAttribute.Description;
+      } else {
+        this.description = name;
+      }
+
+      // get all attributes of type PluginFileAttribute, multiple usage is possible
+      PluginFileAttribute[] fileAttributes = (PluginFileAttribute[])this.GetType().GetCustomAttributes(typeof(PluginFileAttribute), false);
+
+      // exctract the file names from the attributes
+      this.files = new string[fileAttributes.Length];
+      int i = 0;
+      foreach(PluginFileAttribute fileAttr in fileAttributes) {
+        files[i++] = fileAttr.Filename;
+      }
+    }
+
+    #region IPlugin Members
+    public string Name {
+      get {
+        return name;
+      }
+    }
+
+    public Version Version {
+      get {
+        return version;
+      }
+    }
+
+    public string Description {
+      get {
+        return description;
+      }
+    }
+
+    public  string[] Files {
+      get {
+        return files;
+      }
+    }
+
+    public virtual void OnInstall() {
+    }
+
+    public virtual void OnDelete() {
+    }
+
+    public virtual void OnPreUpdate() {
+    }
+
+    public virtual void OnPostUpdate() {
+    }
+
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/ClassInfoAttribute.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/ClassInfoAttribute.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/ClassInfoAttribute.cs	(revision 2)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// This attribute can be used to specify meta data for classes. 
+  /// For example to specify name, version and description of applications or plugins.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class)]
+  public class ClassInfoAttribute : System.Attribute {
+    private string name;
+
+    /// <summary>
+    /// Name of the plugin to which the assembly belongs to.
+    /// </summary>
+    public string Name {
+      get { return name; }
+      set { name = value; }
+    }
+
+    private string version;
+
+    public string Version {
+      get { return version; }
+      set { version = value; }
+    }
+
+
+    private string description;
+
+    public string Description {
+      get { return description; }
+      set { description = value; }
+    }
+
+    public ClassInfoAttribute() {}
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/DependencyAttribute.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/DependencyAttribute.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/DependencyAttribute.cs	(revision 2)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// This attribute can be used to specify that an assembly depends on a different plugin.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class,AllowMultiple=true)]
+  public sealed class DependencyAttribute : System.Attribute {
+    private string dependency;
+
+    /// <summary>
+    /// Name of the plugin that is needed to load the assembly.
+    /// </summary>
+    public string Dependency {
+      get { return dependency; }
+      set { dependency = value; }
+    }
+
+    public DependencyAttribute() {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/DiscoveryService.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/DiscoveryService.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/DiscoveryService.cs	(revision 2)
@@ -0,0 +1,118 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Provides convenience methods to find specific types or to create instances of types.
+  /// </summary>
+  public class DiscoveryService {
+
+    public PluginInfo[] Plugins {
+      get {
+        return PluginManager.Manager.LoadedPlugins;
+      }
+    }
+
+    /// <summary>
+    ///  Find all types that are subtypes or equal to the specified type.
+    /// </summary>
+    /// <param name="type">Most general type for which to find matching types.</param>
+    /// <returns></returns>
+    public Type[] GetTypes(Type type) {
+      Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
+      List<Type> types = new List<Type>();
+      foreach(Assembly asm in assemblies) {
+        Array.ForEach<Type>(GetTypes(type, asm), delegate(Type t) {
+          types.Add(t);
+        });
+      }
+      return types.ToArray();
+    }
+
+    /// <summary>
+    /// Create an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <typeparam name="T">Most general type.</typeparam>
+    /// <returns></returns>
+    public T[] GetInstances<T>() where T : class {
+      Type[] types = GetTypes(typeof(T));
+      List<T> instances = new List<T>();
+      foreach(Type t in types) {
+        if(!t.IsAbstract && !t.IsInterface && !t.HasElementType) {
+          instances.Add((T)Activator.CreateInstance(t));
+        }
+      }
+      return instances.ToArray();
+    }
+
+    public Type[] GetTypes(Type type, PluginInfo plugin) {
+      Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
+      List<Type> types = new List<Type>();
+      foreach(Assembly asm in assemblies) {
+        if(plugin.Assemblies.Contains(asm.Location)) {
+          Array.ForEach<Type>(GetTypes(type, asm), delegate(Type t) {
+            types.Add(t);
+          });
+        }
+      }
+
+      return types.ToArray();
+    }
+
+    /// <summary>
+    /// Get instances of all types that implement the specified interface only in the given assembly.
+    /// </summary>
+    /// <typeparam name="T">Interface type.</typeparam>
+    /// <param name="assembly">Assembly that should be searched for types.</param>
+    /// <returns></returns>
+    internal T[] GetInstances<T>(Assembly assembly) {
+      Type[] types = GetTypes(typeof(T), assembly);
+      List<T> instances = new List<T>();
+      foreach(Type t in types) {
+        if(!t.IsAbstract && !t.IsInterface && !t.HasElementType) {
+          instances.Add((T)Activator.CreateInstance(t));
+        }
+      }
+      return instances.ToArray();
+    }
+
+    /// <summary>
+    /// Get types that are assignable (same of subtype) to the specified type only from the given assembly.
+    /// </summary>
+    /// <param name="type">Most general type we want to find.</param>
+    /// <param name="assembly">Assembly that should be searched for types.</param>
+    /// <returns></returns>
+    internal Type[] GetTypes(Type type, Assembly assembly) {
+      List<Type> types = new List<Type>();
+      foreach(Type t in assembly.GetTypes()) {
+        if(type.IsAssignableFrom(t)) {
+          types.Add(t);
+        }
+      }
+      return types.ToArray();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 2)
@@ -0,0 +1,97 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{94186A6A-5176-4402-AE83-886557B53CCA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.PluginInfrastructure</RootNamespace>
+    <AssemblyName>HeuristicLab.PluginInfrastructure</AssemblyName>
+    <StartupObject>
+    </StartupObject>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.PluginInfrastructure.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ApplicationInfo.cs" />
+    <Compile Include="BaseClasses\ApplicationBase.cs" />
+    <Compile Include="BaseClasses\PluginBase.cs" />
+    <Compile Include="ClassInfoAttribute.cs" />
+    <Compile Include="Interfaces\IApplication.cs" />
+    <Compile Include="Interfaces\IControl.cs" />
+    <Compile Include="Interfaces\IControlManager.cs" />
+    <Compile Include="PluginManager.cs" />
+    <Compile Include="PluginManagerActionEventArgs.cs" />
+    <Compile Include="DependencyAttribute.cs" />
+    <Compile Include="Interfaces\IPlugin.cs" />
+    <Compile Include="DiscoveryService.cs" />
+    <Compile Include="PluginFileAttribute.cs" />
+    <Compile Include="PluginInfo.cs" />
+    <Compile Include="Loader.cs" />
+    <Compile Include="Runner.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="app.config" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IApplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IApplication.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IApplication.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  internal interface IApplication {
+    string Name { get; }
+    Version Version { get; }
+    string Description { get;}
+    void Run();
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IControl.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IControl.cs	(revision 2)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public interface IControl { }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IControlManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IControlManager.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IControlManager.cs	(revision 2)
@@ -0,0 +1,31 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public interface IControlManager {
+    void ShowControl(IControl control);
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPlugin.cs	(revision 2)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Represents a plugin.
+  /// Plugin developers have to include exactly one class that implements this interface in one of the
+  /// assemblies of the plugin. Plugin developers can use the properties of this interface to store
+  /// plugin data (name, version, files, update location ...).
+  /// The methods OnInstall(), OnDelete(), OnPreUpdate(), OnPostUpdate() are called by the framework
+  /// when the corresponding actions are executed. This mechanism allows that the plugin reacts to such
+  /// events. For instance to store plugin specific settings.
+  /// </summary>
+  interface IPlugin {
+    string Name { get; }
+    Version Version { get; }
+    /// <summary>
+    /// a list of all files that are bundled with this plugin including all assembly files (*.dll)
+    /// </summary>
+    string[] Files { get; }
+
+    /// <summary>
+    /// called by the framework after the plugin was successfully installed
+    /// </summary>
+    void OnInstall();
+    /// <summary>
+    /// called by the framework before the files of the plugin are deleted
+    /// </summary>
+    void OnDelete();
+    /// <summary>
+    /// called by the framework before the files of the plugin are deleted for an update
+    /// OnPreUpdate() is sent only to the old instance of the plugin
+    /// </summary>
+    void OnPreUpdate();
+    /// <summary>
+    /// called by the framework after the updated files for the plugin have been installed
+    /// OnPostUpdate() is sent only to the new updated instance of the plugin
+    /// </summary>
+    void OnPostUpdate();
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs	(revision 2)
@@ -0,0 +1,368 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+using System.IO;
+using System.Diagnostics;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure {
+  internal class Loader : MarshalByRefObject {
+    public delegate void PluginLoadedEventHandler(string pluginName);
+    public delegate void PluginLoadFailedEventHandler(string pluginName, string args);
+
+    private Dictionary<PluginInfo, IPlugin> activePlugins = new Dictionary<PluginInfo, IPlugin>();
+    private Dictionary<PluginInfo, IPlugin> allPlugins = new Dictionary<PluginInfo, IPlugin>();
+    private Dictionary<IPlugin, PluginInfo> pluginInfos = new Dictionary<IPlugin, PluginInfo>();
+
+    private Dictionary<string, List<string>> pluginDependencies = new Dictionary<string, List<string>>();
+    private Dictionary<string, List<string>> pluginAssemblies = new Dictionary<string, List<string>>();
+
+    private List<string> loadablePlugins = new List<string>();
+    private string pluginDir = Application.StartupPath+"/"+ HeuristicLab.PluginInfrastructure.Properties.Settings.Default.PluginDir;
+
+    internal event PluginLoadFailedEventHandler MissingPluginFile;
+
+    internal event PluginManagerActionEventHandler PluginAction;
+
+    internal PluginInfo[] ActivePlugins {
+      get {
+        PluginInfo[] plugins = new PluginInfo[activePlugins.Count];
+        activePlugins.Keys.CopyTo(plugins, 0);
+        return plugins;
+      }
+    }
+
+    internal List<PluginInfo> InstalledPlugins {
+      get {
+        return new List<PluginInfo>(allPlugins.Keys);
+      }
+    }
+
+    private ApplicationInfo[] applications;
+    internal ApplicationInfo[] InstalledApplications {
+      get {
+        return applications;
+      }
+    }
+
+    private IPlugin FindPlugin(PluginInfo plugin) {
+      return activePlugins[plugin];
+    }
+
+
+    /// <summary>
+    /// Init first clears all internal datastructures (including plugin lists)
+    /// 1. All assemblies in the plugins directory are loaded into the reflection only context.
+    /// 2. The loader checks if all dependencies for each assembly are available.
+    /// 3. All assemblies for which there are no dependencies missing are loaded into the execution context.
+    /// 4. Each loaded assembly is searched for a type that implements IPlugin, then one instance of each IPlugin type is activated
+    /// 5. The loader checks if all necessary files for each plugin are available.
+    /// 6. The loader builds an acyclic graph of PluginDescriptions (childs are dependencies of a plugin) based on the 
+    /// list of assemblies of an plugin and the list of dependencies for each of those assemblies
+    /// </summary>
+    internal void Init() {
+      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += delegate(object sender, ResolveEventArgs args) { return Assembly.ReflectionOnlyLoad(args.Name); };
+      activePlugins.Clear();
+      allPlugins.Clear();
+      pluginInfos.Clear();
+      pluginsByName.Clear();
+      loadablePlugins.Clear();
+      pluginDependencies.Clear();
+      pluginAssemblies.Clear();
+
+      List<Assembly> assemblies = ReflectionOnlyLoadDlls();
+      CheckAssemblyDependencies(assemblies);
+      LoadPlugins();
+      CheckPluginFiles();
+
+      DiscoveryService service = new DiscoveryService();
+      IApplication[] apps = service.GetInstances<IApplication>();
+      applications = new ApplicationInfo[apps.Length];
+
+      int i = 0;
+      foreach(IApplication application in apps) {
+        ApplicationInfo info = new ApplicationInfo();
+        info.Name = application.Name;
+        info.Version = application.Version;
+        info.Description = application.Description;
+        info.PluginAssembly = application.GetType().Assembly.GetName().Name;
+        info.PluginType = application.GetType().Namespace + "." + application.GetType().Name;
+
+        applications[i++] = info;
+      }
+    }
+
+    private List<Assembly> ReflectionOnlyLoadDlls() {
+      List<Assembly> assemblies = new List<Assembly>();
+      // load all installed plugins into the reflection only context
+      foreach(String filename in Directory.GetFiles(pluginDir, "*.dll")) {
+        assemblies.Add(ReflectionOnlyLoadDll(filename));
+      }
+      return assemblies;
+    }
+
+    private Assembly ReflectionOnlyLoadDll(string filename) {
+      return Assembly.ReflectionOnlyLoadFrom(filename);
+    }
+
+    private void CheckAssemblyDependencies(List<Assembly> assemblies) {
+
+      foreach(Assembly assembly in assemblies) {
+
+        // GetExportedTypes throws FileNotFoundException when a referenced assembly
+        // of the current assembly is missing.
+        try {
+          Type[] exported = assembly.GetExportedTypes();
+
+          foreach(Type t in exported) {
+            // if the type implements IPlugin
+            if(Array.Exists<Type>(t.GetInterfaces(), delegate(Type iface) {
+              // use AssemblyQualifiedName to compare the types because we can't directly 
+              // compare ReflectionOnly types and Execution types
+              return iface.AssemblyQualifiedName == typeof(IPlugin).AssemblyQualifiedName;
+            })) {
+              GetPluginAttributeData(t);
+            }
+
+          }
+        } catch(FileNotFoundException) {
+          // when a referenced assembly cannot be loaded then ignore this assembly in the plugin discovery
+          // TASK: add the assembly to some kind of unloadable assemblies list
+          // this list could be displayed to the user for diagnosis          
+        }
+      }
+
+      foreach(string pluginName in this.pluginDependencies.Keys) {
+        CheckPluginDependencies(pluginName);
+      }
+    }
+
+    /// <summary>
+    /// Extracts plugin information for this type.
+    /// Reads plugin name, list and type of files and dependencies of the plugin. This information is necessary for
+    /// plugin dependency checking before plugin activation.
+    /// </summary>
+    /// <param name="t"></param>
+    private void GetPluginAttributeData(Type t) {
+      // get all attributes of that type
+      IList<CustomAttributeData> attributes = CustomAttributeData.GetCustomAttributes(t);
+
+      List<string> pluginAssemblies = new List<string>();
+      List<string> pluginDependencies = new List<string>();
+      string pluginName = "";
+
+      // extract relevant parameters
+      // iterate through all custom attributes and search for named arguments that we are interested in 
+      foreach(CustomAttributeData attributeData in attributes) {
+        List<CustomAttributeNamedArgument> namedArguments = new List<CustomAttributeNamedArgument>(attributeData.NamedArguments);
+
+        // if the current attribute contains a named argument with the name "Name" then extract the plugin name
+        CustomAttributeNamedArgument pluginNameArgument = namedArguments.Find(delegate(CustomAttributeNamedArgument arg) {
+          return arg.MemberInfo.Name == "Name";
+        });
+        if(pluginNameArgument.MemberInfo != null) {
+          pluginName = (string)pluginNameArgument.TypedValue.Value;
+        }
+
+        // if the current attribute contains a named argument with the name "Dependency" then extract the dependency
+        // and store it in the list of all dependencies
+        CustomAttributeNamedArgument dependencyNameArgument = namedArguments.Find(delegate(CustomAttributeNamedArgument arg) {
+          return arg.MemberInfo.Name == "Dependency";
+        });
+
+        if(dependencyNameArgument.MemberInfo != null) {
+          pluginDependencies.Add((string)dependencyNameArgument.TypedValue.Value);
+        }
+
+        // if the current attribute has a named argument "Filename" then find if the argument "Filetype" is also supplied
+        // and if the filetype is Assembly then store the name of the assembly in the list of assemblies
+        CustomAttributeNamedArgument filenameArg = namedArguments.Find(delegate(CustomAttributeNamedArgument arg) {
+          return arg.MemberInfo.Name == "Filename";
+        });
+        CustomAttributeNamedArgument filetypeArg = namedArguments.Find(delegate(CustomAttributeNamedArgument arg) {
+          return arg.MemberInfo.Name == "Filetype";
+        });
+        if(filenameArg.MemberInfo != null && filetypeArg.MemberInfo != null) {
+          if((PluginFileType)filetypeArg.TypedValue.Value == PluginFileType.Assembly) {
+            pluginAssemblies.Add(pluginDir +"/"+ (string)filenameArg.TypedValue.Value);
+          }
+        }
+      }
+
+      // make sure that we found reasonable values
+      if(pluginName != "" && pluginAssemblies.Count > 0) {
+        this.pluginDependencies[pluginName] = pluginDependencies;
+        this.pluginAssemblies[pluginName] = pluginAssemblies;
+      } else {
+        Trace.Assert(false);
+      }
+    }
+
+    private bool CheckPluginDependencies(string pluginName) {
+      // when we already checked the dependencies of this plugin earlier then just return true
+      if(loadablePlugins.Contains(pluginName)) {
+        return true;
+      } else if(!pluginAssemblies.ContainsKey(pluginName)) {
+        // when the plugin is not available return false;
+        return false;
+      } else {
+        // otherwise check if all dependencies of the plugin are OK 
+        // if yes then this plugin is also ok and we store it in the list of loadable plugins
+        foreach(string dependency in pluginDependencies[pluginName]) {
+          if(CheckPluginDependencies(dependency) == false) {
+            // if only one dependency is not available that means that the current plugin also is unloadable
+            return false;
+          }
+        }
+        // all dependencies OK -> add to loadable list and return true
+        loadablePlugins.Add(pluginName);
+        return true;
+      }
+    }
+
+
+    private Dictionary<string, IPlugin> pluginsByName = new Dictionary<string, IPlugin>();
+
+    private void LoadPlugins() {
+      // load all loadable plugins (all dependencies available) into the execution context
+      foreach(string plugin in loadablePlugins) {
+        {
+          foreach(string assembly in pluginAssemblies[plugin]) {
+            Assembly.LoadFrom(assembly);
+          }
+        }
+      }
+
+      DiscoveryService service = new DiscoveryService();
+      // now search and instantiate an IPlugin type in each loaded assembly
+      foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) {
+        // don't search for plugins in the PluginInfrastructure
+        if(assembly == this.GetType().Assembly)
+          continue;
+        Type[] availablePluginTypes = service.GetTypes(typeof(IPlugin), assembly);
+
+
+        foreach(Type pluginType in availablePluginTypes) {
+          if(!pluginType.IsAbstract && !pluginType.IsInterface && !pluginType.HasElementType) {
+            IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);
+            PluginAction(this, new PluginManagerActionEventArgs(plugin.Name, PluginManagerAction.InitializingPlugin));
+
+            pluginsByName.Add(plugin.Name, plugin);
+            PluginInfo pluginInfo = GetPluginInfo(plugin);
+
+
+            allPlugins.Add(pluginInfo, plugin);
+            PluginAction(this, new PluginManagerActionEventArgs(plugin.Name, PluginManagerAction.InitializedPlugin));
+          }
+        }
+      }
+    }
+
+
+    private PluginInfo GetPluginInfo(IPlugin plugin) {
+      if(pluginInfos.ContainsKey(plugin)) {
+        return pluginInfos[plugin];
+      }
+
+      // store the data of the plugin in a description file which can be used without loading the plugin assemblies
+      PluginInfo pluginInfo = new PluginInfo();
+      pluginInfo.Name = plugin.Name;
+      pluginInfo.Version = plugin.Version;
+      string baseDir = AppDomain.CurrentDomain.BaseDirectory;
+
+      Array.ForEach<string>(plugin.Files, delegate(string file) {
+        string filename = pluginDir + "/" + file;
+        // always use \ as the directory separator
+        pluginInfo.Files.Add(filename.Replace('/','\\')); 
+      });
+
+      // each plugin can have multiple assemlies associated
+      // for each assembly of the plugin find the dependencies
+      // and get the pluginDescriptions for all dependencies
+      foreach(string assembly in pluginAssemblies[plugin.Name]) {
+        // always use \ as directory separator (this is necessary for discovery of types in 
+        // plugins see DiscoveryService.GetTypes() 
+        pluginInfo.Assemblies.Add(assembly.Replace('/', '\\'));
+
+      }
+      foreach(string dependency in pluginDependencies[plugin.Name]) {
+        // accumulate the dependencies of each assembly into the dependencies of the whole plugin
+        PluginInfo dependencyInfo = GetPluginInfo(pluginsByName[dependency]);
+        pluginInfo.Dependencies.Add(dependencyInfo);
+      }
+
+      pluginInfos[plugin] = pluginInfo;
+
+      return pluginInfo;
+    }
+
+    private void CheckPluginFiles() {
+      foreach(PluginInfo plugin in allPlugins.Keys) {
+        CheckPluginFiles(plugin);
+      }
+    }
+
+    private bool CheckPluginFiles(PluginInfo pluginInfo) {
+      if(activePlugins.ContainsKey(pluginInfo)) {
+        return true;
+      }
+      foreach(PluginInfo dependency in pluginInfo.Dependencies) {
+        if(!CheckPluginFiles(dependency)) {
+          return false;
+        }
+      }
+      foreach(string filename in pluginInfo.Files) {
+        if(!File.Exists(filename)) {
+          MissingPluginFile(pluginInfo.Name, filename);
+          return false;
+        }
+      }
+
+      activePlugins.Add(pluginInfo, allPlugins[pluginInfo]);
+      return true;
+    }
+
+    // infinite lease time
+    public override object InitializeLifetimeService() {
+      return null;
+    }
+
+    internal void OnDelete(PluginInfo pluginInfo) {
+      FindPlugin(pluginInfo).OnDelete();
+    }
+
+    internal void OnInstall(PluginInfo pluginInfo) {
+      FindPlugin(pluginInfo).OnInstall();
+    }
+
+    internal void OnPreUpdate(PluginInfo pluginInfo) {
+      FindPlugin(pluginInfo).OnPreUpdate();
+    }
+
+    internal void OnPostUpdate(PluginInfo pluginInfo) {
+      FindPlugin(pluginInfo).OnPostUpdate();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/PluginFileAttribute.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/PluginFileAttribute.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/PluginFileAttribute.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public enum PluginFileType { Assembly, Executable, Data };
+  
+  [AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
+  public class PluginFileAttribute : System.Attribute {
+    private string filename;
+
+    public string Filename {
+      get { return filename; }
+      set { filename = value; }
+    }
+
+    private PluginFileType filetype = PluginFileType.Data;
+
+    public PluginFileType Filetype {
+      get { return filetype; }
+      set { filetype = value; }
+    }
+
+    public PluginFileAttribute() { }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/PluginInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/PluginInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/PluginInfo.cs	(revision 2)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Holds information of loaded plugins that is needed for plugin management.
+  /// Used to represent plugins in AppDomains without loading the plugin assemblies.
+  /// </summary>
+  [Serializable]
+  public class PluginInfo {
+    private string name;
+
+    public string Name {
+      get { return name; }
+      set { name = value; }
+    }
+
+    private Version version;
+
+    public Version Version {
+      get { return version; }
+      set { version = value; }
+    }
+
+    private List<string> files = new List<string> ();
+    /// <summary>
+    /// Names of all files that belong to this plugin.
+    /// These files are deleted when the plugin is removed or updated.
+    /// </summary>
+    public List<string> Files {
+      get { return files; }
+    }
+
+    private List<PluginInfo> dependencies = new List<PluginInfo> ();
+    public List<PluginInfo> Dependencies {
+      get { return dependencies; }
+    }
+    private List<string> assemblies = new List<string>();
+
+    /// <summary>
+    /// Names of the assemblies that belong to this plugin.
+    /// </summary>
+    public List<string> Assemblies {
+      get { return assemblies; }
+      set { assemblies = value; }
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+
+    // equals and hashcode have to be implemented because we want to compare PluginDescriptions from 
+    // different AppDomains and serialization destroys reference equality
+    public override bool Equals(object obj) {
+      if(!(obj is PluginInfo))
+        return false;
+      PluginInfo other = (PluginInfo)obj;
+
+      return other.Name == this.Name && other.Version == this.Version;
+    }
+
+    public override int GetHashCode() {
+      return name.GetHashCode() + version.GetHashCode();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/PluginManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/PluginManager.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/PluginManager.cs	(revision 2)
@@ -0,0 +1,166 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.PluginInfrastructure {
+
+  // must extend MarshalByRefObject because of event passing between Loader and PluginManager (each in it's own AppDomain)
+  public class PluginManager : MarshalByRefObject {
+
+    // singleton: only one manager allowed in each AppDomain
+    private static PluginManager manager = new PluginManager();
+    public static PluginManager Manager {
+      get { return manager; }
+    }
+
+    // singleton: only one control manager allowed in each applicatoin (i.e. AppDomain)
+    private static IControlManager controlManager;
+    public static IControlManager ControlManager {
+      get { return controlManager; }
+      set { controlManager = value; }
+    }
+
+    public event PluginManagerActionEventHandler Action;
+
+    // holds a proxy for the loader in the special AppDomain for PluginManagament
+    private Loader remoteLoader;
+    private AppDomain pluginDomain;
+    private string pluginDir;
+
+    // singleton pattern
+    private PluginManager() {
+      this.pluginDir = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.PluginDir;
+    }
+
+    public List<PluginInfo> InstalledPlugins {
+      get { return remoteLoader.InstalledPlugins; }
+    }
+
+    public ApplicationInfo[] InstalledApplications {
+      get { return remoteLoader.InstalledApplications; }
+    }
+
+    private PluginInfo[] loadedPlugins;
+    public PluginInfo[] LoadedPlugins {
+      get { return loadedPlugins; }
+      internal set { loadedPlugins = value; }
+    }
+
+    /// <summary>
+    /// Creates a dedicated AppDomain for loading all plugins and checking dependencies.
+    /// </summary>
+    public void Initialize() {
+      NotifyListeners(PluginManagerAction.Initializing, "-");
+
+      AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
+      setup.PrivateBinPath = pluginDir;
+      pluginDomain = AppDomain.CreateDomain("plugin domain", null, setup);
+
+      remoteLoader = (Loader)pluginDomain.CreateInstanceAndUnwrap("HeuristicLab.PluginInfraStructure", "HeuristicLab.PluginInfrastructure.Loader");
+
+      remoteLoader.PluginAction += delegate(object sender, PluginManagerActionEventArgs args) { if(Action != null) Action(this, args); };
+      remoteLoader.Init();
+
+      NotifyListeners(PluginManagerAction.Initialized, "-");
+    }
+
+    /// <summary>
+    /// Creates a separate AppDomain.
+    /// Loads all active plugin assemblies and starts the application in the new AppDomain via a PluginRunner instance activated in the new AppDomain
+    /// </summary>
+    /// <param name="appInfo">application to run</param>
+    public void Run(ApplicationInfo appInfo) {
+      // create a separate AppDomain for the application
+      // activate a PluginRunner instance in the application
+      // and remotely tell it to start the application
+
+      NotifyListeners(PluginManagerAction.Starting, appInfo.Name);
+      AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
+      setup.PrivateBinPath = pluginDir;
+      AppDomain applicationDomain = AppDomain.CreateDomain(appInfo.Name + " AppDomain", null, setup);
+      
+      Runner remoteRunner = (Runner)applicationDomain.CreateInstanceAndUnwrap("HeuristicLab.PluginInfrastructure", "HeuristicLab.PluginInfrastructure.Runner");
+      NotifyListeners(PluginManagerAction.Initializing, "All plugins");
+      remoteRunner.LoadPlugins(remoteLoader.ActivePlugins);
+      NotifyListeners(PluginManagerAction.Initialized, "All plugins");
+      remoteRunner.Run(appInfo);
+
+      AppDomain.Unload(applicationDomain);
+    }
+
+    /// <summary>
+    /// Calculates a set of plugins that directly or transitively depend on the plugin given in the argument.
+    /// </summary>
+    /// <param name="pluginInfo"></param>
+    /// <returns>a list of plugins that are directly of transitively dependent.</returns>
+    public List<PluginInfo> GetDependentPlugins(PluginInfo pluginInfo) {
+      List<PluginInfo> mergedList = new List<PluginInfo>();
+      InstalledPlugins.ForEach(delegate(PluginInfo plugin) {
+        if(plugin.Dependencies.Contains(pluginInfo)) {
+          if(!mergedList.Contains(plugin)) {
+            mergedList.Add(plugin);
+          }
+          // for each of the dependent plugins add the list of transitively dependent plugins
+          // make sure that only one entry for each plugin is added to the merged list
+          GetDependentPlugins(plugin).ForEach(delegate(PluginInfo dependentPlugin) {
+            if(!mergedList.Contains(dependentPlugin)) {
+              mergedList.Add(dependentPlugin);              
+            }
+          });
+        }
+      });
+      
+      return mergedList;
+    }
+
+    public void UnloadAllPlugins() {
+      AppDomain.Unload(pluginDomain);
+    }
+
+    public void LoadAllPlugins() {
+      Initialize();
+    }
+
+    public void OnDelete(PluginInfo pluginInfo) {
+      remoteLoader.OnDelete(pluginInfo);
+    }
+
+    public void OnInstall(PluginInfo pluginInfo) {
+      remoteLoader.OnInstall(pluginInfo);
+    }
+
+    public void OnPreUpdate(PluginInfo pluginInfo) {
+      remoteLoader.OnPreUpdate(pluginInfo);
+    }
+
+    public void OnPostUpdate(PluginInfo pluginInfo) {
+      remoteLoader.OnPostUpdate(pluginInfo);
+    }
+
+    private void NotifyListeners(PluginManagerAction action, string text) {
+      if(Action != null) {
+        Action(this, new PluginManagerActionEventArgs(text, action));
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/PluginManagerActionEventArgs.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/PluginManagerActionEventArgs.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/PluginManagerActionEventArgs.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public enum PluginManagerAction { Initializing, InitializingPlugin, InitializedPlugin, Initialized, Starting }
+  public delegate void PluginManagerActionEventHandler(object sender, PluginManagerActionEventArgs e);
+
+  // this class must be serializable because EventArgs are transmitted over AppDomain boundaries
+  [Serializable]
+  public class PluginManagerActionEventArgs {
+    private PluginManagerAction action;
+    public PluginManagerAction Action {
+      get { return action; }
+      set { this.action = value; }
+    }
+    private string id;
+    public string Id {
+      get { return id; }
+      set { id = value; }
+    }
+
+    public PluginManagerActionEventArgs(string id, PluginManagerAction action) {
+      this.Id = id;
+      this.Action = action;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.PluginInfrastructure")]
+[assembly: AssemblyDescription("PluginInfrastructure to load and manage HeuristicLab plugins")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7f3dedcf-24cc-4176-977a-0baad7f16573")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.Designer.cs	(revision 2)
@@ -0,0 +1,84 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.PluginInfrastructure.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.resx	(revision 2)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs	(revision 2)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("plugins")]
+        public string PluginDir {
+            get {
+                return ((string)(this["PluginDir"]));
+            }
+            set {
+                this["PluginDir"] = value;
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings	(revision 2)
@@ -0,0 +1,9 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.PluginInfrastructure.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="PluginDir" Type="System.String" Scope="User">
+      <Value Profile="(Default)">plugins</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Runner.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Runner.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Runner.cs	(revision 2)
@@ -0,0 +1,50 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure {
+  internal class Runner : MarshalByRefObject {
+
+    public void LoadPlugins(PluginInfo[] plugins) {
+      foreach(PluginInfo pluginInfo in plugins) {
+        foreach(string assemblyName in pluginInfo.Assemblies) {
+          Assembly.LoadFrom(assemblyName);
+        }
+      }
+
+      PluginManager.Manager.LoadedPlugins = plugins;
+    }
+
+    public void Run(ApplicationInfo appInfo) {
+      IApplication runnablePlugin = (IApplication)Activator.CreateInstance(appInfo.PluginAssembly, appInfo.PluginType).Unwrap();
+      runnablePlugin.Run();
+    }
+
+    // infinite lease time
+    public override object InitializeLifetimeService() {
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/app.config
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/app.config	(revision 2)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/app.config	(revision 2)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.PluginInfrastructure.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <HeuristicLab.PluginInfrastructure.Properties.Settings>
+            <setting name="PluginDir" serializeAs="String">
+                <value>plugins</value>
+            </setting>
+        </HeuristicLab.PluginInfrastructure.Properties.Settings>
+    </userSettings>
+</configuration>
Index: /trunk/sources/HeuristicLab.Random/HeuristicLab.Random.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Random/HeuristicLab.Random.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/HeuristicLab.Random.csproj	(revision 2)
@@ -0,0 +1,92 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{47019A74-F7F7-482E-83AA-D3F4F777E879}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Random</RootNamespace>
+    <AssemblyName>HeuristicLab.Random</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Random.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UniformRandomAdder.cs" />
+    <Compile Include="NormalRandomAdder.cs" />
+    <Compile Include="HeuristicLabRandomPlugin.cs" />
+    <Compile Include="MersenneTwister.cs" />
+    <Compile Include="NormalDistributedRandom.cs" />
+    <Compile Include="NormalRandomizer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RandomInjector.cs" />
+    <Compile Include="UniformRandomizer.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Random/HeuristicLabRandomPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/HeuristicLabRandomPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/HeuristicLabRandomPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Random {
+  [ClassInfo(Name = "HeuristicLab.Random")]
+  [PluginFile(Filename = "HeuristicLab.Random.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  public class HeuristicLabRandomPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/MersenneTwister.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/MersenneTwister.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/MersenneTwister.cs	(revision 2)
@@ -0,0 +1,213 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+/* 
+ * C# port of the freeware implementation of the Mersenne Twister
+ * originally developed by M. Matsumoto and T. Nishimura
+ * 
+ * M. Matsumoto and T. Nishimura,
+ * "Mersenne Twister: A 623-Dimensionally Equidistributed Uniform
+ * Pseudo-Random Number Generator",
+ * ACM Transactions on Modeling and Computer Simulation,
+ * Vol. 8, No. 1, January 1998, pp 3-30.
+ * 
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Random {
+  public class MersenneTwister : ItemBase, IRandom {
+    private const int n = 624, m = 397;
+
+    private object locker = new object();
+    private uint[] state = new uint[n];
+    private int p = 0;
+    private bool init = false;
+
+    public MersenneTwister() {
+      if (!init) seed((uint)DateTime.Now.Ticks);
+      init = true;
+    }
+    public MersenneTwister(uint s) {
+      seed(s);
+      init = true;
+    }
+    public MersenneTwister(uint[] array) {
+      seed(array);
+      init = true;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      MersenneTwister clone = new MersenneTwister();
+      clonedObjects.Add(Guid, clone);
+      clone.state = (uint[])state.Clone();
+      clone.p = p;
+      clone.init = init;
+      return clone;
+    }
+
+    public void Reset() {
+      lock (locker)
+        seed((uint)DateTime.Now.Ticks);
+    }
+    public void Reset(int s) {
+      lock (locker)
+        seed((uint)s);
+    }
+
+    public int Next() {
+      lock (locker) {
+        return (int)(rand_int32() >> 1);
+      }
+    }
+    public int Next(int maxVal) {
+      lock (locker) {
+        if (maxVal <= 0)
+          throw new ArgumentException("The interval [0, " + maxVal + ") is empty");
+        int limit = (Int32.MaxValue / maxVal) * maxVal;
+        int value = Next();
+        while (value >= limit) value = Next();
+        return value % maxVal;
+      }
+    }
+    public int Next(int minVal, int maxVal) {
+      lock (locker) {
+        if (maxVal <= minVal)
+          throw new ArgumentException("The interval [" + minVal + ", " + maxVal + ") is empty");
+        return Next(maxVal - minVal) + minVal;
+      }
+    }
+    public double NextDouble() {
+      lock (locker) {
+        return rand_double53();
+      }
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+
+      StringBuilder builder = new StringBuilder();
+      builder.Append(state[0]);
+      for (int i = 1; i < state.Length; i++) {
+        builder.Append(';');
+        builder.Append(state[i]);
+      }
+      XmlNode stateNode = document.CreateNode(XmlNodeType.Element, "State", null);
+      stateNode.InnerText = builder.ToString();
+      node.AppendChild(stateNode);
+
+      XmlNode pNode = document.CreateNode(XmlNodeType.Element, "P", null);
+      pNode.InnerText = p.ToString();
+      node.AppendChild(pNode);
+
+      XmlNode initNode = document.CreateNode(XmlNodeType.Element, "Init", null);
+      initNode.InnerText = init.ToString();
+      node.AppendChild(initNode);
+
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      string stateString = node.SelectSingleNode("State").InnerText;
+      string[] tokens = stateString.Split(';');
+      for (int i = 0; i < tokens.Length; i++)
+        state[i] = uint.Parse(tokens[i]);
+      p = int.Parse(node.SelectSingleNode("P").InnerText);
+      init = bool.Parse(node.SelectSingleNode("Init").InnerText);
+    }
+    #endregion
+
+    #region Seed Methods
+    public void seed(uint s) {
+      state[0] = s & 0xFFFFFFFFU;
+      for (int i = 1; i < n; ++i) {
+        state[i] = 1812433253U * (state[i - 1] ^ (state[i - 1] >> 30)) + (uint)i;
+        state[i] &= 0xFFFFFFFFU;
+      }
+      p = n;
+    }
+    public void seed(uint[] array) {
+      seed(19650218U);
+      int i = 1, j = 0;
+      for (int k = ((n > array.Length) ? n : array.Length); k > 0; --k) {
+        state[i] = (state[i] ^ ((state[i - 1] ^ (state[i - 1] >> 30)) * 1664525U))
+          + array[j] + (uint)j;
+        state[i] &= 0xFFFFFFFFU;
+        ++j;
+        j %= array.Length;
+        if ((++i) == n) { state[0] = state[n - 1]; i = 1; }
+      }
+      for (int k = n - 1; k > 0; --k) {
+        state[i] = (state[i] ^ ((state[i - 1] ^ (state[i - 1] >> 30)) * 1566083941U)) - (uint)i;
+        state[i] &= 0xFFFFFFFFU;
+        if ((++i) == n) { state[0] = state[n - 1]; i = 1; }
+      }
+      state[0] = 0x80000000U;
+      p = n;
+    }
+    #endregion
+
+    #region Random Number Generation Methods
+    private uint rand_int32() {
+      if (p == n) gen_state();
+      uint x = state[p++];
+      x ^= (x >> 11);
+      x ^= (x << 7) & 0x9D2C5680U;
+      x ^= (x << 15) & 0xEFC60000U;
+      return x ^ (x >> 18);
+    }
+    private double rand_double() { // interval [0, 1)
+      return ((double)rand_int32()) * (1.0 / 4294967296.0);
+    }
+    private double rand_double_closed() { // interval [0, 1]
+      return ((double)rand_int32()) * (1.0 / 4294967295.0);
+    }
+    private double rand_double_open() { // interval (0, 1)
+      return (((double)rand_int32()) + 0.5) * (1.0 / 4294967296.0);
+    }
+    private double rand_double53() { // 53 bit resolution, interval [0, 1)
+      return (((double)(rand_int32() >> 5)) * 67108864.0 +
+        ((double)(rand_int32() >> 6))) * (1.0 / 9007199254740992.0);
+    }
+    #endregion
+
+    #region Private Helper Methods
+    private uint twiddle(uint u, uint v) {
+      return (((u & 0x80000000U) | (v & 0x7FFFFFFFU)) >> 1)
+        ^ (((v & 1U) != 0) ? 0x9908B0DFU : 0x0U);
+    }
+    private void gen_state() {
+      for (int i = 0; i < (n - m); ++i)
+        state[i] = state[i + m] ^ twiddle(state[i], state[i + 1]);
+      for (int i = n - m; i < (n - 1); ++i)
+        state[i] = state[i + m - n] ^ twiddle(state[i], state[i + 1]);
+      state[n - 1] = state[m - 1] ^ twiddle(state[n - 1], state[0]);
+      p = 0; // reset position
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/NormalDistributedRandom.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/NormalDistributedRandom.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/NormalDistributedRandom.cs	(revision 2)
@@ -0,0 +1,547 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Xml;
+
+namespace HeuristicLab.Random {
+
+  /// <summary>
+  /// Normally distributed random variable.
+  /// Uses the Ziggurat transform to efficiently generate normal distributed random numbers.
+  /// See "The Ziggurat Method for Generating Random Variables" (G. Marsaglia and W.W. Tsang 2000).
+  /// </summary>
+  public class NormalDistributedRandom : ItemBase, IRandom {
+
+    private double mu;
+
+    public double Mu {
+      get { return mu; }
+      set { mu = value; }
+    }
+    private double sigma;
+
+    public double Sigma {
+      get { return sigma; }
+      set { sigma = value; }
+    }
+    private IRandom uniform;
+    private double[] w = new double[] {
+      1.7290404664e-09,
+      1.2680928529e-10,
+      1.6897518107e-10,
+      1.9862687883e-10,
+      2.2232431174e-10,
+      2.4244936614e-10,
+      2.6016130916e-10,
+      2.7611987696e-10,
+      2.9073962682e-10,
+      3.0429969655e-10,
+      3.1699795566e-10,
+      3.2898020419e-10,
+      3.4035738117e-10,
+      3.5121602848e-10,
+      3.6162509098e-10,
+      3.7164057942e-10,
+      3.8130856805e-10,
+      3.9066758162e-10,
+      3.9975012189e-10,
+      4.0858399997e-10,
+      4.1719308563e-10,
+      4.2559822333e-10,
+      4.3381759296e-10,
+      4.4186720949e-10,
+      4.4976131153e-10,
+      4.5751258337e-10,
+      4.6513240481e-10,
+      4.7263104541e-10,
+      4.8001774777e-10,
+      4.8730097735e-10,
+      4.9448850570e-10,
+      5.0158732723e-10,
+      5.0860404777e-10,
+      5.1554460700e-10,
+      5.2241466708e-10,
+      5.2921933502e-10,
+      5.3596349581e-10,
+      5.4265170135e-10,
+      5.4928817050e-10,
+      5.5587695558e-10,
+      5.6242188684e-10,
+      5.6892646150e-10,
+      5.7539412124e-10,
+      5.8182819673e-10,
+      5.8823168558e-10,
+      5.9460769641e-10,
+      6.0095900478e-10,
+      6.0728838625e-10,
+      6.1359850534e-10,
+      6.1989202660e-10,
+      6.2617133700e-10,
+      6.3243904558e-10,
+      6.3869737277e-10,
+      6.4494881657e-10,
+      6.5119559745e-10,
+      6.5744004685e-10,
+      6.6368432972e-10,
+      6.6993072201e-10,
+      6.7618144417e-10,
+      6.8243871665e-10,
+      6.8870464887e-10,
+      6.9498151678e-10,
+      7.0127148533e-10,
+      7.0757677495e-10,
+      7.1389966161e-10,
+      7.2024242126e-10,
+      7.2660727435e-10,
+      7.3299660786e-10,
+      7.3941280876e-10,
+      7.4585826404e-10,
+      7.5233547170e-10,
+      7.5884698525e-10,
+      7.6539541372e-10,
+      7.7198347714e-10,
+      7.7861395109e-10,
+      7.8528972214e-10,
+      7.9201378789e-10,
+      7.9878920145e-10,
+      8.0561923799e-10,
+      8.1250728368e-10,
+      8.1945689123e-10,
+      8.2647166888e-10,
+      8.3355555791e-10,
+      8.4071272166e-10,
+      8.4794732347e-10,
+      8.5526402627e-10,
+      8.6266754851e-10,
+      8.7016316375e-10,
+      8.7775620106e-10,
+      8.8545243360e-10,
+      8.9325818964e-10,
+      9.0117996399e-10,
+      9.0922497309e-10,
+      9.1740082198e-10,
+      9.2571583732e-10,
+      9.3417884539e-10,
+      9.4279972718e-10,
+      9.5158891877e-10,
+      9.6055785548e-10,
+      9.6971930486e-10,
+      9.7908692265e-10,
+      9.8867602993e-10,
+      9.9850361313e-10,
+      1.0085882129e-09,
+      1.0189509236e-09,
+      1.0296150599e-09,
+      1.0406069340e-09,
+      1.0519566329e-09,
+      1.0636980186e-09,
+      1.0758701707e-09,
+      1.0885182755e-09,
+      1.1016947354e-09,
+      1.1154610569e-09,
+      1.1298901814e-09,
+      1.1450695947e-09,
+      1.1611052120e-09,
+      1.1781275955e-09,
+      1.1962995039e-09,
+      1.2158286600e-09,
+      1.2369856250e-09,
+      1.2601323318e-09,
+      1.2857697129e-09,
+      1.3146201905e-09,
+      1.3477839955e-09,
+      1.3870635751e-09,
+      1.4357403044e-09,
+      1.5008658760e-09,
+      1.6030947680e-09
+    };
+    private long[] k = new long[] {
+      1991057938,
+      0,
+      1611602771,
+      1826899878,
+      1918584482,
+      1969227037,
+      2001281515,
+      2023368125,
+      2039498179,
+      2051788381,
+      2061460127,
+      2069267110,
+      2075699398,
+      2081089314,
+      2085670119,
+      2089610331,
+      2093034710,
+      2096037586,
+      2098691595,
+      2101053571,
+      2103168620,
+      2105072996,
+      2106796166,
+      2108362327,
+      2109791536,
+      2111100552,
+      2112303493,
+      2113412330,
+      2114437283,
+      2115387130,
+      2116269447,
+      2117090813,
+      2117856962,
+      2118572919,
+      2119243101,
+      2119871411,
+      2120461303,
+      2121015852,
+      2121537798,
+      2122029592,
+      2122493434,
+      2122931299,
+      2123344971,
+      2123736059,
+      2124106020,
+      2124456175,
+      2124787725,
+      2125101763,
+      2125399283,
+      2125681194,
+      2125948325,
+      2126201433,
+      2126441213,
+      2126668298,
+      2126883268,
+      2127086657,
+      2127278949,
+      2127460589,
+      2127631985,
+      2127793506,
+      2127945490,
+      2128088244,
+      2128222044,
+      2128347141,
+      2128463758,
+      2128572095,
+      2128672327,
+      2128764606,
+      2128849065,
+      2128925811,
+      2128994934,
+      2129056501,
+      2129110560,
+      2129157136,
+      2129196237,
+      2129227847,
+      2129251929,
+      2129268426,
+      2129277255,
+      2129278312,
+      2129271467,
+      2129256561,
+      2129233410,
+      2129201800,
+      2129161480,
+      2129112170,
+      2129053545,
+      2128985244,
+      2128906855,
+      2128817916,
+      2128717911,
+      2128606255,
+      2128482298,
+      2128345305,
+      2128194452,
+      2128028813,
+      2127847342,
+      2127648860,
+      2127432031,
+      2127195339,
+      2126937058,
+      2126655214,
+      2126347546,
+      2126011445,
+      2125643893,
+      2125241376,
+      2124799783,
+      2124314271,
+      2123779094,
+      2123187386,
+      2122530867,
+      2121799464,
+      2120980787,
+      2120059418,
+      2119015917,
+      2117825402,
+      2116455471,
+      2114863093,
+      2112989789,
+      2110753906,
+      2108037662,
+      2104664315,
+      2100355223,
+      2094642347,
+      2086670106,
+      2074676188,
+      2054300022,
+      2010539237
+   };
+    private double[] f = new double[] {
+      1.0000000000e+00,
+      9.6359968185e-01,
+      9.3628269434e-01,
+      9.1304361820e-01,
+      8.9228165150e-01,
+      8.7324303389e-01,
+      8.5550057888e-01,
+      8.3878362179e-01,
+      8.2290720940e-01,
+      8.0773830414e-01,
+      7.9317700863e-01,
+      7.7914607525e-01,
+      7.6558417082e-01,
+      7.5244158506e-01,
+      7.3967725039e-01,
+      7.2725689411e-01,
+      7.1515148878e-01,
+      7.0333611965e-01,
+      6.9178915024e-01,
+      6.8049186468e-01,
+      6.6942769289e-01,
+      6.5858197212e-01,
+      6.4794182777e-01,
+      6.3749545813e-01,
+      6.2723249197e-01,
+      6.1714339256e-01,
+      6.0721951723e-01,
+      5.9745317698e-01,
+      5.8783704042e-01,
+      5.7836467028e-01,
+      5.6902998686e-01,
+      5.5982738733e-01,
+      5.5075180531e-01,
+      5.4179835320e-01,
+      5.3296267986e-01,
+      5.2424055338e-01,
+      5.1562821865e-01,
+      5.0712203979e-01,
+      4.9871864915e-01,
+      4.9041482806e-01,
+      4.8220765591e-01,
+      4.7409430146e-01,
+      4.6607214212e-01,
+      4.5813870430e-01,
+      4.5029163361e-01,
+      4.4252872467e-01,
+      4.3484783173e-01,
+      4.2724698782e-01,
+      4.1972434521e-01,
+      4.1227802634e-01,
+      4.0490642190e-01,
+      3.9760786295e-01,
+      3.9038079977e-01,
+      3.8322380185e-01,
+      3.7613546848e-01,
+      3.6911445856e-01,
+      3.6215949059e-01,
+      3.5526937246e-01,
+      3.4844297171e-01,
+      3.4167915583e-01,
+      3.3497685194e-01,
+      3.2833510637e-01,
+      3.2175290585e-01,
+      3.1522938609e-01,
+      3.0876362324e-01,
+      3.0235484242e-01,
+      2.9600214958e-01,
+      2.8970485926e-01,
+      2.8346219659e-01,
+      2.7727350593e-01,
+      2.7113807201e-01,
+      2.6505529881e-01,
+      2.5902456045e-01,
+      2.5304529071e-01,
+      2.4711695313e-01,
+      2.4123899639e-01,
+      2.3541094363e-01,
+      2.2963231802e-01,
+      2.2390270233e-01,
+      2.1822164953e-01,
+      2.1258877218e-01,
+      2.0700371265e-01,
+      2.0146611333e-01,
+      1.9597564638e-01,
+      1.9053204358e-01,
+      1.8513499200e-01,
+      1.7978426814e-01,
+      1.7447963357e-01,
+      1.6922089458e-01,
+      1.6400785744e-01,
+      1.5884037316e-01,
+      1.5371830761e-01,
+      1.4864157140e-01,
+      1.4361007512e-01,
+      1.3862377405e-01,
+      1.3368265331e-01,
+      1.2878671288e-01,
+      1.2393598258e-01,
+      1.1913054436e-01,
+      1.1437050998e-01,
+      1.0965602100e-01,
+      1.0498725623e-01,
+      1.0036443919e-01,
+      9.5787845552e-02,
+      9.1257803142e-02,
+      8.6774669588e-02,
+      8.2338899374e-02,
+      7.7950984240e-02,
+      7.3611505330e-02,
+      6.9321118295e-02,
+      6.5080583096e-02,
+      6.0890771449e-02,
+      5.6752663106e-02,
+      5.2667401731e-02,
+      4.8636294901e-02,
+      4.4660862535e-02,
+      4.0742866695e-02,
+      3.6884389818e-02,
+      3.3087886870e-02,
+      2.9356317595e-02,
+      2.5693291798e-02,
+      2.2103304043e-02,
+      1.8592102453e-02,
+      1.5167297795e-02,
+      1.1839478277e-02,
+      8.6244847625e-03,
+      5.5489949882e-03,
+      2.6696291752e-03
+    };
+
+    public NormalDistributedRandom() {
+      this.mu = 0.0;
+      this.sigma = 1.0;
+      this.uniform = new MersenneTwister();
+    }
+
+    public NormalDistributedRandom(IRandom uniformRandom, double mu, double sigma) {
+      this.mu = mu;
+      this.sigma = sigma;
+      this.uniform = uniformRandom;
+    }
+
+    #region IRandom Members
+
+    public void Reset() {
+      uniform.Reset();
+    }
+
+    public void Reset(int seed) {
+      uniform.Reset(seed);
+    }
+
+    public int Next() {
+      throw new Exception("The method or operation is not implemented.");
+    }
+
+    public int Next(int maxVal) {
+      throw new Exception("The method or operation is not implemented.");
+    }
+
+    public int Next(int minVal, int maxVal) {
+      throw new Exception("The method or operation is not implemented.");
+    }
+
+    public double NextDouble() {
+      double signFactor = uniform.Next()%2==0?1.0:-1.0;
+      return sigma* signFactor * NextPositiveDouble() + mu;
+    }
+
+    private double NextPositiveDouble() {
+      int j = uniform.Next();
+      int i = (j & 127);
+      if(Math.Abs(j) < k[i]) {
+        return j * w[i];
+      } else {
+        double r = 3.442620;
+        double x, y;
+        x = j * w[i];
+        if(i == 0) {
+          do {
+            x = -Math.Log(ScaledUniform()) * 0.2904764;
+            y = -Math.Log(ScaledUniform());
+          } while(y + y < x * x);
+          return (j > 0) ? r + x : -r - x;
+        }
+        if(f[i] + ScaledUniform() * (f[i - 1] - f[i]) < Math.Exp(-0.5 * x * x)) {
+          return x;
+        } else {
+          // recurse
+          return (NextPositiveDouble());
+        }
+      }
+    }
+
+    private double ScaledUniform() {
+      return 0.5 + uniform.Next() * 0.2328306e-9;
+    }
+
+
+    #endregion
+
+    #region IStorable Members
+
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+
+      XmlNode muNode = document.CreateNode(XmlNodeType.Element, "Mu", null);
+      muNode.InnerText = mu.ToString();
+      node.AppendChild(muNode);
+
+      XmlNode sigmaNode = document.CreateNode(XmlNodeType.Element, "Sigma", null);
+      sigmaNode.InnerText = sigma.ToString();
+      node.AppendChild(sigmaNode);
+
+      node.AppendChild(PersistenceManager.Persist("UniformRandom", uniform, document, persistedObjects));
+
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      mu = double.Parse(node.SelectSingleNode("Mu").InnerText);
+      sigma = double.Parse(node.SelectSingleNode("Sigma").InnerText);
+      uniform = (IRandom)PersistenceManager.Restore(node.SelectSingleNode("UniformRandom"), restoredObjects);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NormalDistributedRandom clone = new NormalDistributedRandom((IRandom)Auxiliary.Clone(uniform, clonedObjects), mu, sigma);
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/NormalRandomAdder.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/NormalRandomAdder.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/NormalRandomAdder.cs	(revision 2)
@@ -0,0 +1,119 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.Random {
+  public class NormalRandomAdder : OperatorBase {
+    private static int MAX_NUMBER_OF_TRIES = 100;
+
+    public override string Description {
+      get {
+        return @"Samples a normally distributed (mu, sigma * shakingFactor) random variable and adds the result to variable 'Value'.
+        
+If a constraint for the allowed range of 'Value' is defined and the result of the operation would be smaller then 
+the smallest allowed value then 'Value' is set to the lower bound and vice versa for the upper bound.";
+      }
+    }
+
+    public NormalRandomAdder() {
+      AddVariableInfo(new VariableInfo("Mu", "Parameter mu of the normal distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Mu").Local = true;
+      AddVariable(new Variable("Mu", new DoubleData(0.0)));
+
+      AddVariableInfo(new VariableInfo("Sigma", "Parameter sigma of the normal distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Sigma").Local = true;
+      AddVariable(new Variable("Sigma", new DoubleData(0.0)));
+
+      AddVariableInfo(new VariableInfo("Value", "The value to manipulate (actual type is one of: IntData, DoubleData, ConstrainedIntData, ConstrainedDoubleData)", typeof(IObjectData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ShakingFactor", "Determines the force of the shaking factor (effective sigma = sigma * shakingFactor)", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "The random generator to use", typeof(MersenneTwister), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IObjectData value = GetVariableValue<IObjectData>("Value", scope, false);
+      MersenneTwister mt = GetVariableValue<MersenneTwister>("Random", scope, true);
+      double factor = GetVariableValue<DoubleData>("ShakingFactor", scope, true).Data;
+      double mu = GetVariableValue<DoubleData>("Mu", null, false).Data;
+      double sigma = GetVariableValue<DoubleData>("Sigma", null, false).Data;
+      NormalDistributedRandom normal = new NormalDistributedRandom(mt, mu, sigma * factor);
+
+      value.Accept(new RandomAdderVisitor(normal));
+
+      return null;
+    }
+
+
+    private class RandomAdderVisitor : ObjectDataVisitorBase {
+      private NormalDistributedRandom normal;
+      public RandomAdderVisitor(NormalDistributedRandom normal) {
+        this.normal = normal;
+      }
+
+      public override void Visit(DoubleData data) {
+        data.Data += normal.NextDouble();
+      }
+
+      public override void Visit(ConstrainedDoubleData data) {
+
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          double newValue = data.Data + normal.NextDouble();
+
+          if(IsIntegerConstrained(data)) {
+            newValue = Math.Round(newValue);
+          }
+          if(data.TrySetData(newValue)) {
+            return;
+          }
+        }
+
+        throw new InvalidProgramException("Coudn't find a valid value");
+      }
+
+      public override void Visit(IntData data) {
+        data.Data = (int)Math.Round(data.Data + normal.NextDouble());
+      }
+
+      public override void Visit(ConstrainedIntData data) {
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          if(data.TrySetData((int)Math.Round(data.Data + normal.NextDouble())))
+            return;
+        }
+
+        throw new InvalidProgramException("Couldn't find a valid value.");
+      }
+
+      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+        foreach(IConstraint constraint in data.Constraints) {
+          if(constraint is IsIntegerConstraint) {
+            return true;
+          }
+        }
+        return false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/NormalRandomizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/NormalRandomizer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/NormalRandomizer.cs	(revision 2)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.Random {
+  public class NormalRandomizer : OperatorBase {
+    private static int MAX_NUMBER_OF_TRIES = 100;
+
+    public override string Description {
+      get { return "Initializes the value of variable 'Value' to a random value normally distributed with 'Mu' and 'Sigma'."; }
+    }
+
+    public NormalRandomizer() {
+      AddVariableInfo(new VariableInfo("Mu", "Parameter mu of the normal distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Mu").Local = true;
+      AddVariable(new Variable("Mu", new DoubleData(0.0)));
+
+      AddVariableInfo(new VariableInfo("Sigma", "Parameter sigma of the normal distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Sigma").Local = true;
+      AddVariable(new Variable("Sigma", new DoubleData(0.0)));
+
+      AddVariableInfo(new VariableInfo("Value", "The value to manipulate (actual type is one of: IntData, DoubleData, ConstrainedIntData, ConstrainedDoubleData)", typeof(IObjectData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "The random generator to use", typeof(MersenneTwister), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IObjectData value = GetVariableValue<IObjectData>("Value", scope, false);
+      MersenneTwister mt = GetVariableValue<MersenneTwister>("Random", scope, true);
+      double mu = GetVariableValue<DoubleData>("Mu", null, false).Data;
+      double sigma = GetVariableValue<DoubleData>("Sigma", null, false).Data;
+      NormalDistributedRandom normal = new NormalDistributedRandom(mt, mu, sigma);
+
+      value.Accept(new RandomizerVisitor(normal));
+
+      return null;
+    }
+
+    private class RandomizerVisitor : ObjectDataVisitorBase {
+      private NormalDistributedRandom normal;
+
+      public RandomizerVisitor(NormalDistributedRandom normal) {
+        this.normal = normal;
+      }
+
+      public override void Visit(ConstrainedDoubleData data) {
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          double r = normal.NextDouble();
+
+          if(IsIntegerConstrained(data)) {
+            r = Math.Round(r);
+          }
+
+          if(data.TrySetData(r)) {
+            return;
+          }
+        }
+        throw new InvalidProgramException("Couldn't find a valid value in 100 tries with mu=" + normal.Mu + " sigma=" + normal.Sigma);
+      }
+
+      public override void Visit(ConstrainedIntData data) {
+
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          double r = normal.NextDouble();
+          if(data.TrySetData((int)Math.Round(r)))
+            return;
+        }
+
+        throw new InvalidProgramException("Couldn't find a valid value");
+      }
+
+      public override void Visit(DoubleData data) {
+        data.Data = normal.NextDouble();
+      }
+
+      public override void Visit(IntData data) {
+        data.Data = (int)Math.Round(normal.NextDouble());
+      }
+
+
+      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+        foreach(IConstraint constraint in data.Constraints) {
+          if(constraint is IsIntegerConstraint) {
+            return true;
+          }
+        }
+        return false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Random")]
+[assembly: AssemblyDescription("HeuristicLab random number generation classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fc20091c-d28c-4999-940b-5f4029c1ca33")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Random/RandomInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/RandomInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/RandomInjector.cs	(revision 2)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Random {
+  public class RandomInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public RandomInjector()
+      : base() {
+      AddVariableInfo(new VariableInfo("SetSeedRandomly", "Initialize random seed randomly", typeof(BoolData), VariableKind.In));
+      GetVariableInfo("SetSeedRandomly").Local = true;
+      AddVariable(new Variable("SetSeedRandomly", new BoolData(true)));
+
+      AddVariableInfo(new VariableInfo("Seed", "Random seed", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Seed").Local = true;
+      System.Random random = new System.Random();
+      AddVariable(new Variable("Seed", new IntData(random.Next())));
+
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      bool setRandomly = GetVariableValue<BoolData>("SetSeedRandomly", scope, true).Data;
+      IntData seed = GetVariableValue<IntData>("Seed", scope, true);
+      if (setRandomly) {
+        System.Random random = new System.Random();
+        seed.Data = random.Next();
+      }
+      MersenneTwister mersenneTwister = new MersenneTwister((uint)seed.Data);
+      scope.AddVariable(new Variable(GetVariableInfo("Random").ActualName, mersenneTwister));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/UniformRandomAdder.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/UniformRandomAdder.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/UniformRandomAdder.cs	(revision 2)
@@ -0,0 +1,131 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.Random {
+  public class UniformRandomAdder : OperatorBase {
+
+    private static int MAX_NUMBER_OF_TRIES = 100;
+
+    public override string Description {
+      get { return @"Samples a uniformly distributed random variable 'U' with range = [min,max] and E(u) = (max-min)/2
+and adds the result to the variable 'Value'. ShakingFactor influences the effective range of U. 
+If r=(max-min) then the effective range of U is [E(u) - shakingFactor * r/2, E(u) + shakingFactor * r/2].
+
+If a constraint for the allowed range of 'Value' is defined and the result of the operation would be smaller then 
+the smallest allowed value then 'Value' is set to the lower bound and vice versa for the upper bound."; }
+    }
+
+    public UniformRandomAdder() {
+      AddVariableInfo(new VariableInfo("Value", "The value to manipulate (type is one of: IntData, ConstrainedIntData, DoubleData, ConstrainedDoubleData)", typeof(IObjectData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ShakingFactor", "Determines the force of the shaking factor.", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "The random generator to use", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Min", "Lower bound of the uniform distribution.", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Min").Local = true;
+      AddVariable(new Variable("Min", new DoubleData(-1.0)));
+
+      AddVariableInfo(new VariableInfo("Max", "Upper bound of the uniform distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Max").Local = true;
+      AddVariable(new Variable("Max", new DoubleData(1.0)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IObjectData value = GetVariableValue<IObjectData>("Value", scope, false);
+      MersenneTwister mt = GetVariableValue<MersenneTwister>("Random", scope, true);
+      double factor = GetVariableValue<DoubleData>("ShakingFactor", scope, true).Data;
+      double min = GetVariableValue<DoubleData>("Min", null, false).Data;
+      double max = GetVariableValue<DoubleData>("Max", null, false).Data;
+
+      double ex = (max - min) / 2.0 + min;
+      double newRange = (max - min) * factor;
+      min = ex - newRange / 2;
+      max = ex + newRange / 2;
+
+      value.Accept(new RandomAdderVisitor(mt, min, max));
+
+      return null;
+    }
+
+
+    private class RandomAdderVisitor : ObjectDataVisitorBase {
+      private double min;
+      private double max;
+      private MersenneTwister mt;
+
+      public RandomAdderVisitor(MersenneTwister mt, double min, double max) {
+        this.mt = mt;
+        this.min = min;
+        this.max = max;
+      }
+
+      public override void Visit(ConstrainedDoubleData data) {
+
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+
+          double newValue = data.Data + mt.NextDouble() * (max - min) + min;
+
+          if(IsIntegerConstrained(data)) {
+            newValue = Math.Round(newValue);
+          }
+
+          if(data.TrySetData(newValue)) {
+            return;
+          }
+        }
+
+        throw new InvalidProgramException("Couldn't find a valid value");
+      }
+
+      public override void Visit(ConstrainedIntData data) {
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          int newValue = (int)Math.Round(data.Data + mt.NextDouble() * (max - min) + min);
+
+          if(data.TrySetData(newValue)) {
+            return;
+          }
+        }
+        throw new InvalidProgramException("Couldn't find a valid value");
+      }
+
+      public override void Visit(DoubleData data) {
+        data.Data = data.Data + mt.NextDouble() * (max - min) + min;
+      }
+
+      public override void Visit(IntData data) {
+        data.Data = (int)Math.Round(data.Data + mt.NextDouble() * (max - min) + min);
+      }
+      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+        foreach(IConstraint constraint in data.Constraints) {
+          if(constraint is IsIntegerConstraint) {
+            return true;
+          }
+        }
+        return false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Random/UniformRandomizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/UniformRandomizer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Random/UniformRandomizer.cs	(revision 2)
@@ -0,0 +1,117 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.Random {
+  public class UniformRandomizer : OperatorBase {
+    private static int MAX_NUMBER_OF_TRIES = 100;
+    public override string Description {
+      get { return "Initializes the value of variable 'Value' to a random value uniformly distributed between 'Min' and 'Max' (exclusive)"; }
+    }
+
+    public UniformRandomizer() {
+      AddVariableInfo(new VariableInfo("Value", "The value to manipulate (type is one of: IntData, ConstrainedIntData, DoubleData, ConstrainedDoubleData)", typeof(IObjectData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "The random generator to use", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Min", "Lower bound of the uniform distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Min").Local = true;
+      AddVariable(new Variable("Min", new DoubleData(0.0)));
+
+      AddVariableInfo(new VariableInfo("Max", "Upper bound of the uniform distribution", typeof(DoubleData), VariableKind.None));
+      GetVariableInfo("Max").Local = true;
+      AddVariable(new Variable("Max", new DoubleData(1.0)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IObjectData value = GetVariableValue<IObjectData>("Value", scope, false);
+      MersenneTwister mt = GetVariableValue<MersenneTwister>("Random", scope, true);
+      double min = GetVariableValue<DoubleData>("Min", null, false).Data;
+      double max = GetVariableValue<DoubleData>("Max", null, false).Data;
+
+      value.Accept(new RandomVisitor(mt, min, max));
+
+      return null;
+    }
+
+    private class RandomVisitor : ObjectDataVisitorBase {
+      private MersenneTwister mt;
+      private double min;
+      private double max;
+
+      public RandomVisitor(MersenneTwister mt, double min, double max) {
+        this.mt = mt;
+        this.min = min;
+        this.max = max;
+      }
+
+      public override void Visit(DoubleData data) {
+        data.Data = mt.NextDouble() * (max - min) + min;
+      }
+
+      public override void Visit(IntData data) {
+        data.Data = (int)Math.Round(mt.NextDouble() * (max - min) + min);
+      }
+
+      public override void Visit(ConstrainedDoubleData data) {
+
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          double r = mt.NextDouble() * (max - min) + min;
+
+          if(IsIntegerConstrained(data)) {
+            r = Math.Round(r);
+          }
+
+          if(data.TrySetData(r)) {
+            return;
+          }
+        }
+
+        throw new InvalidProgramException("Couldn't find a valid value");
+      }
+
+      public override void Visit(ConstrainedIntData data) {
+
+        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+          int r = (int)Math.Round(mt.NextDouble() * (max - min) + min);
+
+          if(data.TrySetData(r)) {
+            return;
+          }
+        }
+        throw new InvalidProgramException("Couldn't find a valid value");
+      }
+
+      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+        foreach(IConstraint constraint in data.Constraints) {
+          if(constraint is IsIntegerConstraint) {
+            return true;
+          }
+        }
+        return false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj	(revision 2)
@@ -0,0 +1,79 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2D4E4565-3ED9-4BEB-AE75-39D871843D24}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.RealVector</RootNamespace>
+    <AssemblyName>HeuristicLab.RealVector</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.RealVector.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UniformRandomRealVectorGenerator.cs" />
+    <Compile Include="UniformOnePositionManipulator.cs" />
+    <Compile Include="RealVectorCrossoverBase.cs" />
+    <Compile Include="RealVectorManipulatorBase.cs" />
+    <Compile Include="HeuristicLabRealVectorPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SinglePointCrossover.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Evolutionary\HeuristicLab.Evolutionary.csproj">
+      <Project>{F5614C53-153C-4A37-A608-121E1C087F07}</Project>
+      <Name>HeuristicLab.Evolutionary</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.RealVector/HeuristicLabRealVectorPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/HeuristicLabRealVectorPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/HeuristicLabRealVectorPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.RealVector {
+  [ClassInfo(Name = "HeuristicLab.RealVector")]
+  [PluginFile(Filename = "HeuristicLab.RealVector.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Evolutionary")]
+  public class HeuristicLabRealVectorPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.RealVector")]
+[assembly: AssemblyDescription("HeuristicLab real vector operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("4da6c9ad-b15d-4960-b010-d12318948e2d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.RealVector/RealVectorCrossoverBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/RealVectorCrossoverBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/RealVectorCrossoverBase.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.RealVector {
+  public abstract class RealVectorCrossoverBase : CrossoverBase {
+    public RealVectorCrossoverBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("RealVector", "Parent and child real vector", typeof(DoubleArrayData), VariableKind.In | VariableKind.New));
+    }
+
+    protected sealed override void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child) {
+      IVariableInfo realVectorInfo = GetVariableInfo("RealVector");
+      DoubleArrayData vector1 = parent1.GetVariableValue<DoubleArrayData>(realVectorInfo.ActualName, false);
+      DoubleArrayData vector2 = parent2.GetVariableValue<DoubleArrayData>(realVectorInfo.ActualName, false);
+
+      if (vector1.Data.Length != vector2.Data.Length) throw new InvalidOperationException("Cannot apply crossover to real vectors of different length.");
+
+      double[] result = Cross(scope, random, vector1.Data, vector2.Data);
+      child.AddVariable(new Variable(realVectorInfo.ActualName, new DoubleArrayData(result)));
+    }
+
+    protected abstract double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2);
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/RealVectorManipulatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/RealVectorManipulatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/RealVectorManipulatorBase.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  public abstract class RealVectorManipulatorBase : OperatorBase {
+    public RealVectorManipulatorBase() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RealVector", "Real vector to manipulate", typeof(DoubleArrayData), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      DoubleArrayData vector = GetVariableValue<DoubleArrayData>("RealVector", scope, false);
+      vector.Data = Manipulate(scope, random, vector.Data);
+      return null;
+    }
+
+    protected abstract double[] Manipulate(IScope scope, IRandom random, double[] vector);
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/SinglePointCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/SinglePointCrossover.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/SinglePointCrossover.cs	(revision 2)
@@ -0,0 +1,50 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.RealVector {
+  public class SinglePointCrossover : RealVectorCrossoverBase {
+    public override string Description {
+      get { return "Single point crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IRandom random, double[] parent1, double[] parent2) {
+      int length = parent1.Length;
+      double[] result = new double[length];
+      int breakPoint = random.Next(1, length);
+
+      for (int i = 0; i < breakPoint; i++)
+        result[i] = parent1[i];
+      for (int i = breakPoint; i < length; i++)
+        result[i] = parent2[i];
+
+      return result;
+    }
+
+    protected override double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/UniformOnePositionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/UniformOnePositionManipulator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/UniformOnePositionManipulator.cs	(revision 2)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  public class UniformOnePositionManipulator : RealVectorManipulatorBase {
+    public override string Description {
+      get { return "Uniformly distributed change of a single position of a real vector."; }
+    }
+
+    public UniformOnePositionManipulator() {
+      AddVariableInfo(new VariableInfo("Minimum", "Minimum of the sampling range for the vector element (included)", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximum", "Maximum of the sampling range for the vector element (excluded)", typeof(DoubleData), VariableKind.In));
+    }
+
+    public static double[] Apply(IRandom random, double[] vector, double min, double max) {
+      double[] result = (double[])vector.Clone();
+      int index = random.Next(result.Length);
+      result[index] = min + random.NextDouble() * (max - min);
+      return result;
+    }
+
+    protected override double[] Manipulate(IScope scope, IRandom random, double[] vector) {
+      double min = GetVariableValue<DoubleData>("Minimum", scope, true).Data;
+      double max = GetVariableValue<DoubleData>("Maximum", scope, true).Data;
+      return Apply(random, vector, min, max);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/UniformRandomRealVectorGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/UniformRandomRealVectorGenerator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.RealVector/UniformRandomRealVectorGenerator.cs	(revision 2)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  public class UniformRandomRealVectorGenerator : OperatorBase {
+    public override string Description {
+      get { return "Operator generating a new random real vector with each element uniformly distributed in a specified range."; }
+    }
+
+    public UniformRandomRealVectorGenerator() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Length", "Vector length", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Minimum", "Minimum of the sampling range for each vector element (included)", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximum", "Maximum of the sampling range for each vector element (excluded)", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RealVector", "Created random real vector", typeof(DoubleArrayData), VariableKind.New));
+    }
+
+    public static double[] Apply(IRandom random, int length, double min, double max) {
+      double[] result = new double[length];
+      for (int i = 0; i < length; i++)
+        result[i] = min + random.NextDouble() * (max - min);
+      return result;
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      int length = GetVariableValue<IntData>("Length", scope, true).Data;
+      double min = GetVariableValue<DoubleData>("Minimum", scope, true).Data;
+      double max = GetVariableValue<DoubleData>("Maximum", scope, true).Data;
+
+      double[] vector = Apply(random, length, min, max);
+      scope.AddVariable(new Variable(GetVariableInfo("RealVector").ActualName, new DoubleArrayData(vector)));
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/DistanceMatrixPathTSPEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/DistanceMatrixPathTSPEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/DistanceMatrixPathTSPEvaluator.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Permutation;
+
+namespace HeuristicLab.Routing.TSP {
+  public class DistanceMatrixPathTSPEvaluator : SingleObjectiveEvaluatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public DistanceMatrixPathTSPEvaluator()
+      : base() {
+      AddVariableInfo(new VariableInfo("Permutation", "Permutation representing a TSP solution in path encoding", typeof(Permutation.Permutation), VariableKind.In));
+      AddVariableInfo(new VariableInfo("DistanceMatrix", "Distance matrix containing all distances between cities", typeof(DoubleMatrixData), VariableKind.In));
+    }
+
+    protected override double Evaluate(IScope scope) {
+      double[,] distanceMatrix = GetVariableValue<DoubleMatrixData>("DistanceMatrix", scope, true).Data;
+      int[] perm = GetVariableValue<Permutation.Permutation>("Permutation", scope, false).Data;
+      double length = 0;
+
+      for (int i = 0; i < perm.Length - 1; i++)
+        length += distanceMatrix[perm[i], perm[i + 1]];
+      length += distanceMatrix[perm[perm.Length - 1], perm[0]];
+      return length;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/HeuristicLab.Routing.TSP.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/HeuristicLab.Routing.TSP.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/HeuristicLab.Routing.TSP.csproj	(revision 2)
@@ -0,0 +1,120 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9EF75B49-D507-44E0-BC5D-C200FDA53B9B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Routing.TSP</RootNamespace>
+    <AssemblyName>HeuristicLab.Routing.TSP</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Routing.TSP.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="TSPTourInjector.cs" />
+    <Compile Include="TSPTourView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TSPTourView.Designer.cs">
+      <DependentUpon>TSPTourView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TSPTour.cs" />
+    <Compile Include="TSPInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TSPInjectorView.Designer.cs">
+      <DependentUpon>TSPInjectorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TSPRoundedEuclideanDistanceMatrixInjector.cs" />
+    <Compile Include="TSPDistanceMatrixInjectorBase.cs" />
+    <Compile Include="DistanceMatrixPathTSPEvaluator.cs" />
+    <Compile Include="PathTSPEvaluatorBase.cs" />
+    <Compile Include="HeuristicLabRoutingTSPPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RoundedEuclideanPathTSPEvaluator.cs" />
+    <Compile Include="TSPInjector.cs" />
+    <Compile Include="TSPParser.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Charting\HeuristicLab.Charting.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Permutation\HeuristicLab.Permutation.csproj">
+      <Project>{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}</Project>
+      <Name>HeuristicLab.Permutation</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="TSPTourView.resx">
+      <DependentUpon>TSPTourView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TSPInjectorView.resx">
+      <DependentUpon>TSPInjectorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Routing.TSP/HeuristicLabRoutingTSPPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/HeuristicLabRoutingTSPPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/HeuristicLabRoutingTSPPlugin.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Routing.TSP {
+  [ClassInfo(Name = "HeuristicLab.Routing.TSP")]
+  [PluginFile(Filename = "HeuristicLab.Routing.TSP.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  [Dependency(Dependency = "HeuristicLab.Permutation")]
+  [Dependency(Dependency = "HeuristicLab.Charting")]
+  public class HeuristicLabRoutingTSPPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/PathTSPEvaluatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/PathTSPEvaluatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/PathTSPEvaluatorBase.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Permutation;
+
+namespace HeuristicLab.Routing.TSP {
+  public abstract class PathTSPEvaluatorBase : SingleObjectiveEvaluatorBase {
+    public PathTSPEvaluatorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Permutation", "Permutation representing a TSP solution in path encoding", typeof(Permutation.Permutation), VariableKind.In));
+    }
+
+    protected sealed override double Evaluate(IScope scope) {
+      double[,] coordinates = GetVariableValue<DoubleMatrixData>("Coordinates", scope, true).Data;
+      int[] perm = GetVariableValue<Permutation.Permutation>("Permutation", scope, false).Data;
+      double length = 0;
+
+      for (int i = 0; i < perm.Length - 1; i++)
+        length += CalculateDistance(coordinates[perm[i], 0],
+                                    coordinates[perm[i], 1],
+                                    coordinates[perm[i + 1], 0],
+                                    coordinates[perm[i + 1], 1]);
+      length += CalculateDistance(coordinates[perm[perm.Length - 1], 0],
+                                  coordinates[perm[perm.Length - 1], 1],
+                                  coordinates[perm[0], 0],
+                                  coordinates[perm[0], 1]);
+      return length;
+    }
+
+    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Routing.TSP")]
+[assembly: AssemblyDescription("HeuristicLab Traveling Salesman Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3c4c7e0d-ad0b-4e9b-8182-cd7498c7e55d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Routing.TSP/RoundedEuclideanPathTSPEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/RoundedEuclideanPathTSPEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/RoundedEuclideanPathTSPEvaluator.cs	(revision 2)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Permutation;
+
+namespace HeuristicLab.Routing.TSP {
+  public class RoundedEuclideanPathTSPEvaluator : PathTSPEvaluatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPDistanceMatrixInjectorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPDistanceMatrixInjectorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPDistanceMatrixInjectorBase.cs	(revision 2)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Routing.TSP {
+  public abstract class TSPDistanceMatrixInjectorBase : OperatorBase {
+    public TSPDistanceMatrixInjectorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Cities", "Number of cities", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("DistanceMatrix", "Distance matrix containing all distances between cities", typeof(DoubleMatrixData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int cities = GetVariableValue<IntData>("Cities", scope, true).Data;
+      double[,] coordinates = GetVariableValue<DoubleMatrixData>("Coordinates", scope, true).Data;
+      double[,] distanceMatrix = new double[cities, cities];
+
+      for (int i = 0; i < cities; i++) {
+        for (int j = 0; j < cities; j++) {
+          distanceMatrix[i, j] = CalculateDistance(coordinates[i, 0],
+                                                   coordinates[i, 1],
+                                                   coordinates[j, 0],
+                                                   coordinates[j, 1]);
+        }
+      }
+      scope.AddVariable(new Variable(GetVariableInfo("DistanceMatrix").ActualName, new DoubleMatrixData(distanceMatrix)));
+
+      return null;
+    }
+
+    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPInjector.cs	(revision 2)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Routing.TSP {
+  public class TSPInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public TSPInjector()
+      : base() {
+      AddVariableInfo(new VariableInfo("Maximization", "Set to false as TSP is a minimization problem", typeof(BoolData), VariableKind.New));
+      AddVariableInfo(new VariableInfo("Cities", "Number of cities", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("Cities", new IntData(0)));
+      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.New));
+      AddVariable(new Variable("Coordinates", new DoubleMatrixData(new double[0,0])));
+      AddVariableInfo(new VariableInfo("BestKnownQuality", "Quality of best known solution", typeof(DoubleData), VariableKind.New));
+      AddVariable(new Variable("InjectBestKnownQuality", new BoolData(false)));
+      AddVariable(new Variable("BestKnownQuality", new DoubleData(0)));
+    }
+
+    public override IView CreateView() {
+      return new TSPInjectorView(this);
+    }
+
+    public override IOperation Apply(IScope scope) {
+      scope.AddVariable(new Variable(GetVariableInfo("Maximization").ActualName, new BoolData(false)));
+      scope.AddVariable(new Variable(GetVariableInfo("Cities").ActualName, (IItem)GetVariable("Cities").Value.Clone()));
+      scope.AddVariable(new Variable(GetVariableInfo("Coordinates").ActualName, (IItem)GetVariable("Coordinates").Value.Clone()));
+      if (GetVariable("InjectBestKnownQuality").GetValue<BoolData>().Data)
+        scope.AddVariable(new Variable(GetVariableInfo("BestKnownQuality").ActualName, (IItem)GetVariable("BestKnownQuality").Value.Clone()));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.Designer.cs	(revision 2)
@@ -0,0 +1,248 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Routing.TSP {
+  partial class TSPInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.citiesLabel = new System.Windows.Forms.Label();
+      this.bestKnownQualityTextBox = new System.Windows.Forms.TextBox();
+      this.bestKnownQualityAvailableCheckBox = new System.Windows.Forms.CheckBox();
+      this.citiesTextBox = new System.Windows.Forms.TextBox();
+      this.importInstanceButton = new System.Windows.Forms.Button();
+      this.bestKnownQualityLabel = new System.Windows.Forms.Label();
+      this.bestKnownQualityAvailableLabel = new System.Windows.Forms.Label();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
+      this.tabControl.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // citiesLabel
+      // 
+      this.citiesLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.citiesLabel.AutoSize = true;
+      this.citiesLabel.Location = new System.Drawing.Point(6, 36);
+      this.citiesLabel.Name = "citiesLabel";
+      this.citiesLabel.Size = new System.Drawing.Size(35, 13);
+      this.citiesLabel.TabIndex = 0;
+      this.citiesLabel.Text = "&Cities:";
+      // 
+      // bestKnownQualityTextBox
+      // 
+      this.bestKnownQualityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.bestKnownQualityTextBox.Location = new System.Drawing.Point(166, 79);
+      this.bestKnownQualityTextBox.Name = "bestKnownQualityTextBox";
+      this.bestKnownQualityTextBox.Size = new System.Drawing.Size(96, 20);
+      this.bestKnownQualityTextBox.TabIndex = 5;
+      this.bestKnownQualityTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.bestKnownQualityTextBox_Validating);
+      // 
+      // bestKnownQualityAvailableCheckBox
+      // 
+      this.bestKnownQualityAvailableCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.bestKnownQualityAvailableCheckBox.AutoSize = true;
+      this.bestKnownQualityAvailableCheckBox.Location = new System.Drawing.Point(166, 59);
+      this.bestKnownQualityAvailableCheckBox.Name = "bestKnownQualityAvailableCheckBox";
+      this.bestKnownQualityAvailableCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.bestKnownQualityAvailableCheckBox.TabIndex = 3;
+      this.bestKnownQualityAvailableCheckBox.UseVisualStyleBackColor = true;
+      this.bestKnownQualityAvailableCheckBox.CheckedChanged += new System.EventHandler(this.bestKnownQualityAvailableCheckBox_CheckedChanged);
+      // 
+      // citiesTextBox
+      // 
+      this.citiesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.citiesTextBox.Location = new System.Drawing.Point(166, 33);
+      this.citiesTextBox.Name = "citiesTextBox";
+      this.citiesTextBox.ReadOnly = true;
+      this.citiesTextBox.Size = new System.Drawing.Size(96, 20);
+      this.citiesTextBox.TabIndex = 1;
+      // 
+      // importInstanceButton
+      // 
+      this.importInstanceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.importInstanceButton.Location = new System.Drawing.Point(6, 105);
+      this.importInstanceButton.Name = "importInstanceButton";
+      this.importInstanceButton.Size = new System.Drawing.Size(256, 21);
+      this.importInstanceButton.TabIndex = 6;
+      this.importInstanceButton.Text = "&Import Instance from TSPLib";
+      this.importInstanceButton.UseVisualStyleBackColor = true;
+      this.importInstanceButton.Click += new System.EventHandler(this.importInstanceButton_Click);
+      // 
+      // bestKnownQualityLabel
+      // 
+      this.bestKnownQualityLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.bestKnownQualityLabel.AutoSize = true;
+      this.bestKnownQualityLabel.Location = new System.Drawing.Point(6, 82);
+      this.bestKnownQualityLabel.Name = "bestKnownQualityLabel";
+      this.bestKnownQualityLabel.Size = new System.Drawing.Size(102, 13);
+      this.bestKnownQualityLabel.TabIndex = 4;
+      this.bestKnownQualityLabel.Text = "&Best Known Quality:";
+      // 
+      // bestKnownQualityAvailableLabel
+      // 
+      this.bestKnownQualityAvailableLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.bestKnownQualityAvailableLabel.AutoSize = true;
+      this.bestKnownQualityAvailableLabel.Location = new System.Drawing.Point(6, 59);
+      this.bestKnownQualityAvailableLabel.Name = "bestKnownQualityAvailableLabel";
+      this.bestKnownQualityAvailableLabel.Size = new System.Drawing.Size(148, 13);
+      this.bestKnownQualityAvailableLabel.TabIndex = 2;
+      this.bestKnownQualityAvailableLabel.Text = "Best Known Quality &Available:";
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "tsp";
+      this.openFileDialog.FileName = "tsp";
+      this.openFileDialog.Filter = "TSPLib files|*.tsp|All files|*.*";
+      this.openFileDialog.Title = "Import TSPLib File";
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.dataTabPage);
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(276, 184);
+      this.tabControl.TabIndex = 0;
+      // 
+      // dataTabPage
+      // 
+      this.dataTabPage.Controls.Add(this.citiesLabel);
+      this.dataTabPage.Controls.Add(this.bestKnownQualityAvailableLabel);
+      this.dataTabPage.Controls.Add(this.bestKnownQualityTextBox);
+      this.dataTabPage.Controls.Add(this.bestKnownQualityLabel);
+      this.dataTabPage.Controls.Add(this.bestKnownQualityAvailableCheckBox);
+      this.dataTabPage.Controls.Add(this.importInstanceButton);
+      this.dataTabPage.Controls.Add(this.citiesTextBox);
+      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTabPage.Name = "dataTabPage";
+      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTabPage.Size = new System.Drawing.Size(268, 158);
+      this.dataTabPage.TabIndex = 0;
+      this.dataTabPage.Text = "TSP Data";
+      this.dataTabPage.UseVisualStyleBackColor = true;
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(268, 158);
+      this.variableInfosTabPage.TabIndex = 1;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(262, 152);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.operatorBaseDescriptionView);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(268, 158);
+      this.descriptionTabPage.TabIndex = 2;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseDescriptionView
+      // 
+      this.operatorBaseDescriptionView.Caption = "Operator";
+      this.operatorBaseDescriptionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseDescriptionView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
+      this.operatorBaseDescriptionView.Operator = null;
+      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(262, 152);
+      this.operatorBaseDescriptionView.TabIndex = 0;
+      // 
+      // TSPInjectorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "TSPInjectorView";
+      this.Size = new System.Drawing.Size(276, 184);
+      this.tabControl.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.dataTabPage.PerformLayout();
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label citiesLabel;
+    private System.Windows.Forms.TextBox bestKnownQualityTextBox;
+    private System.Windows.Forms.CheckBox bestKnownQualityAvailableCheckBox;
+    private System.Windows.Forms.TextBox citiesTextBox;
+    private System.Windows.Forms.Button importInstanceButton;
+    private System.Windows.Forms.Label bestKnownQualityLabel;
+    private System.Windows.Forms.Label bestKnownQualityAvailableLabel;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage dataTabPage;
+    private System.Windows.Forms.TabPage variableInfosTabPage;
+    private HeuristicLab.Core.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    private System.Windows.Forms.TabPage descriptionTabPage;
+    private HeuristicLab.Core.OperatorBaseDescriptionView operatorBaseDescriptionView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.cs	(revision 2)
@@ -0,0 +1,125 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Routing.TSP {
+  public partial class TSPInjectorView : ViewBase {
+    public TSPInjector TSPInjector {
+      get { return (TSPInjector)Item; }
+      set { base.Item = value; }
+    }
+
+    public TSPInjectorView() {
+      InitializeComponent();
+    }
+    public TSPInjectorView(TSPInjector tspInjector)
+      : this() {
+      TSPInjector = tspInjector;
+    }
+
+    protected override void RemoveItemEvents() {
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseDescriptionView.Operator = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorBaseVariableInfosView.Operator = TSPInjector;
+      operatorBaseDescriptionView.Operator = TSPInjector;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (TSPInjector == null) {
+        citiesTextBox.Text = "-";
+        bestKnownQualityAvailableCheckBox.Checked = false;
+        bestKnownQualityAvailableCheckBox.Enabled = false;
+        bestKnownQualityTextBox.Text = "-";
+        bestKnownQualityTextBox.Enabled = false;
+        importInstanceButton.Enabled = false;
+      } else {
+        citiesTextBox.Text = TSPInjector.GetVariable("Cities").Value.ToString();
+        bestKnownQualityAvailableCheckBox.Checked = TSPInjector.GetVariable("InjectBestKnownQuality").GetValue<BoolData>().Data;
+        bestKnownQualityAvailableCheckBox.Enabled = true;
+        if (bestKnownQualityAvailableCheckBox.Checked) {
+          bestKnownQualityTextBox.Text = TSPInjector.GetVariable("BestKnownQuality").Value.ToString();
+          bestKnownQualityTextBox.Enabled = true;
+        } else {
+          bestKnownQualityTextBox.Text = "-";
+          bestKnownQualityTextBox.Enabled = false;
+        }
+        importInstanceButton.Enabled = true;
+      }
+    }
+
+    private void bestKnownQualityAvailableCheckBox_CheckedChanged(object sender, EventArgs e) {
+      TSPInjector.GetVariable("InjectBestKnownQuality").GetValue<BoolData>().Data = bestKnownQualityAvailableCheckBox.Checked;
+      if (bestKnownQualityAvailableCheckBox.Checked) {
+        bestKnownQualityTextBox.Text = TSPInjector.GetVariable("BestKnownQuality").Value.ToString();
+        bestKnownQualityTextBox.Enabled = true;
+      } else {
+        bestKnownQualityTextBox.Text = "-";
+        bestKnownQualityTextBox.Enabled = false;
+      }
+    }
+
+    private void bestKnownQualityTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        TSPInjector.GetVariable("BestKnownQuality").GetValue<DoubleData>().Data = double.Parse(bestKnownQualityTextBox.Text);
+      }
+      catch (Exception) {
+        bestKnownQualityTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void importInstanceButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        TSPParser parser = null;
+        bool success = false;
+        try {
+          parser = new TSPParser(openFileDialog.FileName);
+          parser.Parse();
+          success = true;
+        }
+        catch (Exception ex) {
+          MessageBox.Show(this, ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
+        if (success) {
+          TSPInjector.GetVariable("Cities").Value = new IntData(parser.Vertices.GetLength(0));
+          TSPInjector.GetVariable("Coordinates").Value = new DoubleMatrixData(parser.Vertices);
+          Refresh();
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPInjectorView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPParser.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPParser.cs	(revision 2)
@@ -0,0 +1,188 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Globalization;
+
+namespace HeuristicLab.Routing.TSP {
+  public class TSPParser {
+    private const int EOF = 0;
+    private const int NAME = 1;
+    private const int TYPE = 2;
+    private const int DIM = 3;
+    private const int WEIGHTTYPE = 4;
+    private const int NODETYPE = 5;
+    private const int NODESECTION = 6;
+
+    private StreamReader source;
+
+    private string myName;
+    public string Name {
+      get { return myName; }
+    }
+    private double[,] myVertices;
+    public double[,] Vertices {
+      get { return myVertices; }
+    }
+    private int myWeightType;
+    public int WeightType {
+      get { return myWeightType; }
+    }
+
+    public TSPParser(String path) {
+      if (!path.EndsWith(".tsp"))
+        throw new ArgumentException("Input file name has to be in TSP format (*.tsp)");
+
+      source = new StreamReader(path);
+      myName = path;
+      myVertices = null;
+      myWeightType = -1;
+    }
+
+    public void Parse() {
+      int section = -1;
+      string str = null;
+      bool typeIsChecked = false;
+      bool weightTypeIsChecked = false;
+
+      do {
+        str = source.ReadLine();
+        section = GetSection(str);
+
+        if (section != -1) {
+          switch (section) {
+            case NAME:
+              ReadName(str);
+              break;
+            case TYPE:
+              CheckType(str);
+              typeIsChecked = true;
+              break;
+            case DIM:
+              InitVerticesArray(str);
+              break;
+            case WEIGHTTYPE:
+              ReadWeightType(str);
+              weightTypeIsChecked = true;
+              break;
+            case NODETYPE:
+              CheckNodeType(str);
+              break;
+            case NODESECTION:
+              ReadVertices();
+              break;
+          }
+        }
+      } while (!((section == EOF) || (str == null)));
+
+      if (!(typeIsChecked && weightTypeIsChecked))
+        throw new InvalidDataException("File contains unknown (edge) types");
+    }
+
+    private int GetSection(string str) {
+      if (str == null)
+        return EOF;
+
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      if (tokens.Length == 0)
+        return -1;
+
+      string token = tokens[0].Trim();
+      if (token.Equals("eof", StringComparison.OrdinalIgnoreCase))
+        return EOF;
+      if (token.Equals("name", StringComparison.OrdinalIgnoreCase))
+        return NAME;
+      if (token.Equals("type", StringComparison.OrdinalIgnoreCase))
+        return TYPE;
+      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
+        return DIM;
+      if (token.Equals("edge_weight_type", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTTYPE;
+      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
+        return NODETYPE;
+      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
+        return NODESECTION;
+
+      return -1;
+    }
+
+    private void ReadName(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      myName = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void CheckType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+
+      string type = tokens[tokens.Length - 1].Trim();
+      if (!type.Equals("tsp", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input data format is not \"TSP\"");
+    }
+
+    private void InitVerticesArray(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string dimension = tokens[tokens.Length - 1].Trim();
+
+      int dim = Int32.Parse(dimension);
+      myVertices = new double[dim, 2];
+    }
+
+    private void ReadWeightType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (type.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        myWeightType = 0;
+      else if (type.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        myWeightType = 1;
+      else
+        throw new InvalidDataException("Unsupported type of edge weights");
+    }
+
+    private void CheckNodeType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (!type.Equals("twod_coords", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Unsupported node type");
+    }
+
+    private void ReadVertices() {
+      if (myVertices == null)
+        throw new InvalidDataException("Dimension not found");
+
+      for (int i = 0; i < (myVertices.Length / 2); i++) {
+        string str = source.ReadLine();
+        string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+        if (tokens.Length != 3)
+          throw new InvalidDataException("Invalid node format");
+
+        CultureInfo culture = new CultureInfo("en-US");
+        myVertices[i, 0] = Double.Parse(tokens[1], culture.NumberFormat);
+        myVertices[i, 1] = Double.Parse(tokens[2], culture.NumberFormat);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPRoundedEuclideanDistanceMatrixInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPRoundedEuclideanDistanceMatrixInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPRoundedEuclideanDistanceMatrixInjector.cs	(revision 2)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Routing.TSP {
+  public class TSPRoundedEuclideanDistanceMatrixInjector : TSPDistanceMatrixInjectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPTour.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPTour.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPTour.cs	(revision 2)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Permutation;
+
+namespace HeuristicLab.Routing.TSP {
+  public class TSPTour : ItemBase, IVisualizationItem {
+    private DoubleMatrixData myCoordinates;
+    public DoubleMatrixData Coordinates {
+      get { return myCoordinates; }
+      set { myCoordinates = value; }
+    }
+    private Permutation.Permutation myTour;
+    public Permutation.Permutation Tour {
+      get { return myTour; }
+      set { myTour = value; }
+    }
+
+
+    public TSPTour() { }
+    public TSPTour(DoubleMatrixData coordinates, Permutation.Permutation tour) {
+      myCoordinates = coordinates;
+      myTour = tour;
+    }
+
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      TSPTour clone = (TSPTour)base.Clone(clonedObjects);
+      clone.myCoordinates = (DoubleMatrixData)Auxiliary.Clone(Coordinates, clonedObjects);
+      clone.myTour = Tour;
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new TSPTourView(this);
+    }
+
+    public event EventHandler CoordinatesChanged;
+    protected virtual void OnCoordinatesChanged() {
+      if (CoordinatesChanged != null)
+        CoordinatesChanged(this, new EventArgs());
+    }
+    public event EventHandler TourChanged;
+    protected virtual void OnTourChanged() {
+      if (TourChanged != null)
+        TourChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Coordinates", Coordinates, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Tour", Tour, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myCoordinates = (DoubleMatrixData)PersistenceManager.Restore(node.SelectSingleNode("Coordinates"), restoredObjects);
+      myTour = (Permutation.Permutation)PersistenceManager.Restore(node.SelectSingleNode("Tour"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPTourInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPTourInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPTourInjector.cs	(revision 2)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Permutation;
+
+namespace HeuristicLab.Routing.TSP {
+  public class TSPTourInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public TSPTourInjector() {
+      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Permutation", "Permutation representing a TSP solution in path encoding", typeof(Permutation.Permutation), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Tour", "Object representing a whole TSP tour", typeof(TSPTour), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      DoubleMatrixData coordinates = GetVariableValue<DoubleMatrixData>("Coordinates", scope, true);
+      Permutation.Permutation permutation = GetVariableValue<Permutation.Permutation>("Permutation", scope, false);
+      TSPTour tour = GetVariableValue<TSPTour>("Tour", scope, false, false);
+      if (tour == null) {
+        tour = new TSPTour(coordinates, permutation);
+        IVariableInfo info = GetVariableInfo("Tour");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, tour));
+        else
+          scope.AddVariable(new Variable(info.ActualName, tour));
+      } else {
+        tour.Coordinates = coordinates;
+        tour.Tour = permutation;
+      }
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.Designer.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Routing.TSP {
+  partial class TSPTourView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.chartControl = new HeuristicLab.Charting.ChartControl();
+      this.SuspendLayout();
+      // 
+      // chartControl
+      // 
+      this.chartControl.BackColor = System.Drawing.SystemColors.Control;
+      this.chartControl.Chart = null;
+      this.chartControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.chartControl.Location = new System.Drawing.Point(0, 0);
+      this.chartControl.Name = "chartControl";
+      this.chartControl.ScaleOnResize = true;
+      this.chartControl.Size = new System.Drawing.Size(160, 147);
+      this.chartControl.TabIndex = 0;
+      // 
+      // TSPTourScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.chartControl);
+      this.Name = "TSPTourScopeView";
+      this.Size = new System.Drawing.Size(160, 147);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Charting.ChartControl chartControl;
+
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.cs	(revision 2)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Permutation;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.Routing.TSP {
+  public partial class TSPTourView : ViewBase {
+    public TSPTour TSPTour {
+      get { return (TSPTour)base.Item; }
+      set { base.Item = value; }
+    }
+
+
+    public TSPTourView() {
+      InitializeComponent();
+      Caption = "TSP Tour View";
+    }
+    public TSPTourView(TSPTour tspTour)
+      : this() {
+      TSPTour = tspTour;
+    }
+
+
+    protected override void RemoveItemEvents() {
+      TSPTour.CoordinatesChanged -= new EventHandler(TSPTour_CoordinatesChanged);
+      TSPTour.TourChanged -= new EventHandler(TSPTour_TourChanged);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      TSPTour.CoordinatesChanged += new EventHandler(TSPTour_CoordinatesChanged);
+      TSPTour.TourChanged += new EventHandler(TSPTour_TourChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      Chart chart = new Chart(0, 0, 10, 10);
+      chartControl.ScaleOnResize = false;
+
+      if ((TSPTour.Coordinates != null) && (TSPTour.Tour != null)) {
+        chart.UpdateEnabled = false;
+
+        double[,] coords = TSPTour.Coordinates.Data;
+        int[] tour = TSPTour.Tour.Data;
+
+        for (int i = 0; i < tour.Length - 1; i++)
+          chart.Group.Add(new Line(chart, coords[tour[i], 0], coords[tour[i], 1],
+                                          coords[tour[i + 1], 0], coords[tour[i + 1], 1], Pens.Black));
+        chart.Group.Add(new Line(chart, coords[tour[tour.Length - 1], 0], coords[tour[tour.Length - 1], 1],
+                                        coords[tour[0], 0], coords[tour[0], 1], Pens.Black));
+
+        for (int i = 0; i < coords.GetLength(0); i++) {
+          FixedSizeCircle circle = new FixedSizeCircle(chart, coords[i, 0], coords[i, 1], 8, Pens.Black, Brushes.Blue);
+          circle.ToolTipText = "(" + coords[i, 0].ToString() + " ; " + coords[i, 1].ToString() + ")";
+          chart.Group.Add(circle);
+        }
+
+        if (coords.GetLength(0) > 0) {
+          PointD min = new PointD(coords[0, 0], coords[0, 1]);
+          PointD max = new PointD(coords[0, 0], coords[0, 1]);
+          for (int i = 0; i < coords.GetLength(0); i++) {
+            if (coords[i, 0] < min.X) min.X = coords[i, 0];
+            if (coords[i, 1] < min.Y) min.Y = coords[i, 1];
+            if (coords[i, 0] > max.X) max.X = coords[i, 0];
+            if (coords[i, 1] > max.Y) max.Y = coords[i, 1];
+          }
+          Offset offset = new Offset((max.X - min.X) / 20, (max.Y - min.Y) / 20);
+          min = min - offset;
+          max = max + offset;
+          chart.SetPosition(min, max);
+        }
+        chart.UpdateEnabled = true;
+      }
+      chartControl.Chart = chart;
+    }
+
+    #region TSPTour Events
+    private void TSPTour_TourChanged(object sender, EventArgs e) {
+      Refresh();
+    }
+    private void TSPTour_CoordinatesChanged(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/TSPTourView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Routing.TSP/ch130.tsp
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/ch130.tsp	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/ch130.tsp	(revision 2)
@@ -0,0 +1,137 @@
+NAME: ch130
+TYPE: TSP
+COMMENT: 130 city problem (Churritz)
+DIMENSION: 130
+EDGE_WEIGHT_TYPE: EUC_2D
+NODE_COORD_SECTION
+1 334.5909245845 161.7809319139
+2 397.6446634067 262.8165330708
+3 503.8741827107 172.8741151168
+4 444.0479403502 384.6491809647
+5 311.6137146746 2.0091699828
+6 662.8551011379 549.2301263653
+7 40.0979030612 187.2375430791
+8 526.8941409181 215.7079092185
+9 209.1887938487 691.0262291948
+10 683.2674131973 414.2096286906
+11 280.7494438748 5.9206392047
+12 252.7493090080 535.7430385019
+13 698.7850451923 348.4413729766
+14 678.7574678104 410.7256424438
+15 220.0041131179 409.1225812873
+16 355.1528556851 76.3912076444
+17 296.9724227786 313.1312792361
+18 504.5154071733 240.8866564499
+19 224.1079496785 358.4872228907
+20 470.6801296968 309.6259188406
+21 554.2530513223 279.4242466521
+22 567.6332684419 352.7162027273
+23 599.0532671093 361.0948690386
+24 240.5232959211 430.6036007844
+25 32.0825972787 345.8551009775
+26 91.0538736891 148.7213270256
+27 248.2179894723 343.9528017384
+28 488.8909044347 3.6122311393
+29 206.0467939820 437.7639406167
+30 575.8409415632 141.9670960195
+31 282.6089948164 329.4183805862
+32 27.6581484868 424.7684581747
+33 568.5737309870 287.0975660546
+34 269.4638933331 295.9464636385
+35 417.8004856811 341.2596589955
+36 32.1680938737 448.8998721172
+37 561.4775136009 357.3543930067
+38 342.9482167470 492.3321423839
+39 399.6752075383 156.8435035519
+40 571.7371050025 375.7575350833
+41 370.7559842751 151.9060751898
+42 509.7093253204 435.7975189314
+43 177.0206999750 295.6044772584
+44 526.1674198605 409.4859418161
+45 316.5725171854 65.6400108214
+46 469.2908100279 281.9891445025
+47 572.7630641427 373.3208821255
+48 29.5176994283 330.0382309000
+49 454.0082936692 537.2178547659
+50 416.1546762271 227.6133100741
+51 535.2514330806 471.0648643744
+52 265.4455533675 684.9987192464
+53 478.0542110167 509.6452028741
+54 370.4781203413 332.5390063041
+55 598.3479202004 446.8693279856
+56 201.1521139175 649.0260268945
+57 193.6925360026 680.2322840744
+58 448.5792598859 532.7934059740
+59 603.2853485624 134.4006473609
+60 543.0102490781 481.5168231148
+61 214.5750793346 43.6460117543
+62 426.3501451825 61.7285415996
+63 89.0447037063 277.1158385868
+64 84.4920100219 31.8474816424
+65 220.0468614154 623.0778103080
+66 688.4613313444 0.4702312726
+67 687.2857531630 373.5346236130
+68 75.4934933967 312.9175377486
+69 63.4170993511 23.7039309674
+70 97.9363495877 211.0910930878
+71 399.5255884970 170.8221968365
+72 456.3167017346 597.1937161677
+73 319.8855102422 626.8396604886
+74 295.9250894897 664.6291554845
+75 288.4868857235 667.7284070537
+76 268.3951858954 52.9010181645
+77 140.4709056068 513.5566720960
+78 689.8079027159 167.5947003748
+79 280.5784506848 458.7533546925
+80 453.3884433554 282.9082328989
+81 213.5704943432 525.8681817779
+82 133.6953004520 677.1757808026
+83 521.1658690522 132.8617086506
+84 30.2657946347 450.0754502986
+85 657.0199585283 39.7772908299
+86 6.9252241961 23.8749241575
+87 252.4286967767 535.1659364856
+88 42.8551682504 63.8232081774
+89 145.8999393902 399.5255884970
+90 638.4885715591 62.6262558472
+91 489.2756391122 665.3131282446
+92 361.2231139311 564.2347787901
+93 519.9475425732 347.9711417040
+94 129.3349741063 435.6692740389
+95 259.7172815016 454.6495181318
+96 676.3421890013 371.0979706551
+97 84.5133841706 183.3260738572
+98 77.7164048671 354.3833863300
+99 335.9802442534 660.6321896676
+100 264.3554717810 377.5743377274
+101 51.6826916855 676.0429509187
+102 692.1376849300 543.8010925819
+103 169.2191356800 547.8194325476
+104 194.0131482339 263.4791316822
+105 415.1928395332 78.9133571973
+106 415.0432204919 479.0801701569
+107 169.8389859939 245.6103433244
+108 525.0987124228 213.5063718969
+109 238.6851191283 33.4932910965
+110 116.2112467718 363.5742702940
+111 16.9283258126 656.5711014044
+112 434.3440768162 92.6996831431
+113 40.5253860363 424.6829615797
+114 530.4849979086 183.8390534273
+115 484.3595848990 49.2460387276
+116 263.6501248722 426.5852608187
+117 450.2891917862 126.3853415784
+118 441.7822805823 299.7724362653
+119 24.2169105375 500.3474481664
+120 503.7886861157 514.6895019799
+121 635.5389390312 200.9811207275
+122 614.5922732529 418.8691931188
+123 21.7161351334 660.9741760476
+124 143.8266469611 92.6996831431
+125 637.7191022040 54.2048412384
+126 566.5645610042 199.9551615873
+127 196.6849168280 221.8209157619
+128 384.9270448985 87.4630166986
+129 178.1107815614 104.6905805938
+130 403.2874386776 205.8971749407
+EOF
Index: /trunk/sources/HeuristicLab.Routing.TSP/fl1400.tsp
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/fl1400.tsp	(revision 2)
+++ /trunk/sources/HeuristicLab.Routing.TSP/fl1400.tsp	(revision 2)
@@ -0,0 +1,1407 @@
+NAME: fl1400
+COMMENT: Drilling problem (Reinelt)
+TYPE: TSP
+DIMENSION: 1400
+EDGE_WEIGHT_TYPE: EUC_2D
+NODE_COORD_SECTION
+1 2.10461e+03 1.96835e+03
+2 2.10461e+03 2.32264e+02
+3 2.95591e+02 1.96835e+03
+4 2.95591e+02 2.32264e+02
+5 1.02570e+03 1.97130e+03
+6 1.16167e+03 1.96539e+03
+7 1.19123e+03 1.95949e+03
+8 1.16759e+03 1.95949e+03
+9 1.09664e+03 1.95949e+03
+10 1.10256e+03 1.95358e+03
+11 1.09073e+03 1.95358e+03
+12 1.01979e+03 1.95358e+03
+13 1.23262e+03 1.94177e+03
+14 1.04344e+03 1.94177e+03
+15 1.23853e+03 1.93587e+03
+16 1.16759e+03 1.93587e+03
+17 1.13211e+03 1.93587e+03
+18 1.26809e+03 1.92996e+03
+19 1.24444e+03 1.92996e+03
+20 1.06708e+03 1.92996e+03
+21 1.17941e+03 1.92406e+03
+22 1.04935e+03 1.92406e+03
+23 1.03753e+03 1.92406e+03
+24 1.12620e+03 1.91815e+03
+25 1.09073e+03 1.91815e+03
+26 9.84319e+02 1.91815e+03
+27 1.32720e+03 1.90634e+03
+28 1.03161e+03 1.90634e+03
+29 9.96143e+02 1.90634e+03
+30 1.04935e+03 1.90044e+03
+31 1.18532e+03 1.89453e+03
+32 1.11438e+03 1.89453e+03
+33 1.31538e+03 1.88272e+03
+34 1.29173e+03 1.88272e+03
+35 1.07891e+03 1.88272e+03
+36 1.01388e+03 1.87682e+03
+37 1.73512e+03 1.74691e+03
+38 7.41934e+02 1.74691e+03
+39 1.72921e+03 1.74100e+03
+40 7.36022e+02 1.74100e+03
+41 1.52230e+03 1.72329e+03
+42 5.29108e+02 1.72329e+03
+43 1.18532e+03 1.64652e+03
+44 1.56959e+03 1.52252e+03
+45 5.76403e+02 1.52252e+03
+46 1.14985e+03 1.44575e+03
+47 6.17786e+02 1.44575e+03
+48 1.03161e+03 1.42213e+03
+49 1.10847e+03 1.41622e+03
+50 7.53758e+02 1.41622e+03
+51 1.03161e+03 1.41032e+03
+52 5.94138e+02 1.41032e+03
+53 7.59670e+02 1.39851e+03
+54 6.05962e+02 1.39851e+03
+55 7.53758e+02 1.27450e+03
+56 6.59169e+02 1.25088e+03
+57 1.26809e+03 1.24498e+03
+58 5.94138e+02 1.24498e+03
+59 6.11874e+02 1.22726e+03
+60 1.27991e+03 1.22136e+03
+61 6.59169e+02 1.15640e+03
+62 1.22670e+03 1.00287e+03
+63 1.14985e+03 9.96967e+02
+64 1.61097e+03 9.73347e+02
+65 1.03753e+03 8.02101e+02
+66 1.31538e+03 7.96196e+02
+67 1.11438e+03 7.96196e+02
+68 1.09073e+03 7.96196e+02
+69 1.27400e+03 7.90290e+02
+70 1.13211e+03 7.90290e+02
+71 1.10847e+03 7.90290e+02
+72 1.01388e+03 7.90290e+02
+73 1.26809e+03 7.84386e+02
+74 1.11438e+03 7.84386e+02
+75 1.03161e+03 7.84386e+02
+76 1.66418e+03 7.78481e+02
+77 1.23853e+03 7.78481e+02
+78 1.09664e+03 7.78481e+02
+79 1.04935e+03 7.78481e+02
+80 9.78407e+02 7.78481e+02
+81 1.23262e+03 7.72576e+02
+82 1.18532e+03 7.72576e+02
+83 1.07891e+03 7.72576e+02
+84 1.05526e+03 7.72576e+02
+85 1.01979e+03 7.72576e+02
+86 1.21488e+03 7.66670e+02
+87 1.19123e+03 7.66670e+02
+88 1.16759e+03 7.66670e+02
+89 1.08482e+03 7.66670e+02
+90 1.07300e+03 7.66670e+02
+91 1.23262e+03 7.60765e+02
+92 1.16167e+03 7.60765e+02
+93 1.26218e+03 7.54861e+02
+94 1.25035e+03 7.54861e+02
+95 1.17941e+03 7.54861e+02
+96 1.02570e+03 7.54861e+02
+97 1.26809e+03 7.48955e+02
+98 1.24444e+03 7.48955e+02
+99 1.17350e+03 7.48955e+02
+100 1.13211e+03 7.43050e+02
+101 1.12029e+03 7.43050e+02
+102 1.01979e+03 7.25335e+02
+103 9.96143e+02 7.25335e+02
+104 1.03753e+03 7.19430e+02
+105 1.00205e+03 7.19430e+02
+106 1.17350e+03 5.59994e+02
+107 1.61097e+03 5.48184e+02
+108 1.17350e+03 5.48184e+02
+109 1.22079e+03 5.36374e+02
+110 1.07300e+03 1.96539e+03
+111 1.04935e+03 1.96539e+03
+112 1.13803e+03 1.95949e+03
+113 1.11438e+03 1.95949e+03
+114 1.05526e+03 1.95949e+03
+115 1.73512e+03 1.95358e+03
+116 1.27400e+03 1.95358e+03
+117 1.25035e+03 1.95358e+03
+118 7.41934e+02 1.95358e+03
+119 1.06117e+03 1.94177e+03
+120 1.29173e+03 1.93587e+03
+121 1.21488e+03 1.92996e+03
+122 1.12029e+03 1.92996e+03
+123 1.09073e+03 1.92406e+03
+124 1.20306e+03 1.91815e+03
+125 1.20897e+03 1.91225e+03
+126 1.11438e+03 1.91225e+03
+127 1.22670e+03 1.90634e+03
+128 1.14394e+03 1.90634e+03
+129 1.29173e+03 1.90044e+03
+130 1.26809e+03 1.90044e+03
+131 1.30947e+03 1.89453e+03
+132 1.00205e+03 1.89453e+03
+133 9.78407e+02 1.88272e+03
+134 1.09073e+03 1.87682e+03
+135 1.56959e+03 1.87091e+03
+136 1.52230e+03 1.87091e+03
+137 1.15576e+03 1.87091e+03
+138 5.76403e+02 1.87091e+03
+139 5.29108e+02 1.87091e+03
+140 1.18532e+03 1.86501e+03
+141 1.09073e+03 1.86501e+03
+142 1.72921e+03 1.74691e+03
+143 7.36022e+02 1.74691e+03
+144 2.05436e+03 1.51661e+03
+145 1.16759e+03 1.51661e+03
+146 1.18532e+03 1.48708e+03
+147 3.10371e+02 1.48708e+03
+148 1.18532e+03 1.47528e+03
+149 6.11874e+02 1.42213e+03
+150 6.17786e+02 1.41622e+03
+151 5.40932e+02 1.41032e+03
+152 6.05962e+02 1.39260e+03
+153 5.82315e+02 1.39260e+03
+154 1.14985e+03 1.27450e+03
+155 7.59670e+02 1.27450e+03
+156 5.82315e+02 1.27450e+03
+157 1.03161e+03 1.22726e+03
+158 5.40932e+02 1.22136e+03
+159 1.26809e+03 1.15640e+03
+160 2.05436e+03 1.15050e+03
+161 1.16759e+03 1.15050e+03
+162 1.27991e+03 1.14459e+03
+163 1.18532e+03 1.05011e+03
+164 1.17350e+03 1.00287e+03
+165 1.66418e+03 9.96967e+02
+166 1.17941e+03 9.96967e+02
+167 1.32720e+03 8.02101e+02
+168 1.23262e+03 8.02101e+02
+169 1.09073e+03 8.02101e+02
+170 9.84319e+02 8.02101e+02
+171 1.17941e+03 7.96196e+02
+172 1.16759e+03 7.96196e+02
+173 1.08482e+03 7.96196e+02
+174 1.06117e+03 7.96196e+02
+175 1.23262e+03 7.90290e+02
+176 1.26218e+03 7.84386e+02
+177 1.15576e+03 7.84386e+02
+178 1.13211e+03 7.84386e+02
+179 1.04935e+03 7.84386e+02
+180 1.22079e+03 7.78481e+02
+181 1.13803e+03 7.78481e+02
+182 1.01979e+03 7.78481e+02
+183 1.20306e+03 7.72576e+02
+184 1.14985e+03 7.66670e+02
+185 1.11438e+03 7.66670e+02
+186 1.30947e+03 7.60765e+02
+187 1.14394e+03 7.60765e+02
+188 1.04935e+03 7.60765e+02
+189 1.20897e+03 7.54861e+02
+190 1.18532e+03 7.54861e+02
+191 1.12620e+03 7.54861e+02
+192 1.10256e+03 7.54861e+02
+193 1.09073e+03 7.54861e+02
+194 1.06708e+03 7.54861e+02
+195 1.03753e+03 7.48955e+02
+196 1.04344e+03 7.43050e+02
+197 1.03161e+03 7.43050e+02
+198 1.29173e+03 7.31240e+02
+199 1.23262e+03 7.31240e+02
+200 3.10371e+02 6.01329e+02
+201 1.22966e+03 1.94473e+03
+202 1.09960e+03 1.93292e+03
+203 1.20601e+03 1.92111e+03
+204 9.81363e+02 1.92111e+03
+205 1.14690e+03 1.90930e+03
+206 1.02866e+03 1.90930e+03
+207 1.07595e+03 1.88568e+03
+208 9.81363e+02 1.88568e+03
+209 2.05732e+03 1.51956e+03
+210 9.81363e+02 7.99148e+02
+211 9.81363e+02 7.75528e+02
+212 3.07415e+02 5.98377e+02
+213 1.16463e+03 1.96835e+03
+214 1.07004e+03 1.96835e+03
+215 1.05231e+03 1.96244e+03
+216 1.73217e+03 1.95654e+03
+217 1.27104e+03 1.95654e+03
+218 1.24740e+03 1.95654e+03
+219 1.02275e+03 1.95654e+03
+220 7.38978e+02 1.95654e+03
+221 1.04639e+03 1.94473e+03
+222 1.24740e+03 1.93292e+03
+223 1.16463e+03 1.93292e+03
+224 1.11733e+03 1.93292e+03
+225 1.07004e+03 1.93292e+03
+226 1.09960e+03 1.92701e+03
+227 1.09369e+03 1.92111e+03
+228 1.04639e+03 1.92111e+03
+229 1.22375e+03 1.90930e+03
+230 1.11733e+03 1.90930e+03
+231 9.99099e+02 1.90930e+03
+232 1.29469e+03 1.89748e+03
+233 1.27104e+03 1.89748e+03
+234 1.18828e+03 1.89748e+03
+235 9.99099e+02 1.89748e+03
+236 1.29469e+03 1.88568e+03
+237 1.56664e+03 1.87386e+03
+238 1.51934e+03 1.87386e+03
+239 1.09369e+03 1.87386e+03
+240 5.73447e+02 1.87386e+03
+241 5.26152e+02 1.87386e+03
+242 1.72625e+03 1.74986e+03
+243 7.33066e+02 1.74986e+03
+244 1.18828e+03 1.64947e+03
+245 1.16463e+03 1.51956e+03
+246 3.07415e+02 1.49004e+03
+247 6.08918e+02 1.42508e+03
+248 1.02866e+03 1.41918e+03
+249 6.20742e+02 1.41327e+03
+250 5.97094e+02 1.41327e+03
+251 5.37976e+02 1.41327e+03
+252 6.08918e+02 1.38965e+03
+253 1.15281e+03 1.27155e+03
+254 7.62626e+02 1.27155e+03
+255 7.50802e+02 1.27155e+03
+256 1.27104e+03 1.24793e+03
+257 1.28287e+03 1.22431e+03
+258 1.03457e+03 1.22431e+03
+259 6.56213e+02 1.15345e+03
+260 2.05732e+03 1.14755e+03
+261 1.18828e+03 1.04716e+03
+262 1.17054e+03 1.00583e+03
+263 1.66122e+03 9.99920e+02
+264 1.18237e+03 9.94014e+02
+265 1.61393e+03 9.76300e+02
+266 1.16463e+03 7.99148e+02
+267 1.09369e+03 7.99148e+02
+268 1.08186e+03 7.99148e+02
+269 1.03457e+03 7.99148e+02
+270 1.22966e+03 7.93243e+02
+271 1.27104e+03 7.87338e+02
+272 1.25922e+03 7.87338e+02
+273 1.12916e+03 7.87338e+02
+274 1.10551e+03 7.87338e+02
+275 1.03457e+03 7.87338e+02
+276 1.21784e+03 7.81433e+02
+277 1.05231e+03 7.81433e+02
+278 1.23557e+03 7.75528e+02
+279 1.18828e+03 7.75528e+02
+280 1.09369e+03 7.75528e+02
+281 1.02275e+03 7.75528e+02
+282 1.20601e+03 7.69623e+02
+283 1.07595e+03 7.69623e+02
+284 1.05231e+03 7.69623e+02
+285 1.23557e+03 7.63718e+02
+286 1.21193e+03 7.63718e+02
+287 1.18828e+03 7.63718e+02
+288 1.15281e+03 7.63718e+02
+289 1.11733e+03 7.63718e+02
+290 1.17645e+03 7.51908e+02
+291 1.12916e+03 7.51908e+02
+292 1.10551e+03 7.51908e+02
+293 1.03457e+03 7.51908e+02
+294 1.02275e+03 7.51908e+02
+295 1.17645e+03 5.62947e+02
+296 1.63167e+03 2.05102e+03
+297 1.63167e+03 2.03921e+03
+298 1.63167e+03 2.02740e+03
+299 1.61984e+03 2.05102e+03
+300 1.61984e+03 2.03921e+03
+301 1.61984e+03 2.02740e+03
+302 1.60802e+03 2.05102e+03
+303 1.60802e+03 2.03921e+03
+304 1.60802e+03 2.02740e+03
+305 1.59619e+03 2.05102e+03
+306 1.59619e+03 2.03921e+03
+307 1.59619e+03 2.02740e+03
+308 1.58437e+03 2.05102e+03
+309 1.58437e+03 2.03921e+03
+310 1.58437e+03 2.02740e+03
+311 1.57255e+03 2.05102e+03
+312 1.57255e+03 2.03921e+03
+313 1.57255e+03 2.02740e+03
+314 1.56072e+03 2.05102e+03
+315 1.56072e+03 2.03921e+03
+316 1.56072e+03 2.02740e+03
+317 1.54890e+03 2.05102e+03
+318 1.54890e+03 2.03921e+03
+319 1.54890e+03 2.02740e+03
+320 1.53708e+03 2.05102e+03
+321 1.53708e+03 2.03921e+03
+322 1.53708e+03 2.02740e+03
+323 1.52525e+03 2.05102e+03
+324 1.52525e+03 2.03921e+03
+325 1.52525e+03 2.02740e+03
+326 1.51343e+03 2.05102e+03
+327 1.51343e+03 2.03921e+03
+328 1.51343e+03 2.02740e+03
+329 1.50160e+03 2.05102e+03
+330 1.50160e+03 2.03921e+03
+331 1.50160e+03 2.02740e+03
+332 1.48978e+03 2.05102e+03
+333 1.48978e+03 2.03921e+03
+334 1.48978e+03 2.02740e+03
+335 1.62575e+03 2.04511e+03
+336 1.62575e+03 2.03330e+03
+337 1.61393e+03 2.04511e+03
+338 1.61393e+03 2.03330e+03
+339 1.60211e+03 2.04511e+03
+340 1.60211e+03 2.03330e+03
+341 1.59028e+03 2.04511e+03
+342 1.59028e+03 2.03330e+03
+343 1.57846e+03 2.04511e+03
+344 1.57846e+03 2.03330e+03
+345 1.56664e+03 2.04511e+03
+346 1.56664e+03 2.03330e+03
+347 1.55481e+03 2.04511e+03
+348 1.55481e+03 2.03330e+03
+349 1.54299e+03 2.04511e+03
+350 1.54299e+03 2.03330e+03
+351 1.53116e+03 2.04511e+03
+352 1.53116e+03 2.03330e+03
+353 1.51934e+03 2.04511e+03
+354 1.51934e+03 2.03330e+03
+355 1.50752e+03 2.04511e+03
+356 1.50752e+03 2.03330e+03
+357 1.49569e+03 2.04511e+03
+358 1.49569e+03 2.03330e+03
+359 1.62575e+03 2.05102e+03
+360 1.62575e+03 2.03921e+03
+361 1.62575e+03 2.02740e+03
+362 1.61393e+03 2.05102e+03
+363 1.61393e+03 2.03921e+03
+364 1.61393e+03 2.02740e+03
+365 1.60211e+03 2.05102e+03
+366 1.60211e+03 2.03921e+03
+367 1.60211e+03 2.02740e+03
+368 1.59028e+03 2.05102e+03
+369 1.59028e+03 2.03921e+03
+370 1.59028e+03 2.02740e+03
+371 1.57846e+03 2.05102e+03
+372 1.57846e+03 2.03921e+03
+373 1.57846e+03 2.02740e+03
+374 1.56664e+03 2.05102e+03
+375 1.56664e+03 2.03921e+03
+376 1.56664e+03 2.02740e+03
+377 1.55481e+03 2.05102e+03
+378 1.55481e+03 2.03921e+03
+379 1.55481e+03 2.02740e+03
+380 1.54299e+03 2.05102e+03
+381 1.54299e+03 2.03921e+03
+382 1.54299e+03 2.02740e+03
+383 1.53116e+03 2.05102e+03
+384 1.53116e+03 2.03921e+03
+385 1.53116e+03 2.02740e+03
+386 1.51934e+03 2.05102e+03
+387 1.51934e+03 2.03921e+03
+388 1.51934e+03 2.02740e+03
+389 1.50752e+03 2.05102e+03
+390 1.50752e+03 2.03921e+03
+391 1.50752e+03 2.02740e+03
+392 1.49569e+03 2.05102e+03
+393 1.49569e+03 2.03921e+03
+394 1.49569e+03 2.02740e+03
+395 1.63167e+03 2.04511e+03
+396 1.63167e+03 2.03330e+03
+397 1.61984e+03 2.04511e+03
+398 1.61984e+03 2.03330e+03
+399 1.60802e+03 2.04511e+03
+400 1.60802e+03 2.03330e+03
+401 1.59619e+03 2.04511e+03
+402 1.59619e+03 2.03330e+03
+403 1.58437e+03 2.04511e+03
+404 1.58437e+03 2.03330e+03
+405 1.57255e+03 2.04511e+03
+406 1.57255e+03 2.03330e+03
+407 1.56072e+03 2.04511e+03
+408 1.56072e+03 2.03330e+03
+409 1.54890e+03 2.04511e+03
+410 1.54890e+03 2.03330e+03
+411 1.53708e+03 2.04511e+03
+412 1.53708e+03 2.03330e+03
+413 1.52525e+03 2.04511e+03
+414 1.52525e+03 2.03330e+03
+415 1.51343e+03 2.04511e+03
+416 1.51343e+03 2.03330e+03
+417 1.50160e+03 2.04511e+03
+418 1.50160e+03 2.03330e+03
+419 1.48978e+03 2.04511e+03
+420 1.48978e+03 2.03330e+03
+421 1.62871e+03 2.04806e+03
+422 1.62871e+03 2.03625e+03
+423 1.61689e+03 2.04806e+03
+424 1.61689e+03 2.03625e+03
+425 1.60506e+03 2.04806e+03
+426 1.60506e+03 2.03625e+03
+427 1.59324e+03 2.04806e+03
+428 1.59324e+03 2.03625e+03
+429 1.58141e+03 2.04806e+03
+430 1.58141e+03 2.03625e+03
+431 1.56959e+03 2.04806e+03
+432 1.56959e+03 2.03625e+03
+433 1.55777e+03 2.04806e+03
+434 1.55777e+03 2.03625e+03
+435 1.54594e+03 2.04806e+03
+436 1.54594e+03 2.03625e+03
+437 1.53412e+03 2.04806e+03
+438 1.53412e+03 2.03625e+03
+439 1.52230e+03 2.04806e+03
+440 1.52230e+03 2.03625e+03
+441 1.51047e+03 2.04806e+03
+442 1.51047e+03 2.03625e+03
+443 1.49865e+03 2.04806e+03
+444 1.49865e+03 2.03625e+03
+445 1.62280e+03 2.04216e+03
+446 1.62280e+03 2.03035e+03
+447 1.61097e+03 2.04216e+03
+448 1.61097e+03 2.03035e+03
+449 1.59915e+03 2.04216e+03
+450 1.59915e+03 2.03035e+03
+451 1.58733e+03 2.04216e+03
+452 1.58733e+03 2.03035e+03
+453 1.57550e+03 2.04216e+03
+454 1.57550e+03 2.03035e+03
+455 1.56368e+03 2.04216e+03
+456 1.56368e+03 2.03035e+03
+457 1.55185e+03 2.04216e+03
+458 1.55185e+03 2.03035e+03
+459 1.54003e+03 2.04216e+03
+460 1.54003e+03 2.03035e+03
+461 1.52821e+03 2.04216e+03
+462 1.52821e+03 2.03035e+03
+463 1.51638e+03 2.04216e+03
+464 1.51638e+03 2.03035e+03
+465 1.50456e+03 2.04216e+03
+466 1.50456e+03 2.03035e+03
+467 1.49274e+03 2.04216e+03
+468 1.49274e+03 2.03035e+03
+469 1.62871e+03 2.04216e+03
+470 1.62871e+03 2.03035e+03
+471 1.61689e+03 2.04216e+03
+472 1.61689e+03 2.03035e+03
+473 1.60506e+03 2.04216e+03
+474 1.60506e+03 2.03035e+03
+475 1.59324e+03 2.04216e+03
+476 1.59324e+03 2.03035e+03
+477 1.58141e+03 2.04216e+03
+478 1.58141e+03 2.03035e+03
+479 1.56959e+03 2.04216e+03
+480 1.56959e+03 2.03035e+03
+481 1.55777e+03 2.04216e+03
+482 1.55777e+03 2.03035e+03
+483 1.54594e+03 2.04216e+03
+484 1.54594e+03 2.03035e+03
+485 1.53412e+03 2.04216e+03
+486 1.53412e+03 2.03035e+03
+487 1.52230e+03 2.04216e+03
+488 1.52230e+03 2.03035e+03
+489 1.51047e+03 2.04216e+03
+490 1.51047e+03 2.03035e+03
+491 1.49865e+03 2.04216e+03
+492 1.49865e+03 2.03035e+03
+493 1.62280e+03 2.04806e+03
+494 1.62280e+03 2.03625e+03
+495 1.61097e+03 2.04806e+03
+496 1.61097e+03 2.03625e+03
+497 1.59915e+03 2.04806e+03
+498 1.59915e+03 2.03625e+03
+499 1.58733e+03 2.04806e+03
+500 1.58733e+03 2.03625e+03
+501 1.57550e+03 2.04806e+03
+502 1.57550e+03 2.03625e+03
+503 1.56368e+03 2.04806e+03
+504 1.56368e+03 2.03625e+03
+505 1.55185e+03 2.04806e+03
+506 1.55185e+03 2.03625e+03
+507 1.54003e+03 2.04806e+03
+508 1.54003e+03 2.03625e+03
+509 1.52821e+03 2.04806e+03
+510 1.52821e+03 2.03625e+03
+511 1.51638e+03 2.04806e+03
+512 1.51638e+03 2.03625e+03
+513 1.50456e+03 2.04806e+03
+514 1.50456e+03 2.03625e+03
+515 1.49274e+03 2.04806e+03
+516 1.49274e+03 2.03625e+03
+517 6.50302e+02 2.05102e+03
+518 6.50302e+02 2.03921e+03
+519 6.50302e+02 2.02740e+03
+520 6.38478e+02 2.05102e+03
+521 6.38478e+02 2.03921e+03
+522 6.38478e+02 2.02740e+03
+523 6.26655e+02 2.05102e+03
+524 6.26655e+02 2.03921e+03
+525 6.26655e+02 2.02740e+03
+526 6.14831e+02 2.05102e+03
+527 6.14831e+02 2.03921e+03
+528 6.14831e+02 2.02740e+03
+529 6.03007e+02 2.05102e+03
+530 6.03007e+02 2.03921e+03
+531 6.03007e+02 2.02740e+03
+532 5.91184e+02 2.05102e+03
+533 5.91184e+02 2.03921e+03
+534 5.91184e+02 2.02740e+03
+535 5.79360e+02 2.05102e+03
+536 5.79360e+02 2.03921e+03
+537 5.79360e+02 2.02740e+03
+538 5.67537e+02 2.05102e+03
+539 5.67537e+02 2.03921e+03
+540 5.67537e+02 2.02740e+03
+541 5.55713e+02 2.05102e+03
+542 5.55713e+02 2.03921e+03
+543 5.55713e+02 2.02740e+03
+544 5.43889e+02 2.05102e+03
+545 5.43889e+02 2.03921e+03
+546 5.43889e+02 2.02740e+03
+547 5.32066e+02 2.05102e+03
+548 5.32066e+02 2.03921e+03
+549 5.32066e+02 2.02740e+03
+550 5.20242e+02 2.05102e+03
+551 5.20242e+02 2.03921e+03
+552 5.20242e+02 2.02740e+03
+553 5.08418e+02 2.05102e+03
+554 5.08418e+02 2.03921e+03
+555 5.08418e+02 2.02740e+03
+556 6.44390e+02 2.04511e+03
+557 6.44390e+02 2.03330e+03
+558 6.32566e+02 2.04511e+03
+559 6.32566e+02 2.03330e+03
+560 6.20743e+02 2.04511e+03
+561 6.20743e+02 2.03330e+03
+562 6.08919e+02 2.04511e+03
+563 6.08919e+02 2.03330e+03
+564 5.97096e+02 2.04511e+03
+565 5.97096e+02 2.03330e+03
+566 5.85272e+02 2.04511e+03
+567 5.85272e+02 2.03330e+03
+568 5.73448e+02 2.04511e+03
+569 5.73448e+02 2.03330e+03
+570 5.61625e+02 2.04511e+03
+571 5.61625e+02 2.03330e+03
+572 5.49801e+02 2.04511e+03
+573 5.49801e+02 2.03330e+03
+574 5.37977e+02 2.04511e+03
+575 5.37977e+02 2.03330e+03
+576 5.26153e+02 2.04511e+03
+577 5.26153e+02 2.03330e+03
+578 5.14330e+02 2.04511e+03
+579 5.14330e+02 2.03330e+03
+580 6.44390e+02 2.05102e+03
+581 6.44390e+02 2.03921e+03
+582 6.44390e+02 2.02740e+03
+583 6.32566e+02 2.05102e+03
+584 6.32566e+02 2.03921e+03
+585 6.32566e+02 2.02740e+03
+586 6.20743e+02 2.05102e+03
+587 6.20743e+02 2.03921e+03
+588 6.20743e+02 2.02740e+03
+589 6.08919e+02 2.05102e+03
+590 6.08919e+02 2.03921e+03
+591 6.08919e+02 2.02740e+03
+592 5.97096e+02 2.05102e+03
+593 5.97096e+02 2.03921e+03
+594 5.97096e+02 2.02740e+03
+595 5.85272e+02 2.05102e+03
+596 5.85272e+02 2.03921e+03
+597 5.85272e+02 2.02740e+03
+598 5.73448e+02 2.05102e+03
+599 5.73448e+02 2.03921e+03
+600 5.73448e+02 2.02740e+03
+601 5.61625e+02 2.05102e+03
+602 5.61625e+02 2.03921e+03
+603 5.61625e+02 2.02740e+03
+604 5.49801e+02 2.05102e+03
+605 5.49801e+02 2.03921e+03
+606 5.49801e+02 2.02740e+03
+607 5.37977e+02 2.05102e+03
+608 5.37977e+02 2.03921e+03
+609 5.37977e+02 2.02740e+03
+610 5.26153e+02 2.05102e+03
+611 5.26153e+02 2.03921e+03
+612 5.26153e+02 2.02740e+03
+613 5.14330e+02 2.05102e+03
+614 5.14330e+02 2.03921e+03
+615 5.14330e+02 2.02740e+03
+616 6.50302e+02 2.04511e+03
+617 6.50302e+02 2.03330e+03
+618 6.38478e+02 2.04511e+03
+619 6.38478e+02 2.03330e+03
+620 6.26655e+02 2.04511e+03
+621 6.26655e+02 2.03330e+03
+622 6.14831e+02 2.04511e+03
+623 6.14831e+02 2.03330e+03
+624 6.03007e+02 2.04511e+03
+625 6.03007e+02 2.03330e+03
+626 5.91184e+02 2.04511e+03
+627 5.91184e+02 2.03330e+03
+628 5.79360e+02 2.04511e+03
+629 5.79360e+02 2.03330e+03
+630 5.67537e+02 2.04511e+03
+631 5.67537e+02 2.03330e+03
+632 5.55713e+02 2.04511e+03
+633 5.55713e+02 2.03330e+03
+634 5.43889e+02 2.04511e+03
+635 5.43889e+02 2.03330e+03
+636 5.32066e+02 2.04511e+03
+637 5.32066e+02 2.03330e+03
+638 5.20242e+02 2.04511e+03
+639 5.20242e+02 2.03330e+03
+640 5.08418e+02 2.04511e+03
+641 5.08418e+02 2.03330e+03
+642 6.47346e+02 2.04806e+03
+643 6.47346e+02 2.03625e+03
+644 6.35522e+02 2.04806e+03
+645 6.35522e+02 2.03625e+03
+646 6.23699e+02 2.04806e+03
+647 6.23699e+02 2.03625e+03
+648 6.11875e+02 2.04806e+03
+649 6.11875e+02 2.03625e+03
+650 6.00051e+02 2.04806e+03
+651 6.00051e+02 2.03625e+03
+652 5.88228e+02 2.04806e+03
+653 5.88228e+02 2.03625e+03
+654 5.76404e+02 2.04806e+03
+655 5.76404e+02 2.03625e+03
+656 5.64581e+02 2.04806e+03
+657 5.64581e+02 2.03625e+03
+658 5.52757e+02 2.04806e+03
+659 5.52757e+02 2.03625e+03
+660 5.40933e+02 2.04806e+03
+661 5.40933e+02 2.03625e+03
+662 5.29109e+02 2.04806e+03
+663 5.29109e+02 2.03625e+03
+664 5.17286e+02 2.04806e+03
+665 5.17286e+02 2.03625e+03
+666 6.41434e+02 2.04216e+03
+667 6.41434e+02 2.03035e+03
+668 6.29611e+02 2.04216e+03
+669 6.29611e+02 2.03035e+03
+670 6.17787e+02 2.04216e+03
+671 6.17787e+02 2.03035e+03
+672 6.05963e+02 2.04216e+03
+673 6.05963e+02 2.03035e+03
+674 5.94140e+02 2.04216e+03
+675 5.94140e+02 2.03035e+03
+676 5.82316e+02 2.04216e+03
+677 5.82316e+02 2.03035e+03
+678 5.70492e+02 2.04216e+03
+679 5.70492e+02 2.03035e+03
+680 5.58669e+02 2.04216e+03
+681 5.58669e+02 2.03035e+03
+682 5.46845e+02 2.04216e+03
+683 5.46845e+02 2.03035e+03
+684 5.35022e+02 2.04216e+03
+685 5.35022e+02 2.03035e+03
+686 5.23198e+02 2.04216e+03
+687 5.23198e+02 2.03035e+03
+688 5.11374e+02 2.04216e+03
+689 5.11374e+02 2.03035e+03
+690 6.47346e+02 2.04216e+03
+691 6.47346e+02 2.03035e+03
+692 6.35522e+02 2.04216e+03
+693 6.35522e+02 2.03035e+03
+694 6.23699e+02 2.04216e+03
+695 6.23699e+02 2.03035e+03
+696 6.11875e+02 2.04216e+03
+697 6.11875e+02 2.03035e+03
+698 6.00051e+02 2.04216e+03
+699 6.00051e+02 2.03035e+03
+700 5.88228e+02 2.04216e+03
+701 5.88228e+02 2.03035e+03
+702 5.76404e+02 2.04216e+03
+703 5.76404e+02 2.03035e+03
+704 5.64581e+02 2.04216e+03
+705 5.64581e+02 2.03035e+03
+706 5.52757e+02 2.04216e+03
+707 5.52757e+02 2.03035e+03
+708 5.40933e+02 2.04216e+03
+709 5.40933e+02 2.03035e+03
+710 5.29109e+02 2.04216e+03
+711 5.29109e+02 2.03035e+03
+712 5.17286e+02 2.04216e+03
+713 5.17286e+02 2.03035e+03
+714 6.41434e+02 2.04806e+03
+715 6.41434e+02 2.03625e+03
+716 6.29611e+02 2.04806e+03
+717 6.29611e+02 2.03625e+03
+718 6.17787e+02 2.04806e+03
+719 6.17787e+02 2.03625e+03
+720 6.05963e+02 2.04806e+03
+721 6.05963e+02 2.03625e+03
+722 5.94140e+02 2.04806e+03
+723 5.94140e+02 2.03625e+03
+724 5.82316e+02 2.04806e+03
+725 5.82316e+02 2.03625e+03
+726 5.70492e+02 2.04806e+03
+727 5.70492e+02 2.03625e+03
+728 5.58669e+02 2.04806e+03
+729 5.58669e+02 2.03625e+03
+730 5.46845e+02 2.04806e+03
+731 5.46845e+02 2.03625e+03
+732 5.35022e+02 2.04806e+03
+733 5.35022e+02 2.03625e+03
+734 5.23198e+02 2.04806e+03
+735 5.23198e+02 2.03625e+03
+736 5.11374e+02 2.04806e+03
+737 5.11374e+02 2.03625e+03
+738 1.63167e+03 1.73215e+02
+739 1.63167e+03 1.61405e+02
+740 1.63167e+03 1.49595e+02
+741 1.61984e+03 1.73215e+02
+742 1.61984e+03 1.61405e+02
+743 1.61984e+03 1.49595e+02
+744 1.60802e+03 1.73215e+02
+745 1.60802e+03 1.61405e+02
+746 1.60802e+03 1.49595e+02
+747 1.59619e+03 1.73215e+02
+748 1.59619e+03 1.61405e+02
+749 1.59619e+03 1.49595e+02
+750 1.58437e+03 1.73215e+02
+751 1.58437e+03 1.61405e+02
+752 1.58437e+03 1.49595e+02
+753 1.57255e+03 1.73215e+02
+754 1.57255e+03 1.61405e+02
+755 1.57255e+03 1.49595e+02
+756 1.56072e+03 1.73215e+02
+757 1.56072e+03 1.61405e+02
+758 1.56072e+03 1.49595e+02
+759 1.54890e+03 1.73215e+02
+760 1.54890e+03 1.61405e+02
+761 1.54890e+03 1.49595e+02
+762 1.53708e+03 1.73215e+02
+763 1.53708e+03 1.61405e+02
+764 1.53708e+03 1.49595e+02
+765 1.52525e+03 1.73215e+02
+766 1.52525e+03 1.61405e+02
+767 1.52525e+03 1.49595e+02
+768 1.51343e+03 1.73215e+02
+769 1.51343e+03 1.61405e+02
+770 1.51343e+03 1.49595e+02
+771 1.50160e+03 1.73215e+02
+772 1.50160e+03 1.61405e+02
+773 1.50160e+03 1.49595e+02
+774 1.48978e+03 1.73215e+02
+775 1.48978e+03 1.61405e+02
+776 1.48978e+03 1.49595e+02
+777 1.62575e+03 1.67310e+02
+778 1.62575e+03 1.55500e+02
+779 1.61393e+03 1.67310e+02
+780 1.61393e+03 1.55500e+02
+781 1.60211e+03 1.67310e+02
+782 1.60211e+03 1.55500e+02
+783 1.59028e+03 1.67310e+02
+784 1.59028e+03 1.55500e+02
+785 1.57846e+03 1.67310e+02
+786 1.57846e+03 1.55500e+02
+787 1.56664e+03 1.67310e+02
+788 1.56664e+03 1.55500e+02
+789 1.55481e+03 1.67310e+02
+790 1.55481e+03 1.55500e+02
+791 1.54299e+03 1.67310e+02
+792 1.54299e+03 1.55500e+02
+793 1.53116e+03 1.67310e+02
+794 1.53116e+03 1.55500e+02
+795 1.51934e+03 1.67310e+02
+796 1.51934e+03 1.55500e+02
+797 1.50752e+03 1.67310e+02
+798 1.50752e+03 1.55500e+02
+799 1.49569e+03 1.67310e+02
+800 1.49569e+03 1.55500e+02
+801 1.62575e+03 1.73215e+02
+802 1.62575e+03 1.61405e+02
+803 1.62575e+03 1.49595e+02
+804 1.61393e+03 1.73215e+02
+805 1.61393e+03 1.61405e+02
+806 1.61393e+03 1.49595e+02
+807 1.60211e+03 1.73215e+02
+808 1.60211e+03 1.61405e+02
+809 1.60211e+03 1.49595e+02
+810 1.59028e+03 1.73215e+02
+811 1.59028e+03 1.61405e+02
+812 1.59028e+03 1.49595e+02
+813 1.57846e+03 1.73215e+02
+814 1.57846e+03 1.61405e+02
+815 1.57846e+03 1.49595e+02
+816 1.56664e+03 1.73215e+02
+817 1.56664e+03 1.61405e+02
+818 1.56664e+03 1.49595e+02
+819 1.55481e+03 1.73215e+02
+820 1.55481e+03 1.61405e+02
+821 1.55481e+03 1.49595e+02
+822 1.54299e+03 1.73215e+02
+823 1.54299e+03 1.61405e+02
+824 1.54299e+03 1.49595e+02
+825 1.53116e+03 1.73215e+02
+826 1.53116e+03 1.61405e+02
+827 1.53116e+03 1.49595e+02
+828 1.51934e+03 1.73215e+02
+829 1.51934e+03 1.61405e+02
+830 1.51934e+03 1.49595e+02
+831 1.50752e+03 1.73215e+02
+832 1.50752e+03 1.61405e+02
+833 1.50752e+03 1.49595e+02
+834 1.49569e+03 1.73215e+02
+835 1.49569e+03 1.61405e+02
+836 1.49569e+03 1.49595e+02
+837 1.63167e+03 1.67310e+02
+838 1.63167e+03 1.55500e+02
+839 1.61984e+03 1.67310e+02
+840 1.61984e+03 1.55500e+02
+841 1.60802e+03 1.67310e+02
+842 1.60802e+03 1.55500e+02
+843 1.59619e+03 1.67310e+02
+844 1.59619e+03 1.55500e+02
+845 1.58437e+03 1.67310e+02
+846 1.58437e+03 1.55500e+02
+847 1.57255e+03 1.67310e+02
+848 1.57255e+03 1.55500e+02
+849 1.56072e+03 1.67310e+02
+850 1.56072e+03 1.55500e+02
+851 1.54890e+03 1.67310e+02
+852 1.54890e+03 1.55500e+02
+853 1.53708e+03 1.67310e+02
+854 1.53708e+03 1.55500e+02
+855 1.52525e+03 1.67310e+02
+856 1.52525e+03 1.55500e+02
+857 1.51343e+03 1.67310e+02
+858 1.51343e+03 1.55500e+02
+859 1.50160e+03 1.67310e+02
+860 1.50160e+03 1.55500e+02
+861 1.48978e+03 1.67310e+02
+862 1.48978e+03 1.55500e+02
+863 1.62871e+03 1.70262e+02
+864 1.62871e+03 1.58452e+02
+865 1.61689e+03 1.70262e+02
+866 1.61689e+03 1.58452e+02
+867 1.60506e+03 1.70262e+02
+868 1.60506e+03 1.58452e+02
+869 1.59324e+03 1.70262e+02
+870 1.59324e+03 1.58452e+02
+871 1.58141e+03 1.70262e+02
+872 1.58141e+03 1.58452e+02
+873 1.56959e+03 1.70262e+02
+874 1.56959e+03 1.58452e+02
+875 1.55777e+03 1.70262e+02
+876 1.55777e+03 1.58452e+02
+877 1.54594e+03 1.70262e+02
+878 1.54594e+03 1.58452e+02
+879 1.53412e+03 1.70262e+02
+880 1.53412e+03 1.58452e+02
+881 1.52230e+03 1.70262e+02
+882 1.52230e+03 1.58452e+02
+883 1.51047e+03 1.70262e+02
+884 1.51047e+03 1.58452e+02
+885 1.49865e+03 1.70262e+02
+886 1.49865e+03 1.58452e+02
+887 1.62280e+03 1.64357e+02
+888 1.62280e+03 1.52547e+02
+889 1.61097e+03 1.64357e+02
+890 1.61097e+03 1.52547e+02
+891 1.59915e+03 1.64357e+02
+892 1.59915e+03 1.52547e+02
+893 1.58733e+03 1.64357e+02
+894 1.58733e+03 1.52547e+02
+895 1.57550e+03 1.64357e+02
+896 1.57550e+03 1.52547e+02
+897 1.56368e+03 1.64357e+02
+898 1.56368e+03 1.52547e+02
+899 1.55185e+03 1.64357e+02
+900 1.55185e+03 1.52547e+02
+901 1.54003e+03 1.64357e+02
+902 1.54003e+03 1.52547e+02
+903 1.52821e+03 1.64357e+02
+904 1.52821e+03 1.52547e+02
+905 1.51638e+03 1.64357e+02
+906 1.51638e+03 1.52547e+02
+907 1.50456e+03 1.64357e+02
+908 1.50456e+03 1.52547e+02
+909 1.49274e+03 1.64357e+02
+910 1.49274e+03 1.52547e+02
+911 1.62871e+03 1.64357e+02
+912 1.62871e+03 1.52547e+02
+913 1.61689e+03 1.64357e+02
+914 1.61689e+03 1.52547e+02
+915 1.60506e+03 1.64357e+02
+916 1.60506e+03 1.52547e+02
+917 1.59324e+03 1.64357e+02
+918 1.59324e+03 1.52547e+02
+919 1.58141e+03 1.64357e+02
+920 1.58141e+03 1.52547e+02
+921 1.56959e+03 1.64357e+02
+922 1.56959e+03 1.52547e+02
+923 1.55777e+03 1.64357e+02
+924 1.55777e+03 1.52547e+02
+925 1.54594e+03 1.64357e+02
+926 1.54594e+03 1.52547e+02
+927 1.53412e+03 1.64357e+02
+928 1.53412e+03 1.52547e+02
+929 1.52230e+03 1.64357e+02
+930 1.52230e+03 1.52547e+02
+931 1.51047e+03 1.64357e+02
+932 1.51047e+03 1.52547e+02
+933 1.49865e+03 1.64357e+02
+934 1.49865e+03 1.52547e+02
+935 1.62280e+03 1.70262e+02
+936 1.62280e+03 1.58452e+02
+937 1.61097e+03 1.70262e+02
+938 1.61097e+03 1.58452e+02
+939 1.59915e+03 1.70262e+02
+940 1.59915e+03 1.58452e+02
+941 1.58733e+03 1.70262e+02
+942 1.58733e+03 1.58452e+02
+943 1.57550e+03 1.70262e+02
+944 1.57550e+03 1.58452e+02
+945 1.56368e+03 1.70262e+02
+946 1.56368e+03 1.58452e+02
+947 1.55185e+03 1.70262e+02
+948 1.55185e+03 1.58452e+02
+949 1.54003e+03 1.70262e+02
+950 1.54003e+03 1.58452e+02
+951 1.52821e+03 1.70262e+02
+952 1.52821e+03 1.58452e+02
+953 1.51638e+03 1.70262e+02
+954 1.51638e+03 1.58452e+02
+955 1.50456e+03 1.70262e+02
+956 1.50456e+03 1.58452e+02
+957 1.49274e+03 1.70262e+02
+958 1.49274e+03 1.58452e+02
+959 6.50302e+02 1.73215e+02
+960 6.50302e+02 1.61405e+02
+961 6.50302e+02 1.49595e+02
+962 6.38478e+02 1.73215e+02
+963 6.38478e+02 1.61405e+02
+964 6.38478e+02 1.49595e+02
+965 6.26655e+02 1.73215e+02
+966 6.26655e+02 1.61405e+02
+967 6.26655e+02 1.49595e+02
+968 6.14831e+02 1.73215e+02
+969 6.14831e+02 1.61405e+02
+970 6.14831e+02 1.49595e+02
+971 6.03007e+02 1.73215e+02
+972 6.03007e+02 1.61405e+02
+973 6.03007e+02 1.49595e+02
+974 5.91184e+02 1.73215e+02
+975 5.91184e+02 1.61405e+02
+976 5.91184e+02 1.49595e+02
+977 5.79360e+02 1.73215e+02
+978 5.79360e+02 1.61405e+02
+979 5.79360e+02 1.49595e+02
+980 5.67537e+02 1.73215e+02
+981 5.67537e+02 1.61405e+02
+982 5.67537e+02 1.49595e+02
+983 5.55713e+02 1.73215e+02
+984 5.55713e+02 1.61405e+02
+985 5.55713e+02 1.49595e+02
+986 5.43889e+02 1.73215e+02
+987 5.43889e+02 1.61405e+02
+988 5.43889e+02 1.49595e+02
+989 5.32066e+02 1.73215e+02
+990 5.32066e+02 1.61405e+02
+991 5.32066e+02 1.49595e+02
+992 5.20242e+02 1.73215e+02
+993 5.20242e+02 1.61405e+02
+994 5.20242e+02 1.49595e+02
+995 5.08418e+02 1.73215e+02
+996 5.08418e+02 1.61405e+02
+997 5.08418e+02 1.49595e+02
+998 6.44390e+02 1.67310e+02
+999 6.44390e+02 1.55500e+02
+1000 6.32566e+02 1.67310e+02
+1001 6.32566e+02 1.55500e+02
+1002 6.20743e+02 1.67310e+02
+1003 6.20743e+02 1.55500e+02
+1004 6.08919e+02 1.67310e+02
+1005 6.08919e+02 1.55500e+02
+1006 5.97096e+02 1.67310e+02
+1007 5.97096e+02 1.55500e+02
+1008 5.85272e+02 1.67310e+02
+1009 5.85272e+02 1.55500e+02
+1010 5.73448e+02 1.67310e+02
+1011 5.73448e+02 1.55500e+02
+1012 5.61625e+02 1.67310e+02
+1013 5.61625e+02 1.55500e+02
+1014 5.49801e+02 1.67310e+02
+1015 5.49801e+02 1.55500e+02
+1016 5.37977e+02 1.67310e+02
+1017 5.37977e+02 1.55500e+02
+1018 5.26153e+02 1.67310e+02
+1019 5.26153e+02 1.55500e+02
+1020 5.14330e+02 1.67310e+02
+1021 5.14330e+02 1.55500e+02
+1022 6.44390e+02 1.73215e+02
+1023 6.44390e+02 1.61405e+02
+1024 6.44390e+02 1.49595e+02
+1025 6.32566e+02 1.73215e+02
+1026 6.32566e+02 1.61405e+02
+1027 6.32566e+02 1.49595e+02
+1028 6.20743e+02 1.73215e+02
+1029 6.20743e+02 1.61405e+02
+1030 6.20743e+02 1.49595e+02
+1031 6.08919e+02 1.73215e+02
+1032 6.08919e+02 1.61405e+02
+1033 6.08919e+02 1.49595e+02
+1034 5.97096e+02 1.73215e+02
+1035 5.97096e+02 1.61405e+02
+1036 5.97096e+02 1.49595e+02
+1037 5.85272e+02 1.73215e+02
+1038 5.85272e+02 1.61405e+02
+1039 5.85272e+02 1.49595e+02
+1040 5.73448e+02 1.73215e+02
+1041 5.73448e+02 1.61405e+02
+1042 5.73448e+02 1.49595e+02
+1043 5.61625e+02 1.73215e+02
+1044 5.61625e+02 1.61405e+02
+1045 5.61625e+02 1.49595e+02
+1046 5.49801e+02 1.73215e+02
+1047 5.49801e+02 1.61405e+02
+1048 5.49801e+02 1.49595e+02
+1049 5.37977e+02 1.73215e+02
+1050 5.37977e+02 1.61405e+02
+1051 5.37977e+02 1.49595e+02
+1052 5.26153e+02 1.73215e+02
+1053 5.26153e+02 1.61405e+02
+1054 5.26153e+02 1.49595e+02
+1055 5.14330e+02 1.73215e+02
+1056 5.14330e+02 1.61405e+02
+1057 5.14330e+02 1.49595e+02
+1058 6.50302e+02 1.67310e+02
+1059 6.50302e+02 1.55500e+02
+1060 6.38478e+02 1.67310e+02
+1061 6.38478e+02 1.55500e+02
+1062 6.26655e+02 1.67310e+02
+1063 6.26655e+02 1.55500e+02
+1064 6.14831e+02 1.67310e+02
+1065 6.14831e+02 1.55500e+02
+1066 6.03007e+02 1.67310e+02
+1067 6.03007e+02 1.55500e+02
+1068 5.91184e+02 1.67310e+02
+1069 5.91184e+02 1.55500e+02
+1070 5.79360e+02 1.67310e+02
+1071 5.79360e+02 1.55500e+02
+1072 5.67537e+02 1.67310e+02
+1073 5.67537e+02 1.55500e+02
+1074 5.55713e+02 1.67310e+02
+1075 5.55713e+02 1.55500e+02
+1076 5.43889e+02 1.67310e+02
+1077 5.43889e+02 1.55500e+02
+1078 5.32066e+02 1.67310e+02
+1079 5.32066e+02 1.55500e+02
+1080 5.20242e+02 1.67310e+02
+1081 5.20242e+02 1.55500e+02
+1082 5.08418e+02 1.67310e+02
+1083 5.08418e+02 1.55500e+02
+1084 6.47346e+02 1.70262e+02
+1085 6.47346e+02 1.58452e+02
+1086 6.35522e+02 1.70262e+02
+1087 6.35522e+02 1.58452e+02
+1088 6.23699e+02 1.70262e+02
+1089 6.23699e+02 1.58452e+02
+1090 6.11875e+02 1.70262e+02
+1091 6.11875e+02 1.58452e+02
+1092 6.00051e+02 1.70262e+02
+1093 6.00051e+02 1.58452e+02
+1094 5.88228e+02 1.70262e+02
+1095 5.88228e+02 1.58452e+02
+1096 5.76404e+02 1.70262e+02
+1097 5.76404e+02 1.58452e+02
+1098 5.64581e+02 1.70262e+02
+1099 5.64581e+02 1.58452e+02
+1100 5.52757e+02 1.70262e+02
+1101 5.52757e+02 1.58452e+02
+1102 5.40933e+02 1.70262e+02
+1103 5.40933e+02 1.58452e+02
+1104 5.29109e+02 1.70262e+02
+1105 5.29109e+02 1.58452e+02
+1106 5.17286e+02 1.70262e+02
+1107 5.17286e+02 1.58452e+02
+1108 6.41434e+02 1.64357e+02
+1109 6.41434e+02 1.52547e+02
+1110 6.29611e+02 1.64357e+02
+1111 6.29611e+02 1.52547e+02
+1112 6.17787e+02 1.64357e+02
+1113 6.17787e+02 1.52547e+02
+1114 6.05963e+02 1.64357e+02
+1115 6.05963e+02 1.52547e+02
+1116 5.94140e+02 1.64357e+02
+1117 5.94140e+02 1.52547e+02
+1118 5.82316e+02 1.64357e+02
+1119 5.82316e+02 1.52547e+02
+1120 5.70492e+02 1.64357e+02
+1121 5.70492e+02 1.52547e+02
+1122 5.58669e+02 1.64357e+02
+1123 5.58669e+02 1.52547e+02
+1124 5.46845e+02 1.64357e+02
+1125 5.46845e+02 1.52547e+02
+1126 5.35022e+02 1.64357e+02
+1127 5.35022e+02 1.52547e+02
+1128 5.23198e+02 1.64357e+02
+1129 5.23198e+02 1.52547e+02
+1130 5.11374e+02 1.64357e+02
+1131 5.11374e+02 1.52547e+02
+1132 6.47346e+02 1.64357e+02
+1133 6.47346e+02 1.52547e+02
+1134 6.35522e+02 1.64357e+02
+1135 6.35522e+02 1.52547e+02
+1136 6.23699e+02 1.64357e+02
+1137 6.23699e+02 1.52547e+02
+1138 6.11875e+02 1.64357e+02
+1139 6.11875e+02 1.52547e+02
+1140 6.00051e+02 1.64357e+02
+1141 6.00051e+02 1.52547e+02
+1142 5.88228e+02 1.64357e+02
+1143 5.88228e+02 1.52547e+02
+1144 5.76404e+02 1.64357e+02
+1145 5.76404e+02 1.52547e+02
+1146 5.64581e+02 1.64357e+02
+1147 5.64581e+02 1.52547e+02
+1148 5.52757e+02 1.64357e+02
+1149 5.52757e+02 1.52547e+02
+1150 5.40933e+02 1.64357e+02
+1151 5.40933e+02 1.52547e+02
+1152 5.29109e+02 1.64357e+02
+1153 5.29109e+02 1.52547e+02
+1154 5.17286e+02 1.64357e+02
+1155 5.17286e+02 1.52547e+02
+1156 6.41434e+02 1.70262e+02
+1157 6.41434e+02 1.58452e+02
+1158 6.29611e+02 1.70262e+02
+1159 6.29611e+02 1.58452e+02
+1160 6.17787e+02 1.70262e+02
+1161 6.17787e+02 1.58452e+02
+1162 6.05963e+02 1.70262e+02
+1163 6.05963e+02 1.58452e+02
+1164 5.94140e+02 1.70262e+02
+1165 5.94140e+02 1.58452e+02
+1166 5.82316e+02 1.70262e+02
+1167 5.82316e+02 1.58452e+02
+1168 5.70492e+02 1.70262e+02
+1169 5.70492e+02 1.58452e+02
+1170 5.58669e+02 1.70262e+02
+1171 5.58669e+02 1.58452e+02
+1172 5.46845e+02 1.70262e+02
+1173 5.46845e+02 1.58452e+02
+1174 5.35022e+02 1.70262e+02
+1175 5.35022e+02 1.58452e+02
+1176 5.23198e+02 1.70262e+02
+1177 5.23198e+02 1.58452e+02
+1178 5.11374e+02 1.70262e+02
+1179 5.11374e+02 1.58452e+02
+1180 1.88883e+03 2.04806e+03
+1181 1.87701e+03 2.04806e+03
+1182 1.85336e+03 2.04806e+03
+1183 1.84154e+03 2.04806e+03
+1184 1.82971e+03 2.04806e+03
+1185 1.78242e+03 2.04806e+03
+1186 1.74695e+03 2.04806e+03
+1187 1.72330e+03 2.04806e+03
+1188 1.71147e+03 2.04806e+03
+1189 1.67600e+03 2.04806e+03
+1190 1.65236e+03 2.04806e+03
+1191 9.07466e+02 2.04806e+03
+1192 8.95642e+02 2.04806e+03
+1193 8.71994e+02 2.04806e+03
+1194 8.60171e+02 2.04806e+03
+1195 8.48347e+02 2.04806e+03
+1196 8.01053e+02 2.04806e+03
+1197 7.65581e+02 2.04806e+03
+1198 7.41934e+02 2.04806e+03
+1199 7.30111e+02 2.04806e+03
+1200 6.94640e+02 2.04806e+03
+1201 6.70992e+02 2.04806e+03
+1202 1.87109e+03 2.04216e+03
+1203 1.80015e+03 2.04216e+03
+1204 1.77651e+03 2.04216e+03
+1205 1.75286e+03 2.04216e+03
+1206 8.89730e+02 2.04216e+03
+1207 8.18788e+02 2.04216e+03
+1208 7.95141e+02 2.04216e+03
+1209 7.71494e+02 2.04216e+03
+1210 1.87701e+03 2.03625e+03
+1211 1.85336e+03 2.03625e+03
+1212 1.84154e+03 2.03625e+03
+1213 1.74695e+03 2.03625e+03
+1214 1.72330e+03 2.03625e+03
+1215 1.69965e+03 2.03625e+03
+1216 8.95642e+02 2.03625e+03
+1217 8.71994e+02 2.03625e+03
+1218 8.60171e+02 2.03625e+03
+1219 7.65581e+02 2.03625e+03
+1220 7.41934e+02 2.03625e+03
+1221 7.18287e+02 2.03625e+03
+1222 1.89474e+03 2.03035e+03
+1223 1.87109e+03 2.03035e+03
+1224 1.85927e+03 2.03035e+03
+1225 1.82380e+03 2.03035e+03
+1226 1.81198e+03 2.03035e+03
+1227 1.80015e+03 2.03035e+03
+1228 1.77651e+03 2.03035e+03
+1229 1.76468e+03 2.03035e+03
+1230 1.75286e+03 2.03035e+03
+1231 9.13377e+02 2.03035e+03
+1232 8.89730e+02 2.03035e+03
+1233 8.77906e+02 2.03035e+03
+1234 8.42435e+02 2.03035e+03
+1235 8.30612e+02 2.03035e+03
+1236 8.18788e+02 2.03035e+03
+1237 7.95141e+02 2.03035e+03
+1238 7.83317e+02 2.03035e+03
+1239 7.71494e+02 2.03035e+03
+1240 1.88883e+03 1.70261e+02
+1241 1.87701e+03 1.70261e+02
+1242 1.85336e+03 1.70261e+02
+1243 1.84154e+03 1.70261e+02
+1244 1.82971e+03 1.70261e+02
+1245 1.78242e+03 1.70261e+02
+1246 1.74695e+03 1.70261e+02
+1247 1.72330e+03 1.70261e+02
+1248 1.71147e+03 1.70261e+02
+1249 1.67600e+03 1.70261e+02
+1250 1.65236e+03 1.70261e+02
+1251 9.07466e+02 1.70261e+02
+1252 8.95642e+02 1.70261e+02
+1253 8.71994e+02 1.70261e+02
+1254 8.60171e+02 1.70261e+02
+1255 8.48347e+02 1.70261e+02
+1256 8.01053e+02 1.70261e+02
+1257 7.65581e+02 1.70261e+02
+1258 7.41934e+02 1.70261e+02
+1259 7.30111e+02 1.70261e+02
+1260 6.94640e+02 1.70261e+02
+1261 6.70992e+02 1.70261e+02
+1262 1.87109e+03 1.64357e+02
+1263 1.80015e+03 1.64357e+02
+1264 1.77651e+03 1.64357e+02
+1265 1.75286e+03 1.64357e+02
+1266 8.89730e+02 1.64357e+02
+1267 8.18788e+02 1.64357e+02
+1268 7.95141e+02 1.64357e+02
+1269 7.71494e+02 1.64357e+02
+1270 1.87701e+03 1.58451e+02
+1271 1.85336e+03 1.58451e+02
+1272 1.84154e+03 1.58451e+02
+1273 1.74695e+03 1.58451e+02
+1274 1.72330e+03 1.58451e+02
+1275 1.69965e+03 1.58451e+02
+1276 8.95642e+02 1.58451e+02
+1277 8.71994e+02 1.58451e+02
+1278 8.60171e+02 1.58451e+02
+1279 7.65581e+02 1.58451e+02
+1280 7.41934e+02 1.58451e+02
+1281 7.18287e+02 1.58451e+02
+1282 1.89474e+03 1.52546e+02
+1283 1.87109e+03 1.52546e+02
+1284 1.85927e+03 1.52546e+02
+1285 1.82380e+03 1.52546e+02
+1286 1.81198e+03 1.52546e+02
+1287 1.80015e+03 1.52546e+02
+1288 1.77651e+03 1.52546e+02
+1289 1.76468e+03 1.52546e+02
+1290 1.75286e+03 1.52546e+02
+1291 9.13377e+02 1.52546e+02
+1292 8.89730e+02 1.52546e+02
+1293 8.77906e+02 1.52546e+02
+1294 8.42435e+02 1.52546e+02
+1295 8.30612e+02 1.52546e+02
+1296 8.18788e+02 1.52546e+02
+1297 7.95141e+02 1.52546e+02
+1298 7.83317e+02 1.52546e+02
+1299 7.71494e+02 1.52546e+02
+1300 1.89474e+03 2.04806e+03
+1301 1.88292e+03 2.04806e+03
+1302 1.85927e+03 2.04806e+03
+1303 1.81198e+03 2.04806e+03
+1304 1.76468e+03 2.04806e+03
+1305 1.67009e+03 2.04806e+03
+1306 9.13377e+02 2.04806e+03
+1307 9.01554e+02 2.04806e+03
+1308 8.77906e+02 2.04806e+03
+1309 8.30612e+02 2.04806e+03
+1310 7.83317e+02 2.04806e+03
+1311 6.88728e+02 2.04806e+03
+1312 1.88883e+03 2.04216e+03
+1313 1.82971e+03 2.04216e+03
+1314 1.73512e+03 2.04216e+03
+1315 1.69965e+03 2.04216e+03
+1316 1.67600e+03 2.04216e+03
+1317 9.07466e+02 2.04216e+03
+1318 8.48347e+02 2.04216e+03
+1319 7.53758e+02 2.04216e+03
+1320 7.18287e+02 2.04216e+03
+1321 6.94640e+02 2.04216e+03
+1322 1.88292e+03 2.03625e+03
+1323 1.82380e+03 2.03625e+03
+1324 1.67009e+03 2.03625e+03
+1325 9.01554e+02 2.03625e+03
+1326 8.42435e+02 2.03625e+03
+1327 6.88728e+02 2.03625e+03
+1328 1.78242e+03 2.03035e+03
+1329 1.73512e+03 2.03035e+03
+1330 1.71147e+03 2.03035e+03
+1331 1.65236e+03 2.03035e+03
+1332 8.01053e+02 2.03035e+03
+1333 7.53758e+02 2.03035e+03
+1334 7.30111e+02 2.03035e+03
+1335 6.70992e+02 2.03035e+03
+1336 1.89474e+03 1.70261e+02
+1337 1.88292e+03 1.70261e+02
+1338 1.85927e+03 1.70261e+02
+1339 1.81198e+03 1.70261e+02
+1340 1.76468e+03 1.70261e+02
+1341 1.67009e+03 1.70261e+02
+1342 9.13377e+02 1.70261e+02
+1343 9.01554e+02 1.70261e+02
+1344 8.77906e+02 1.70261e+02
+1345 8.30612e+02 1.70261e+02
+1346 7.83317e+02 1.70261e+02
+1347 6.88728e+02 1.70261e+02
+1348 1.88883e+03 1.64357e+02
+1349 1.82971e+03 1.64357e+02
+1350 1.73512e+03 1.64357e+02
+1351 1.69965e+03 1.64357e+02
+1352 1.67600e+03 1.64357e+02
+1353 9.07466e+02 1.64357e+02
+1354 8.48347e+02 1.64357e+02
+1355 7.53758e+02 1.64357e+02
+1356 7.18287e+02 1.64357e+02
+1357 6.94640e+02 1.64357e+02
+1358 1.88292e+03 1.58451e+02
+1359 1.82380e+03 1.58451e+02
+1360 1.67009e+03 1.58451e+02
+1361 9.01554e+02 1.58451e+02
+1362 8.42435e+02 1.58451e+02
+1363 6.88728e+02 1.58451e+02
+1364 1.78242e+03 1.52546e+02
+1365 1.73512e+03 1.52546e+02
+1366 1.71147e+03 1.52546e+02
+1367 1.65236e+03 1.52546e+02
+1368 8.01053e+02 1.52546e+02
+1369 7.53758e+02 1.52546e+02
+1370 7.30111e+02 1.52546e+02
+1371 6.70992e+02 1.52546e+02
+1372 1.89179e+03 2.05102e+03
+1373 1.67896e+03 2.05102e+03
+1374 9.10422e+02 2.05102e+03
+1375 6.97596e+02 2.05102e+03
+1376 1.73217e+03 2.04511e+03
+1377 7.50802e+02 2.04511e+03
+1378 1.89179e+03 2.03921e+03
+1379 1.67896e+03 2.03921e+03
+1380 9.10422e+02 2.03921e+03
+1381 6.97596e+02 2.03921e+03
+1382 1.83858e+03 2.03330e+03
+1383 8.57215e+02 2.03330e+03
+1384 1.78537e+03 2.02740e+03
+1385 8.04009e+02 2.02740e+03
+1386 1.89179e+03 1.73214e+02
+1387 1.67896e+03 1.73214e+02
+1388 9.10422e+02 1.73214e+02
+1389 6.97596e+02 1.73214e+02
+1390 1.73217e+03 1.67309e+02
+1391 7.50802e+02 1.67309e+02
+1392 1.89179e+03 1.61404e+02
+1393 1.67896e+03 1.61404e+02
+1394 9.10422e+02 1.61404e+02
+1395 6.97596e+02 1.61404e+02
+1396 1.83858e+03 1.55499e+02
+1397 8.57215e+02 1.55499e+02
+1398 1.78537e+03 1.49594e+02
+1399 8.04009e+02 1.49594e+02
+1400 0.00000e+00 0.00000e+00
+EOF
Index: /trunk/sources/HeuristicLab.SGA/HeuristicLab.SGA.csproj
===================================================================
--- /trunk/sources/HeuristicLab.SGA/HeuristicLab.SGA.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/HeuristicLab.SGA.csproj	(revision 2)
@@ -0,0 +1,111 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E39AF78A-9692-472B-B061-E2F1B1AB2C92}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.SGA</RootNamespace>
+    <AssemblyName>HeuristicLab.SGA</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.SGA.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="HeuristicLabSGAPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SGA.cs" />
+    <Compile Include="SGAEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SGAEditor.Designer.cs">
+      <DependentUpon>SGAEditor.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Logging\HeuristicLab.Logging.csproj">
+      <Project>{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}</Project>
+      <Name>HeuristicLab.Logging</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Random\HeuristicLab.Random.csproj">
+      <Project>{47019A74-F7F7-482E-83AA-D3F4F777E879}</Project>
+      <Name>HeuristicLab.Random</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Selection\HeuristicLab.Selection.csproj">
+      <Project>{F7CF0571-25CB-43D5-8443-0843A1E2861A}</Project>
+      <Name>HeuristicLab.Selection</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.SequentialEngine\HeuristicLab.SequentialEngine.csproj">
+      <Project>{B4BE8E53-BA06-4237-9A01-24255F880201}</Project>
+      <Name>HeuristicLab.SequentialEngine</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="SGAEditor.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>SGAEditor.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.SGA/HeuristicLabSGAPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/HeuristicLabSGAPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/HeuristicLabSGAPlugin.cs	(revision 2)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.SGA {
+  [ClassInfo(Name = "HeuristicLab.SGA")]
+  [PluginFile(Filename = "HeuristicLab.SGA.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  [Dependency(Dependency = "HeuristicLab.Random")]
+  [Dependency(Dependency = "HeuristicLab.Selection")]
+  [Dependency(Dependency = "HeuristicLab.Logging")]
+  [Dependency(Dependency = "HeuristicLab.SequentialEngine")]
+  public class HeuristicLabSGAPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.SGA/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.SGA")]
+[assembly: AssemblyDescription("HeuristicLab Standard Genetic Algorithm (SGA)")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ec039d68-07a5-43cf-ba26-34f41c2d470a")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.SGA/SGA.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/SGA.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/SGA.cs	(revision 2)
@@ -0,0 +1,521 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.SequentialEngine;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Logging;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.SGA {
+  public class SGA : ItemBase, IEditable {
+    #region Create Operators
+    public static void Create(IEngine engine) {
+      engine.OperatorGraph.Clear();
+
+      CombinedOperator co = CreateSGA();
+      co.Name = "SGA";
+      engine.OperatorGraph.AddOperator(co);
+      engine.OperatorGraph.InitialOperator = co;
+
+      engine.Reset();
+    }
+    private static CombinedOperator CreateSGA() {
+      CombinedOperator op = new CombinedOperator();
+      SequentialProcessor sp = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp);
+      op.OperatorGraph.InitialOperator = sp;
+
+      CombinedOperator co1 = CreateVariableInjection();
+      co1.Name = "Variable Injection";
+      op.OperatorGraph.AddOperator(co1);
+      sp.AddSubOperator(co1);
+
+      // place holder for Problem Initializer
+      EmptyOperator eo1 = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo1);
+      co1.AddSubOperator(eo1);
+
+      CombinedOperator co2 = CreatePopulationInitialization();
+      co2.Name = "Population Initialization";
+      op.OperatorGraph.AddOperator(co2);
+      sp.AddSubOperator(co2);
+
+      // place holder for Solution Generator
+      EmptyOperator eo2 = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo2);
+      co2.AddSubOperator(eo2);
+
+      // place holder for Evaluator
+      EmptyOperator eo3 = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo3);
+      co2.AddSubOperator(eo3);
+
+      CombinedOperator co3 = CreateSGAMain();
+      co3.Name = "SGA Main";
+      op.OperatorGraph.AddOperator(co3);
+      sp.AddSubOperator(co3);
+
+      // place holder for Selector
+      EmptyOperator eo4 = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo4);
+      co3.AddSubOperator(eo4);
+
+      // place holder for Crossover
+      EmptyOperator eo5 = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo5);
+      co3.AddSubOperator(eo5);
+
+      // place holder for Mutator
+      EmptyOperator eo6 = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo6);
+      co3.AddSubOperator(eo6);
+
+      // place holder for Evaluator
+      co3.AddSubOperator(eo3);
+
+      return op;
+    }
+    private static CombinedOperator CreateVariableInjection() {
+      CombinedOperator op = new CombinedOperator();
+      SequentialProcessor sp = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp);
+      op.OperatorGraph.InitialOperator = sp;
+
+      RandomInjector ri = new RandomInjector();
+      op.OperatorGraph.AddOperator(ri);
+      sp.AddSubOperator(ri);
+
+      OperatorExtractor oe = new OperatorExtractor();
+      oe.Name = "Problem Initializer";
+      oe.GetVariable("Name").GetValue<StringData>().Data = "ProblemInitializer";
+      op.OperatorGraph.AddOperator(oe);
+      sp.AddSubOperator(oe);
+
+      VariableInjector vi = new VariableInjector();
+      vi.AddVariable(new Variable("PopulationSize", new IntData(100)));
+      vi.AddVariable(new Variable("EvaluatedSolutions", new IntData()));
+      vi.AddVariable(new Variable("Parents", new IntData(200)));
+      vi.AddVariable(new Variable("MutationRate", new DoubleData(0.05)));
+      vi.AddVariable(new Variable("Elites", new IntData(1)));
+      vi.AddVariable(new Variable("Generations", new IntData()));
+      vi.AddVariable(new Variable("MaximumGenerations", new IntData(1000)));
+      op.OperatorGraph.AddOperator(vi);
+      sp.AddSubOperator(vi);
+
+      op.GetVariable("InjectSubOperators").GetValue<BoolData>().Data = true;
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("ProblemInitializer"));
+
+      return op;
+    }
+    private static CombinedOperator CreatePopulationInitialization() {
+      CombinedOperator op = new CombinedOperator();
+      SequentialProcessor sp1 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp1);
+      op.OperatorGraph.InitialOperator = sp1;
+
+      SubScopesCreater ssc = new SubScopesCreater();
+      ssc.GetVariableInfo("SubScopes").ActualName = "PopulationSize";
+      op.OperatorGraph.AddOperator(ssc);
+      sp1.AddSubOperator(ssc);
+
+      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
+      op.OperatorGraph.AddOperator(ussp);
+      sp1.AddSubOperator(ussp);
+
+      SequentialProcessor sp2 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp2);
+      ussp.AddSubOperator(sp2);
+
+      OperatorExtractor oe1 = new OperatorExtractor();
+      oe1.Name = "Solution Generator";
+      oe1.GetVariable("Name").GetValue<StringData>().Data = "SolutionGenerator";
+      op.OperatorGraph.AddOperator(oe1);
+      sp2.AddSubOperator(oe1);
+
+      OperatorExtractor oe2 = new OperatorExtractor();
+      oe2.Name = "Evaluator";
+      oe2.GetVariable("Name").GetValue<StringData>().Data = "Evaluator";
+      op.OperatorGraph.AddOperator(oe2);
+      sp2.AddSubOperator(oe2);
+
+      Counter c = new Counter();
+      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
+      op.OperatorGraph.AddOperator(c);
+      sp2.AddSubOperator(c);
+
+      Sorter s = new Sorter();
+      s.GetVariableInfo("Descending").ActualName = "Maximization";
+      s.GetVariableInfo("Value").ActualName = "Quality";
+      op.OperatorGraph.AddOperator(s);
+      sp1.AddSubOperator(s);
+
+      op.GetVariable("InjectSubOperators").GetValue<BoolData>().Data = true;
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("SolutionGenerator"));
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("Evaluator"));
+
+      return op;
+    }
+    private static CombinedOperator CreateSGAMain() {
+      CombinedOperator op = new CombinedOperator();
+      SequentialProcessor sp = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp);
+      op.OperatorGraph.InitialOperator = sp;
+
+      OperatorExtractor oe = new OperatorExtractor();
+      oe.Name = "Selector";
+      oe.GetVariable("Name").GetValue<StringData>().Data = "Selector";
+      op.OperatorGraph.AddOperator(oe);
+      sp.AddSubOperator(oe);
+
+      SequentialSubScopesProcessor ssp = new SequentialSubScopesProcessor();
+      op.OperatorGraph.AddOperator(ssp);
+      sp.AddSubOperator(ssp);
+
+      EmptyOperator eo = new EmptyOperator();
+      op.OperatorGraph.AddOperator(eo);
+      ssp.AddSubOperator(eo);
+
+      CombinedOperator co1 = CreateCreateChildren();
+      co1.Name = "Create Children";
+      op.OperatorGraph.AddOperator(co1);
+      ssp.AddSubOperator(co1);
+
+      CombinedOperator co2 = CreateReplacement();
+      co2.Name = "Replacement";
+      op.OperatorGraph.AddOperator(co2);
+      sp.AddSubOperator(co2);
+
+      QualityLogger ql = new QualityLogger();
+      op.OperatorGraph.AddOperator(ql);
+      sp.AddSubOperator(ql);
+
+      BestAverageWorstQualityCalculator bawqc = new BestAverageWorstQualityCalculator();
+      op.OperatorGraph.AddOperator(bawqc);
+      sp.AddSubOperator(bawqc);
+
+      DataCollector dc = new DataCollector();
+      ItemList names = dc.GetVariable("VariableNames").GetValue<ItemList>();
+      names.Add(new StringData("BestQuality"));
+      names.Add(new StringData("AverageQuality"));
+      names.Add(new StringData("WorstQuality"));
+      op.OperatorGraph.AddOperator(dc);
+      sp.AddSubOperator(dc);
+
+      LinechartInjector lci = new LinechartInjector();
+      lci.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
+      lci.GetVariable("NumberOfLines").GetValue<IntData>().Data = 3;
+      op.OperatorGraph.AddOperator(lci);
+      sp.AddSubOperator(lci);
+
+      Counter c = new Counter();
+      c.GetVariableInfo("Value").ActualName = "Generations";
+      op.OperatorGraph.AddOperator(c);
+      sp.AddSubOperator(c);
+
+      LessThanComparator ltc = new LessThanComparator();
+      ltc.GetVariableInfo("LeftSide").ActualName = "Generations";
+      ltc.GetVariableInfo("RightSide").ActualName = "MaximumGenerations";
+      ltc.GetVariableInfo("Result").ActualName = "GenerationsCondition";
+      op.OperatorGraph.AddOperator(ltc);
+      sp.AddSubOperator(ltc);
+
+      ConditionalBranch cb = new ConditionalBranch();
+      cb.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
+      op.OperatorGraph.AddOperator(cb);
+      sp.AddSubOperator(cb);
+
+      cb.AddSubOperator(sp);
+
+      op.GetVariable("InjectSubOperators").GetValue<BoolData>().Data = true;
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("Selector"));
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("Crossover"));
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("Mutator"));
+      op.GetVariable("SubOperatorNames").GetValue<ItemList>().Add(new StringData("Evaluator"));
+
+      return op;
+    }
+    private static CombinedOperator CreateCreateChildren() {
+      CombinedOperator op = new CombinedOperator();
+      SequentialProcessor sp1 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp1);
+      op.OperatorGraph.InitialOperator = sp1;
+
+      OperatorExtractor oe1 = new OperatorExtractor();
+      oe1.Name = "Crossover";
+      oe1.GetVariable("Name").GetValue<StringData>().Data = "Crossover";
+      op.OperatorGraph.AddOperator(oe1);
+      sp1.AddSubOperator(oe1);
+
+      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
+      op.OperatorGraph.AddOperator(ussp);
+      sp1.AddSubOperator(ussp);
+
+      SequentialProcessor sp2 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp2);
+      ussp.AddSubOperator(sp2);
+
+      StochasticBranch hb = new StochasticBranch();
+      hb.GetVariableInfo("Probability").ActualName = "MutationRate";
+      op.OperatorGraph.AddOperator(hb);
+      sp2.AddSubOperator(hb);
+
+      OperatorExtractor oe2 = new OperatorExtractor();
+      oe2.Name = "Mutator";
+      oe2.GetVariable("Name").GetValue<StringData>().Data = "Mutator";
+      op.OperatorGraph.AddOperator(oe2);
+      hb.AddSubOperator(oe2);
+
+      OperatorExtractor oe3 = new OperatorExtractor();
+      oe3.Name = "Evaluator";
+      oe3.GetVariable("Name").GetValue<StringData>().Data = "Evaluator";
+      op.OperatorGraph.AddOperator(oe3);
+      sp2.AddSubOperator(oe3);
+
+      Counter c = new Counter();
+      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
+      op.OperatorGraph.AddOperator(c);
+      sp2.AddSubOperator(c);
+
+      Sorter s = new Sorter();
+      s.GetVariableInfo("Descending").ActualName = "Maximization";
+      s.GetVariableInfo("Value").ActualName = "Quality";
+      op.OperatorGraph.AddOperator(s);
+      sp1.AddSubOperator(s);
+
+      return op;
+    }
+    private static CombinedOperator CreateReplacement() {
+      CombinedOperator op = new CombinedOperator();
+      SequentialProcessor sp1 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp1);
+      op.OperatorGraph.InitialOperator = sp1;
+
+      SequentialSubScopesProcessor ssp = new SequentialSubScopesProcessor();
+      op.OperatorGraph.AddOperator(ssp);
+      sp1.AddSubOperator(ssp);
+
+      SequentialProcessor sp2 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp2);
+      ssp.AddSubOperator(sp2);
+
+      LeftSelector ls = new LeftSelector();
+      ls.GetVariableInfo("Selected").ActualName = "Elites";
+      op.OperatorGraph.AddOperator(ls);
+      sp2.AddSubOperator(ls);
+
+      RightReducer rr = new RightReducer();
+      op.OperatorGraph.AddOperator(rr);
+      sp2.AddSubOperator(rr);
+
+      SequentialProcessor sp3 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp3);
+      ssp.AddSubOperator(sp3);
+
+      RightSelector rs = new RightSelector();
+      rs.GetVariableInfo("Selected").ActualName = "Elites";
+      op.OperatorGraph.AddOperator(rs);
+      sp3.AddSubOperator(rs);
+
+      LeftReducer lr = new LeftReducer();
+      op.OperatorGraph.AddOperator(lr);
+      sp3.AddSubOperator(lr);
+
+      MergingReducer mr = new MergingReducer();
+      op.OperatorGraph.AddOperator(mr);
+      sp1.AddSubOperator(mr);
+
+      Sorter s = new Sorter();
+      s.GetVariableInfo("Descending").ActualName = "Maximization";
+      s.GetVariableInfo("Value").ActualName = "Quality";
+      op.OperatorGraph.AddOperator(s);
+      sp1.AddSubOperator(s);
+
+      return op;
+    }
+    #endregion
+
+    #region Properties
+    private IEngine myEngine;
+    public IEngine Engine {
+      get { return myEngine; }
+    }
+    private BoolData mySetSeedRandomly;
+    public bool SetSeedRandomly {
+      get { return mySetSeedRandomly.Data; }
+      set { mySetSeedRandomly.Data = value; }
+    }
+    private IntData mySeed;
+    public int Seed {
+      get { return mySeed.Data; }
+      set { mySeed.Data = value; }
+    }
+    private IntData myPopulationSize;
+    private IntData myParents;
+    public int PopulationSize {
+      get { return myPopulationSize.Data; }
+      set {
+        myPopulationSize.Data = value;
+        myParents.Data = value * 2;
+      }
+    }
+    private IntData myMaximumGenerations;
+    public int MaximumGenerations {
+      get { return myMaximumGenerations.Data; }
+      set { myMaximumGenerations.Data = value; }
+    }
+    private DoubleData myMutationRate;
+    public double MutationRate {
+      get { return myMutationRate.Data; }
+      set { myMutationRate.Data = value; }
+    }
+    private IntData myElites;
+    public int Elites {
+      get { return myElites.Data; }
+      set { myElites.Data = value; }
+    }
+    private CombinedOperator mySGA;
+    private IOperator myVariableInjection;
+    public IOperator ProblemInitializer {
+      get { return myVariableInjection.SubOperators[0]; }
+      set {
+        mySGA.OperatorGraph.RemoveOperator(ProblemInitializer.Guid);
+        mySGA.OperatorGraph.AddOperator(value);
+        myVariableInjection.AddSubOperator(value, 0);
+      }
+    }
+    private IOperator myPopulationInitialization;
+    public IOperator SolutionGenerator {
+      get { return myPopulationInitialization.SubOperators[0]; }
+      set {
+        mySGA.OperatorGraph.RemoveOperator(SolutionGenerator.Guid);
+        mySGA.OperatorGraph.AddOperator(value);
+        myPopulationInitialization.AddSubOperator(value, 0);
+      }
+    }
+    public IOperator Evaluator {
+      get { return myPopulationInitialization.SubOperators[1]; }
+      set {
+        mySGA.OperatorGraph.RemoveOperator(Evaluator.Guid);
+        mySGA.OperatorGraph.AddOperator(value);
+        myPopulationInitialization.AddSubOperator(value, 1);
+        mySGAMain.AddSubOperator(value, 3);
+      }
+    }
+    private IOperator mySGAMain;
+    public IOperator Selector {
+      get { return mySGAMain.SubOperators[0]; }
+      set {
+        mySGA.OperatorGraph.RemoveOperator(Selector.Guid);
+        mySGA.OperatorGraph.AddOperator(value);
+        mySGAMain.AddSubOperator(value, 0);
+      }
+    }
+    public IOperator Crossover {
+      get { return mySGAMain.SubOperators[1]; }
+      set {
+        mySGA.OperatorGraph.RemoveOperator(Crossover.Guid);
+        mySGA.OperatorGraph.AddOperator(value);
+        mySGAMain.AddSubOperator(value, 1);
+      }
+    }
+    public IOperator Mutator {
+      get { return mySGAMain.SubOperators[2]; }
+      set {
+        mySGA.OperatorGraph.RemoveOperator(Mutator.Guid);
+        mySGA.OperatorGraph.AddOperator(value);
+        mySGAMain.AddSubOperator(value, 2);
+      }
+    }
+    #endregion
+
+    public SGA() {
+      myEngine = new SequentialEngine.SequentialEngine();
+      Create(myEngine);
+      SetReferences();
+    }
+
+    public override IView CreateView() {
+      return new SGAEditor(this);
+    }
+    public virtual IEditor CreateEditor() {
+      return new SGAEditor(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      SGA clone = new SGA();
+      clonedObjects.Add(Guid, clone);
+      clone.myEngine = (IEngine)Auxiliary.Clone(Engine, clonedObjects);
+      return clone;
+    }
+
+    #region SetReferences Method
+    private void SetReferences() {
+      // SGA
+      CombinedOperator co1 = (CombinedOperator)Engine.OperatorGraph.InitialOperator;
+      mySGA = co1;
+      // SequentialProcessor in SGA
+      SequentialProcessor sp1 = (SequentialProcessor)co1.OperatorGraph.InitialOperator;
+      // Variable Injection
+      CombinedOperator co2 = (CombinedOperator)sp1.SubOperators[0];
+      myVariableInjection = co2;
+      // SequentialProcessor in Variable Injection
+      SequentialProcessor sp2 = (SequentialProcessor)co2.OperatorGraph.InitialOperator;
+      // RandomInjector
+      RandomInjector ri = (RandomInjector)sp2.SubOperators[0];
+      mySetSeedRandomly = ri.GetVariable("SetSeedRandomly").GetValue<BoolData>();
+      mySeed = ri.GetVariable("Seed").GetValue<IntData>();
+      // VariableInjector
+      VariableInjector vi = (VariableInjector)sp2.SubOperators[2];
+      myPopulationSize = vi.GetVariable("PopulationSize").GetValue<IntData>();
+      myParents = vi.GetVariable("Parents").GetValue<IntData>();
+      myMaximumGenerations = vi.GetVariable("MaximumGenerations").GetValue<IntData>();
+      myMutationRate = vi.GetVariable("MutationRate").GetValue<DoubleData>();
+      myElites = vi.GetVariable("Elites").GetValue<IntData>();
+      // Population Initialization
+      CombinedOperator co3 = (CombinedOperator)sp1.SubOperators[1];
+      myPopulationInitialization = co3;
+      // SGA Main
+      CombinedOperator co4 = (CombinedOperator)sp1.SubOperators[2];
+      mySGAMain = co4;
+    }
+    #endregion
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Engine", Engine, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myEngine = (IEngine)PersistenceManager.Restore(node.SelectSingleNode("Engine"), restoredObjects);
+      SetReferences();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.SGA/SGAEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/SGAEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/SGAEditor.Designer.cs	(revision 2)
@@ -0,0 +1,644 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.SGA {
+  partial class SGAEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (chooseOperatorDialog != null) chooseOperatorDialog.Dispose();
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.executeButton = new System.Windows.Forms.Button();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.setEvaluationButton = new System.Windows.Forms.Button();
+      this.setMutationButton = new System.Windows.Forms.Button();
+      this.setCrossoverButton = new System.Windows.Forms.Button();
+      this.setSelectionButton = new System.Windows.Forms.Button();
+      this.setSolutionGenerationButton = new System.Windows.Forms.Button();
+      this.setProblemInitializationButton = new System.Windows.Forms.Button();
+      this.evaluationTextBox = new System.Windows.Forms.TextBox();
+      this.mutationTextBox = new System.Windows.Forms.TextBox();
+      this.crossoverTextBox = new System.Windows.Forms.TextBox();
+      this.selectionTextBox = new System.Windows.Forms.TextBox();
+      this.solutionGenerationTextBox = new System.Windows.Forms.TextBox();
+      this.problemInitializationTextBox = new System.Windows.Forms.TextBox();
+      this.setRandomSeedRandomlyCheckBox = new System.Windows.Forms.CheckBox();
+      this.elitesTextBox = new System.Windows.Forms.TextBox();
+      this.evaluationLabel = new System.Windows.Forms.Label();
+      this.mutationLabel = new System.Windows.Forms.Label();
+      this.selectionLabel = new System.Windows.Forms.Label();
+      this.crossoverLabel = new System.Windows.Forms.Label();
+      this.solutionGenerationLabel = new System.Windows.Forms.Label();
+      this.problemInitializationLabel = new System.Windows.Forms.Label();
+      this.elitesLabel = new System.Windows.Forms.Label();
+      this.mutationRateTextBox = new System.Windows.Forms.TextBox();
+      this.mutationRateLabel = new System.Windows.Forms.Label();
+      this.maximumGenerationsTextBox = new System.Windows.Forms.TextBox();
+      this.maximumGenerationsLabel = new System.Windows.Forms.Label();
+      this.randomSeedTextBox = new System.Windows.Forms.TextBox();
+      this.populationSizeTextBox = new System.Windows.Forms.TextBox();
+      this.setRandomSeedRandomlyLabel = new System.Windows.Forms.Label();
+      this.randomSeedLabel = new System.Windows.Forms.Label();
+      this.populationSizeLabel = new System.Windows.Forms.Label();
+      this.scopesTabPage = new System.Windows.Forms.TabPage();
+      this.scopeView = new HeuristicLab.Core.ScopeView();
+      this.abortButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.cloneEngineButton = new System.Windows.Forms.Button();
+      this.viewProblemInitializationButton = new System.Windows.Forms.Button();
+      this.viewSolutionGenerationButton = new System.Windows.Forms.Button();
+      this.viewSelectionButton = new System.Windows.Forms.Button();
+      this.viewCrossoverButton = new System.Windows.Forms.Button();
+      this.viewMutationButton = new System.Windows.Forms.Button();
+      this.viewEvaluationButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.scopesTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // executeButton
+      // 
+      this.executeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.executeButton.Location = new System.Drawing.Point(0, 396);
+      this.executeButton.Name = "executeButton";
+      this.executeButton.Size = new System.Drawing.Size(75, 23);
+      this.executeButton.TabIndex = 1;
+      this.executeButton.Text = "&Execute";
+      this.executeButton.UseVisualStyleBackColor = true;
+      this.executeButton.Click += new System.EventHandler(this.executeButton_Click);
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Controls.Add(this.scopesTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(526, 390);
+      this.tabControl.TabIndex = 0;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.setEvaluationButton);
+      this.parametersTabPage.Controls.Add(this.setMutationButton);
+      this.parametersTabPage.Controls.Add(this.setCrossoverButton);
+      this.parametersTabPage.Controls.Add(this.setSelectionButton);
+      this.parametersTabPage.Controls.Add(this.setSolutionGenerationButton);
+      this.parametersTabPage.Controls.Add(this.viewEvaluationButton);
+      this.parametersTabPage.Controls.Add(this.viewMutationButton);
+      this.parametersTabPage.Controls.Add(this.viewCrossoverButton);
+      this.parametersTabPage.Controls.Add(this.viewSelectionButton);
+      this.parametersTabPage.Controls.Add(this.viewSolutionGenerationButton);
+      this.parametersTabPage.Controls.Add(this.viewProblemInitializationButton);
+      this.parametersTabPage.Controls.Add(this.setProblemInitializationButton);
+      this.parametersTabPage.Controls.Add(this.evaluationTextBox);
+      this.parametersTabPage.Controls.Add(this.mutationTextBox);
+      this.parametersTabPage.Controls.Add(this.crossoverTextBox);
+      this.parametersTabPage.Controls.Add(this.selectionTextBox);
+      this.parametersTabPage.Controls.Add(this.solutionGenerationTextBox);
+      this.parametersTabPage.Controls.Add(this.problemInitializationTextBox);
+      this.parametersTabPage.Controls.Add(this.setRandomSeedRandomlyCheckBox);
+      this.parametersTabPage.Controls.Add(this.elitesTextBox);
+      this.parametersTabPage.Controls.Add(this.evaluationLabel);
+      this.parametersTabPage.Controls.Add(this.mutationLabel);
+      this.parametersTabPage.Controls.Add(this.selectionLabel);
+      this.parametersTabPage.Controls.Add(this.crossoverLabel);
+      this.parametersTabPage.Controls.Add(this.solutionGenerationLabel);
+      this.parametersTabPage.Controls.Add(this.problemInitializationLabel);
+      this.parametersTabPage.Controls.Add(this.elitesLabel);
+      this.parametersTabPage.Controls.Add(this.mutationRateTextBox);
+      this.parametersTabPage.Controls.Add(this.mutationRateLabel);
+      this.parametersTabPage.Controls.Add(this.maximumGenerationsTextBox);
+      this.parametersTabPage.Controls.Add(this.maximumGenerationsLabel);
+      this.parametersTabPage.Controls.Add(this.randomSeedTextBox);
+      this.parametersTabPage.Controls.Add(this.populationSizeTextBox);
+      this.parametersTabPage.Controls.Add(this.setRandomSeedRandomlyLabel);
+      this.parametersTabPage.Controls.Add(this.randomSeedLabel);
+      this.parametersTabPage.Controls.Add(this.populationSizeLabel);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(518, 364);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // setEvaluationButton
+      // 
+      this.setEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setEvaluationButton.Location = new System.Drawing.Point(469, 338);
+      this.setEvaluationButton.Name = "setEvaluationButton";
+      this.setEvaluationButton.Size = new System.Drawing.Size(43, 20);
+      this.setEvaluationButton.TabIndex = 35;
+      this.setEvaluationButton.Text = "Set...";
+      this.setEvaluationButton.UseVisualStyleBackColor = true;
+      this.setEvaluationButton.Click += new System.EventHandler(this.setEvaluationButton_Click);
+      // 
+      // setMutationButton
+      // 
+      this.setMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setMutationButton.Location = new System.Drawing.Point(469, 312);
+      this.setMutationButton.Name = "setMutationButton";
+      this.setMutationButton.Size = new System.Drawing.Size(43, 20);
+      this.setMutationButton.TabIndex = 31;
+      this.setMutationButton.Text = "Set...";
+      this.setMutationButton.UseVisualStyleBackColor = true;
+      this.setMutationButton.Click += new System.EventHandler(this.setMutationButton_Click);
+      // 
+      // setCrossoverButton
+      // 
+      this.setCrossoverButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setCrossoverButton.Location = new System.Drawing.Point(469, 286);
+      this.setCrossoverButton.Name = "setCrossoverButton";
+      this.setCrossoverButton.Size = new System.Drawing.Size(43, 20);
+      this.setCrossoverButton.TabIndex = 27;
+      this.setCrossoverButton.Text = "Set...";
+      this.setCrossoverButton.UseVisualStyleBackColor = true;
+      this.setCrossoverButton.Click += new System.EventHandler(this.setCrossoverButton_Click);
+      // 
+      // setSelectionButton
+      // 
+      this.setSelectionButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setSelectionButton.Location = new System.Drawing.Point(469, 260);
+      this.setSelectionButton.Name = "setSelectionButton";
+      this.setSelectionButton.Size = new System.Drawing.Size(43, 20);
+      this.setSelectionButton.TabIndex = 23;
+      this.setSelectionButton.Text = "Set...";
+      this.setSelectionButton.UseVisualStyleBackColor = true;
+      this.setSelectionButton.Click += new System.EventHandler(this.setSelectionButton_Click);
+      // 
+      // setSolutionGenerationButton
+      // 
+      this.setSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setSolutionGenerationButton.Location = new System.Drawing.Point(469, 234);
+      this.setSolutionGenerationButton.Name = "setSolutionGenerationButton";
+      this.setSolutionGenerationButton.Size = new System.Drawing.Size(43, 20);
+      this.setSolutionGenerationButton.TabIndex = 19;
+      this.setSolutionGenerationButton.Text = "Set...";
+      this.setSolutionGenerationButton.UseVisualStyleBackColor = true;
+      this.setSolutionGenerationButton.Click += new System.EventHandler(this.setSolutionGenerationButton_Click);
+      // 
+      // setProblemInitializationButton
+      // 
+      this.setProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setProblemInitializationButton.Location = new System.Drawing.Point(469, 208);
+      this.setProblemInitializationButton.Name = "setProblemInitializationButton";
+      this.setProblemInitializationButton.Size = new System.Drawing.Size(43, 20);
+      this.setProblemInitializationButton.TabIndex = 15;
+      this.setProblemInitializationButton.Text = "Set...";
+      this.setProblemInitializationButton.UseVisualStyleBackColor = true;
+      this.setProblemInitializationButton.Click += new System.EventHandler(this.setProblemInitializationButton_Click);
+      // 
+      // evaluationTextBox
+      // 
+      this.evaluationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.evaluationTextBox.Location = new System.Drawing.Point(218, 338);
+      this.evaluationTextBox.Name = "evaluationTextBox";
+      this.evaluationTextBox.ReadOnly = true;
+      this.evaluationTextBox.Size = new System.Drawing.Size(186, 20);
+      this.evaluationTextBox.TabIndex = 33;
+      // 
+      // mutationTextBox
+      // 
+      this.mutationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.mutationTextBox.Location = new System.Drawing.Point(218, 312);
+      this.mutationTextBox.Name = "mutationTextBox";
+      this.mutationTextBox.ReadOnly = true;
+      this.mutationTextBox.Size = new System.Drawing.Size(186, 20);
+      this.mutationTextBox.TabIndex = 29;
+      // 
+      // crossoverTextBox
+      // 
+      this.crossoverTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.crossoverTextBox.Location = new System.Drawing.Point(218, 286);
+      this.crossoverTextBox.Name = "crossoverTextBox";
+      this.crossoverTextBox.ReadOnly = true;
+      this.crossoverTextBox.Size = new System.Drawing.Size(186, 20);
+      this.crossoverTextBox.TabIndex = 25;
+      // 
+      // selectionTextBox
+      // 
+      this.selectionTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.selectionTextBox.Location = new System.Drawing.Point(218, 260);
+      this.selectionTextBox.Name = "selectionTextBox";
+      this.selectionTextBox.ReadOnly = true;
+      this.selectionTextBox.Size = new System.Drawing.Size(186, 20);
+      this.selectionTextBox.TabIndex = 21;
+      // 
+      // solutionGenerationTextBox
+      // 
+      this.solutionGenerationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.solutionGenerationTextBox.Location = new System.Drawing.Point(218, 234);
+      this.solutionGenerationTextBox.Name = "solutionGenerationTextBox";
+      this.solutionGenerationTextBox.ReadOnly = true;
+      this.solutionGenerationTextBox.Size = new System.Drawing.Size(186, 20);
+      this.solutionGenerationTextBox.TabIndex = 17;
+      // 
+      // problemInitializationTextBox
+      // 
+      this.problemInitializationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.problemInitializationTextBox.Location = new System.Drawing.Point(218, 208);
+      this.problemInitializationTextBox.Name = "problemInitializationTextBox";
+      this.problemInitializationTextBox.ReadOnly = true;
+      this.problemInitializationTextBox.Size = new System.Drawing.Size(186, 20);
+      this.problemInitializationTextBox.TabIndex = 13;
+      // 
+      // setRandomSeedRandomlyCheckBox
+      // 
+      this.setRandomSeedRandomlyCheckBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setRandomSeedRandomlyCheckBox.AutoSize = true;
+      this.setRandomSeedRandomlyCheckBox.Location = new System.Drawing.Point(218, 6);
+      this.setRandomSeedRandomlyCheckBox.Name = "setRandomSeedRandomlyCheckBox";
+      this.setRandomSeedRandomlyCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.setRandomSeedRandomlyCheckBox.TabIndex = 1;
+      this.setRandomSeedRandomlyCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // elitesTextBox
+      // 
+      this.elitesTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.elitesTextBox.Location = new System.Drawing.Point(218, 156);
+      this.elitesTextBox.Name = "elitesTextBox";
+      this.elitesTextBox.Size = new System.Drawing.Size(186, 20);
+      this.elitesTextBox.TabIndex = 11;
+      // 
+      // evaluationLabel
+      // 
+      this.evaluationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.evaluationLabel.AutoSize = true;
+      this.evaluationLabel.Location = new System.Drawing.Point(65, 341);
+      this.evaluationLabel.Name = "evaluationLabel";
+      this.evaluationLabel.Size = new System.Drawing.Size(60, 13);
+      this.evaluationLabel.TabIndex = 32;
+      this.evaluationLabel.Text = "&Evaluation:";
+      // 
+      // mutationLabel
+      // 
+      this.mutationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.mutationLabel.AutoSize = true;
+      this.mutationLabel.Location = new System.Drawing.Point(65, 315);
+      this.mutationLabel.Name = "mutationLabel";
+      this.mutationLabel.Size = new System.Drawing.Size(51, 13);
+      this.mutationLabel.TabIndex = 28;
+      this.mutationLabel.Text = "&Mutation:";
+      // 
+      // selectionLabel
+      // 
+      this.selectionLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.selectionLabel.AutoSize = true;
+      this.selectionLabel.Location = new System.Drawing.Point(65, 263);
+      this.selectionLabel.Name = "selectionLabel";
+      this.selectionLabel.Size = new System.Drawing.Size(54, 13);
+      this.selectionLabel.TabIndex = 20;
+      this.selectionLabel.Text = "&Selection:";
+      // 
+      // crossoverLabel
+      // 
+      this.crossoverLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.crossoverLabel.AutoSize = true;
+      this.crossoverLabel.Location = new System.Drawing.Point(65, 289);
+      this.crossoverLabel.Name = "crossoverLabel";
+      this.crossoverLabel.Size = new System.Drawing.Size(57, 13);
+      this.crossoverLabel.TabIndex = 24;
+      this.crossoverLabel.Text = "&Crossover:";
+      // 
+      // solutionGenerationLabel
+      // 
+      this.solutionGenerationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.solutionGenerationLabel.AutoSize = true;
+      this.solutionGenerationLabel.Location = new System.Drawing.Point(65, 237);
+      this.solutionGenerationLabel.Name = "solutionGenerationLabel";
+      this.solutionGenerationLabel.Size = new System.Drawing.Size(103, 13);
+      this.solutionGenerationLabel.TabIndex = 16;
+      this.solutionGenerationLabel.Text = "&Solution Generation:";
+      // 
+      // problemInitializationLabel
+      // 
+      this.problemInitializationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.problemInitializationLabel.AutoSize = true;
+      this.problemInitializationLabel.Location = new System.Drawing.Point(65, 211);
+      this.problemInitializationLabel.Name = "problemInitializationLabel";
+      this.problemInitializationLabel.Size = new System.Drawing.Size(105, 13);
+      this.problemInitializationLabel.TabIndex = 12;
+      this.problemInitializationLabel.Text = "&Problem Initialization:";
+      // 
+      // elitesLabel
+      // 
+      this.elitesLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.elitesLabel.AutoSize = true;
+      this.elitesLabel.Location = new System.Drawing.Point(65, 159);
+      this.elitesLabel.Name = "elitesLabel";
+      this.elitesLabel.Size = new System.Drawing.Size(35, 13);
+      this.elitesLabel.TabIndex = 10;
+      this.elitesLabel.Text = "&Elites:";
+      // 
+      // mutationRateTextBox
+      // 
+      this.mutationRateTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.mutationRateTextBox.Location = new System.Drawing.Point(218, 130);
+      this.mutationRateTextBox.Name = "mutationRateTextBox";
+      this.mutationRateTextBox.Size = new System.Drawing.Size(186, 20);
+      this.mutationRateTextBox.TabIndex = 9;
+      // 
+      // mutationRateLabel
+      // 
+      this.mutationRateLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.mutationRateLabel.AutoSize = true;
+      this.mutationRateLabel.Location = new System.Drawing.Point(65, 133);
+      this.mutationRateLabel.Name = "mutationRateLabel";
+      this.mutationRateLabel.Size = new System.Drawing.Size(77, 13);
+      this.mutationRateLabel.TabIndex = 8;
+      this.mutationRateLabel.Text = "&Mutation Rate:";
+      // 
+      // maximumGenerationsTextBox
+      // 
+      this.maximumGenerationsTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.maximumGenerationsTextBox.Location = new System.Drawing.Point(218, 104);
+      this.maximumGenerationsTextBox.Name = "maximumGenerationsTextBox";
+      this.maximumGenerationsTextBox.Size = new System.Drawing.Size(186, 20);
+      this.maximumGenerationsTextBox.TabIndex = 7;
+      // 
+      // maximumGenerationsLabel
+      // 
+      this.maximumGenerationsLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.maximumGenerationsLabel.AutoSize = true;
+      this.maximumGenerationsLabel.Location = new System.Drawing.Point(65, 107);
+      this.maximumGenerationsLabel.Name = "maximumGenerationsLabel";
+      this.maximumGenerationsLabel.Size = new System.Drawing.Size(114, 13);
+      this.maximumGenerationsLabel.TabIndex = 6;
+      this.maximumGenerationsLabel.Text = "Maximum &Generations:";
+      // 
+      // randomSeedTextBox
+      // 
+      this.randomSeedTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.randomSeedTextBox.Location = new System.Drawing.Point(218, 26);
+      this.randomSeedTextBox.Name = "randomSeedTextBox";
+      this.randomSeedTextBox.Size = new System.Drawing.Size(186, 20);
+      this.randomSeedTextBox.TabIndex = 3;
+      // 
+      // populationSizeTextBox
+      // 
+      this.populationSizeTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.populationSizeTextBox.Location = new System.Drawing.Point(218, 78);
+      this.populationSizeTextBox.Name = "populationSizeTextBox";
+      this.populationSizeTextBox.Size = new System.Drawing.Size(186, 20);
+      this.populationSizeTextBox.TabIndex = 5;
+      // 
+      // setRandomSeedRandomlyLabel
+      // 
+      this.setRandomSeedRandomlyLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setRandomSeedRandomlyLabel.AutoSize = true;
+      this.setRandomSeedRandomlyLabel.Location = new System.Drawing.Point(65, 6);
+      this.setRandomSeedRandomlyLabel.Name = "setRandomSeedRandomlyLabel";
+      this.setRandomSeedRandomlyLabel.Size = new System.Drawing.Size(147, 13);
+      this.setRandomSeedRandomlyLabel.TabIndex = 0;
+      this.setRandomSeedRandomlyLabel.Text = "Set &Random Seed Randomly:";
+      // 
+      // randomSeedLabel
+      // 
+      this.randomSeedLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.randomSeedLabel.AutoSize = true;
+      this.randomSeedLabel.Location = new System.Drawing.Point(65, 29);
+      this.randomSeedLabel.Name = "randomSeedLabel";
+      this.randomSeedLabel.Size = new System.Drawing.Size(78, 13);
+      this.randomSeedLabel.TabIndex = 2;
+      this.randomSeedLabel.Text = "&Random Seed:";
+      // 
+      // populationSizeLabel
+      // 
+      this.populationSizeLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.populationSizeLabel.AutoSize = true;
+      this.populationSizeLabel.Location = new System.Drawing.Point(65, 81);
+      this.populationSizeLabel.Name = "populationSizeLabel";
+      this.populationSizeLabel.Size = new System.Drawing.Size(83, 13);
+      this.populationSizeLabel.TabIndex = 4;
+      this.populationSizeLabel.Text = "&Population Size:";
+      // 
+      // scopesTabPage
+      // 
+      this.scopesTabPage.Controls.Add(this.scopeView);
+      this.scopesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.scopesTabPage.Name = "scopesTabPage";
+      this.scopesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.scopesTabPage.Size = new System.Drawing.Size(518, 364);
+      this.scopesTabPage.TabIndex = 2;
+      this.scopesTabPage.Text = "Scopes";
+      this.scopesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // scopeView
+      // 
+      this.scopeView.Caption = "Scope";
+      this.scopeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scopeView.Location = new System.Drawing.Point(3, 3);
+      this.scopeView.Name = "scopeView";
+      this.scopeView.Scope = null;
+      this.scopeView.Size = new System.Drawing.Size(512, 358);
+      this.scopeView.TabIndex = 0;
+      // 
+      // abortButton
+      // 
+      this.abortButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.abortButton.Enabled = false;
+      this.abortButton.Location = new System.Drawing.Point(81, 396);
+      this.abortButton.Name = "abortButton";
+      this.abortButton.Size = new System.Drawing.Size(75, 23);
+      this.abortButton.TabIndex = 2;
+      this.abortButton.Text = "&Abort";
+      this.abortButton.UseVisualStyleBackColor = true;
+      this.abortButton.Click += new System.EventHandler(this.abortButton_Click);
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Location = new System.Drawing.Point(162, 396);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(75, 23);
+      this.resetButton.TabIndex = 3;
+      this.resetButton.Text = "&Reset";
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // cloneEngineButton
+      // 
+      this.cloneEngineButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cloneEngineButton.Location = new System.Drawing.Point(420, 396);
+      this.cloneEngineButton.Name = "cloneEngineButton";
+      this.cloneEngineButton.Size = new System.Drawing.Size(106, 23);
+      this.cloneEngineButton.TabIndex = 4;
+      this.cloneEngineButton.Text = "&Clone Engine...";
+      this.cloneEngineButton.UseVisualStyleBackColor = true;
+      this.cloneEngineButton.Click += new System.EventHandler(this.cloneEngineButton_Click);
+      // 
+      // viewProblemInitializationButton
+      // 
+      this.viewProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewProblemInitializationButton.Location = new System.Drawing.Point(410, 208);
+      this.viewProblemInitializationButton.Name = "viewProblemInitializationButton";
+      this.viewProblemInitializationButton.Size = new System.Drawing.Size(53, 20);
+      this.viewProblemInitializationButton.TabIndex = 14;
+      this.viewProblemInitializationButton.Text = "View...";
+      this.viewProblemInitializationButton.UseVisualStyleBackColor = true;
+      this.viewProblemInitializationButton.Click += new System.EventHandler(this.viewProblemInitializationButton_Click);
+      // 
+      // viewSolutionGenerationButton
+      // 
+      this.viewSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewSolutionGenerationButton.Location = new System.Drawing.Point(410, 234);
+      this.viewSolutionGenerationButton.Name = "viewSolutionGenerationButton";
+      this.viewSolutionGenerationButton.Size = new System.Drawing.Size(53, 20);
+      this.viewSolutionGenerationButton.TabIndex = 18;
+      this.viewSolutionGenerationButton.Text = "View...";
+      this.viewSolutionGenerationButton.UseVisualStyleBackColor = true;
+      this.viewSolutionGenerationButton.Click += new System.EventHandler(this.viewSolutionGenerationButton_Click);
+      // 
+      // viewSelectionButton
+      // 
+      this.viewSelectionButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewSelectionButton.Location = new System.Drawing.Point(410, 260);
+      this.viewSelectionButton.Name = "viewSelectionButton";
+      this.viewSelectionButton.Size = new System.Drawing.Size(53, 20);
+      this.viewSelectionButton.TabIndex = 22;
+      this.viewSelectionButton.Text = "View...";
+      this.viewSelectionButton.UseVisualStyleBackColor = true;
+      this.viewSelectionButton.Click += new System.EventHandler(this.viewSelectionButton_Click);
+      // 
+      // viewCrossoverButton
+      // 
+      this.viewCrossoverButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewCrossoverButton.Location = new System.Drawing.Point(410, 286);
+      this.viewCrossoverButton.Name = "viewCrossoverButton";
+      this.viewCrossoverButton.Size = new System.Drawing.Size(53, 20);
+      this.viewCrossoverButton.TabIndex = 26;
+      this.viewCrossoverButton.Text = "View...";
+      this.viewCrossoverButton.UseVisualStyleBackColor = true;
+      this.viewCrossoverButton.Click += new System.EventHandler(this.viewCrossoverButton_Click);
+      // 
+      // viewMutationButton
+      // 
+      this.viewMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewMutationButton.Location = new System.Drawing.Point(410, 312);
+      this.viewMutationButton.Name = "viewMutationButton";
+      this.viewMutationButton.Size = new System.Drawing.Size(53, 20);
+      this.viewMutationButton.TabIndex = 30;
+      this.viewMutationButton.Text = "View...";
+      this.viewMutationButton.UseVisualStyleBackColor = true;
+      this.viewMutationButton.Click += new System.EventHandler(this.viewMutationButton_Click);
+      // 
+      // viewEvaluationButton
+      // 
+      this.viewEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewEvaluationButton.Location = new System.Drawing.Point(410, 338);
+      this.viewEvaluationButton.Name = "viewEvaluationButton";
+      this.viewEvaluationButton.Size = new System.Drawing.Size(53, 20);
+      this.viewEvaluationButton.TabIndex = 34;
+      this.viewEvaluationButton.Text = "View...";
+      this.viewEvaluationButton.UseVisualStyleBackColor = true;
+      this.viewEvaluationButton.Click += new System.EventHandler(this.viewEvaluationButton_Click);
+      // 
+      // SGAEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.cloneEngineButton);
+      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.abortButton);
+      this.Controls.Add(this.executeButton);
+      this.Name = "SGAEditor";
+      this.Size = new System.Drawing.Size(526, 419);
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.parametersTabPage.PerformLayout();
+      this.scopesTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button executeButton;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private System.Windows.Forms.Button abortButton;
+    private System.Windows.Forms.Button resetButton;
+    private System.Windows.Forms.TextBox mutationRateTextBox;
+    private System.Windows.Forms.Label mutationRateLabel;
+    private System.Windows.Forms.TextBox populationSizeTextBox;
+    private System.Windows.Forms.Label populationSizeLabel;
+    private System.Windows.Forms.TabPage scopesTabPage;
+    private System.Windows.Forms.TextBox maximumGenerationsTextBox;
+    private System.Windows.Forms.Label maximumGenerationsLabel;
+    private System.Windows.Forms.TextBox elitesTextBox;
+    private System.Windows.Forms.Label elitesLabel;
+    private System.Windows.Forms.TextBox randomSeedTextBox;
+    private System.Windows.Forms.Label setRandomSeedRandomlyLabel;
+    private System.Windows.Forms.Label randomSeedLabel;
+    private System.Windows.Forms.CheckBox setRandomSeedRandomlyCheckBox;
+    private System.Windows.Forms.Label problemInitializationLabel;
+    private System.Windows.Forms.Label evaluationLabel;
+    private System.Windows.Forms.Label mutationLabel;
+    private System.Windows.Forms.Label crossoverLabel;
+    private System.Windows.Forms.Label solutionGenerationLabel;
+    private System.Windows.Forms.Button cloneEngineButton;
+    private System.Windows.Forms.TextBox mutationTextBox;
+    private System.Windows.Forms.TextBox crossoverTextBox;
+    private System.Windows.Forms.TextBox selectionTextBox;
+    private System.Windows.Forms.TextBox solutionGenerationTextBox;
+    private System.Windows.Forms.TextBox problemInitializationTextBox;
+    private System.Windows.Forms.Label selectionLabel;
+    private System.Windows.Forms.TextBox evaluationTextBox;
+    private System.Windows.Forms.Button setProblemInitializationButton;
+    private System.Windows.Forms.Button setEvaluationButton;
+    private System.Windows.Forms.Button setMutationButton;
+    private System.Windows.Forms.Button setCrossoverButton;
+    private System.Windows.Forms.Button setSelectionButton;
+    private System.Windows.Forms.Button setSolutionGenerationButton;
+    private HeuristicLab.Core.ScopeView scopeView;
+    private System.Windows.Forms.Button viewEvaluationButton;
+    private System.Windows.Forms.Button viewMutationButton;
+    private System.Windows.Forms.Button viewCrossoverButton;
+    private System.Windows.Forms.Button viewSelectionButton;
+    private System.Windows.Forms.Button viewSolutionGenerationButton;
+    private System.Windows.Forms.Button viewProblemInitializationButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.SGA/SGAEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/SGAEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/SGAEditor.cs	(revision 2)
@@ -0,0 +1,193 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.SGA {
+  public partial class SGAEditor : EditorBase {
+    private ChooseOperatorDialog chooseOperatorDialog;
+
+    public SGA SGA {
+      get { return (SGA)Item; }
+      set { base.Item = value; }
+    }
+
+    public SGAEditor() {
+      InitializeComponent();
+    }
+    public SGAEditor(SGA sga)
+      : this() {
+      SGA = sga;
+    }
+
+    protected override void RemoveItemEvents() {
+      SGA.Engine.ExceptionOccurred -= new EventHandler<ExceptionEventArgs>(Engine_ExceptionOccurred);
+      SGA.Engine.Finished -= new EventHandler(Engine_Finished);
+      scopeView.Scope = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      SGA.Engine.ExceptionOccurred += new EventHandler<ExceptionEventArgs>(Engine_ExceptionOccurred);
+      SGA.Engine.Finished += new EventHandler(Engine_Finished);
+      SetDataBinding();
+      scopeView.Scope = SGA.Engine.GlobalScope;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (SGA == null) {
+        tabControl.Enabled = false;
+      } else {
+        tabControl.Enabled = true;
+        problemInitializationTextBox.Text = SGA.ProblemInitializer.Name;
+        solutionGenerationTextBox.Text = SGA.SolutionGenerator.Name;
+        selectionTextBox.Text = SGA.Selector.Name;
+        crossoverTextBox.Text = SGA.Crossover.Name;
+        mutationTextBox.Text = SGA.Mutator.Name;
+        evaluationTextBox.Text = SGA.Evaluator.Name;
+      }
+    }
+
+    private void SetDataBinding() {
+      setRandomSeedRandomlyCheckBox.DataBindings.Add("Checked", SGA, "SetSeedRandomly");
+      randomSeedTextBox.DataBindings.Add("Text", SGA, "Seed");
+      populationSizeTextBox.DataBindings.Add("Text", SGA, "PopulationSize");
+      maximumGenerationsTextBox.DataBindings.Add("Text", SGA, "MaximumGenerations");
+      mutationRateTextBox.DataBindings.Add("Text", SGA, "MutationRate");
+      elitesTextBox.DataBindings.Add("Text", SGA, "Elites");
+    }
+
+    #region Button Events
+    private void viewProblemInitializationButton_Click(object sender, EventArgs e) {
+      IView view = SGA.ProblemInitializer.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
+    private void viewSolutionGenerationButton_Click(object sender, EventArgs e) {
+      IView view = SGA.SolutionGenerator.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
+    private void viewSelectionButton_Click(object sender, EventArgs e) {
+      IView view = SGA.Selector.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
+    private void viewCrossoverButton_Click(object sender, EventArgs e) {
+      IView view = SGA.Crossover.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
+    private void viewMutationButton_Click(object sender, EventArgs e) {
+      IView view = SGA.Mutator.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
+    private void viewEvaluationButton_Click(object sender, EventArgs e) {
+      IView view = SGA.Evaluator.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
+    private void setProblemInitializationButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        SGA.ProblemInitializer = chooseOperatorDialog.Operator;
+        problemInitializationTextBox.Text = SGA.ProblemInitializer.Name;
+      }
+    }
+    private void setSolutionGenerationButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        SGA.SolutionGenerator= chooseOperatorDialog.Operator;
+        solutionGenerationTextBox.Text = SGA.SolutionGenerator.Name;
+      }
+    }
+    private void setSelectionButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        SGA.Selector = chooseOperatorDialog.Operator;
+        selectionTextBox.Text = SGA.Selector.Name;
+      }
+    }
+    private void setCrossoverButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        SGA.Crossover = chooseOperatorDialog.Operator;
+        crossoverTextBox.Text = SGA.Crossover.Name;
+      }
+    }
+    private void setMutationButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        SGA.Mutator = chooseOperatorDialog.Operator;
+        mutationTextBox.Text = SGA.Mutator.Name;
+      }
+    }
+    private void setEvaluationButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        SGA.Evaluator = chooseOperatorDialog.Operator;
+        evaluationTextBox.Text = SGA.Evaluator.Name;
+      }
+    }
+    private void executeButton_Click(object sender, EventArgs e) {
+      executeButton.Enabled = false;
+      abortButton.Enabled = true;
+      SGA.Engine.Execute();
+    }
+    private void abortButton_Click(object sender, EventArgs e) {
+      SGA.Engine.Abort();
+    }
+    private void resetButton_Click(object sender, EventArgs e) {
+      SGA.Engine.Reset();
+    }
+    private void cloneEngineButton_Click(object sender, EventArgs e) {
+      IEngine clone = (IEngine)SGA.Engine.Clone();
+      IEditor editor = ((IEditable)clone).CreateEditor();
+      PluginManager.ControlManager.ShowControl(editor);
+    }
+    #endregion
+
+    #region Engine Events
+    private delegate void OnExceptionEventDelegate(object sender, ExceptionEventArgs e);
+    private void Engine_ExceptionOccurred(object sender, ExceptionEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnExceptionEventDelegate(Engine_ExceptionOccurred), sender, e);
+      else
+        Auxiliary.ShowErrorMessageBox(e.Exception);
+    }
+    private void Engine_Finished(object sender, EventArgs e) {
+      scopeView.Refresh();
+      executeButton.Enabled = true;
+      abortButton.Enabled = false;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.SGA/SGAEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.SGA/SGAEditor.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.SGA/SGAEditor.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/ConditionalSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/ConditionalSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/ConditionalSelector.cs	(revision 2)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class ConditionalSelector : SelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public ConditionalSelector()
+      : base() {
+      AddVariableInfo(new VariableInfo("Condition", "Input condition", typeof(BoolData), VariableKind.In));
+    }
+
+    private int GetFirstSelectedScopeIndex(IScope source) {
+      for (int i = 0; i < source.SubScopes.Count; i++) {
+        bool condition = GetVariableValue<BoolData>("Condition", source.SubScopes[i], true).Data;
+        if (condition) {
+          return i;
+        }
+      }
+      return -1;
+    }
+
+    protected override void Select(IScope source, IScope target, bool copySelected) {
+      if (copySelected) {
+        for (int i = 0; i < source.SubScopes.Count; i++) {
+          IScope selectedScope = source.SubScopes[i];
+          bool condition = GetVariableValue<BoolData>("Condition", source.SubScopes[i], true).Data;
+          if (condition) {
+            target.AddSubScope((IScope)selectedScope.Clone());
+          }
+        }
+      } else {
+        int removeAt = GetFirstSelectedScopeIndex(source);
+        while (removeAt != -1) {
+          IScope selectedScope = source.SubScopes[removeAt];
+          target.AddSubScope(selectedScope);
+          source.RemoveSubScope(selectedScope);
+          removeAt = GetFirstSelectedScopeIndex(source);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/CopyVariableFromSubScope.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/CopyVariableFromSubScope.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/CopyVariableFromSubScope.cs	(revision 2)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class CopyVariableFromSubScope : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public CopyVariableFromSubScope()
+      : base() {
+      AddVariableInfo(new VariableInfo("Variable", "Variable to move.", typeof(IItem), VariableKind.In | VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("SubScope", "Index of the subscope.", typeof(IntData), VariableKind.In));
+      GetVariableInfo("SubScope").Local = true;
+      AddVariable(new Variable("SubScope", new IntData(0)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int scopeIndex = GetVariableValue<IntData>("SubScope", scope, false).Data;
+      if(scope.SubScopes.Count >= scopeIndex + 1) {
+        IScope s = scope.SubScopes[scopeIndex];
+        IItem var = GetVariableValue<IItem>("Variable", s, false);
+        if(var != null) {
+          if(scope.GetVariable(GetVariableInfo("Variable").ActualName) != null) {
+            scope.RemoveVariable(GetVariableInfo("Variable").ActualName);
+          }
+          scope.AddVariable(new Variable(GetVariableInfo("Variable").ActualName, var));
+          return null;
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/HeuristicLab.Scheduling.JSSP.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/HeuristicLab.Scheduling.JSSP.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/HeuristicLab.Scheduling.JSSP.csproj	(revision 2)
@@ -0,0 +1,162 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4C0EF782-CC94-4A94-BC3E-661D2600559B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Scheduling.JSSP</RootNamespace>
+    <AssemblyName>HeuristicLab.Scheduling.JSSP</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/HeuristicLab.Scheduling.JSSP/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ItemListIndexer.cs" />
+    <Compile Include="JSSPInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JSSPInjectorView.Designer.cs">
+      <DependentUpon>JSSPInjectorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="JSSPInjector.cs" />
+    <Compile Include="ConditionalSelector.cs" />
+    <Compile Include="CopyVariableFromSubScope.cs" />
+    <Compile Include="IsSchedulable.cs" />
+    <Compile Include="Scores\RemainingNrOfOperations.cs" />
+    <Compile Include="Operation.cs" />
+    <Compile Include="OperationScheduler.cs" />
+    <Compile Include="Scores\OperationScoreBase.cs" />
+    <Compile Include="OperationUpdater.cs" />
+    <Compile Include="OperationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperationView.Designer.cs">
+      <DependentUpon>OperationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Scores\ProcessingTime.cs" />
+    <Compile Include="Scores\RemainingProcessingTime.cs" />
+    <Compile Include="Schedule.cs" />
+    <Compile Include="ScheduleInjector.cs" />
+    <Compile Include="ScheduleTree.cs" />
+    <Compile Include="HeuristicLabJSSPPlugin.cs" />
+    <Compile Include="JSSPParser.cs" />
+    <Compile Include="TimeSlot.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Functions\HeuristicLab.Functions.csproj">
+      <Project>{B95CA6E2-34BC-4430-994D-BD6E99375319}</Project>
+      <Name>HeuristicLab.Functions</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Permutation\HeuristicLab.Permutation.csproj">
+      <Project>{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}</Project>
+      <Name>HeuristicLab.Permutation</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Selection\HeuristicLab.Selection.csproj">
+      <Project>{F7CF0571-25CB-43D5-8443-0843A1E2861A}</Project>
+      <Name>HeuristicLab.Selection</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="JSSPInjectorView.resx">
+      <DependentUpon>JSSPInjectorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperationView.resx">
+      <DependentUpon>OperationView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/HeuristicLabJSSPPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/HeuristicLabJSSPPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/HeuristicLabJSSPPlugin.cs	(revision 2)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  [ClassInfo(Name = "HeuristicLab.Scheduling.JSSP")]
+  [PluginFile(Filename = "HeuristicLab.Scheduling.JSSP.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  [Dependency(Dependency = "HeuristicLab.Permutation")]
+  public class HeuristicLabRoutingTSPPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/IsSchedulable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/IsSchedulable.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/IsSchedulable.cs	(revision 2)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class IsSchedulable : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public IsSchedulable()
+      : base() {
+      AddVariableInfo(new VariableInfo("Operation", "One operation of JSSP job", typeof(Operation), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Schedulable", "Is the operation schedulable?", typeof(BoolData), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      Operation op = GetVariableValue<Operation>("Operation", scope, true);
+      if(scope.GetVariable(GetVariableInfo("Schedulable").ActualName) != null) {
+        BoolData isSchedulable = GetVariableValue<BoolData>("Schedulable", scope, false);
+        isSchedulable.Data = (op.Predecessors.Count == 0);
+      } else {
+        scope.AddVariable(new Variable(GetVariableInfo("Schedulable").ActualName, new BoolData((op.Predecessors.Count == 0))));
+      }
+      return null;
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/ItemListIndexer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/ItemListIndexer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/ItemListIndexer.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  class ItemListIndexer : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public ItemListIndexer()
+      : base() {
+      AddVariableInfo(new VariableInfo("List", "List of IItem objects", typeof(ItemList), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Index", "Index of list element to extract", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Object", "List element at index", typeof(IItem), VariableKind.New));
+    }
+
+    // ToDo: Make more generic (for all array data types)
+    public override IOperation Apply(IScope scope) {
+      ItemList list = GetVariableValue<ItemList>("List", scope, true);
+      int index = GetVariableValue<IntData>("Index", scope, true).Data;
+      if(scope.GetVariable(GetVariableInfo("Object").ActualName) != null) {
+        scope.RemoveVariable(GetVariableInfo("Object").ActualName);
+      }
+      if((list != null) && (index < list.Count)) {
+        scope.AddVariable(new Variable(GetVariableInfo("Object").ActualName, (IItem)list[index].Clone()));
+      }
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjector.cs	(revision 2)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml; 
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class JSSPInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    private ItemList operations; 
+    public ItemList Operations {
+      get { return operations; }
+      set { operations = value; }
+    }
+
+    private IntData machines;
+    public int NrOfMachines {
+      get { return machines.Data; }
+      set { machines.Data = value; }
+    }
+    private IntData jobs;
+    public int NrOfJobs {
+      get { return jobs.Data; }
+      set { jobs.Data = value; }
+    }
+
+    public JSSPInjector()
+      : base() {
+      operations = new ItemList();
+      machines = new IntData();
+      jobs = new IntData(); 
+      AddVariableInfo(new VariableInfo("Machines", "Number of machines", typeof(IntData), VariableKind.New));
+      AddVariableInfo(new VariableInfo("Jobs", "Number of jobs", typeof(IntData), VariableKind.New));
+      AddVariableInfo(new VariableInfo("Operations", "List of JSSP operations", typeof(ItemList), VariableKind.New));
+    }
+
+    public override IView CreateView() {
+      return new JSSPInjectorView(this);
+    }
+
+    public override IOperation Apply(IScope scope) {
+      scope.AddVariable(new Variable(GetVariableInfo("Machines").ActualName, machines.Clone() as IntData));
+      scope.AddVariable(new Variable(GetVariableInfo("Jobs").ActualName, jobs.Clone() as IntData));
+      scope.AddVariable(new Variable(GetVariableInfo("Operations").ActualName, (ItemList)operations.Clone()));
+      return base.Apply(scope);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      JSSPInjector clone = (JSSPInjector)base.Clone(clonedObjects);
+      clone.operations = (ItemList)Auxiliary.Clone(operations, clonedObjects);
+      clone.jobs = (IntData)Auxiliary.Clone(jobs, clonedObjects);
+      clone.machines = (IntData)Auxiliary.Clone(machines, clonedObjects); 
+      return clone;
+    }
+
+    #region IStorable Members
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Machings", machines, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Jobs", jobs, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Operations", operations, document, persistedObjects));
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      operations = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Operations"), restoredObjects);
+      jobs = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Jobs"), restoredObjects);
+      machines = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Machines"), restoredObjects); 
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.Designer.cs	(revision 2)
@@ -0,0 +1,200 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Scheduling.JSSP {
+  partial class JSSPInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.tb_jobs = new System.Windows.Forms.TextBox();
+      this.tb_machines = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.button1 = new System.Windows.Forms.Button();
+      this.tabControl1 = new System.Windows.Forms.TabControl();
+      this.tabvariables = new System.Windows.Forms.TabPage();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
+      this.tabPage1.SuspendLayout();
+      this.tabControl1.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.tb_jobs);
+      this.tabPage1.Controls.Add(this.tb_machines);
+      this.tabPage1.Controls.Add(this.label2);
+      this.tabPage1.Controls.Add(this.label1);
+      this.tabPage1.Controls.Add(this.button1);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(228, 133);
+      this.tabPage1.TabIndex = 0;
+      this.tabPage1.Text = "JSSP Data";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // tb_jobs
+      // 
+      this.tb_jobs.BackColor = System.Drawing.SystemColors.Control;
+      this.tb_jobs.Location = new System.Drawing.Point(96, 42);
+      this.tb_jobs.Name = "tb_jobs";
+      this.tb_jobs.ReadOnly = true;
+      this.tb_jobs.Size = new System.Drawing.Size(100, 20);
+      this.tb_jobs.TabIndex = 4;
+      // 
+      // tb_machines
+      // 
+      this.tb_machines.BackColor = System.Drawing.SystemColors.Control;
+      this.tb_machines.Location = new System.Drawing.Point(96, 16);
+      this.tb_machines.Name = "tb_machines";
+      this.tb_machines.ReadOnly = true;
+      this.tb_machines.Size = new System.Drawing.Size(101, 20);
+      this.tb_machines.TabIndex = 3;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(11, 45);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(35, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Jobs: ";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(11, 19);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(56, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Machines:";
+      // 
+      // button1
+      // 
+      this.button1.Location = new System.Drawing.Point(3, 97);
+      this.button1.Name = "button1";
+      this.button1.Size = new System.Drawing.Size(216, 25);
+      this.button1.TabIndex = 0;
+      this.button1.Text = "Import Instance from JSSPLib ";
+      this.button1.UseVisualStyleBackColor = true;
+      this.button1.Click += new System.EventHandler(this.button1_Click);
+      // 
+      // tabControl1
+      // 
+      this.tabControl1.Controls.Add(this.tabPage1);
+      this.tabControl1.Controls.Add(this.tabvariables);
+      this.tabControl1.Controls.Add(this.descriptionTabPage);
+      this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl1.Location = new System.Drawing.Point(0, 0);
+      this.tabControl1.Name = "tabControl1";
+      this.tabControl1.SelectedIndex = 0;
+      this.tabControl1.Size = new System.Drawing.Size(236, 159);
+      this.tabControl1.TabIndex = 0;
+      // 
+      // tabvariables
+      // 
+      this.tabvariables.Location = new System.Drawing.Point(4, 22);
+      this.tabvariables.Name = "tabvariables";
+      this.tabvariables.Size = new System.Drawing.Size(228, 133);
+      this.tabvariables.TabIndex = 1;
+      this.tabvariables.Text = "Variables";
+      this.tabvariables.UseVisualStyleBackColor = true;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "jssp";
+      this.openFileDialog.Title = "Import JSSP Instance";
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.operatorBaseDescriptionView);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(228, 133);
+      this.descriptionTabPage.TabIndex = 2;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseDescriptionView
+      // 
+      this.operatorBaseDescriptionView.Caption = "Operator";
+      this.operatorBaseDescriptionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseDescriptionView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
+      this.operatorBaseDescriptionView.Operator = null;
+      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(222, 127);
+      this.operatorBaseDescriptionView.TabIndex = 0;
+      // 
+      // JSSPInjectorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl1);
+      this.Name = "JSSPInjectorView";
+      this.Size = new System.Drawing.Size(236, 159);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage1.PerformLayout();
+      this.tabControl1.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.TextBox tb_jobs;
+    private System.Windows.Forms.TextBox tb_machines;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Button button1;
+    private System.Windows.Forms.TabControl tabControl1;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.TabPage tabvariables;
+    private System.Windows.Forms.TabPage descriptionTabPage;
+    private HeuristicLab.Core.OperatorBaseDescriptionView operatorBaseDescriptionView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.cs	(revision 2)
@@ -0,0 +1,97 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public partial class JSSPInjectorView : ViewBase {
+
+    public JSSPInjector JSSPInjector {
+      get { return (JSSPInjector)Item; }
+      set { base.Item = value; }
+    }
+
+    public JSSPInjectorView() {
+      InitializeComponent();
+    }
+    public JSSPInjectorView(JSSPInjector jsspInjector)
+      : this() {
+      JSSPInjector = jsspInjector;
+    }
+
+    protected override void RemoveItemEvents() {
+      JSSPInjector.Operations.Changed -= new EventHandler(JSSP_Changed);
+      operatorBaseDescriptionView.Operator = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      JSSPInjector.Operations.Changed += new EventHandler(JSSP_Changed);
+      operatorBaseDescriptionView.Operator = JSSPInjector;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      OperatorBaseView view = new OperatorBaseView(JSSPInjector);
+      tabvariables.Controls.Clear();
+      tabvariables.Controls.Add(view);
+      view.Dock = DockStyle.Fill;
+      if (JSSPInjector != null) {
+        tb_jobs.Text = JSSPInjector.NrOfJobs.ToString();
+        tb_machines.Text = JSSPInjector.NrOfMachines.ToString();
+      }
+    }
+
+    private void button1_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        JSSPParser parser = null;
+        bool success = false;
+        try {
+          parser = new JSSPParser(openFileDialog.FileName);
+          parser.Parse();
+          success = true;
+        }
+        catch (Exception ex) {
+          MessageBox.Show(this, ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
+        if (success) {
+          JSSPInjector.Operations = (ItemList)parser.Operations.Clone();
+          JSSPInjector.NrOfJobs = parser.NrOfJobs;
+          JSSPInjector.NrOfMachines = parser.NrOfMachines;
+          Refresh();
+        }
+      }
+    }
+
+    private void JSSP_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPInjectorView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>139, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPParser.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/JSSPParser.cs	(revision 2)
@@ -0,0 +1,105 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using HeuristicLab.Core;
+using HeuristicLab.Data; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class JSSPParser {
+    private StreamReader source;
+    private int nrOfJobs;
+    public int NrOfJobs {
+      get { return nrOfJobs; }
+    }
+
+    private int nrOfMachines;
+    public int NrOfMachines {
+      get { return nrOfMachines; }
+    }
+
+    private int[,] machineSequence; // each row: machine sequence per job
+    public int[,] MachineSequence {
+      get { return machineSequence; }
+    }
+
+    private int[,] processingTime;  // each row: processing time per job and machine
+    public int[,] ProcessingTime {
+      get { return processingTime; }
+    }
+
+    private ItemList operations;
+    public ItemList Operations {
+      get { return operations; }
+    }
+
+    public JSSPParser(String path) {
+      if(!path.EndsWith(".jssp"))
+        throw new ArgumentException("Input file name has to be in JSSP format (*.jssp)");
+      source = new StreamReader(path);
+    }
+
+    private ItemList getOperations() {
+      ItemList ops = new ItemList();
+      for(int i = 0; i < NrOfJobs; i++) {
+        for(int j = 0; j < NrOfMachines; j++) {
+          List<int> opMachines = new List<int>();
+          opMachines.Add(MachineSequence[i, j]);
+          List<int> opPredecessors = new List<int>();
+          if(j > 0) {
+            opPredecessors.Add(j - 1);
+          }
+          Operation op = new Operation(i, 0, ProcessingTime[i, MachineSequence[i, j]], j, opMachines.ToArray(), opPredecessors.ToArray());
+          ops.Add(op);
+        }
+      }
+      return ops;
+    }
+
+    // File structure of *.jssp files: 
+    // #jobs #machines
+    // one line for each job; start count from zero
+    // machineNumber processingTime machineNumber processingTime ....
+    public void Parse() {
+      string str = source.ReadLine();
+      string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+      if(tokens.Length != 2)
+        throw new InvalidDataException("Invalid problem specification!");
+      nrOfJobs = Int32.Parse(tokens[0]);
+      nrOfMachines = Int32.Parse(tokens[1]);
+      // Console.WriteLine("nrOfMachines: {0}, nrOfJobs: {1}", nrOfMachines, nrOfJobs);
+      machineSequence = new int[nrOfJobs, nrOfMachines];
+      processingTime = new int[nrOfJobs, nrOfMachines];
+      for(int i = 0; i < nrOfJobs; i++) {
+        str = source.ReadLine();
+        tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+        for(int j = 0; j < nrOfMachines; j++) {
+          machineSequence[i, j] = Int32.Parse(tokens[2 * j]);
+          processingTime[i, machineSequence[i, j]] = Int32.Parse(tokens[2 * j + 1]);
+        }
+      }
+      operations = getOperations(); 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Operation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Operation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Operation.cs	(revision 2)
@@ -0,0 +1,164 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class Operation : ItemBase, IComparable {
+
+    #region Data
+    private IntData start;
+    public int Start {
+      get { return start.Data; }
+      set {
+        start.Data = value;
+        OnChanged();
+      }
+    }
+
+    private IntData duration;
+    public int Duration {
+      get { return duration.Data; }
+      set {
+        duration.Data = value;
+        OnChanged();
+      }
+    }
+
+    private IntData job;
+    public int Job {
+      get { return job.Data; }
+      set {
+        job.Data = value;
+        OnChanged();
+      }
+    }
+
+    private IntData operationIndex;
+    public int OperationIndex {
+      get { return operationIndex.Data; }
+      set { operationIndex.Data = value; }
+    }
+
+    private IntArrayData machines;
+    public int[] Machines {
+      get { return machines.Data; }
+      set {
+        machines.Data = value;
+        OnChanged();
+      }
+    }
+
+    private ItemList predecessors;
+    public ItemList Predecessors {
+      get { return predecessors; }
+      set { predecessors = value; }
+    }
+    #endregion
+
+    public Operation()
+      : this(-1, 0, 0, -1, new int[0], null) {
+    }
+
+    public Operation(int job, int earliestStart, int duration, int operationIndex, int[] machines, int[] predecessors) {
+      this.start = new IntData(earliestStart);
+      this.duration = new IntData(duration);
+      this.job = new IntData(job);
+      this.machines = new IntArrayData(machines);
+      this.predecessors = new ItemList();
+      if(predecessors != null) {
+        for(int i = 0; i < predecessors.Length; i++) {
+          this.predecessors.Add(new IntData(predecessors[i]));
+        }
+      }
+      this.operationIndex = new IntData(operationIndex);
+    }
+
+    public override string ToString() {
+      if(this.Job == -1) {
+        return "";
+      }
+      return (String.Format("|{2},{3}:[m:{0} d:{1}]", machines.Data[0], duration, job, operationIndex));
+    }
+
+    #region IComparable Members
+
+    public int CompareTo(object obj) {
+      if(obj is Operation) {
+        Operation bin = (Operation)obj;
+        return (start.CompareTo(bin.start));
+      } else { throw new ArgumentException("Object is not an Operation"); }
+    }
+
+    #endregion
+
+    #region IViewable Members
+
+    public override IView CreateView() {
+      return new OperationView(this);
+    }
+
+    #endregion
+
+    #region IStorable Members
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Operation clone = new Operation();
+      clonedObjects.Add(Guid, clone);
+      clone.duration = (IntData)Auxiliary.Clone(duration, clonedObjects);
+      clone.start = (IntData)Auxiliary.Clone(start, clonedObjects);
+      clone.operationIndex = (IntData)Auxiliary.Clone(operationIndex, clonedObjects);
+      clone.job = (IntData)Auxiliary.Clone(job, clonedObjects);
+      clone.machines = (IntArrayData)Auxiliary.Clone(machines, clonedObjects);
+      clone.predecessors = (ItemList)Auxiliary.Clone(predecessors, clonedObjects);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Job", job, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("OperationIndex", operationIndex, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Start", start, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Duration", duration, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Predecessors", predecessors, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Machines", machines, document, persistedObjects));
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      job = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Job"), restoredObjects);
+      operationIndex = (IntData)PersistenceManager.Restore(node.SelectSingleNode("OperationIndex"), restoredObjects);
+      start = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Start"), restoredObjects);
+      duration = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Duration"), restoredObjects);
+      predecessors = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Predecessors"), restoredObjects);
+      machines = (IntArrayData)PersistenceManager.Restore(node.SelectSingleNode("Machines"), restoredObjects);
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationScheduler.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationScheduler.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationScheduler.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml; 
+using HeuristicLab.Core;
+using HeuristicLab.Data; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class OperationScheduler : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public OperationScheduler()
+      : base() {
+      AddVariableInfo(new VariableInfo("PartialSchedule", "(Partial) schedule", typeof(Schedule), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("Operation", "Operation to be scheduled. Start date is updated after scheduling.", typeof(Operation), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      Schedule pSchedule = GetVariableValue<Schedule>("PartialSchedule", scope, true);
+      Operation op = GetVariableValue<Operation>("Operation", scope, true);
+      int operationStartDate = pSchedule.ScheduleOperation(op);
+      op.Start = operationStartDate; 
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationUpdater.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationUpdater.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationUpdater.cs	(revision 2)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System.Collections; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class OperationUpdater : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public OperationUpdater()
+      : base() {
+      AddVariableInfo(new VariableInfo("Operation", "Scheduled operation and unscheduled operation which shall be updated.", typeof(Operation), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      Operation scheduledOp = GetVariableValue<Operation>("Operation", scope, false);
+      for(int i = 0; i < scope.SubScopes.Count; i++) {
+        Operation op = GetVariableValue<Operation>("Operation", scope.SubScopes[i], false);
+        if((op.Job == scheduledOp.Job) && (op.Predecessors != null)) {
+          int index = -1; 
+          for(int j = 0; j < op.Predecessors.Count; j++) {
+            if(((IntData)op.Predecessors[j]).Data == scheduledOp.OperationIndex) {
+              index = j; 
+            }
+          }
+          if(index != -1) {
+            op.Predecessors.RemoveAt(index); // remove scheduled op from predecessor list
+            op.Start = scheduledOp.Start + scheduledOp.Duration; // new earliest start date
+            return null;
+          }
+        }
+      }
+      return null; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.Designer.cs	(revision 2)
@@ -0,0 +1,180 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  partial class OperationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label5 = new System.Windows.Forms.Label();
+      this.jobTextBox = new System.Windows.Forms.TextBox();
+      this.opTextBox = new System.Windows.Forms.TextBox();
+      this.startTextBox = new System.Windows.Forms.TextBox();
+      this.durTextBox = new System.Windows.Forms.TextBox();
+      this.predTextBox = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(5, 3);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(30, 13);
+      this.label2.TabIndex = 5;
+      this.label2.Text = "Job: ";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(5, 31);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(56, 13);
+      this.label3.TabIndex = 6;
+      this.label3.Text = "Operation:";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(5, 57);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(32, 13);
+      this.label4.TabIndex = 7;
+      this.label4.Text = "Start:";
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(5, 84);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(50, 13);
+      this.label5.TabIndex = 8;
+      this.label5.Text = "Duration:";
+      // 
+      // jobTextBox
+      // 
+      this.jobTextBox.Location = new System.Drawing.Point(71, 4);
+      this.jobTextBox.Name = "jobTextBox";
+      this.jobTextBox.Size = new System.Drawing.Size(38, 20);
+      this.jobTextBox.TabIndex = 9;
+      this.jobTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.jobTextBox_Validating);
+      // 
+      // opTextBox
+      // 
+      this.opTextBox.Location = new System.Drawing.Point(71, 29);
+      this.opTextBox.Name = "opTextBox";
+      this.opTextBox.Size = new System.Drawing.Size(38, 20);
+      this.opTextBox.TabIndex = 10;
+      this.opTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.opTextBox_Validating);
+      // 
+      // startTextBox
+      // 
+      this.startTextBox.Location = new System.Drawing.Point(71, 55);
+      this.startTextBox.Name = "startTextBox";
+      this.startTextBox.Size = new System.Drawing.Size(38, 20);
+      this.startTextBox.TabIndex = 11;
+      this.startTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.startTextBox_Validating);
+      // 
+      // durTextBox
+      // 
+      this.durTextBox.Location = new System.Drawing.Point(71, 82);
+      this.durTextBox.Name = "durTextBox";
+      this.durTextBox.Size = new System.Drawing.Size(38, 20);
+      this.durTextBox.TabIndex = 12;
+      this.durTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.durTextBox_Validating);
+      // 
+      // predTextBox
+      // 
+      this.predTextBox.Location = new System.Drawing.Point(8, 128);
+      this.predTextBox.Name = "predTextBox";
+      this.predTextBox.Size = new System.Drawing.Size(101, 20);
+      this.predTextBox.TabIndex = 13;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(7, 112);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(74, 13);
+      this.label1.TabIndex = 14;
+      this.label1.Text = "Predecessors:";
+      // 
+      // OperationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.predTextBox);
+      this.Controls.Add(this.durTextBox);
+      this.Controls.Add(this.startTextBox);
+      this.Controls.Add(this.opTextBox);
+      this.Controls.Add(this.jobTextBox);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label2);
+      this.Name = "OperationView";
+      this.Size = new System.Drawing.Size(130, 178);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.TextBox jobTextBox;
+    private System.Windows.Forms.TextBox opTextBox;
+    private System.Windows.Forms.TextBox startTextBox;
+    private System.Windows.Forms.TextBox durTextBox;
+    private System.Windows.Forms.TextBox predTextBox;
+    private System.Windows.Forms.Label label1;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.cs	(revision 2)
@@ -0,0 +1,128 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public partial class OperationView : ViewBase {
+    public Operation Operation {
+      get { return (Operation)Item; }
+      set { base.Item = value; }
+    }
+
+    public OperationView() {
+      InitializeComponent();
+    }
+    public OperationView(Operation operation)
+      : this() {
+      Operation = operation;
+    }
+
+    protected override void RemoveItemEvents() {
+      Operation.Changed -= new EventHandler(Operation_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Operation.Changed += new EventHandler(Operation_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      predTextBox.Enabled = false;
+      if (Operation == null) {
+        jobTextBox.Enabled = false;
+        opTextBox.Enabled = false;
+        startTextBox.Enabled = false;
+        durTextBox.Enabled = false;
+      } else {
+        jobTextBox.Enabled = true;
+        opTextBox.Enabled = true;
+        startTextBox.Enabled = true;
+        durTextBox.Enabled = true;
+        this.jobTextBox.Text = Operation.Job.ToString();
+        this.opTextBox.Text = Operation.OperationIndex.ToString();
+        this.startTextBox.Text = Operation.Start.ToString();
+        this.durTextBox.Text = Operation.Duration.ToString();
+        if (Operation.Predecessors != null) {
+          this.predTextBox.Text = Operation.Predecessors.ToString();
+        }
+      }
+    }
+
+    private void Operation_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void jobTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        Operation.Job = int.Parse(jobTextBox.Text);
+      }
+      catch (Exception) {
+        jobTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void startTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        Operation.Start = int.Parse(startTextBox.Text);
+      }
+      catch (Exception) {
+        startTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void opTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        Operation.OperationIndex = int.Parse(opTextBox.Text);
+      }
+      catch (Exception) {
+        opTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void durTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        Operation.Duration = int.Parse(durTextBox.Text);
+      }
+      catch (Exception) {
+        durTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/OperationView.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Scheduling.JSSP")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Scheduling.JSSP")]
+[assembly: AssemblyCopyright("Copyright Â©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9099e296-3c3e-463b-8368-2935e1506496")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Schedule.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Schedule.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Schedule.cs	(revision 2)
@@ -0,0 +1,104 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class Schedule : ItemBase {
+
+    private ScheduleTree[] schedule;
+
+    public Schedule(int nrOfMachines, int timeSpan)
+      : base() {
+      schedule = new ScheduleTree[nrOfMachines];
+      for(int i = 0; i < nrOfMachines; i++) {
+        schedule[i] = new ScheduleTree(timeSpan);
+      }
+    }
+
+    public Schedule() : this(0, 100) { }
+
+    public int Machines {
+      get { return schedule.Length; }
+    }
+
+    public ScheduleTree GetMachineSchedule(int machineIndex) {
+      return schedule[machineIndex];
+    }
+
+    // return value: operation completion time
+    public int ScheduleOperation(Operation op) {
+      int machine = op.Machines[0];
+      return schedule[machine].Insert(op);
+    }
+
+    public override string ToString() {
+      string s = "";
+      for(int i = 0; i < this.Machines; i++) {
+        s += schedule[i].ToString();
+        s += "\n";
+      }
+      return s;
+    }
+
+    #region IStorable Members
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute machineAttribute = document.CreateAttribute("Machines");
+      machineAttribute.Value = Machines.ToString();
+      node.Attributes.Append(machineAttribute);
+      for(int i = 0; i < Machines; i++) {
+        node.AppendChild(PersistenceManager.Persist("Machine" + i.ToString(), schedule[i], document, persistedObjects));
+      }
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int machines = int.Parse(node.Attributes["Machines"].Value);
+      schedule = new ScheduleTree[machines];
+      for(int i = 0; i < machines; i++) {
+        schedule[i] = (ScheduleTree)PersistenceManager.Restore(node.SelectSingleNode("Machine" + i.ToString()), restoredObjects);
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      int timespan = 0;
+      if ((schedule != null) && (schedule.Length > 0)) {
+        timespan = schedule[0].Timespan;
+      }
+      Schedule clone = new Schedule(this.Machines, timespan);
+      clonedObjects.Add(Guid, clone);
+      clone.schedule = new ScheduleTree[this.Machines];
+      for(int i = 0; i < this.Machines; i++) {
+        clone.schedule[i] = (ScheduleTree)Auxiliary.Clone(schedule[i], clonedObjects);
+      }
+      return clone;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/ScheduleInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/ScheduleInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/ScheduleInjector.cs	(revision 2)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class ScheduleInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    private Schedule schedule;
+    public Schedule Schedule {
+      get { return schedule; }
+    }
+
+    public ScheduleInjector()
+      : base() {
+      AddVariableInfo(new VariableInfo("Machines", "Number of machines", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Timespan", "Desired timespan for the schedule", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Timespan").Local = true;
+      AddVariable(new Variable("Timespan", new IntData(10000)));
+      AddVariableInfo(new VariableInfo("Schedule", "Schedule", typeof(Schedule), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IntData machines = GetVariableValue<IntData>("Machines", scope, true);
+      IntData timespan = GetVariableValue<IntData>("Timespan", scope, true);
+      schedule = new Schedule(machines.Data, timespan.Data);
+      scope.AddVariable(new Variable(GetVariableInfo("Schedule").ActualName, schedule));
+      return null;
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ScheduleInjector clone = (ScheduleInjector)base.Clone(clonedObjects);
+      if(schedule != null) {
+        clone.schedule = (Schedule)Auxiliary.Clone(schedule, clonedObjects);
+      }
+      return clone;
+    }
+
+    #region IStorable Members
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      if(schedule != null) {
+        node.AppendChild(PersistenceManager.Persist("Schedule", schedule, document, persistedObjects));
+      }
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode scheduleNode = node.SelectSingleNode("Schedule");
+      if(scheduleNode != null) {
+        schedule = (Schedule)PersistenceManager.Restore(scheduleNode, restoredObjects);
+      }
+    }
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/ScheduleTree.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/ScheduleTree.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/ScheduleTree.cs	(revision 2)
@@ -0,0 +1,240 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Data;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Scheduling.JSSP {
+
+  public class ScheduleTreeNode {
+    private TimeSlot data;
+    private ScheduleTreeNode left;
+    private ScheduleTreeNode right;
+    private ScheduleTreeNode parent;
+
+    public ScheduleTreeNode(TimeSlot t) {
+      data = t;
+    }
+
+    public ScheduleTreeNode Left {
+      get { return left; }
+      set { left = value; }
+    }
+
+    public ScheduleTreeNode Right {
+      get { return right; }
+      set { right = value; }
+    }
+
+    public ScheduleTreeNode Parent {
+      get { return parent; }
+      set { parent = value; }
+    }
+
+    public void SetLeft(ScheduleTreeNode child) {
+      this.Left = child;
+      child.Parent = this;
+    }
+
+    public void SetRight(ScheduleTreeNode child) {
+      this.Right = child;
+      child.Parent = this;
+    }
+
+    public TimeSlot Data {
+      get { return data; }
+      set { data = value; }
+    }
+  }
+
+  public class ScheduleTree : StorableBase {
+    private ScheduleTreeNode root;
+
+    public ScheduleTreeNode Root {
+      get { return root; }
+    }
+
+    private int timespan;
+    public int Timespan {
+      get { return timespan; }
+    }
+
+    public ScheduleTree(int timespan) {
+      root = new ScheduleTreeNode(new TimeSlot(0, timespan));
+      this.timespan = timespan;
+    }
+
+    public ScheduleTree() : this(10000) { }
+
+    private int InsertOperation(Operation op) {
+      return Insert(this.Root, op);
+    }
+
+    private int InsertOperation(TimeSlot t) {
+      return Insert(this.Root, t.operation);
+    }
+
+    // ToDo: Rewrite code! (not efficient)
+    public int Insert(Operation op) {
+      foreach(ScheduleTreeNode node in this.InOrder) {
+        int start = Math.Max(node.Data.start, op.Start);
+        if((IsLeaf(node)) && (FitsIntoEmptySlot(node.Data, start, op.Duration))) {
+          op.Start = start;
+          return Insert(node, op);
+        }
+      }
+      return -1;
+    }
+
+    private bool FitsIntoEmptySlot(TimeSlot slot, int start, int duration) {
+      return ((slot.free >= duration) && (slot.start <= start) && (slot.end >= start + duration));
+    }
+
+    private void UpdateMaxFreeSlot(ScheduleTreeNode slot) {
+      while(slot != null) {
+        if(!IsLeaf(slot)) {
+          int newMax = Math.Max(slot.Left.Data.maxFreeSlot, slot.Right.Data.maxFreeSlot);
+          slot.Data.free = slot.Left.Data.free + slot.Right.Data.free;
+          slot.Data.maxFreeSlot = newMax;
+        }
+        slot = slot.Parent;
+      }
+    }
+
+    private int Insert(ScheduleTreeNode slot, Operation op) {
+      if (op == null) {
+        return -1;
+      }
+      int end = op.Start + op.Duration;;
+      if(slot.Data.maxFreeSlot < op.Duration) {
+        return -1;
+      }
+      if(IsLeaf(slot)) {
+        // fits exactly into slot
+        if((slot.Data.start == op.Start) && (slot.Data.end == end)) {
+          slot.Data = new TimeSlot(op);
+          UpdateMaxFreeSlot(slot);
+          return op.Start;
+        }
+        // empty slot before op. 
+        if(slot.Data.start < op.Start) {
+          ScheduleTreeNode empty1 = new ScheduleTreeNode(new TimeSlot(slot.Data.start, op.Start));
+          slot.SetLeft(empty1);
+          if(slot.Data.end > end) {
+            ScheduleTreeNode empty2 = new ScheduleTreeNode(new TimeSlot(op.Start, slot.Data.end));
+            slot.SetRight(empty2);
+            return Insert(empty2, op);
+          } else {
+            slot.SetRight(new ScheduleTreeNode(new TimeSlot(op)));
+            UpdateMaxFreeSlot(slot);
+            return op.Start;
+          }
+        }
+        // empty after op. 
+        if(slot.Data.end > end) {
+          ScheduleTreeNode occupied = new ScheduleTreeNode(new TimeSlot(op));
+          ScheduleTreeNode empty2 = new ScheduleTreeNode(new TimeSlot(end, slot.Data.end));
+          slot.SetRight(empty2);
+          slot.SetLeft(occupied);
+          UpdateMaxFreeSlot(slot);
+          return op.Start;
+        }
+      } else {
+        if(slot.Left.Data.end < end) {
+          return Insert(slot.Right, op);
+        } else {
+          return Insert(slot.Left, op);
+        }
+      }
+      return -1;
+    }
+
+    public bool IsLeaf(ScheduleTreeNode slot) {
+      return ((slot.Right == null) && (slot.Left == null));
+    }
+
+    public override string ToString() {
+      StringBuilder builder = new StringBuilder();
+      foreach(ScheduleTreeNode node in this.InOrder) {
+        if(IsLeaf(node)) {
+          builder.Append(node.Data.ToString());
+          builder.Append(";");
+        }
+      }
+      return builder.ToString();
+    }
+
+    #region IEnumerable Members
+    public IEnumerable<ScheduleTreeNode> InOrder {
+      get { return ScanInOrder(root); }
+    }
+
+    IEnumerable<ScheduleTreeNode> ScanInOrder(ScheduleTreeNode root) {
+      if(root.Left != null) {
+        foreach(ScheduleTreeNode node in ScanInOrder(root.Left)) {
+          yield return node;
+        }
+      }
+      yield return root;
+      if(root.Right != null) {
+        foreach(ScheduleTreeNode node in ScanInOrder(root.Right)) {
+          yield return node;
+        }
+      }
+    }
+    #endregion
+
+    #region IStorable Members
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = this.ToString();
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      string[] tokens = node.InnerText.Split(';');
+      for(int i = 0; i < tokens.Length - 1; i++) {
+        TimeSlot t = new TimeSlot(tokens[i]);
+        if(t.job > -1) {
+          this.InsertOperation(t);
+        }
+      }
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ScheduleTree clone = new ScheduleTree(timespan);
+      clonedObjects.Add(Guid, clone);
+      foreach (ScheduleTreeNode node in this.InOrder) {
+        if (IsLeaf(node) && (node.Data.job > -1)) {
+          clone.InsertOperation(node.Data);
+        }
+      }
+      return clone;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/OperationScoreBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/OperationScoreBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/OperationScoreBase.cs	(revision 2)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public abstract class OperationScoreBase : OperatorBase {
+    public OperationScoreBase() : base() {
+      AddVariableInfo(new VariableInfo("Schedule", "Partial Schedule", typeof(Schedule), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Index", "Index of operation from schedulable set to evaluate", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Operation", "Schedulable Operation to evaluate", typeof(Operation), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Result", "Result of the operator", typeof(DoubleData), VariableKind.Out));
+    }
+
+    public abstract double GetOpScore(IScope unscheduled, Operation op, Schedule s);
+
+    public override IOperation Apply(IScope scope) {
+      IntData i = this.GetVariableValue<IntData>("Index", scope, false);
+      Operation op = null; 
+      if((scope.SubScopes.Count == 2) && (scope.SubScopes[1].SubScopes.Count > 0)) {
+        op = this.GetVariableValue<Operation>("Operation", scope.SubScopes[1].SubScopes[i.Data], false);
+      } else {
+        throw new Exception("SubScope structure not valid!");
+      }
+      Schedule s = this.GetVariableValue<Schedule>("Schedule", scope, false);
+      
+      GetVariableValue<DoubleData>("Result", scope, true).Data = GetOpScore(scope.SubScopes[0], op, s);
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/ProcessingTime.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/ProcessingTime.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/ProcessingTime.cs	(revision 2)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class ProcessingTime : OperationScoreBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override double GetOpScore(IScope unscheduled, Operation op, Schedule s) {
+      return op.Duration; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/RemainingNrOfOperations.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/RemainingNrOfOperations.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/RemainingNrOfOperations.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class RemainingNrOfOperations : OperationScoreBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override double GetOpScore(IScope unscheduled, Operation op, Schedule s) {
+      double score = 1; 
+      for(int i = 0; i < unscheduled.SubScopes.Count; i++) { 
+        Operation unscheduledOp = this.GetVariableValue<Operation>("Operation", unscheduled.SubScopes[i], false); 
+        if (unscheduledOp.Job == op.Job) {
+          score++; 
+        }
+      }
+      return score; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/RemainingProcessingTime.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/RemainingProcessingTime.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/Scores/RemainingProcessingTime.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class RemainingProcessingTime : OperationScoreBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public override double GetOpScore(IScope unscheduled, Operation op, Schedule s) {
+      int remainingTime = op.Duration; 
+      for(int i = 0; i < unscheduled.SubScopes.Count; i++) { 
+        Operation unscheduledOp = this.GetVariableValue<Operation>("Operation", unscheduled.SubScopes[i], false); 
+        if (unscheduledOp.Job == op.Job) {
+          remainingTime += unscheduledOp.Duration; 
+        }
+      }
+      return remainingTime; 
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Scheduling.JSSP/TimeSlot.cs
===================================================================
--- /trunk/sources/HeuristicLab.Scheduling.JSSP/TimeSlot.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Scheduling.JSSP/TimeSlot.cs	(revision 2)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Data; 
+
+namespace HeuristicLab.Scheduling.JSSP {
+  public class TimeSlot {
+    public int start;
+    public int end;
+    public int free;
+    public int maxFreeSlot;
+    public int job {
+      get {
+        if (operation != null) {
+          return operation.Job;
+        } else {
+          return -1;
+        }
+      }
+    } 
+    public Operation operation;
+
+    public TimeSlot(int start, int end) {
+      this.start = start;
+      this.end = end;
+      free = end - start;
+      maxFreeSlot = end - start;
+    }
+
+    public TimeSlot(Operation op) {
+      operation = (Operation) op.Clone();
+      start = op.Start;
+      end = op.Start + op.Duration;
+      free = 0;
+      maxFreeSlot = 0;
+    }
+
+    public TimeSlot(string s) {
+      string[] tokens = s.Split(',');
+      start = int.Parse(tokens[1]);
+      end = int.Parse(tokens[2]);
+      free = int.Parse(tokens[3]);
+      maxFreeSlot = int.Parse(tokens[4]);
+      int job = int.Parse(tokens[0]);
+      if (job != -1) {
+        int opIndex = int.Parse(tokens[5]);
+        int[] machines = new int[tokens.Length - 5];
+        for(int i = 0; i < tokens.Length - 5; i++) {
+          machines[i] = int.Parse(tokens[i]); 
+        }
+        operation = new Operation(job, start, end - start, opIndex, machines, null); 
+      }
+    }
+
+    public override string ToString() {
+      StringBuilder builder = new StringBuilder();
+      builder.Append(String.Format("{2},{0},{1},{3},{4}", start, end, job, free, maxFreeSlot));
+      if(operation != null) {
+        builder.Append(String.Format(",{0}", operation.OperationIndex)); 
+        for (int i = 0; i < operation.Machines.Length; i++) {
+          builder.Append(String.Format(",{0}", operation.Machines[i])); 
+        }
+      }
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection.OffspringSelection/HeuristicLab.Selection.OffspringSelection.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Selection.OffspringSelection/HeuristicLab.Selection.OffspringSelection.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection.OffspringSelection/HeuristicLab.Selection.OffspringSelection.csproj	(revision 2)
@@ -0,0 +1,75 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{205898D3-2717-4686-AF17-52409B7EC0C6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Selection.OffspringSelection</RootNamespace>
+    <AssemblyName>HeuristicLab.Selection.OffspringSelection</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Selection.OffspringSelection.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="HeuristicLabSelectionOffspringSelectionPlugin.cs" />
+    <Compile Include="OffspringAnalyzer.cs" />
+    <Compile Include="OffspringSelector.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Selection.OffspringSelection/HeuristicLabSelectionOffspringSelectionPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection.OffspringSelection/HeuristicLabSelectionOffspringSelectionPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection.OffspringSelection/HeuristicLabSelectionOffspringSelectionPlugin.cs	(revision 2)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Selection.OffspringSelection {
+  [ClassInfo(Name = "HeuristicLab.Selection.OffspringSelection")]
+  [PluginFile(Filename = "HeuristicLab.Selection.OffspringSelection.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  public class HeuristicLabSelectionOffspringSelectionPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection.OffspringSelection/OffspringAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection.OffspringSelection/OffspringAnalyzer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection.OffspringSelection/OffspringAnalyzer.cs	(revision 2)
@@ -0,0 +1,113 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection.OffspringSelection {
+  public class OffspringAnalyzer : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public OffspringAnalyzer() {
+      AddVariableInfo(new VariableInfo("Maximization", "Problem is a maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ParentQualities", "Temporarily store parent qualities", typeof(DoubleArrayData), VariableKind.New | VariableKind.Out | VariableKind.In | VariableKind.Deleted));
+      AddVariableInfo(new VariableInfo("SuccessfulChild", "True if the child was successful", typeof(BoolData), VariableKind.New));
+
+      VariableInfo compFactorInfo = new VariableInfo("ComparisonFactor", "Factor for comparing the quality of a child with the qualities of its parents (0 = better than worst parent, 1 = better than best parent)", typeof(DoubleData), VariableKind.In);
+      compFactorInfo.Local = true;
+      AddVariableInfo(compFactorInfo);
+      AddVariable(new Variable("ComparisonFactor", new DoubleData(0.5)));
+      VariableInfo parentCount = new VariableInfo("ParentsCount", "How many parents created the offspring", typeof(IntData), VariableKind.In);
+      parentCount.Local = true;
+      AddVariableInfo(parentCount);
+      AddVariable(new Variable("ParentsCount", new IntData(2)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      bool maximize = GetVariableValue<BoolData>("Maximization", scope, true).Data;
+      double compFact = GetVariableValue<DoubleData>("ComparisonFactor", scope, true).Data;
+      int parentsCount = GetVariableValue<IntData>("ParentsCount", scope, true).Data;
+      if (parentsCount < 1) throw new InvalidOperationException("OffspringAnalyzer: ParentsCount must be >= 1");
+
+      DoubleArrayData qualities = GetVariableValue<DoubleArrayData>("ParentQualities", scope, false, false);
+      if (qualities == null) {
+        // fetch and store parent qualities
+        IVariableInfo qualityInfo = GetVariableInfo("Quality");
+        double[] qualitiesArray = new double[scope.SubScopes.Count];
+        for (int i = 0; i < qualitiesArray.Length; i++)
+          qualitiesArray[i] = scope.SubScopes[i].GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+        qualities = new DoubleArrayData(qualitiesArray);
+        IVariableInfo parentQualitiesInfo = GetVariableInfo("ParentQualities");
+        if (parentQualitiesInfo.Local)
+          AddVariable(new Variable(parentQualitiesInfo.ActualName, qualities));
+        else
+          scope.AddVariable(new Variable(parentQualitiesInfo.ActualName, qualities));
+
+        CompositeOperation next = new CompositeOperation();
+        next.AddOperation(new AtomicOperation(SubOperators[0], scope));
+        next.AddOperation(new AtomicOperation(this, scope));
+        return next;
+      } else {
+        // analyze offspring
+        for (int i = 0; i < scope.SubScopes.Count; i++) {
+          double parent1 = double.MaxValue; // lowest quality parent
+          double parent2 = double.MinValue; // highest quality parent
+          for (int y = 0 ; y < parentsCount ; y++) {
+            if (qualities.Data[parentsCount * i + y] < parent1) parent1 = qualities.Data[parentsCount * i + y];
+            if (qualities.Data[parentsCount * i + y] > parent2) parent2 = qualities.Data[parentsCount * i + y];
+          }
+          IVariableInfo qualityInfo = GetVariableInfo("Quality");
+          double child = scope.SubScopes[i].GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+          double threshold;
+
+          if (!maximize)
+            threshold = parent2 + (parent1 - parent2) * compFact;
+          else
+            threshold = parent1 + (parent2 - parent1) * compFact;
+
+          IVariableInfo successfulInfo = GetVariableInfo("SuccessfulChild");
+          BoolData successful;
+          if (((!maximize) && (child < threshold)) ||
+              ((maximize) && (child > threshold)))
+            successful = new BoolData(true);
+          else
+            successful = new BoolData(false);
+          scope.SubScopes[i].AddVariable(new Variable(successfulInfo.ActualName, successful));
+        }
+
+        // remove parent qualities again
+        IVariableInfo parentQualitiesInfo = GetVariableInfo("ParentQualities");
+        if (parentQualitiesInfo.Local)
+          RemoveVariable(parentQualitiesInfo.ActualName);
+        else
+          scope.RemoveVariable(parentQualitiesInfo.ActualName);
+
+        return null;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection.OffspringSelection/OffspringSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection.OffspringSelection/OffspringSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection.OffspringSelection/OffspringSelector.cs	(revision 2)
@@ -0,0 +1,145 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection.OffspringSelection {
+  public class OffspringSelector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public OffspringSelector() {
+      AddVariableInfo(new VariableInfo("SuccessfulChild", "True if the child was successful", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SelectionPressureLimit", "Maximum selection pressure", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SuccessRatioLimit", "Maximum success ratio", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SelectionPressure", "Current selection pressure", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("SuccessRatio", "Current success ratio", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("GoodChildren", "Temporarily store successful children", typeof(ItemList), VariableKind.New | VariableKind.Out | VariableKind.In | VariableKind.Deleted));
+      AddVariableInfo(new VariableInfo("BadChildren", "Temporarily store unsuccessful children", typeof(ItemList), VariableKind.New | VariableKind.Out | VariableKind.In | VariableKind.Deleted));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      double selectionPressureLimit = GetVariableValue<DoubleData>("SelectionPressureLimit", scope, true).Data;
+      double successRatioLimit = GetVariableValue<DoubleData>("SuccessRatioLimit", scope, true).Data;
+
+      IScope parents = scope.SubScopes[0];
+      IScope children = scope.SubScopes[1];
+
+      // retrieve good and bad children
+      ItemList goodChildren = GetVariableValue<ItemList>("GoodChildren", scope, false, false);
+      if (goodChildren == null) {
+        goodChildren = new ItemList();
+        goodChildren.ItemType = typeof(IScope);
+        IVariableInfo goodChildrenInfo = GetVariableInfo("GoodChildren");
+        if (goodChildrenInfo.Local)
+          AddVariable(new Variable(goodChildrenInfo.ActualName, goodChildren));
+        else
+          scope.AddVariable(new Variable(goodChildrenInfo.ActualName, goodChildren));
+      }
+      ItemList badChildren = GetVariableValue<ItemList>("BadChildren", scope, false, false);
+      if (badChildren == null) {
+        badChildren = new ItemList();
+        badChildren.ItemType = typeof(IScope);
+        IVariableInfo badChildrenInfo = GetVariableInfo("BadChildren");
+        if (badChildrenInfo.Local)
+          AddVariable(new Variable(badChildrenInfo.ActualName, badChildren));
+        else
+          scope.AddVariable(new Variable(badChildrenInfo.ActualName, badChildren));
+      }
+
+      // separate new children in good and bad children
+      IVariableInfo successfulInfo = GetVariableInfo("SuccessfulChild");
+      while (children.SubScopes.Count > 0) {
+        IScope child = children.SubScopes[0];
+        bool successful = child.GetVariableValue<BoolData>(successfulInfo.ActualName, false).Data;
+        if (successful) goodChildren.Add(child);
+        else badChildren.Add(child);
+        children.RemoveSubScope(child);
+      }
+
+      // calculate actual selection pressure and success ratio
+      DoubleData selectionPressure = GetVariableValue<DoubleData>("SelectionPressure", scope, false, false);
+      if (selectionPressure == null) {
+        IVariableInfo selectionPressureInfo = GetVariableInfo("SelectionPressure");
+        selectionPressure = new DoubleData(0);
+        if (selectionPressureInfo.Local)
+          AddVariable(new Variable(selectionPressureInfo.ActualName, selectionPressure));
+        else
+          scope.AddVariable(new Variable(selectionPressureInfo.ActualName, selectionPressure));
+      }
+      DoubleData successRatio = GetVariableValue<DoubleData>("SuccessRatio", scope, false, false);
+      if (successRatio == null) {
+        IVariableInfo successRatioInfo = GetVariableInfo("SuccessRatio");
+        successRatio = new DoubleData(0);
+        if (successRatioInfo.Local)
+          AddVariable(new Variable(successRatioInfo.ActualName, successRatio));
+        else
+          scope.AddVariable(new Variable(successRatioInfo.ActualName, successRatio));
+      }
+      int goodCount = goodChildren.Count;
+      int badCount = badChildren.Count;
+      selectionPressure.Data = (goodCount + badCount) / ((double)parents.SubScopes.Count);
+      successRatio.Data = goodCount / ((double)parents.SubScopes.Count);
+
+      // check if enough children have been generated
+      if (((selectionPressure.Data < selectionPressureLimit) && (successRatio.Data < successRatioLimit)) ||
+          ((goodCount + badCount) < parents.SubScopes.Count)) {
+        // more children required -> reduce left and start children generation again
+        scope.RemoveSubScope(parents);
+        scope.RemoveSubScope(children);
+        for (int i = 0; i < parents.SubScopes.Count; i++)
+          scope.AddSubScope(parents.SubScopes[i]);
+
+        return new AtomicOperation(SubOperators[0], scope);
+      } else {
+        // enough children generated
+        while (children.SubScopes.Count < parents.SubScopes.Count) {
+          if (goodChildren.Count > 0) {
+            children.AddSubScope((IScope)goodChildren[0]);
+            goodChildren.RemoveAt(0);
+          } else {
+            children.AddSubScope((IScope)badChildren[0]);
+            badChildren.RemoveAt(0);
+          }
+        }
+
+        // remove good and bad children again
+        IVariableInfo goodChildrenInfo = GetVariableInfo("GoodChildren");
+        if (goodChildrenInfo.Local)
+          RemoveVariable(goodChildrenInfo.ActualName);
+        else
+          scope.RemoveVariable(goodChildrenInfo.ActualName);
+        IVariableInfo badChildrenInfo = GetVariableInfo("BadChildren");
+        if (badChildrenInfo.Local)
+          RemoveVariable(badChildrenInfo.ActualName);
+        else
+          scope.RemoveVariable(badChildrenInfo.ActualName);
+
+        return null;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection.OffspringSelection/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection.OffspringSelection/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection.OffspringSelection/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Selection.OffspringSelection")]
+[assembly: AssemblyDescription("HeuristicLab Offspring Selection operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("b09e28c5-1ac5-4f1c-ba80-60558319828e")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Selection/HeuristicLab.Selection.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Selection/HeuristicLab.Selection.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/HeuristicLab.Selection.csproj	(revision 2)
@@ -0,0 +1,90 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F7CF0571-25CB-43D5-8443-0843A1E2861A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Selection</RootNamespace>
+    <AssemblyName>HeuristicLab.Selection</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Selection.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="RightChildReducer.cs" />
+    <Compile Include="LeftReducer.cs" />
+    <Compile Include="MergingReducer.cs" />
+    <Compile Include="ProportionalSelector.cs" />
+    <Compile Include="LinearRankSelector.cs" />
+    <Compile Include="LeftSelector.cs" />
+    <Compile Include="RandomSelector.cs" />
+    <Compile Include="ReducerBase.cs" />
+    <Compile Include="RightReducer.cs" />
+    <Compile Include="RightSelector.cs" />
+    <Compile Include="SelectorBase.cs" />
+    <Compile Include="StochasticSelectorBase.cs" />
+    <Compile Include="TournamentSelector.cs" />
+    <Compile Include="HeuristicLabSelectionPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Selection/HeuristicLabSelectionPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/HeuristicLabSelectionPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/HeuristicLabSelectionPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Selection {
+  [ClassInfo(Name = "HeuristicLab.Selection")]
+  [PluginFile(Filename = "HeuristicLab.Selection.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  public class HeuristicLabSelectionPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/LeftReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/LeftReducer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/LeftReducer.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public class LeftReducer : ReducerBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override ICollection<IScope> Reduce(IScope scope) {
+      List<IScope> subScopes = new List<IScope>();
+
+      if (scope.SubScopes.Count > 0)
+        subScopes.AddRange(scope.SubScopes[0].SubScopes);
+      return subScopes;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/LeftSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/LeftSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/LeftSelector.cs	(revision 2)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Selection {
+  public class LeftSelector : StochasticSelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
+      int index = 0;
+      for (int i = 0; i < selected; i++) {
+        if (copySelected) {
+          target.AddSubScope((IScope)source.SubScopes[index].Clone());
+          index++;
+          if (index >= source.SubScopes.Count) index = 0;
+        } else {
+          IScope s = source.SubScopes[0];
+          source.RemoveSubScope(s);
+          target.AddSubScope(s);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/LinearRankSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/LinearRankSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/LinearRankSelector.cs	(revision 2)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection {
+  public class LinearRankSelector : StochasticSelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public LinearRankSelector() {
+      GetVariable("CopySelected").GetValue<BoolData>().Data = true;
+    }
+
+    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
+      int subScopes = source.SubScopes.Count;
+      int lotSum = (subScopes * (subScopes + 1)) / 2;
+      int selectedLot;
+      int currentLot;
+      int index;
+
+      for (int i = 0; i < selected; i++) {
+        if (subScopes < 1) throw new InvalidOperationException("No source scopes available to select.");
+
+        selectedLot = random.Next(1, lotSum + 1);
+        currentLot = subScopes;  // first individual is the best one
+        index = 0;
+        while (currentLot < selectedLot) {
+          index++;
+          currentLot += subScopes - index;
+        }
+        IScope selectedScope = source.SubScopes[index];
+        if (copySelected)
+          target.AddSubScope((IScope)selectedScope.Clone());
+        else {
+          source.RemoveSubScope(selectedScope);
+          target.AddSubScope(selectedScope);
+          subScopes--;
+          lotSum = (subScopes * (subScopes + 1)) / 2;
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/MergingReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/MergingReducer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/MergingReducer.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public class MergingReducer : ReducerBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override ICollection<IScope> Reduce(IScope scope) {
+      List<IScope> subScopes = new List<IScope>();
+
+      for (int i = 0; i < scope.SubScopes.Count; i++) {
+        for (int j = 0; j < scope.SubScopes[i].SubScopes.Count; j++)
+          subScopes.Add(scope.SubScopes[i].SubScopes[j]);
+      }
+      return subScopes;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Selection")]
+[assembly: AssemblyDescription("HeuristicLab selection operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ed119c1e-a48f-41de-a797-43352ff4f1a3")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.Selection/ProportionalSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/ProportionalSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/ProportionalSelector.cs	(revision 2)
@@ -0,0 +1,122 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection {
+  public class ProportionalSelector : StochasticSelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public ProportionalSelector() {
+      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Windowing", "Apply windowing strategy (selection probability is proportional to the quality differences and not to the total quality)", typeof(BoolData), VariableKind.In));
+      GetVariableInfo("Windowing").Local = true;
+      AddVariable(new Variable("Windowing", new BoolData(true)));
+      GetVariable("CopySelected").GetValue<BoolData>().Data = true;
+    }
+
+    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
+      bool maximization = GetVariableValue<BoolData>("Maximization", source, true).Data;
+      IVariableInfo qualityInfo = GetVariableInfo("Quality");
+      bool windowing = GetVariableValue<BoolData>("Windowing", source, true).Data;
+
+      double[] qualities;
+      double qualitySum;
+      double selectedQuality;
+      double sum;
+      int j;
+
+      GenerateQualitiesArray(source, maximization, qualityInfo, windowing, out qualities, out qualitySum);
+
+      // perform selection
+      for (int i = 0; i < selected; i++) {
+        selectedQuality = random.NextDouble() * qualitySum;
+        sum = 0;
+        j = 0;
+        while ((j < qualities.Length) && (sum <= selectedQuality)) {
+          sum += qualities[j];
+          j++;
+        }
+        IScope selectedScope = source.SubScopes[j - 1];
+        if (copySelected)
+          target.AddSubScope((IScope)selectedScope.Clone());
+        else {
+          source.RemoveSubScope(selectedScope);
+          target.AddSubScope(selectedScope);
+          GenerateQualitiesArray(source, maximization, qualityInfo, windowing, out qualities, out qualitySum);
+        }
+      }
+    }
+
+    private void GenerateQualitiesArray(IScope source, bool maximization, IVariableInfo qualityInfo, bool windowing, out double[] qualities, out double qualitySum) {
+      int subScopes = source.SubScopes.Count;
+      qualities = new double[subScopes];
+      qualitySum = 0;
+
+      if (subScopes < 1) throw new InvalidOperationException("No source scopes to select available.");
+
+      double best = source.SubScopes[0].GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+      double worst = source.SubScopes[subScopes - 1].GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+      double limit = Math.Min(worst * 2, double.MaxValue);
+      double min = Math.Min(best, worst);
+      double max = Math.Max(best, worst);
+      double solutionQuality;
+
+      // preprocess fitness values, apply windowing if desired
+      for (int i = 0; i < qualities.Length; i++) {
+        solutionQuality = source.SubScopes[i].GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+        if (solutionQuality < min || solutionQuality > max) {
+          // something has obviously gone wrong here
+          string errorMessage = "There is a problem with the ordering of the source sub-scopes in " + Name + ".\r\n" +
+            "The quality of solution number " + i.ToString() + " is ";
+          if (solutionQuality < min) errorMessage += "below";
+          else errorMessage += "greater than";
+          errorMessage += " the calculated qualities range:\r\n";
+          errorMessage += solutionQuality.ToString() + " is outside the interval [ " + min.ToString() + " ; " + max.ToString() + " ].";
+          throw new InvalidOperationException(errorMessage);
+        }
+        if (best != worst) {  // prevent division by zero
+          if (windowing) {
+            if (!maximization) {
+              qualities[i] = 1 - ((solutionQuality - best) / (worst - best));
+            } else {
+              qualities[i] = (solutionQuality - worst) / (best - worst);
+            }
+          } else {
+            if (!maximization) qualities[i] = limit - solutionQuality;
+            else qualities[i] = solutionQuality;
+          }
+        } else {  // best == worst -> all fitness values are equal
+          qualities[i] = 1;
+        }
+        qualitySum += qualities[i];
+      }
+      if (double.IsInfinity(qualitySum)) qualitySum = double.MaxValue;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/RandomSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/RandomSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/RandomSelector.cs	(revision 2)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Selection {
+  public class RandomSelector : StochasticSelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
+      for (int i = 0; i < selected; i++) {
+        if (copySelected) {
+          target.AddSubScope((IScope)source.SubScopes[random.Next(source.SubScopes.Count)].Clone());
+        } else {
+          IScope s = source.SubScopes[random.Next(source.SubScopes.Count)];
+          source.RemoveSubScope(s);
+          target.AddSubScope(s);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/ReducerBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/ReducerBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/ReducerBase.cs	(revision 2)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public abstract class ReducerBase : OperatorBase {
+    public override IOperation Apply(IScope scope) {
+      ICollection<IScope> subScopes = Reduce(scope);
+
+      while (scope.SubScopes.Count > 0)
+        scope.RemoveSubScope(scope.SubScopes[0]);
+
+      foreach (IScope s in subScopes)
+        scope.AddSubScope(s);
+
+      return null;
+    }
+
+    protected abstract ICollection<IScope> Reduce(IScope scope);
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/RightChildReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/RightChildReducer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/RightChildReducer.cs	(revision 2)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public class RightChildReducer : ReducerBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override ICollection<IScope> Reduce(IScope scope) {
+      IScope rightChild = scope.SubScopes[scope.SubScopes.Count - 1];
+      IScope leftChild = scope.SubScopes[0];
+      IScope leftRightChild = leftChild.SubScopes[leftChild.SubScopes.Count - 1];
+
+      // merge right children
+      for (int i = 0; i < leftRightChild.SubScopes.Count; i++)
+        rightChild.AddSubScope(leftRightChild.SubScopes[i]);
+
+      leftChild = leftChild.SubScopes[0];
+
+      List<IScope> subScopes = new List<IScope>();
+      subScopes.Add(leftChild);
+      subScopes.Add(rightChild);
+      return subScopes;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/RightReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/RightReducer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/RightReducer.cs	(revision 2)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public class RightReducer : ReducerBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override ICollection<IScope> Reduce(IScope scope) {
+      List<IScope> subScopes = new List<IScope>();
+
+      if (scope.SubScopes.Count > 0)
+        subScopes.AddRange(scope.SubScopes[scope.SubScopes.Count - 1].SubScopes);
+      return subScopes;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/RightSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/RightSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/RightSelector.cs	(revision 2)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Selection {
+  public class RightSelector : StochasticSelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
+      int index = source.SubScopes.Count - 1;
+      for (int i = 0; i < selected; i++) {
+        if (copySelected) {
+          target.AddSubScope((IScope)source.SubScopes[index].Clone());
+          index--;
+          if (index < 0) index = source.SubScopes.Count - 1;
+        } else {
+          IScope s = source.SubScopes[source.SubScopes.Count - 1];
+          source.RemoveSubScope(s);
+          target.AddSubScope(s);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/SelectorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/SelectorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/SelectorBase.cs	(revision 2)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public abstract class SelectorBase : OperatorBase {
+    public SelectorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("CopySelected", "Copy or move selected sub-scopes", typeof(BoolData), VariableKind.In));
+      GetVariableInfo("CopySelected").Local = true;
+      AddVariable(new Variable("CopySelected", new BoolData(false)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      BoolData copySelected = GetVariableValue<BoolData>("CopySelected", scope, true);
+
+      IScope source = new Scope("Remaining");
+      while (scope.SubScopes.Count > 0) {
+        IScope s = scope.SubScopes[0];
+        scope.RemoveSubScope(s);
+        source.AddSubScope(s);
+      }
+      scope.AddSubScope(source);
+      IScope target = new Scope("Selected");
+      scope.AddSubScope(target);
+
+      Select(source, target, copySelected.Data);
+
+      return null;
+    }
+
+    protected abstract void Select(IScope source, IScope target, bool copySelected);
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/StochasticSelectorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/StochasticSelectorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/StochasticSelectorBase.cs	(revision 2)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Selection {
+  public abstract class StochasticSelectorBase : SelectorBase {
+    public StochasticSelectorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Selected", "Number of selected sub-scopes", typeof(IntData), VariableKind.In));
+    }
+
+    protected sealed override void Select(IScope source, IScope target, bool copySelected) {
+      IRandom random = GetVariableValue<IRandom>("Random", source, true);
+      IntData selected = GetVariableValue<IntData>("Selected", source, true);
+
+      Select(random, source, selected.Data, target, copySelected);
+    }
+
+    protected abstract void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected);
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/TournamentSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/TournamentSelector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.Selection/TournamentSelector.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection {
+  public class TournamentSelector : StochasticSelectorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public TournamentSelector() {
+      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("GroupSize", "Size of the tournament group", typeof(IntData), VariableKind.In));
+      GetVariableInfo("GroupSize").Local = true;
+      AddVariable(new Variable("GroupSize", new IntData(2)));
+      GetVariable("CopySelected").GetValue<BoolData>().Data = true;
+    }
+
+    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
+      IVariableInfo qualityInfo = GetVariableInfo("Quality");
+      bool maximization = GetVariableValue<BoolData>("Maximization", source, true).Data;
+      int groupSize = GetVariableValue<IntData>("GroupSize", source, true).Data;
+      for (int i = 0; i < selected; i++) {
+        if (source.SubScopes.Count < 1) throw new InvalidOperationException("No source scopes available to select.");
+
+        double best = maximization ? double.MinValue : double.MaxValue;
+        IScope selectedScope = null;
+        for (int j = 0; j < groupSize; j++) {
+          IScope scope = source.SubScopes[random.Next(source.SubScopes.Count)];
+          double quality = scope.GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+          if (((maximization) && (quality > best)) ||
+              ((!maximization) && (quality < best))) {
+            best = quality;
+            selectedScope = scope;
+          }
+        }
+
+        if (copySelected)
+          target.AddSubScope((IScope)selectedScope.Clone());
+        else {
+          source.RemoveSubScope(selectedScope);
+          target.AddSubScope(selectedScope);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.SequentialEngine/HeuristicLab.SequentialEngine.csproj
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/HeuristicLab.SequentialEngine.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.SequentialEngine/HeuristicLab.SequentialEngine.csproj	(revision 2)
@@ -0,0 +1,78 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B4BE8E53-BA06-4237-9A01-24255F880201}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.SequentialEngine</RootNamespace>
+    <AssemblyName>HeuristicLab.SequentialEngine</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.SequentialEngine.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="HeuristicLabSequentialEnginePlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SequentialEngine.cs" />
+    <Compile Include="SequentialEngineEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SequentialEngineEditor.Designer.cs">
+      <DependentUpon>SequentialEngineEditor.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.SequentialEngine/HeuristicLabSequentialEnginePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/HeuristicLabSequentialEnginePlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SequentialEngine/HeuristicLabSequentialEnginePlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.SequentialEngine {
+  [ClassInfo(Name = "HeuristicLab.SequentialEngine")]
+  [PluginFile(Filename = "HeuristicLab.SequentialEngine.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  public class HeuristicLabSequentialEnginePlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.SequentialEngine/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SequentialEngine/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.SequentialEngine")]
+[assembly: AssemblyDescription("HeuristicLab engine for sequential processing")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("00484492-6cc5-4a0a-9876-327488f08c49")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngine.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngine.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using System.Threading;
+
+namespace HeuristicLab.SequentialEngine {
+  public class SequentialEngine : EngineBase, IEditable {
+    private IOperator currentOperator;
+
+    public override IView CreateView() {
+      return new SequentialEngineEditor(this);
+    }
+    public virtual IEditor CreateEditor() {
+      return new SequentialEngineEditor(this);
+    }
+
+    public override void Abort() {
+      base.Abort();
+      if (currentOperator != null)
+        currentOperator.Abort();
+    }
+
+    protected override void ProcessNextOperation() {
+      IOperation operation = myExecutionStack.Pop();
+      if (operation is AtomicOperation) {
+        AtomicOperation atomicOperation = (AtomicOperation)operation;
+        IOperation next = null;
+        try {
+          currentOperator = atomicOperation.Operator;
+          next = atomicOperation.Operator.Execute(atomicOperation.Scope);
+        }
+        catch (Exception ex) {
+          // push operation on stack again
+          myExecutionStack.Push(atomicOperation);
+          Abort();
+          ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex);});
+        }
+        if (next != null)
+          myExecutionStack.Push(next);
+        OnOperationExecuted(atomicOperation);
+        if (atomicOperation.Operator.Breakpoint) Abort();
+      } else if (operation is CompositeOperation) {
+        CompositeOperation compositeOperation = (CompositeOperation)operation;
+        for (int i = compositeOperation.Operations.Count - 1; i >= 0; i--)
+          myExecutionStack.Push(compositeOperation.Operations[i]);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngineEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngineEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngineEditor.Designer.cs	(revision 2)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.SequentialEngine {
+  partial class SequentialEngineEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngineEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngineEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.SequentialEngine/SequentialEngineEditor.cs	(revision 2)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.SequentialEngine {
+  public partial class SequentialEngineEditor : EngineBaseEditor {
+    public SequentialEngine SequentialEngine {
+      get { return (SequentialEngine)Engine; }
+      set { base.Engine = value; }
+    }
+
+    public SequentialEngineEditor() {
+      InitializeComponent();
+    }
+    public SequentialEngineEditor(SequentialEngine sequentialEngine)
+      : this() {
+      SequentialEngine = sequentialEngine;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs	(revision 2)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Functions;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.StructureIdentification {
+  public class CoefficientOfDeterminationEvaluator : OperatorBase {
+    public override string Description {
+      get { return @"Applies 'OperatorTree' to samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) of 'Dataset' and calculates
+the 'coefficient of determination' of estimated values vs. real values of 'TargetVariable'."; }
+    }
+
+    public CoefficientOfDeterminationEvaluator()
+      : base() {
+      AddVariableInfo(new VariableInfo("OperatorTree", "The function tree that should be evaluated", typeof(IFunction), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TargetVariable", "Index of the target variable in the dataset", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataset on which the function should be evaluated", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataset on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("UseEstimatedTargetValues", "When the function tree contains the target variable this variable determines " +
+      "if we should use the estimated or the original values of the target variable in the evaluation", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Quality", "The coefficient of determination of the model", typeof(DoubleData), VariableKind.New));
+
+    }
+
+
+    private double[] savedTargetVariable = new double[1];
+    public override IOperation Apply(IScope scope) {
+      int firstSampleIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data;
+      int lastSampleIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data;
+
+      if(lastSampleIndex < firstSampleIndex) {
+        throw new InvalidProgramException();
+      }
+
+      IFunction function = GetVariableValue<IFunction>("OperatorTree", scope, true);
+
+      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
+
+      int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data;
+      bool useEstimatedTargetValues = GetVariableValue<BoolData>("UseEstimatedTargetValues", scope, true).Data;
+      double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data;
+
+      if(useEstimatedTargetValues && savedTargetVariable.Length != lastSampleIndex - firstSampleIndex + 1) {
+        savedTargetVariable = new double[lastSampleIndex - firstSampleIndex + 1];
+      }
+
+      double maximumPunishment = punishmentFactor * dataset.GetRange(targetVariable, firstSampleIndex, lastSampleIndex);
+
+      double errorsSquaredSum = 0.0;
+      double originalsSum = 0.0;
+      double targetMean = dataset.GetMean(targetVariable, firstSampleIndex, lastSampleIndex);
+
+      for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) {
+        double estimated = function.Evaluate(dataset, sample);
+        double original = dataset.GetValue(sample, targetVariable);
+
+        if(useEstimatedTargetValues) {
+          savedTargetVariable[sample - firstSampleIndex] = original;
+          dataset.SetValue(sample, targetVariable, estimated);
+        }
+
+        if(!double.IsNaN(original) && !double.IsInfinity(original)) {
+          if(double.IsNaN(estimated) || double.IsInfinity(estimated))
+            estimated = targetMean + maximumPunishment;
+          else if(estimated > (targetMean + maximumPunishment))
+            estimated = targetMean + maximumPunishment;
+          else if(estimated < (targetMean - maximumPunishment))
+            estimated = targetMean - maximumPunishment;
+
+          double error = estimated - original;
+          errorsSquaredSum += error * error;
+          originalsSum += original;
+        }
+      }
+
+      double originalsMean = originalsSum / (lastSampleIndex - firstSampleIndex +1);
+      
+      double originalTotalSumOfSquares = 0.0;
+
+      for(int sample=0; sample <savedTargetVariable.Length; sample++) {
+        double original = savedTargetVariable[sample];
+
+        if(!double.IsInfinity(original) && !double.IsNaN(original)) {
+          original = original - originalsMean;
+          originalTotalSumOfSquares += original * original;
+        }
+      }
+
+      double quality = 1 - errorsSquaredSum / originalTotalSumOfSquares;
+
+      if(quality > 1) {
+        throw new InvalidProgramException();
+      }
+
+      if(double.IsNaN(quality) || double.IsInfinity(quality)) {
+        quality = double.MaxValue;
+      }
+
+      if(useEstimatedTargetValues) {
+        // restore original values of the target variable
+        for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) {
+          dataset.SetValue(sample, targetVariable, savedTargetVariable[sample - firstSampleIndex]);
+        }
+      }
+
+      scope.AddVariable(new HeuristicLab.Core.Variable("Quality", new DoubleData(quality)));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/FunctionEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/FunctionEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/FunctionEvaluator.cs	(revision 2)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System.Diagnostics;
+using HeuristicLab.Functions;
+using HeuristicLab.Operators;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.StructureIdentification {
+  public class FunctionEvaluator : OperatorBase {
+    public override string Description {
+      get { return @"Evaluates 'FunctionTree' on samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) of
+'Dataset' and stores the results in array 'Results'."; }
+    }
+
+    public FunctionEvaluator()
+      : base() {
+      AddVariableInfo(new VariableInfo("FunctionTree", "The combined operator containing a function tree that should be evaluated", typeof(IFunction), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
+      AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataSet on which the function should be evaluated", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataSet on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Results", "Array of results of the function for each sample", typeof(DoubleArrayData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+
+      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
+      double[] results = new double[dataset.Rows];
+
+      IFunction function = GetVariableValue<IFunction>("FunctionTree", scope, true);
+
+      int firstIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data;
+      int lastIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data;
+
+      for(int sample = firstIndex; sample <= lastIndex; sample++) {
+        results[sample] = function.Evaluate(dataset, sample);
+      }
+
+      scope.AddVariable(new HeuristicLab.Core.Variable("Results", new DoubleArrayData(results)));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs	(revision 2)
@@ -0,0 +1,116 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Functions;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.StructureIdentification {
+  public class MeanSquaredErrorEvaluator : OperatorBase {
+    public override string Description {
+      get { return @"Evaluates 'OperatorTree' for samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) and calculates the mean-squared-error
+for the estimated values vs. the real values of 'TargetVariable'."; }
+    }
+
+    public MeanSquaredErrorEvaluator()
+      : base() {
+      AddVariableInfo(new VariableInfo("OperatorTree", "The function tree that should be evaluated", typeof(IFunction), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TargetVariable", "Index of the column of the dataset that holds the target variable", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataset on which the function should be evaluated", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataset on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("UseEstimatedTargetValues", "When the function tree contains the target variable this variable determines " +
+      "if we should use the estimated or the original values of the target variable in the evaluation", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Quality", "The mean squared error of the model", typeof(DoubleData), VariableKind.New));
+    }
+
+    private double[] savedTargetVariable = new double[0];
+
+    public override IOperation Apply(IScope scope) {
+
+      int firstSampleIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data;
+      int lastSampleIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data;
+
+      if(firstSampleIndex >= lastSampleIndex) {
+        throw new InvalidProgramException();
+      }
+
+
+      int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data;
+      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
+
+      IFunction function = GetVariableValue<IFunction>("OperatorTree", scope, true);
+
+      double errorsSquaredSum = 0;
+
+      double maximumPunishment = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data * dataset.GetRange(targetVariable, firstSampleIndex, lastSampleIndex);
+      double targetMean = dataset.GetMean(targetVariable, firstSampleIndex, lastSampleIndex);
+      bool useEstimatedValues = GetVariableValue<BoolData>("UseEstimatedTargetValues", scope, true).Data;
+
+      if(useEstimatedValues && savedTargetVariable.Length != lastSampleIndex - firstSampleIndex + 1) {
+        savedTargetVariable = new double[lastSampleIndex - firstSampleIndex + 1];
+      }
+      for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) {
+
+        double estimated = function.Evaluate(dataset, sample);
+        double original = dataset.GetValue(sample, targetVariable);
+
+        if(useEstimatedValues) {
+          savedTargetVariable[sample - firstSampleIndex] = original;
+          dataset.SetValue(sample, targetVariable, estimated);
+        }
+
+        if(double.IsNaN(estimated) || double.IsInfinity(estimated)) {
+          estimated = targetMean + maximumPunishment;
+        } else if(estimated > targetMean + maximumPunishment) {
+          estimated = targetMean + maximumPunishment;
+        } else if(estimated < targetMean - maximumPunishment) {
+          estimated = targetMean - maximumPunishment;
+        }
+
+        double error = estimated - original;
+        errorsSquaredSum += error * error;
+      }
+
+      errorsSquaredSum /= (lastSampleIndex - firstSampleIndex);
+      if(double.IsNaN(errorsSquaredSum) || double.IsInfinity(errorsSquaredSum)) {
+        errorsSquaredSum = double.MaxValue;
+      }
+
+      if(useEstimatedValues) {
+        // restore original values of the target variable
+        for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) {
+          dataset.SetValue(sample, targetVariable, savedTargetVariable[sample - firstSampleIndex]);
+        }
+      }
+
+      scope.AddVariable(new HeuristicLab.Core.Variable("Quality", new DoubleData(errorsSquaredSum)));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs	(revision 2)
@@ -0,0 +1,132 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.DataAnalysis;
+using HeuristicLab.Functions;
+
+namespace HeuristicLab.StructureIdentification {
+  public class VarianceAccountedForEvaluator : OperatorBase {
+    public override string Description {
+      get { return @"Evaluates 'OperatorTree' for samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) and calculates 
+the variance-accounted-for quality measure for the estimated values vs. the real values of 'TargetVariable'.
+
+The Variance Accounted For (VAF) function is computed as
+VAF(y,y') = ( 1 - var(y-y')/var(y) )
+where y' denotes the predicted / modelled values for y and var(x) the variance of a signal x."; }
+    }
+
+    /// <summary>
+    /// The Variance Accounted For (VAF) function calculates is computed as
+    /// VAF(y,y') = ( 1 - var(y-y')/var(y) )
+    /// where y' denotes the predicted / modelled values for y and var(x) the variance of a signal x.
+    /// </summary>
+    public VarianceAccountedForEvaluator()
+      : base() {
+      AddVariableInfo(new VariableInfo("OperatorTree", "The function tree that should be evaluated", typeof(IFunction), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TargetVariable", "Index of the target variable in the dataset", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataset on which the function should be evaluated", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataset on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("UseEstimatedTargetValues", "When the function tree contains the target variable this variable determines " +
+      "if we should use the estimated or the original values of the target variable in the evaluation", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Quality", "Variance accounted for quality of the model", typeof(DoubleData), VariableKind.New));
+
+    }
+
+
+    private double[] originalTargetVariableValues = new double[1];
+    private double[] errors = new double[1];
+
+    public override IOperation Apply(IScope scope) {
+
+      int firstSampleIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data;
+      int lastSampleIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data;
+
+      if(lastSampleIndex < firstSampleIndex) {
+        throw new InvalidProgramException();
+      }
+
+      IFunction function = GetVariableValue<IFunction>("OperatorTree", scope, true);
+
+      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
+
+      int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data;
+      bool useEstimatedTargetValues = GetVariableValue<BoolData>("UseEstimatedTargetValues", scope, true).Data;
+      double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data;
+
+      if(originalTargetVariableValues.Length != lastSampleIndex - firstSampleIndex + 1) {
+        originalTargetVariableValues = new double[lastSampleIndex - firstSampleIndex + 1];
+        errors = new double[lastSampleIndex - firstSampleIndex + 1];
+      }
+
+      double maximumPunishment = punishmentFactor * dataset.GetRange(targetVariable, firstSampleIndex, lastSampleIndex);
+
+      double targetMean = dataset.GetMean(targetVariable, firstSampleIndex, lastSampleIndex);
+
+      for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) {
+
+        double estimated = function.Evaluate(dataset, sample);
+        double original =  dataset.GetValue(sample, targetVariable);
+
+        if(!double.IsNaN(original) && !double.IsInfinity(original)) {
+          if(double.IsNaN(estimated) || double.IsInfinity(estimated))
+            estimated = targetMean + maximumPunishment;
+          else if(estimated > (targetMean + maximumPunishment))
+            estimated = targetMean + maximumPunishment;
+          else if(estimated < (targetMean - maximumPunishment))
+            estimated = targetMean - maximumPunishment;
+        }
+
+        errors[sample-firstSampleIndex] = original - estimated;
+        originalTargetVariableValues[sample-firstSampleIndex] = original;
+        if(useEstimatedTargetValues) {
+          dataset.SetValue(sample, targetVariable, estimated);
+        }
+      }
+
+      double errorsVariance = Statistics.Variance(errors);
+      double originalsVariance = Statistics.Variance(originalTargetVariableValues);
+      double quality = 1 - errorsVariance / originalsVariance;
+
+      if(double.IsNaN(quality) || double.IsInfinity(quality)) {
+        quality = double.MaxValue;
+      }
+
+      if(useEstimatedTargetValues) {
+        // restore original values of the target variable
+        for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) {
+          dataset.SetValue(sample, targetVariable, originalTargetVariableValues[sample - firstSampleIndex]);
+        }
+      }
+
+      scope.AddVariable(new HeuristicLab.Core.Variable("Quality", new DoubleData(quality)));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorGroup.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorGroup.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorGroup.cs	(revision 2)
@@ -0,0 +1,323 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.StructureIdentification {
+  public class GPOperatorGroup : OperatorGroup {
+
+    public GPOperatorGroup()
+      : base() {
+    }
+
+    public override void AddOperator(IOperator op) {
+      base.AddOperator(op);
+
+      var localVariableInfos = op.VariableInfos.Where(f => f.Local);
+
+      if(op.GetVariable(GPOperatorLibrary.MANIPULATION) == null) {
+        CombinedOperator manipulationOperator = new CombinedOperator();
+        SequentialProcessor manipulationSequence = new SequentialProcessor();
+        foreach(IVariableInfo variableInfo in localVariableInfos) {
+          IOperator manipulator = GetDefaultManipulationOperator(variableInfo);
+          if (manipulator != null) {
+            manipulationSequence.AddSubOperator(manipulator);
+          }
+        }
+        if(manipulationSequence.SubOperators.Count > 0) {
+          op.AddVariable(new Variable(GPOperatorLibrary.MANIPULATION, manipulationOperator));
+
+          manipulationOperator.OperatorGraph.AddOperator(manipulationSequence);
+          manipulationOperator.OperatorGraph.InitialOperator = manipulationSequence;
+          foreach(IOperator subOp in manipulationSequence.SubOperators) {
+            manipulationOperator.OperatorGraph.AddOperator(subOp);
+          }
+        }
+      }
+
+      if(op.GetVariable(GPOperatorLibrary.INITIALIZATION) == null) {
+        CombinedOperator initOperator = new CombinedOperator();
+        SequentialProcessor initSequence = new SequentialProcessor();
+        foreach(IVariableInfo variableInfo in localVariableInfos) {
+          IOperator initializer = GetDefaultInitOperator(variableInfo);
+          if (initializer != null) {
+            initSequence.AddSubOperator(initializer);
+          }
+        }
+        if(initSequence.SubOperators.Count > 0) {
+          op.AddVariable(new Variable(GPOperatorLibrary.INITIALIZATION, initOperator));
+          initOperator.OperatorGraph.AddOperator(initSequence);
+          initOperator.OperatorGraph.InitialOperator = initSequence;
+          foreach(IOperator subOp in initSequence.SubOperators) {
+            initOperator.OperatorGraph.AddOperator(subOp);
+          }
+        }
+      }
+
+      // add a new typeid if necessary
+      if(op.GetVariable(GPOperatorLibrary.TYPE_ID) == null) {
+        op.AddVariable(new Variable(GPOperatorLibrary.TYPE_ID, new StringData(Guid.NewGuid().ToString())));
+      }
+
+      if(op.GetVariable(GPOperatorLibrary.MIN_TREE_HEIGHT) == null) {
+        op.AddVariable(new Variable(GPOperatorLibrary.MIN_TREE_HEIGHT, new IntData(-1)));
+      }
+      if(op.GetVariable(GPOperatorLibrary.MIN_TREE_SIZE) == null) {
+        op.AddVariable(new Variable(GPOperatorLibrary.MIN_TREE_SIZE, new IntData(-1)));
+      }
+      if(op.GetVariable(GPOperatorLibrary.ALLOWED_SUBOPERATORS) == null) {
+        op.AddVariable(new Variable(GPOperatorLibrary.ALLOWED_SUBOPERATORS, new ItemList()));
+      }
+
+      RecalculateAllowedSuboperators();
+      RecalculateMinimalTreeBounds();
+
+      OnOperatorAdded(op);
+    }
+
+
+    private Dictionary<string, int> minTreeHeight = new Dictionary<string, int>();
+    private Dictionary<string, int> minTreeSize = new Dictionary<string, int>();
+    private SubOperatorsConstraintAnalyser constraintAnalyser = new SubOperatorsConstraintAnalyser();
+
+    private void RecalculateAllowedSuboperators() {
+      foreach(IOperator op in Operators) {
+        RecalculateAllowedSuboperators(op);
+      }
+    }
+
+    private void RecalculateAllowedSuboperators(IOperator op) {
+      constraintAnalyser.AllPossibleOperators = Operators;
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(op, out minArity, out maxArity);
+      ItemList slotsList = (ItemList)op.GetVariable(GPOperatorLibrary.ALLOWED_SUBOPERATORS).Value;
+      slotsList.Clear();
+      for(int i = 0; i < maxArity; i++) {
+        ItemList slotList = new ItemList();
+        foreach(IOperator allowedOp in constraintAnalyser.GetAllowedOperators(op, i)) {
+          slotList.Add(allowedOp);
+        }
+        slotsList.Add(slotList);
+      }
+    }
+
+
+    private void RecalculateMinimalTreeBounds() {
+      minTreeHeight.Clear();
+      minTreeSize.Clear();
+      constraintAnalyser.AllPossibleOperators = Operators;
+
+      foreach(IOperator op in Operators) {
+        ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_HEIGHT).Value).Data = RecalculateMinimalTreeHeight(op);
+        ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_SIZE).Value).Data = RecalculateMinimalTreeSize(op);
+      }
+    }
+
+    private int RecalculateMinimalTreeSize(IOperator op) {
+      string typeId = GetTypeId(op);
+      // check for memoized value
+      if(minTreeSize.ContainsKey(typeId)) {
+        return minTreeSize[typeId];
+      }
+
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(op, out minArity, out maxArity);
+      // no suboperators possible => minimalTreeSize == 1 (the current node)
+      if(minArity == 0 && maxArity == 0) {
+        minTreeSize[typeId] = 1;
+        return 1;
+      }
+
+      // when suboperators are necessary we have to find the smallest possible tree (recursively)
+      // the minimal size of the parent is 1 + the sum of the minimal sizes of all subtrees
+      int subTreeSizeSum = 0;
+
+      // mark the currently processed operator to prevent infinite recursions and stack overflow
+      minTreeSize[typeId] = 9999;
+      for(int i = 0; i < minArity; i++) {
+        // calculate the minTreeSize of all allowed sub-operators 
+        // if the list of allowed suboperators is empty because the operator needs suboperators 
+        // but there are no valid suboperators defined in the current group then we just use an impossible 
+        // tree size here to indicate that there was a problem.
+        // usually as more operators are added to the group the problem will be corrected (by adding the missing operator).
+        // however if the missing operator is never added the high min tree size here has the effect that this operator
+        // will not be included in generated subtrees because the resulting size would always be higher than a reasonably set 
+        // maximal tree size.
+        int minSubTreeSize = constraintAnalyser.GetAllowedOperators(op, i).Select(subOp => RecalculateMinimalTreeSize(subOp))
+          .Concat(Enumerable.Repeat(9999, 1)).Min();
+        subTreeSizeSum += minSubTreeSize;
+      }
+
+      minTreeSize[typeId] = subTreeSizeSum + 1;
+      return subTreeSizeSum + 1;
+    }
+
+
+    private int RecalculateMinimalTreeHeight(IOperator op) {
+      string typeId = GetTypeId(op);
+      // check for memoized value
+      if(minTreeHeight.ContainsKey(typeId)) {
+        return minTreeHeight[typeId];
+      }
+
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(op, out minArity, out maxArity);
+      // no suboperators possible => minimalTreeHeight == 1
+      if(minArity == 0 && maxArity == 0) {
+        minTreeHeight[typeId] = 1;
+        return 1;
+      }
+
+      // when suboperators are necessary we have to find the smallest possible tree (recursively)
+      // the minimal height of the parent is 1 + the height of the largest subtree
+      int maxSubTreeHeight = 0;
+
+      // mark the currently processed operator to prevent infinite recursions leading to stack overflow
+      minTreeHeight[typeId] = 9999;
+      for(int i = 0; i < minArity; i++) {
+        // calculate the minTreeHeight of all possible sub-operators.
+        // use the smallest possible subTree as lower bound for the subTreeHeight.
+        // if the list of allowed suboperators is empty because the operator needs suboperators 
+        // but there are no valid suboperators defined in the current group then we use an impossible tree height
+        // to indicate that there was a problem.
+        // usually as more operators are added to the group the problem will be corrected (by adding the missing operator).
+        // however if the missing operator is never added the high min tree height here has the effect that this operator
+        // will not be included in generated subtrees because the resulting (virtual) height would always be higher than a reasonably set 
+        // maximal tree height.
+        int minSubTreeHeight = constraintAnalyser.GetAllowedOperators(op, i).Select(subOp => RecalculateMinimalTreeHeight(subOp))
+          .Concat(Enumerable.Repeat(9999, 1)).Min();
+
+        // if the smallest height of this subtree is larger than all other subtrees before we have to update the min height of the parent
+        if(minSubTreeHeight > maxSubTreeHeight) {
+          maxSubTreeHeight = minSubTreeHeight;
+        }
+      }
+
+      minTreeHeight[typeId] = maxSubTreeHeight + 1;
+      return maxSubTreeHeight + 1;
+    }
+
+    private void GetMinMaxArity(IOperator op, out int minArity, out int maxArity) {
+      foreach(IConstraint constraint in op.Constraints) {
+        NumberOfSubOperatorsConstraint theConstraint = constraint as NumberOfSubOperatorsConstraint;
+        if(theConstraint != null) {
+          minArity = theConstraint.MinOperators.Data;
+          maxArity = theConstraint.MaxOperators.Data;
+          return;
+        }
+      }
+      // the default arity is 2
+      minArity = 2;
+      maxArity = 2;
+    }
+
+    private string GetTypeId(IOperator op) {
+      return ((StringData)op.GetVariable(GPOperatorLibrary.TYPE_ID).Value).Data;
+    }
+
+
+    private IOperator GetDefaultManipulationOperator(IVariableInfo variableInfo) {
+      IOperator shaker;
+      if(variableInfo.DataType == typeof(ConstrainedDoubleData) ||
+        variableInfo.DataType == typeof(ConstrainedIntData) ||
+        variableInfo.DataType == typeof(DoubleData) ||
+        variableInfo.DataType == typeof(IntData)) {
+        shaker = new UniformRandomAdder();
+      } else {
+        return null;
+      }
+      shaker.GetVariableInfo("Value").ActualName = variableInfo.FormalName;
+      shaker.Name = variableInfo.FormalName + " manipulation";
+      return shaker;
+    }
+
+    private IOperator GetDefaultInitOperator(IVariableInfo variableInfo) {
+      IOperator shaker;
+      if(variableInfo.DataType == typeof(ConstrainedDoubleData) ||
+        variableInfo.DataType == typeof(ConstrainedIntData) ||
+        variableInfo.DataType == typeof(DoubleData) ||
+        variableInfo.DataType == typeof(IntData)) {
+        shaker = new UniformRandomizer();
+      } else {
+        return null;
+      }
+      shaker.GetVariableInfo("Value").ActualName = variableInfo.FormalName;
+      shaker.Name = variableInfo.FormalName + " initialization";
+      return shaker;
+    }
+
+
+    public override void AddSubGroup(IOperatorGroup group) {
+      throw new NotSupportedException();
+    }
+
+    public override void RemoveOperator(IOperator op) {
+      base.RemoveOperator(op);
+
+      op.RemoveVariable(GPOperatorLibrary.MANIPULATION);
+      op.RemoveVariable(GPOperatorLibrary.INITIALIZATION);
+      op.RemoveVariable(GPOperatorLibrary.TYPE_ID);
+      op.RemoveVariable(GPOperatorLibrary.MIN_TREE_SIZE);
+      op.RemoveVariable(GPOperatorLibrary.MIN_TREE_HEIGHT);
+      op.RemoveVariable(GPOperatorLibrary.ALLOWED_SUBOPERATORS);
+
+      OnOperatorRemoved(op);
+    }
+
+    public override void RemoveSubGroup(IOperatorGroup group) {
+      throw new NotSupportedException();
+    }
+
+    public event EventHandler OperatorAdded;
+    public event EventHandler OperatorRemoved;
+
+    protected virtual void OnOperatorAdded(IOperator op) {
+      if(OperatorAdded != null) {
+        OperatorAdded(this, new OperatorEventArgs(op));
+      }
+    }
+    protected virtual void OnOperatorRemoved(IOperator op) {
+      if(OperatorRemoved != null) {
+        OperatorRemoved(this, new OperatorEventArgs(op));
+      }
+    }
+  }
+
+
+  internal class OperatorEventArgs : EventArgs {
+    public IOperator op;
+
+    public OperatorEventArgs(IOperator op) {
+      this.op = op;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibrary.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibrary.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibrary.cs	(revision 2)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using System.Xml;
+
+namespace HeuristicLab.StructureIdentification {
+  public class GPOperatorLibrary : ItemBase, IOperatorLibrary, IEditable  {
+    // constants for variable names
+    internal const string MANIPULATION = "Manipulation";
+    internal const string INITIALIZATION = "Initialization";
+    internal const string TYPE_ID = "TypeId";
+    internal const string MIN_TREE_HEIGHT = "MinTreeHeight";
+    internal const string MIN_TREE_SIZE = "MinTreeSize";
+    internal const string ALLOWED_SUBOPERATORS = "AllowedSuboperators";
+
+    private GPOperatorGroup group;
+
+    public GPOperatorGroup GPOperatorGroup {
+      get { return group; }
+    }
+    #region IOperatorLibrary Members
+
+    public IOperatorGroup Group {
+      get { return group; }
+    }
+
+    #endregion
+
+
+    public GPOperatorLibrary()
+      : base() {
+      group = new GPOperatorGroup();
+    }
+
+    public override IView CreateView() {
+      return new GPOperatorLibraryEditor(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      GPOperatorLibrary clone = (GPOperatorLibrary)base.Clone(clonedObjects);
+      clone.group = (GPOperatorGroup)group.Clone(clonedObjects);
+      return clone;
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Group", group, document, persistedObjects));
+      return node;
+    }
+
+    public override void Populate(System.Xml.XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      group = (GPOperatorGroup) PersistenceManager.Restore(node.SelectSingleNode("Group"), restoredObjects);
+    }
+    #endregion
+
+    #region IEditable Members
+
+    public IEditor CreateEditor() {
+      return new GPOperatorLibraryEditor(this);
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.Designer.cs	(revision 2)
@@ -0,0 +1,238 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.StructureIdentification {
+  partial class GPOperatorLibraryEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.operatorLibraryEditor = new HeuristicLab.Core.OperatorLibraryEditor();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorLibraryTabPage = new System.Windows.Forms.TabPage();
+      this.initializationTabPage = new System.Windows.Forms.TabPage();
+      this.initSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.initListView = new System.Windows.Forms.ListView();
+      this.initVariableView = new HeuristicLab.Core.VariableView();
+      this.mutationTabPage = new System.Windows.Forms.TabPage();
+      this.mutationSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.mutationVariableView = new HeuristicLab.Core.VariableView();
+      this.mutationListView = new System.Windows.Forms.ListView();
+      this.tabControl.SuspendLayout();
+      this.operatorLibraryTabPage.SuspendLayout();
+      this.initializationTabPage.SuspendLayout();
+      this.initSplitContainer.Panel1.SuspendLayout();
+      this.initSplitContainer.Panel2.SuspendLayout();
+      this.initSplitContainer.SuspendLayout();
+      this.mutationTabPage.SuspendLayout();
+      this.mutationSplitContainer.Panel1.SuspendLayout();
+      this.mutationSplitContainer.Panel2.SuspendLayout();
+      this.mutationSplitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // operatorLibraryEditor
+      // 
+      this.operatorLibraryEditor.Caption = "Operator Library";
+      this.operatorLibraryEditor.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryEditor.Filename = null;
+      this.operatorLibraryEditor.Location = new System.Drawing.Point(3, 3);
+      this.operatorLibraryEditor.Name = "operatorLibraryEditor";
+      this.operatorLibraryEditor.OperatorLibrary = null;
+      this.operatorLibraryEditor.Size = new System.Drawing.Size(663, 529);
+      this.operatorLibraryEditor.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.operatorLibraryTabPage);
+      this.tabControl.Controls.Add(this.initializationTabPage);
+      this.tabControl.Controls.Add(this.mutationTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(677, 561);
+      this.tabControl.TabIndex = 1;
+      // 
+      // operatorLibraryTabPage
+      // 
+      this.operatorLibraryTabPage.Controls.Add(this.operatorLibraryEditor);
+      this.operatorLibraryTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorLibraryTabPage.Name = "operatorLibraryTabPage";
+      this.operatorLibraryTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorLibraryTabPage.Size = new System.Drawing.Size(669, 535);
+      this.operatorLibraryTabPage.TabIndex = 0;
+      this.operatorLibraryTabPage.Text = "Operator Library";
+      this.operatorLibraryTabPage.UseVisualStyleBackColor = true;
+      // 
+      // initializationTabPage
+      // 
+      this.initializationTabPage.Controls.Add(this.initSplitContainer);
+      this.initializationTabPage.Location = new System.Drawing.Point(4, 22);
+      this.initializationTabPage.Name = "initializationTabPage";
+      this.initializationTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.initializationTabPage.Size = new System.Drawing.Size(669, 535);
+      this.initializationTabPage.TabIndex = 1;
+      this.initializationTabPage.Text = "Initialization";
+      this.initializationTabPage.UseVisualStyleBackColor = true;
+      // 
+      // initSplitContainer
+      // 
+      this.initSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.initSplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.initSplitContainer.Name = "initSplitContainer";
+      // 
+      // initSplitContainer.Panel1
+      // 
+      this.initSplitContainer.Panel1.Controls.Add(this.initListView);
+      // 
+      // initSplitContainer.Panel2
+      // 
+      this.initSplitContainer.Panel2.Controls.Add(this.initVariableView);
+      this.initSplitContainer.Size = new System.Drawing.Size(663, 529);
+      this.initSplitContainer.SplitterDistance = 221;
+      this.initSplitContainer.TabIndex = 0;
+      // 
+      // initListView
+      // 
+      this.initListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.initListView.Location = new System.Drawing.Point(0, 0);
+      this.initListView.Name = "initListView";
+      this.initListView.Size = new System.Drawing.Size(221, 529);
+      this.initListView.TabIndex = 0;
+      this.initListView.UseCompatibleStateImageBehavior = false;
+      this.initListView.View = System.Windows.Forms.View.List;
+      this.initListView.SelectedIndexChanged += new System.EventHandler(this.initListView_SelectedIndexChanged);
+      // 
+      // initVariableView
+      // 
+      this.initVariableView.Caption = "Variable";
+      this.initVariableView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.initVariableView.Location = new System.Drawing.Point(0, 0);
+      this.initVariableView.Name = "initVariableView";
+      this.initVariableView.Size = new System.Drawing.Size(438, 529);
+      this.initVariableView.TabIndex = 0;
+      this.initVariableView.Variable = null;
+      // 
+      // mutationTabPage
+      // 
+      this.mutationTabPage.Controls.Add(this.mutationSplitContainer);
+      this.mutationTabPage.Location = new System.Drawing.Point(4, 22);
+      this.mutationTabPage.Name = "mutationTabPage";
+      this.mutationTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.mutationTabPage.Size = new System.Drawing.Size(669, 535);
+      this.mutationTabPage.TabIndex = 2;
+      this.mutationTabPage.Text = "Mutation";
+      this.mutationTabPage.UseVisualStyleBackColor = true;
+      // 
+      // mutationSplitContainer
+      // 
+      this.mutationSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.mutationSplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.mutationSplitContainer.Name = "mutationSplitContainer";
+      // 
+      // mutationSplitContainer.Panel1
+      // 
+      this.mutationSplitContainer.Panel1.Controls.Add(this.mutationListView);
+      // 
+      // mutationSplitContainer.Panel2
+      // 
+      this.mutationSplitContainer.Panel2.Controls.Add(this.mutationVariableView);
+      this.mutationSplitContainer.Size = new System.Drawing.Size(663, 529);
+      this.mutationSplitContainer.SplitterDistance = 221;
+      this.mutationSplitContainer.TabIndex = 0;
+      // 
+      // mutationVariableView
+      // 
+      this.mutationVariableView.Caption = "Variable";
+      this.mutationVariableView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.mutationVariableView.Location = new System.Drawing.Point(0, 0);
+      this.mutationVariableView.Name = "mutationVariableView";
+      this.mutationVariableView.Size = new System.Drawing.Size(438, 529);
+      this.mutationVariableView.TabIndex = 0;
+      this.mutationVariableView.Variable = null;
+      // 
+      // mutationListView
+      // 
+      this.mutationListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.mutationListView.Location = new System.Drawing.Point(0, 0);
+      this.mutationListView.MultiSelect = false;
+      this.mutationListView.Name = "mutationListView";
+      this.mutationListView.Size = new System.Drawing.Size(221, 529);
+      this.mutationListView.TabIndex = 0;
+      this.mutationListView.UseCompatibleStateImageBehavior = false;
+      this.mutationListView.View = System.Windows.Forms.View.List;
+      this.mutationListView.SelectedIndexChanged += new System.EventHandler(this.mutationListView_SelectedIndexChanged);
+      // 
+      // GPOperatorLibraryEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "GPOperatorLibraryEditor";
+      this.Size = new System.Drawing.Size(677, 561);
+      this.tabControl.ResumeLayout(false);
+      this.operatorLibraryTabPage.ResumeLayout(false);
+      this.initializationTabPage.ResumeLayout(false);
+      this.initSplitContainer.Panel1.ResumeLayout(false);
+      this.initSplitContainer.Panel2.ResumeLayout(false);
+      this.initSplitContainer.ResumeLayout(false);
+      this.mutationTabPage.ResumeLayout(false);
+      this.mutationSplitContainer.Panel1.ResumeLayout(false);
+      this.mutationSplitContainer.Panel2.ResumeLayout(false);
+      this.mutationSplitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Core.OperatorLibraryEditor operatorLibraryEditor;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorLibraryTabPage;
+    private System.Windows.Forms.TabPage initializationTabPage;
+    private System.Windows.Forms.TabPage mutationTabPage;
+    private System.Windows.Forms.SplitContainer initSplitContainer;
+    private System.Windows.Forms.SplitContainer mutationSplitContainer;
+    private HeuristicLab.Core.VariableView initVariableView;
+    private HeuristicLab.Core.VariableView mutationVariableView;
+    private System.Windows.Forms.ListView initListView;
+    private System.Windows.Forms.ListView mutationListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.cs	(revision 2)
@@ -0,0 +1,153 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using System.Diagnostics;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.StructureIdentification {
+  public partial class GPOperatorLibraryEditor : EditorBase {
+    public IOperatorLibrary OperatorLibrary {
+      get { return (IOperatorLibrary)Item; }
+      set { base.Item = value; }
+    }
+
+    public GPOperatorLibraryEditor(GPOperatorLibrary library)
+      : base() {
+      InitializeComponent();
+      OperatorLibrary = library;
+      operatorLibraryEditor.OperatorLibrary = library;
+
+      library.GPOperatorGroup.OperatorAdded += new EventHandler(GPOperatorLibraryView_OperatorAdded);
+      library.GPOperatorGroup.OperatorRemoved += new EventHandler(GPOperatorGroup_OperatorRemoved);
+
+      mutationVariableView.Enabled = false;
+      initVariableView.Enabled = false;
+
+      foreach(IOperator op in library.Group.Operators) {
+        if(op.GetVariable(GPOperatorLibrary.MANIPULATION) != null) {
+          ListViewItem item = new ListViewItem();
+          item.Text = op.Name;
+          item.Name = op.Name;
+          item.Tag = op;
+          mutationListView.Items.Add(item);
+        }
+        if(op.GetVariable(GPOperatorLibrary.INITIALIZATION) != null) {
+          ListViewItem item = new ListViewItem();
+          item.Name = op.Name;
+          item.Text = op.Name;
+          item.Tag = op;
+          initListView.Items.Add(item);
+        }
+      }
+    }
+
+
+    private void GPOperatorLibraryView_OperatorAdded(object sender, EventArgs e) {
+      IOperator op = ((OperatorEventArgs)e).op;
+      if (op.GetVariable(GPOperatorLibrary.MANIPULATION) != null) {
+        ListViewItem operatorMutationItem = new ListViewItem();
+        operatorMutationItem.Name = op.Name;
+        operatorMutationItem.Text = op.Name;
+        operatorMutationItem.Tag = op;
+        mutationListView.Items.Add(operatorMutationItem);
+      }
+
+      if (op.GetVariable(GPOperatorLibrary.INITIALIZATION) != null) {
+        ListViewItem operatorInitItem = new ListViewItem();
+        operatorInitItem.Name = op.Name;
+        operatorInitItem.Text = op.Name;
+        operatorInitItem.Tag = op;
+        initListView.Items.Add(operatorInitItem);
+      }
+
+      op.NameChanged += new EventHandler(op_NameChanged);
+      Refresh();
+    }
+
+    private void op_NameChanged(object sender, EventArgs e) {
+      IOperator srcOp = (IOperator)sender;
+      foreach(ListViewItem item in mutationListView.Items) {
+        if(item.Tag == srcOp) {
+          item.Name = srcOp.Name;
+          item.Text = srcOp.Name;
+          break;
+        }
+      }
+      foreach(ListViewItem item in initListView.Items) {
+        if(item.Tag == srcOp) {
+          item.Name = srcOp.Name;
+          item.Text = srcOp.Name;
+          break;
+        }
+      }
+    }
+
+
+    private void GPOperatorGroup_OperatorRemoved(object sender, EventArgs e) {
+      IOperator op = ((OperatorEventArgs)e).op;
+
+      foreach(ListViewItem item in mutationListView.Items) {
+        if(item.Tag == op) {
+          mutationListView.Items.Remove(item);
+          break;
+        }
+      }
+
+      foreach(ListViewItem item in initListView.Items) {
+        if(item.Tag == op) {
+          initListView.Items.Remove(item);
+          break;
+        }
+      }
+    }
+
+    private void mutationListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if(mutationListView.SelectedItems.Count>0 && mutationListView.SelectedItems[0].Tag != null) {
+        IVariable variable = ((IOperator)mutationListView.SelectedItems[0].Tag).GetVariable(GPOperatorLibrary.MANIPULATION);
+        mutationVariableView.Enabled = true;
+        mutationVariableView.Variable = variable;
+      } else {
+        mutationVariableView.Enabled = false;
+      }
+    }
+
+    private void initListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if(initListView.SelectedItems.Count>0 && initListView.SelectedItems[0].Tag != null) {
+        IVariable variable = ((IOperator)initListView.SelectedItems[0].Tag).GetVariable(GPOperatorLibrary.INITIALIZATION);
+        initVariableView.Enabled = true;
+        initVariableView.Variable = variable;
+      } else {
+        initVariableView.Enabled = false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/GPOperatorLibraryEditor.resx	(revision 2)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj	(revision 2)
@@ -0,0 +1,142 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5948F299-0A5E-43B9-8F17-2D15298EEC34}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.StructureIdentification</RootNamespace>
+    <AssemblyName>HeuristicLab.StructureIdentification</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.XML" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Evaluation\CoefficientOfDeterminationEvaluator.cs" />
+    <Compile Include="Evaluation\FunctionEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Evaluation\MeanSquaredErrorEvaluator.cs" />
+    <Compile Include="Evaluation\VarianceAccountedForEvaluator.cs" />
+    <Compile Include="GPOperatorGroup.cs" />
+    <Compile Include="GPOperatorLibrary.cs" />
+    <Compile Include="GPOperatorLibraryEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GPOperatorLibraryEditor.designer.cs">
+      <DependentUpon>GPOperatorLibraryEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Manipulation\ChangeNodeTypeManipulation.cs" />
+    <Compile Include="Manipulation\CutOutNodeManipulation.cs" />
+    <Compile Include="Manipulation\DeleteSubTreeManipulation.cs" />
+    <Compile Include="Manipulation\FullTreeShaker.cs" />
+    <Compile Include="Manipulation\OnePointShaker.cs" />
+    <Compile Include="Manipulation\SubstituteSubTreeManipulation.cs" />
+    <Compile Include="PopulationAnalyser.cs" />
+    <Compile Include="HeuristicLabStructureIdentificationPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RandomTreeCreator.cs" />
+    <Compile Include="Recombination\SinglePointCrossOver.cs" />
+    <Compile Include="TreeGardener.cs" />
+    <Compile Include="StructIdProblemInjector.cs" />
+    <Compile Include="StructIdProblemInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StructIdProblemInjectorView.Designer.cs">
+      <DependentUpon>StructIdProblemInjectorView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataAnalysis\HeuristicLab.DataAnalysis.csproj">
+      <Project>{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}</Project>
+      <Name>HeuristicLab.DataAnalysis</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Functions\HeuristicLab.Functions.csproj">
+      <Project>{B95CA6E2-34BC-4430-994D-BD6E99375319}</Project>
+      <Name>HeuristicLab.Functions</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Random\HeuristicLab.Random.csproj">
+      <Project>{47019A74-F7F7-482E-83AA-D3F4F777E879}</Project>
+      <Name>HeuristicLab.Random</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Selection\HeuristicLab.Selection.csproj">
+      <Project>{F7CF0571-25CB-43D5-8443-0843A1E2861A}</Project>
+      <Name>HeuristicLab.Selection</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="GPOperatorLibraryEditor.resx">
+      <DependentUpon>GPOperatorLibraryEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StructIdProblemInjectorView.resx">
+      <DependentUpon>StructIdProblemInjectorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLabStructureIdentificationPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLabStructureIdentificationPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLabStructureIdentificationPlugin.cs	(revision 2)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.StructureIdentification {
+  [ClassInfo(Name = "HeuristicLab.StructureIdentification")]
+  [PluginFile(Filename = "HeuristicLab.StructureIdentification.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Constraints")]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.DataAnalysis")]
+  [Dependency(Dependency = "HeuristicLab.Functions")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  [Dependency(Dependency = "HeuristicLab.Selection")]
+  [Dependency(Dependency = "HeuristicLab.Random")]
+  public class HeuristicLabStructureIdentificationPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/ChangeNodeTypeManipulation.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/ChangeNodeTypeManipulation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/ChangeNodeTypeManipulation.cs	(revision 2)
@@ -0,0 +1,210 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.StructureIdentification {
+  public class ChangeNodeTypeManipulation : OperatorBase {
+    public ChangeNodeTypeManipulation()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Uniform random number generator", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "The maximal allowed size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BalanceTrees", "Determines if the trees should be balanced", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The tree to mutate", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.In));
+    }
+
+
+    public override IOperation Apply(IScope scope) {
+      IOperator rootOperator = GetVariableValue<IOperator>("OperatorTree", scope, false);
+      MersenneTwister random = GetVariableValue<MersenneTwister>("Random", scope, true);
+      GPOperatorLibrary library = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      bool balanceTrees = GetVariableValue<BoolData>("BalanceTrees", scope, true).Data;
+      IntData treeSize = GetVariableValue<IntData>("TreeSize", scope, false);
+      IntData treeHeight = GetVariableValue<IntData>("TreeHeight", scope, false);
+      int maxTreeSize = GetVariableValue<IntData>("MaxTreeSize", scope, true).Data;
+      int maxTreeHeight = GetVariableValue<IntData>("MaxTreeHeight", scope, true).Data;
+
+      TreeGardener gardener = new TreeGardener(random, library);
+
+      IOperator parent = gardener.GetRandomParentNode(rootOperator);
+
+      IOperator selectedChild;
+      int selectedChildIndex;
+      if (parent == null) {
+        selectedChildIndex = 0;
+        selectedChild = rootOperator;
+      } else {
+        selectedChildIndex = random.Next(parent.SubOperators.Count);
+        selectedChild = parent.SubOperators[selectedChildIndex];
+      }
+
+      if (selectedChild.SubOperators.Count == 0) {
+        IOperator newTerminal = ChangeTerminalType(parent, selectedChild, selectedChildIndex, gardener, random);
+
+        if (parent == null) {
+          // no parent means the new child is the initial operator
+          // and we have to update the value in the variable
+          scope.GetVariable("OperatorTree").Value = newTerminal;
+        } else {
+          parent.RemoveSubOperator(selectedChildIndex);
+          parent.AddSubOperator(newTerminal, selectedChildIndex);
+          // updating the variable is not necessary because it stays the same
+        }
+
+        // size and height stays the same when changing a terminal so no need to update the variables
+        // schedule an operation to initialize the new terminal
+        return gardener.CreateInitializationOperation(gardener.GetAllOperators(newTerminal), scope);
+      } else {
+        List<IOperator> uninitializedOperators;
+        IOperator newFunction = ChangeFunctionType(parent, selectedChild, selectedChildIndex, gardener, random, balanceTrees, out uninitializedOperators);
+
+        if (parent == null) {
+          // no parent means the new function is the initial operator
+          // and we have to update the value in the variable
+          scope.GetVariable("OperatorTree").Value = newFunction;
+          rootOperator = newFunction;
+        } else {
+          // remove the old child
+          parent.RemoveSubOperator(selectedChildIndex);
+          // add the new child as sub-tree of parent
+          parent.AddSubOperator(newFunction, selectedChildIndex);
+        }
+
+        // recalculate size and height
+        treeSize.Data = gardener.GetTreeSize(rootOperator);
+        treeHeight.Data = gardener.GetTreeHeight(rootOperator);
+
+        // check if the size of the new tree is still in the allowed bounds
+        if (treeHeight.Data > maxTreeHeight ||
+          treeSize.Data > maxTreeSize) {
+          throw new InvalidProgramException();
+        }
+
+        // check if whole tree is ok
+        if (!gardener.IsValidTree(rootOperator)) {
+          throw new InvalidProgramException();
+        }
+
+        // return a composite operation that initializes all created sub-trees
+        return gardener.CreateInitializationOperation(uninitializedOperators, scope);
+      }
+    }
+
+
+    private IOperator ChangeTerminalType(IOperator parent, IOperator child, int childIndex, TreeGardener gardener, MersenneTwister random) {
+
+      IList<IOperator> allowedChildren;
+      if (parent == null) {
+        allowedChildren = gardener.Terminals;
+      } else {
+        SubOperatorsConstraintAnalyser analyser = new SubOperatorsConstraintAnalyser();
+        analyser.AllPossibleOperators = gardener.Terminals;
+        allowedChildren = analyser.GetAllowedOperators(parent, childIndex);
+      }
+
+      // selecting from the terminals should always work since the current child was also a terminal
+      // so in the worst case we will just create a new terminal of the same type again.
+      return gardener.CreateRandomTree((IOperator)allowedChildren[random.Next(allowedChildren.Count)].Clone(), 1, 1, false);
+    }
+
+    private IOperator ChangeFunctionType(IOperator parent, IOperator child, int childIndex, TreeGardener gardener, MersenneTwister random,
+      bool balanceTrees, out List<IOperator> uninitializedOperators) {
+      // since there are suboperators, we have to check which 
+      // and how many of the existing suboperators we can reuse
+
+      // let's choose the operator we want to use instead of the old child. For this we have to determine the
+      // pool of allowed operators based on constraints of the parent if there is one.
+      IList<IOperator> allowedSubOperators;
+      SubOperatorsConstraintAnalyser analyser = new SubOperatorsConstraintAnalyser();
+      analyser.AllPossibleOperators = gardener.AllOperators;
+      if (parent == null) {
+        allowedSubOperators = gardener.AllOperators;
+      } else {
+        allowedSubOperators = analyser.GetAllowedOperators(parent, childIndex);
+      }
+
+      // try to make a tree with the same arity as the old child.
+      int actualArity = child.SubOperators.Count;
+      // arity of the selected operator
+      int minArity;
+      int maxArity;
+
+      allowedSubOperators = allowedSubOperators.Where(f => {
+        gardener.GetMinMaxArity(f, out minArity, out maxArity);
+        return minArity <= actualArity;
+      }).ToList();
+
+      IOperator newOperator = (IOperator)allowedSubOperators[random.Next(allowedSubOperators.Count)].Clone();
+
+      gardener.GetMinMaxArity(newOperator, out minArity, out maxArity);
+      // if the old child had too many sub-operators then make the new child with the maximal arity
+      if (actualArity > maxArity)
+        actualArity = maxArity;
+
+      // get the allowed size and height for new sub-trees
+      // use the size of the smallest subtree as the maximal allowed size for new subtrees to
+      // prevent that we ever create trees over the MaxTreeSize limit
+      int maxSubTreeSize = child.SubOperators.Select(subOp => gardener.GetTreeSize(subOp)).Min();
+      int maxSubTreeHeight = gardener.GetTreeHeight(child) - 1;
+
+      // create a list that holds old sub-trees that we can reuse in the new tree
+      List<IOperator> availableSubOperators = new List<IOperator>(child.SubOperators);
+      List<IOperator> freshSubTrees = new List<IOperator>() { newOperator };
+
+      // randomly select the suboperators that we keep
+      for (int i = 0; i < actualArity; i++) {
+        // fill all sub-operator slots of the new operator
+        // if for a given slot i there are existing sub-operators that can be used in that slot
+        // then use a random existing sub-operator. When there are no existing sub-operators
+        // that fit in the given slot then create a new random tree and use it for the slot
+        IList<IOperator> allowedOperators = analyser.GetAllowedOperators(newOperator, i);
+        var matchingOperators = availableSubOperators.Where(subOp => allowedOperators.Contains(subOp, new TreeGardener.OperatorEqualityComparer()));
+
+        if (matchingOperators.Count() > 0) {
+          IOperator selectedSubOperator = matchingOperators.ElementAt(random.Next(matchingOperators.Count()));
+          // we can just add it as suboperator
+          newOperator.AddSubOperator(selectedSubOperator, i);
+          availableSubOperators.Remove(selectedSubOperator); // the operator shouldn't be available for the following slots
+        } else {
+          IOperator freshOperatorTree = gardener.CreateRandomTree(allowedOperators, maxSubTreeSize, maxSubTreeHeight, balanceTrees);
+          freshSubTrees.AddRange(gardener.GetAllOperators(freshOperatorTree));
+
+          newOperator.AddSubOperator(freshOperatorTree, i);
+        }
+      }
+
+      uninitializedOperators = freshSubTrees;
+      return newOperator;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/CutOutNodeManipulation.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/CutOutNodeManipulation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/CutOutNodeManipulation.cs	(revision 2)
@@ -0,0 +1,169 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using System;
+
+namespace HeuristicLab.StructureIdentification {
+  public class CutOutNodeManipulation : OperatorBase {
+    public override string Description {
+      get {
+        return @"Takes a tree, selects a random node of the tree and then tries to replace a random child 
+of that node with one of the childs of the selected child.
+
+               O                             O
+              / \                           / \
+             O   X                         O   2
+                / \    2 is selected =>       / \
+               1   2                         4   5
+              /   / \
+             3   4   5
+";
+      }
+    }
+
+    public CutOutNodeManipulation()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Uniform random number generator", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "The maximal allowed size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BalanceTrees", "Determines if the trees should be balanced", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The tree to mutate", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.In));
+    }
+
+
+    public override IOperation Apply(IScope scope) {
+      IOperator rootOperator = GetVariableValue<IOperator>("OperatorTree", scope, true);
+      MersenneTwister random = GetVariableValue<MersenneTwister>("Random", scope, true);
+      GPOperatorLibrary library = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      int maxTreeHeight = GetVariableValue<IntData>("MaxTreeHeight", scope, true).Data;
+      int maxTreeSize = GetVariableValue<IntData>("MaxTreeSize", scope, true).Data;
+      bool balanceTrees = GetVariableValue<BoolData>("BalanceTrees", scope, true).Data;
+
+      TreeGardener gardener = new TreeGardener(random, library);
+      IOperator parent = gardener.GetRandomParentNode(rootOperator);
+      // parent == null means we should cut out the root node
+      // => return a random suboperator of the root
+      if (parent == null) {
+        // when there are suboperators then replace the old operator with a random suboperator
+        if (rootOperator.SubOperators.Count > 0) {
+          rootOperator = rootOperator.SubOperators[random.Next(rootOperator.SubOperators.Count)];
+
+          GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(rootOperator);
+          GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(rootOperator);
+
+          // this is not really necessary (we can leave it in until the operator is stable)
+          if (!gardener.IsValidTree(rootOperator)) {
+            throw new InvalidProgramException();
+          }
+
+          // update the variable
+          scope.GetVariable("OperatorTree").Value = rootOperator;
+          if (!gardener.IsValidTree(rootOperator)) {
+            throw new InvalidProgramException();
+          }
+
+
+          // the tree is already initialized so we don't have to schedule initialization operations
+          return null;
+        } else {
+          // create a new random tree
+          IOperator newOperator = gardener.CreateRandomTree(gardener.AllOperators, maxTreeSize, maxTreeHeight, balanceTrees);
+
+          GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(newOperator);
+          GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(newOperator);
+
+          if (!gardener.IsValidTree(newOperator)) {
+            throw new InvalidProgramException();
+          }
+
+          // update the variable
+          scope.GetVariable("OperatorTree").Value = newOperator;
+
+          if (!gardener.IsValidTree(newOperator)) {
+            throw new InvalidProgramException();
+          }
+
+          // schedule an operation to initialize the whole operator graph
+          return gardener.CreateInitializationOperation(gardener.GetAllOperators(newOperator), scope);
+        }
+      }
+
+      int childIndex = random.Next(parent.SubOperators.Count);
+      IOperator child = parent.SubOperators[childIndex];
+
+      // match the suboperators of the child with the allowed suboperators of the parent
+      IOperator[] possibleChilds = gardener.GetAllowedSubOperators(parent, childIndex).SelectMany(allowedOp => child.SubOperators
+        .Where(subOp => ((StringData)subOp.GetVariable(GPOperatorLibrary.TYPE_ID).Value).Data ==
+          ((StringData)allowedOp.GetVariable(GPOperatorLibrary.TYPE_ID).Value).Data)).ToArray();
+
+
+      if (possibleChilds.Length > 0) {
+        // replace child with a random child of the child
+        // make a clone to simplify removing obsolete operators from the operator-graph
+        IOperator selectedChild = (IOperator)possibleChilds[random.Next(possibleChilds.Length)].Clone();        
+        parent.RemoveSubOperator(childIndex);
+        parent.AddSubOperator(selectedChild, childIndex);
+
+        if (!gardener.IsValidTree(rootOperator)) {
+          throw new InvalidProgramException();
+        }
+
+        // update the size and height of our tree
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(rootOperator);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(rootOperator);
+        // don't need to schedule initialization operations
+        return null;
+      } else {
+        // determine the level of the parent
+        int parentLevel = gardener.GetNodeLevel(rootOperator, parent);
+
+        // first remove the old child (first step essential!)
+        parent.RemoveSubOperator(childIndex);
+        // then determine the number of nodes left over after the child has been removed!
+        int remainingNodes = gardener.GetTreeSize(rootOperator);
+
+        IList<IOperator> allowedOperators = gardener.GetAllowedSubOperators(parent, childIndex);
+        IOperator newOperatorTree = gardener.CreateRandomTree(allowedOperators, maxTreeSize - remainingNodes, maxTreeHeight - parentLevel, true);
+
+        parent.AddSubOperator(newOperatorTree, childIndex);
+
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(rootOperator);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(rootOperator);
+
+        if (!gardener.IsValidTree(rootOperator)) {
+          throw new InvalidProgramException();
+        }
+
+        // schedule an initialization operation for the new operator
+        return gardener.CreateInitializationOperation(gardener.GetAllOperators(newOperatorTree), scope);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/DeleteSubTreeManipulation.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/DeleteSubTreeManipulation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/DeleteSubTreeManipulation.cs	(revision 2)
@@ -0,0 +1,122 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.StructureIdentification {
+  public class DeleteSubTreeManipulation : OperatorBase {
+    public override string Description {
+      get {
+        return @"Deletes a random sub-tree of the input tree. If the remaining tree is not valid 
+the operator tries to fix the tree by generating random subtrees where necessary.";
+      }
+    }
+
+    public DeleteSubTreeManipulation()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Uniform random number generator", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "The maximal allowed size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BalanceTrees", "Determines if the trees should be balanced", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The tree to mutate", typeof(IOperator), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.In | VariableKind.Out));
+    }
+
+
+    public override IOperation Apply(IScope scope) {
+      IOperator rootOperator = GetVariableValue<IOperator>("OperatorTree", scope, true);
+      MersenneTwister random = GetVariableValue<MersenneTwister>("Random", scope, true);
+      GPOperatorLibrary library = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+
+      TreeGardener gardener = new TreeGardener(random, library);
+
+      IOperator parent = gardener.GetRandomParentNode(rootOperator);
+
+      // parent==null means the whole tree should be deleted.
+      // => return a new minimal random tree
+      if(parent == null) {
+        IOperator newTree = gardener.CreateRandomTree(1, 1, true);
+
+        // check if the tree is ok
+        if(!gardener.IsValidTree(newTree)) {
+          throw new InvalidOperationException();
+        }
+
+        // update sizes to match the new tree
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(newTree);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(newTree);
+        scope.GetVariable("OperatorTree").Value = newTree;
+
+        // schedule an operation to initialize the newly created operator
+        return gardener.CreateInitializationOperation(gardener.GetAllOperators(newTree), scope);
+      }
+
+      int childIndex = random.Next(parent.SubOperators.Count);
+
+      int min;
+      int max;
+      gardener.GetMinMaxArity(parent, out min, out max);
+      if(parent.SubOperators.Count > min) {
+        parent.RemoveSubOperator(childIndex);
+        // actually since the next suboperators are shifted in the place of the removed operator
+        // it might be possible that these suboperators are not allowed in the place of the old operator
+        // we ignore this problem for now.
+        // when this starts to become a problem a possible solution is to go through the shifted operators from the place of the shifted
+        // and find the first one that doesn't fit. At this position we insert a new randomly initialized subtree of matching type (gkronber 25.12.07)
+
+        if(!gardener.IsValidTree(rootOperator)) {
+          throw new InvalidOperationException();
+        }
+
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(rootOperator);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(rootOperator);
+        // root hasn't changed so don't need to update 'OperatorTree' variable
+
+        return null;
+      } else {
+        // replace with a minimal random seedling
+        parent.RemoveSubOperator(childIndex);
+
+        IList<IOperator> allowedOperators = gardener.GetAllowedSubOperators(parent, childIndex);
+        IOperator newOperatorTree = gardener.CreateRandomTree(allowedOperators, 1, 1, true);
+
+        parent.AddSubOperator(newOperatorTree, childIndex);
+
+        if(!gardener.IsValidTree(rootOperator)) {
+          throw new InvalidProgramException();
+        }
+
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(rootOperator);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(rootOperator);
+        // again the root hasn't changed so we don't need to update the 'OperatorTree' variable
+
+        return gardener.CreateInitializationOperation(gardener.GetAllOperators(newOperatorTree), scope);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/FullTreeShaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/FullTreeShaker.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/FullTreeShaker.cs	(revision 2)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Data;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.StructureIdentification {
+  public class FullTreeShaker : OperatorBase {
+    public override string Description {
+      get { return "Manipulates all tree nodes for which a '"+GPOperatorLibrary.MANIPULATION+"' variable is defined."; }
+    }
+
+    public FullTreeShaker()
+      : base() {
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "Operator library that defines operator mutations", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The operator tree that should be mutated", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "A random generator (uniform)", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ShakingFactor", "Variable that determines the force of the shakeing operation", typeof(DoubleData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      GPOperatorLibrary library = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      IOperator op = GetVariableValue<IOperator>("OperatorTree", scope, false);
+      MersenneTwister mt = GetVariableValue<MersenneTwister>("Random", scope, true);
+
+      // enqueue all mutation operations as parallel operations
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+
+      Scope tempScope = new Scope("Temp. manipulation scope");
+
+      TreeGardener gardener = new TreeGardener(mt, library);
+      var parametricNodes = gardener.GetAllOperators(op).Where(o => o.GetVariable(GPOperatorLibrary.MANIPULATION) != null);
+      foreach(IOperator subOperator in parametricNodes) {
+        IOperator mutation =(IOperator)subOperator.GetVariable(GPOperatorLibrary.MANIPULATION).Value;
+
+        // store all local variables into a temporary scope
+        Scope mutationScope = new Scope();
+        foreach(IVariableInfo info in subOperator.VariableInfos) {
+          if(info.Local) {
+            mutationScope.AddVariable(subOperator.GetVariable(info.FormalName));
+          }
+        }
+
+        tempScope.AddSubScope(mutationScope);
+        next.AddOperation(new AtomicOperation(mutation, mutationScope));
+      }
+
+      // save all existing sub-scopes in a backup scope
+      Scope backupScope = new Scope("backup");
+      foreach (Scope subScope in scope.SubScopes) {
+        backupScope.AddSubScope(subScope);
+      }
+
+      scope.AddSubScope(tempScope); // scope containing a subscope for each manipulation
+      scope.AddSubScope(backupScope); // scope containing the old subscopes
+
+      // schedule a reducer operation to delete all temporary scopes and restore
+      // the subscopes of the backup scope after all manipulations are finished.
+      next.AddOperation(new AtomicOperation(new RightReducer(), scope));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/OnePointShaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/OnePointShaker.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/OnePointShaker.cs	(revision 2)
@@ -0,0 +1,86 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Data;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.StructureIdentification {
+  public class OnePointShaker : OperatorBase {
+    public override string Description {
+      get { return "Selects a random node of all tree-nodes that have a '"+GPOperatorLibrary.MANIPULATION+"' variable defined and manipulates the selected node."; }
+    }
+
+    public OnePointShaker()
+      : base() {
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "Operator library that defines mutation operations for operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The operator tree that should be mutated", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "A random generator (uniform)", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ShakingFactor", "Factor that determines the force of the shaking operation", typeof(DoubleData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      GPOperatorLibrary library = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      IOperator op = GetVariableValue<IOperator>("OperatorTree", scope, false);
+      MersenneTwister mt = GetVariableValue<MersenneTwister>("Random", scope, true);
+      TreeGardener gardener = new TreeGardener(mt, library);
+
+      // get all nodes for which a manipulation is defined
+      var parametricNodes = gardener.GetAllOperators(op).Where(o => o.GetVariable(GPOperatorLibrary.MANIPULATION) != null);
+      IOperator selectedOp = parametricNodes.ElementAt(mt.Next(parametricNodes.Count()));
+
+      IOperator mutation = (IOperator)selectedOp.GetVariable(GPOperatorLibrary.MANIPULATION).Value;
+
+      CompositeOperation next = new CompositeOperation();
+
+      // store all local variables into a temporary scope
+      Scope tempScope = new Scope("Temp. manipulation scope");
+
+      foreach(IVariableInfo info in selectedOp.VariableInfos) {
+        if(info.Local) {
+          tempScope.AddVariable(selectedOp.GetVariable(info.FormalName));
+        }
+      }
+
+      // save the exising sub-scops in a backup scope
+      Scope backupScope = new Scope("backup");
+      foreach (Scope subScope in scope.SubScopes) {
+        backupScope.AddSubScope(subScope);
+      }
+
+      // add the new sub-scopes
+      scope.AddSubScope(tempScope);
+      scope.AddSubScope(backupScope);
+
+      // the next operation should first manipulate and then restore the sub-scopes from the backup scope
+      next.AddOperation(new AtomicOperation(mutation, tempScope));
+      next.AddOperation(new AtomicOperation(new RightReducer(), scope));
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/SubstituteSubTreeManipulation.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/SubstituteSubTreeManipulation.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Manipulation/SubstituteSubTreeManipulation.cs	(revision 2)
@@ -0,0 +1,122 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.StructureIdentification {
+  public class SubstituteSubTreeManipulation : OperatorBase {
+
+    public override string Description {
+      get { return "Selects a random node of the tree and replaces it with randomly initialized subtree."; }
+    }
+
+    public SubstituteSubTreeManipulation()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Uniform random number generator", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "The maximal allowed size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BalanceTrees", "Determines if the trees should be balanced", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The tree to manipulate", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IOperator rootOperator = GetVariableValue<IOperator>("OperatorTree", scope, true);
+
+      MersenneTwister random = GetVariableValue<MersenneTwister>("Random", scope, true);
+      GPOperatorLibrary library = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      int maxTreeHeight = GetVariableValue<IntData>("MaxTreeHeight", scope, true).Data;
+      int maxTreeSize = GetVariableValue<IntData>("MaxTreeSize", scope, true).Data;
+      bool balanceTrees = GetVariableValue<BoolData>("BalanceTrees", scope, true).Data;
+      int treeSize = GetVariableValue<IntData>("TreeSize", scope, true).Data;
+      int treeHeight = GetVariableValue<IntData>("TreeHeight", scope, true).Data;
+
+      TreeGardener gardener = new TreeGardener(random, library);
+
+      IOperator parent = gardener.GetRandomParentNode(rootOperator);
+      if(parent == null) {
+        // parent == null means we should subsitute the whole tree
+        // => create a new random tree
+
+        // create a new random operator tree
+        IOperator newOperatorTree = gardener.CreateRandomTree(gardener.AllOperators, maxTreeSize, maxTreeHeight, balanceTrees);
+
+        if(!gardener.IsValidTree(newOperatorTree)) {
+          throw new InvalidProgramException();
+        }
+
+        // update the variables in the scope with the new values
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(newOperatorTree);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(newOperatorTree);
+        scope.GetVariable("OperatorTree").Value = newOperatorTree;
+        
+        // return a CompositeOperation that randomly initializes the new operator
+        return gardener.CreateInitializationOperation(gardener.GetAllOperators(newOperatorTree), scope);
+      } else {
+        // determine a random child of the parent to be replaced
+        int childIndex = random.Next(parent.SubOperators.Count);
+
+        // get the list of allowed suboperators as the new child
+        IList<IOperator> allowedOperators = gardener.GetAllowedSubOperators(parent, childIndex);
+
+        if(allowedOperators.Count == 0) {
+          // don't change anything
+          // this shouldn't happen
+          throw new InvalidProgramException();
+        }
+
+        // calculate the maximum size and height of the new sub-tree based on the location where
+        // it will be inserted
+        int parentLevel = gardener.GetNodeLevel(rootOperator, parent);
+
+        int maxSubTreeHeight = maxTreeHeight - parentLevel;
+        int maxSubTreeSize = maxTreeSize - (treeSize - gardener.GetTreeSize(parent.SubOperators[childIndex]));
+
+        // get a random operatorTree
+        IOperator newOperatorTree = gardener.CreateRandomTree(allowedOperators, maxSubTreeSize, maxSubTreeHeight, balanceTrees);
+
+        IOperator oldChild = parent.SubOperators[childIndex];
+        parent.RemoveSubOperator(childIndex);
+        parent.AddSubOperator(newOperatorTree, childIndex);
+
+        if(!gardener.IsValidTree(rootOperator)) {
+          throw new InvalidProgramException();
+        }
+
+        // update the values of treeSize and treeHeight
+        GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(rootOperator);
+        GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(rootOperator);
+        // the root operator hasn't changed so we don't need to update 
+
+        // return a CompositeOperation that randomly initializes all nodes of the new subtree
+        return gardener.CreateInitializationOperation(gardener.GetAllOperators(newOperatorTree), scope);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/PopulationAnalyser.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/PopulationAnalyser.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/PopulationAnalyser.cs	(revision 2)
@@ -0,0 +1,220 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Functions;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.StructureIdentification {
+  public class PopulationAnalyser : OperatorBase {
+    public override string Description {
+      get { return @"Generates statistics about the population. (for debugging)"; }
+    }
+
+    public PopulationAnalyser()
+      : base() {
+    }
+
+    public override IOperation Apply(IScope topScope) {
+
+      Scope resultsScope = new Scope("Pop. analyzer results");
+      IScope scope = topScope.SubScopes[0];
+
+      var functionTrees = scope.SubScopes.Select(s => s.GetVariableValue<IFunction>("OperatorTree", false));
+      var treeSizes = scope.SubScopes.Select(s => s.GetVariableValue<IntData>("TreeSize", false).Data);
+      var treeHeights = scope.SubScopes.Select(s => s.GetVariableValue<IntData>("TreeHeight", false).Data);
+      var qualities = scope.SubScopes.Select(s => s.GetVariableValue<DoubleData>("Quality", false).Data);
+
+      var allFunctions = functionTrees.Select(t => AllNodes(t)).Aggregate((x, y) => { x.AddRange(y); return x; });
+
+      //var results = scope.SubScopes.Select(s => (DoubleArrayData)s.GetVariableValue<DoubleArrayData>("Results", false));
+      //var resultSums = results.Select(a => a.Data.Aggregate(0.0, (x, y) => x + y));
+
+      var functionsHistogram = from f in allFunctions
+                               group f by ((StringData)f.GetVariable("TypeId").Value).Data into g
+                               select new { FunctionType = g.Key, Functions = g };
+
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("AvgTreeSize", new DoubleData(treeSizes.Average())));
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("MinTreeSize", new DoubleData(treeSizes.Min())));
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("MaxTreeSize", new DoubleData(treeSizes.Max())));
+
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("AvgTreeHeight", new DoubleData(treeHeights.Average())));
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("MinTreeHeight", new DoubleData(treeHeights.Min())));
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("MaxTreeHeight", new DoubleData(treeHeights.Max())));
+
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("AvgQuality", new DoubleData(qualities.Average())));
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("MinQuality", new DoubleData(qualities.Min())));
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("MaxQuality", new DoubleData(qualities.Max())));
+
+      ItemList list = new ItemList();
+      PrefixVisitor visitor = new PrefixVisitor();
+      foreach(IFunction function in functionTrees) {
+        visitor.Reset();
+        function.Accept(visitor);
+        list.Add(new StringData(visitor.Representation));
+      }
+
+      resultsScope.AddVariable(new HeuristicLab.Core.Variable("Functions", list));
+
+      topScope.SubScopes[1].AddSubScope(resultsScope);
+      return null;
+    }
+
+    private List<IFunction> AllNodes(IFunction f) {
+      List<IFunction> result = new List<IFunction>();
+      result.Add(f);
+      if(f.SubFunctions.Count == 0) {
+        return result;
+      } else return f.SubFunctions.Select(subFunction => AllNodes(subFunction)).Aggregate(result, (x, y) => { x.AddRange(y); return x; });
+    }
+
+    private class PrefixVisitor : IFunctionVisitor {
+      private string representation;
+      public string Representation {
+        get { return representation; }
+      }
+
+      public void Reset() {
+        representation = "";
+      }
+
+      private void VisitFunction(string name, IFunction f) {
+        representation += "(" + name;
+        foreach(IFunction subFunction in f.SubFunctions) {
+          representation += " ";
+          subFunction.Accept(this);
+        }
+        representation += ")";
+      }
+
+      #region IFunctionVisitor Members
+
+      public void Visit(IFunction function) {
+        representation += function.Name;
+      }
+
+      public void Visit(Addition addition) {
+        VisitFunction("+", addition);
+      }
+
+      public void Visit(Constant constant) {
+        representation += constant.Value.Data.ToString("F2");
+      }
+
+      public void Visit(Cosinus cosinus) {
+        VisitFunction("cos", cosinus);
+      }
+
+      public void Visit(Division division) {
+        VisitFunction("/", division);
+      }
+
+      public void Visit(Exponential exponential) {
+        VisitFunction("expt", exponential);
+      }
+
+      public void Visit(Logarithm logarithm) {
+        VisitFunction("log", logarithm);
+      }
+
+      public void Visit(Multiplication multiplication) {
+        VisitFunction("*", multiplication);
+      }
+
+      public void Visit(Power power) {
+        VisitFunction("pow", power);
+      }
+
+      public void Visit(Signum signum) {
+        VisitFunction("signum", signum);
+      }
+
+      public void Visit(Sinus sinus) {
+        VisitFunction("sinus", sinus);
+      }
+
+      public void Visit(Sqrt sqrt) {
+        VisitFunction("sqrt", sqrt);
+      }
+
+      public void Visit(Substraction substraction) {
+        VisitFunction("-", substraction);
+      }
+
+      public void Visit(Tangens tangens) {
+        VisitFunction("tan", tangens);
+      }
+
+      public void Visit(HeuristicLab.Functions.Variable variable) {
+        string offsetStr;
+
+        if(variable.SampleOffset > 0) {
+          offsetStr = "(+ t " + variable.SampleOffset + ")";
+        } else if(variable.SampleOffset < 0) {
+          offsetStr = "(- t " + -variable.SampleOffset  + ")";
+        } else {
+          offsetStr = "(t)";
+        }
+        int v = variable.VariableIndex;
+        representation+= "(* " + variable.Weight.ToString("F2") + " " + variable.Name + v + offsetStr + ")";
+      }
+
+      public void Visit(And and) {
+        VisitFunction("and", and);
+      }
+
+      public void Visit(Average average) {
+        VisitFunction("average", average);
+      }
+
+      public void Visit(IfThenElse ifThenElse) {
+        VisitFunction("if-then-else", ifThenElse);
+      }
+
+      public void Visit(Not not) {
+        VisitFunction("not", not);
+      }
+
+      public void Visit(Or or) {
+        VisitFunction("or", or);
+      }
+
+      public void Visit(Xor xor) {
+        VisitFunction("xor", xor);
+      }
+
+      public void Visit(Equal equal) {
+        VisitFunction("eq?", equal);
+      }
+
+      public void Visit(LessThan lessThan) {
+        VisitFunction("<", lessThan);
+      }
+
+      #endregion
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.StructureIdentification")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("FH OÃ F&E")]
+[assembly: AssemblyProduct("HeuristicLab.StructureIdentification")]
+[assembly: AssemblyCopyright("Copyright Â© FH OÃ F&E 2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ca7d6d59-76a3-4dc3-8a90-dafadec08959")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /trunk/sources/HeuristicLab.StructureIdentification/RandomTreeCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/RandomTreeCreator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/RandomTreeCreator.cs	(revision 2)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using System;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.StructureIdentification {
+  public class RandomTreeCreator : OperatorBase {
+    public override string Description {
+      get { return @"Generates a new random operator tree."; }
+    }
+
+    public RandomTreeCreator()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Uniform random number generator", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "The maximal allowed size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BalanceTrees", "Determines if the trees should be balanced", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The tree to mutate", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      GPOperatorLibrary opLibrary = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      int maxTreeHeight = GetVariableValue<IntData>("MaxTreeHeight", scope, true).Data;
+      int maxTreeSize = GetVariableValue<IntData>("MaxTreeSize", scope, true).Data;
+      bool balanceTrees = GetVariableValue<BoolData>("BalanceTrees", scope, true).Data;
+
+      TreeGardener gardener = new TreeGardener(random, opLibrary);
+
+      int treeHeight = random.Next(1, maxTreeHeight + 1);
+      int treeSize = random.Next(1, maxTreeSize + 1);
+
+      IOperator rootOperator = gardener.CreateRandomTree(treeSize, treeHeight, balanceTrees);
+
+      int actualTreeSize = gardener.GetTreeSize(rootOperator);
+      int actualTreeHeight = gardener.GetTreeHeight(rootOperator);
+
+      scope.AddVariable(new Variable("OperatorTree", rootOperator));
+      scope.AddVariable(new Variable("TreeSize", new IntData(actualTreeSize)));
+      scope.AddVariable(new Variable("TreeHeight", new IntData(actualTreeHeight)));
+
+      if(!gardener.IsValidTree(rootOperator)) { throw new InvalidProgramException(); }
+
+      if(actualTreeSize > maxTreeSize ||
+        actualTreeHeight > maxTreeHeight) {
+        throw new InvalidProgramException();
+      }
+
+      return gardener.CreateInitializationOperation(gardener.GetAllOperators(rootOperator), scope);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Recombination/SinglePointCrossOver.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Recombination/SinglePointCrossOver.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Recombination/SinglePointCrossOver.cs	(revision 2)
@@ -0,0 +1,269 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.StructureIdentification {
+  public class SinglePointCrossOver : OperatorBase {
+
+    public override string Description {
+      get {
+        return "TASK";
+      }
+    }
+    public SinglePointCrossOver()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(MersenneTwister), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "The maximal allowed size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BalanceTrees", "Determines if the trees should be balanced", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("OperatorTree", "The tree to mutate", typeof(IOperator), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      MersenneTwister random = GetVariableValue<MersenneTwister>("Random", scope, true);
+      GPOperatorLibrary opLibrary = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
+      int maxTreeHeight = GetVariableValue<IntData>("MaxTreeHeight", scope, true).Data;
+      int maxTreeSize = GetVariableValue<IntData>("MaxTreeSize", scope, true).Data;
+
+      TreeGardener gardener = new TreeGardener(random, opLibrary);
+
+      if((scope.SubScopes.Count % 2) != 0)
+        throw new InvalidOperationException("Number of parents is not even");
+
+      CompositeOperation initOperations = new CompositeOperation();
+
+      int children = scope.SubScopes.Count / 2;
+      for(int i = 0; i < children; i++) {
+        IScope parent1 = scope.SubScopes[0];
+        scope.RemoveSubScope(parent1);
+        IScope parent2 = scope.SubScopes[0];
+        scope.RemoveSubScope(parent2);
+        IScope child = new Scope(i.ToString());
+        IOperation childInitOperation = Cross(gardener, maxTreeSize, maxTreeHeight, scope, random, parent1, parent2, child);
+        initOperations.AddOperation(childInitOperation);
+        scope.AddSubScope(child);
+      }
+
+      return initOperations;
+    }
+
+
+    private IOperation Cross(TreeGardener gardener, int maxTreeSize, int maxTreeHeight,
+      IScope scope, MersenneTwister random, IScope parent1, IScope parent2, IScope child) {
+      List<IOperator> newOperators;
+      IOperator newTree = Cross(gardener, parent1, parent2,
+        random, maxTreeSize, maxTreeHeight, out newOperators);
+
+      if(!gardener.IsValidTree(newTree)) {
+        throw new InvalidProgramException();
+      }
+
+      int newTreeSize = gardener.GetTreeSize(newTree);
+      int newTreeHeight = gardener.GetTreeHeight(newTree);
+      child.AddVariable(new Variable("OperatorTree", newTree));
+      child.AddVariable(new Variable("TreeSize", new IntData(newTreeSize)));
+      child.AddVariable(new Variable("TreeHeight", new IntData(newTreeHeight)));
+
+      // check if the size of the new tree is still in the allowed bounds
+      if (newTreeHeight > maxTreeHeight ||
+        newTreeSize > maxTreeSize) {
+        throw new InvalidProgramException();
+      }
+
+
+      return gardener.CreateInitializationOperation(newOperators, child);
+    }
+
+
+    private IOperator Cross(TreeGardener gardener, IScope f, IScope g, MersenneTwister random, int maxTreeSize, int maxTreeHeight, out List<IOperator> newOperators) {
+      IOperator tree0 = f.GetVariableValue<IOperator>("OperatorTree", false);
+      int tree0Height = f.GetVariableValue<IntData>("TreeHeight", false).Data;
+      int tree0Size = f.GetVariableValue<IntData>("TreeSize", false).Data;
+
+      IOperator tree1 = g.GetVariableValue<IOperator>("OperatorTree", false);
+      int tree1Height = g.GetVariableValue<IntData>("TreeHeight", false).Data;
+      int tree1Size = g.GetVariableValue<IntData>("TreeSize", false).Data;
+
+      if(tree0Size == 1 && tree1Size == 1) {
+        return CombineTerminals(gardener, tree0, tree1, random, maxTreeHeight, out newOperators);
+      } else {
+        // we are going to insert tree1 into tree0 at a random place so we have to make sure that tree0 is not a terminal
+        // in case both trees are higher than 1 we swap the trees with probability 50%
+        if(tree0Height == 1 || (tree1Height > 1 && random.Next(2) == 0)) {
+          IOperator tmp = tree0; tree0 = tree1; tree1 = tmp;
+          int tmpHeight = tree0Height; tree0Height = tree1Height; tree1Height = tmpHeight;
+          int tmpSize = tree0Size; tree0Size = tree1Size; tree1Size = tmpSize;
+        }
+
+        // save the root because later on we change tree0 and tree1 while searching a valid tree configuration
+        IOperator root = tree0;
+        int rootSize = tree0Size;
+
+        // select a random suboperators of the two trees at a random level
+        int tree0Level = random.Next(tree0Height - 1); // since we checked before that the height of tree0 is > 1 this is OK
+        int tree1Level = random.Next(tree1Height);
+        tree0 = gardener.GetRandomNode(tree0, tree0Level);
+        tree1 = gardener.GetRandomNode(tree1, tree1Level);
+
+        // recalculate the size and height of tree1 (the one that we want to insert) because we need to check constraints later on
+        tree1Size = gardener.GetTreeSize(tree1);
+        tree1Height = gardener.GetTreeHeight(tree1);
+
+        List<int> possibleChildIndices = new List<int>();
+        TreeGardener.OperatorEqualityComparer comparer = new TreeGardener.OperatorEqualityComparer();
+
+        // Now tree0 is supposed to take tree1 as one if its children. If this is not possible,
+        // then go down in either of the two trees as far as possible. If even then it is not possible
+        // to merge the trees then throw an exception
+        // find the list of allowed indices (regarding allowed sub-operators, maxTreeSize and maxTreeHeight)
+        for(int i = 0; i < tree0.SubOperators.Count; i++) {
+          int subOperatorSize = gardener.GetTreeSize(tree0.SubOperators[i]);
+
+          // the index is ok when the operator is allowed as sub-operator and we don't violate the maxSize and maxHeight constraints
+          if(GetAllowedOperators(tree0, i).Contains(tree1, comparer) &&
+            rootSize - subOperatorSize + tree1Size < maxTreeSize &&
+            tree0Level + tree1Height < maxTreeHeight) {
+            possibleChildIndices.Add(i);
+          }
+        }
+
+        while(possibleChildIndices.Count == 0) {
+          // ok we couln't find a possible configuration given the current tree0 and tree1
+          // possible reasons for this are: 
+          //  - tree1 is not allowed as sub-operator of tree0
+          //  - appending tree1 as child of tree0 would create a tree that exceedes the maxTreeHeight
+          //  - replacing any child of tree0 with tree1 woulde create a tree that exceedes the maxTeeSize
+          // thus we have to either:
+          //  - go up in tree0 => the insert position allows larger trees
+          //  - go down in tree1 => the tree that is inserted becomes smaller
+          //  - however we have to get lucky to solve the 'allowed sub-operators' problem
+          if(tree1Height == 1 || (tree0Level>0 && random.Next(2) == 0)) {
+            // go up in tree0 
+            tree0Level--;
+            tree0 = gardener.GetRandomNode(root, tree0Level);
+          } else if(tree1.SubOperators.Count > 0) {
+            // go down in node2:
+            tree1 = tree1.SubOperators[random.Next(tree1.SubOperators.Count)];
+            tree1Size = gardener.GetTreeSize(tree1);
+            tree1Height = gardener.GetTreeHeight(tree1);
+          } else {
+            // could neither go up or down ... don't know what to do ... give up
+            throw new InvalidProgramException();
+          }
+
+          // recalculate the list of possible indices 
+          possibleChildIndices.Clear();
+          for(int i = 0; i < tree0.SubOperators.Count; i++) {
+            int subOperatorSize = gardener.GetTreeSize(tree0.SubOperators[i]);
+
+            // when the operator is allowed as sub-operator and we don't violate the maxSize and maxHeight constraints
+            // the index is ok
+            if(GetAllowedOperators(tree0, i).Contains(tree1, comparer) &&
+              rootSize - subOperatorSize + tree1Size < maxTreeSize &&
+              tree0Level + tree1Height < maxTreeHeight) {
+              possibleChildIndices.Add(i);
+            }
+          }
+        }
+
+        // no possible configuration found this indicates that there is a bigger problem
+        if(possibleChildIndices.Count == 0) {
+          throw new InvalidProgramException();
+        }
+
+        // replace the existing sub-tree at a random index in tree0 with tree1
+        int selectedIndex = possibleChildIndices[random.Next(possibleChildIndices.Count)];
+        tree0.RemoveSubOperator(selectedIndex);
+        tree0.AddSubOperator(tree1, selectedIndex);
+
+        // no new operators where needed
+        newOperators = new List<IOperator>();
+        return root;
+      }
+    }
+
+    private ICollection<IOperator> GetAllowedOperators(IOperator tree0, int i) {
+      ItemList slotList = (ItemList)tree0.GetVariable(GPOperatorLibrary.ALLOWED_SUBOPERATORS).Value;
+      return ((ItemList)slotList[i]).OfType<IOperator>().ToArray();
+    }
+
+    private IOperator CombineTerminals(TreeGardener gardener, IOperator f, IOperator g, MersenneTwister random, int maxTreeHeight, out List<IOperator> newOperators) {
+      newOperators = new List<IOperator>();
+      ICollection<IOperator> possibleParents = gardener.GetPossibleParents(new List<IOperator>() { f, g });
+      if(possibleParents.Count == 0) throw new InvalidProgramException();
+
+      IOperator parent = (IOperator)possibleParents.ElementAt(random.Next(possibleParents.Count())).Clone();
+
+      int minArity;
+      int maxArity;
+      gardener.GetMinMaxArity(parent, out minArity, out maxArity);
+
+      int nSlots = Math.Max(2, minArity);
+
+      HashSet<IOperator>[] slotSets = new HashSet<IOperator>[nSlots];
+
+      SubOperatorsConstraintAnalyser analyser = new SubOperatorsConstraintAnalyser();
+      analyser.AllPossibleOperators = new List<IOperator>() { g, f };
+      for(int slot = 0; slot < nSlots; slot++) {
+        HashSet<IOperator> slotSet = new HashSet<IOperator>(analyser.GetAllowedOperators(parent, slot));
+        slotSets[slot] = slotSet;
+      }
+
+      int[] slotSequence = Enumerable.Range(0, slotSets.Count()).OrderBy(slot => slotSets[slot].Count()).ToArray();
+
+      IOperator[] selectedOperators = new IOperator[nSlots];
+      for(int i = 0; i < slotSequence.Length; i++) {
+        int slot = slotSequence[i];
+        HashSet<IOperator> slotSet = slotSets[slot];
+        if(slotSet.Count() == 0) {
+          var allowedOperators = GetAllowedOperators(parent, slot);
+          selectedOperators[slot] = gardener.CreateRandomTree(allowedOperators, 1, 1, true);
+          newOperators.AddRange(gardener.GetAllOperators(selectedOperators[slot]));
+        } else {
+          IOperator selectedOperator = slotSet.ElementAt(random.Next(slotSet.Count()));
+          selectedOperators[slot] = selectedOperator;
+          for(int j = i + 1; j < slotSequence.Length; j++) {
+            int otherSlot = slotSequence[j];
+            slotSets[otherSlot].Remove(selectedOperator);
+          }
+        }
+      }
+
+      for(int i = 0; i < selectedOperators.Length; i++) {
+        parent.AddSubOperator(selectedOperators[i], i);
+      }
+
+      return parent;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjector.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjector.cs	(revision 2)
@@ -0,0 +1,69 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.StructureIdentification {
+  public class StructIdProblemInjector : OperatorBase {
+    public override string Description {
+      get { return @"Injects the necessary variables for a structure identification problem."; }
+    }
+
+    public StructIdProblemInjector()
+      : base() {
+      AddVariableInfo(new VariableInfo("Maximization", "Set to false as structure identification is a minimization problem", typeof(BoolData), VariableKind.New));
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset", typeof(Dataset), VariableKind.New));
+      AddVariable(new Variable("Dataset", new Dataset()));
+      AddVariableInfo(new VariableInfo("TargetVariable", "TargetVariable", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("TargetVariable", new IntData()));
+      AddVariableInfo(new VariableInfo("MaxTreeHeight", "MaxTreeHeight", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("MaxTreeHeight", new IntData(1)));
+      AddVariableInfo(new VariableInfo("MaxTreeSize", "MaxTreeSize", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("MaxTreeSize", new IntData(1)));
+      AddVariableInfo(new VariableInfo("TrainingSamplesStart", "First sample to evaluate in training", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("TrainingSamplesStart", new IntData(0)));
+      AddVariableInfo(new VariableInfo("TrainingSamplesEnd", "Last sample to evaluate in training", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("TrainingSamplesEnd", new IntData(0)));
+    }
+
+    public override IView CreateView() {
+      return new StructIdProblemInjectorView(this);
+    }
+
+    public override IOperation Apply(IScope scope) {
+      scope.AddVariable(new Variable(GetVariableInfo("Maximization").ActualName, new BoolData(false)));
+      scope.AddVariable(new Variable(GetVariableInfo("Dataset").ActualName, (IItem)GetVariable("Dataset").Value.Clone()));
+      scope.AddVariable(new Variable(GetVariableInfo("TargetVariable").ActualName, (IItem)GetVariable("TargetVariable").Value.Clone()));
+      scope.AddVariable(new Variable(GetVariableInfo("MaxTreeHeight").ActualName, (IItem)GetVariable("MaxTreeHeight").Value.Clone()));
+      scope.AddVariable(new Variable(GetVariableInfo("MaxTreeSize").ActualName, (IItem)GetVariable("MaxTreeSize").Value.Clone()));
+      scope.AddVariable(new Variable(GetVariableInfo("TrainingSamplesStart").ActualName, (IItem)GetVariable("TrainingSamplesStart").Value.Clone()));
+      scope.AddVariable(new Variable(GetVariableInfo("TrainingSamplesEnd").ActualName, (IItem)GetVariable("TrainingSamplesEnd").Value.Clone()));
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs	(revision 2)
@@ -0,0 +1,246 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.StructureIdentification {
+  partial class StructIdProblemInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.importInstanceButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
+      this.samplesLabel = new System.Windows.Forms.Label();
+      this.samplesTextBox = new System.Windows.Forms.TextBox();
+      this.variablesLabel = new System.Windows.Forms.Label();
+      this.variablesTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(6, 9);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 0;
+      this.nameLabel.Text = "Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(62, 6);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.ReadOnly = true;
+      this.nameTextBox.Size = new System.Drawing.Size(166, 20);
+      this.nameTextBox.TabIndex = 1;
+      // 
+      // importInstanceButton
+      // 
+      this.importInstanceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.importInstanceButton.Location = new System.Drawing.Point(6, 105);
+      this.importInstanceButton.Name = "importInstanceButton";
+      this.importInstanceButton.Size = new System.Drawing.Size(256, 21);
+      this.importInstanceButton.TabIndex = 6;
+      this.importInstanceButton.Text = "&Import...";
+      this.importInstanceButton.UseVisualStyleBackColor = true;
+      this.importInstanceButton.Click += new System.EventHandler(this.importInstanceButton_Click);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "txt";
+      this.openFileDialog.FileName = "txt";
+      this.openFileDialog.Filter = "Text files|*.txt|All files|*.*";
+      this.openFileDialog.Title = "Import StructId File";
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.dataTabPage);
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(276, 184);
+      this.tabControl.TabIndex = 0;
+      // 
+      // dataTabPage
+      // 
+      this.dataTabPage.Controls.Add(this.variablesLabel);
+      this.dataTabPage.Controls.Add(this.variablesTextBox);
+      this.dataTabPage.Controls.Add(this.samplesLabel);
+      this.dataTabPage.Controls.Add(this.samplesTextBox);
+      this.dataTabPage.Controls.Add(this.nameLabel);
+      this.dataTabPage.Controls.Add(this.importInstanceButton);
+      this.dataTabPage.Controls.Add(this.nameTextBox);
+      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTabPage.Name = "dataTabPage";
+      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTabPage.Size = new System.Drawing.Size(268, 158);
+      this.dataTabPage.TabIndex = 0;
+      this.dataTabPage.Text = "TSP Data";
+      this.dataTabPage.UseVisualStyleBackColor = true;
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(268, 158);
+      this.variableInfosTabPage.TabIndex = 1;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(262, 152);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.operatorBaseDescriptionView);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(268, 158);
+      this.descriptionTabPage.TabIndex = 2;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseDescriptionView
+      // 
+      this.operatorBaseDescriptionView.Caption = "Operator";
+      this.operatorBaseDescriptionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseDescriptionView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
+      this.operatorBaseDescriptionView.Operator = null;
+      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(262, 152);
+      this.operatorBaseDescriptionView.TabIndex = 0;
+      // 
+      // samplesLabel
+      // 
+      this.samplesLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.samplesLabel.AutoSize = true;
+      this.samplesLabel.Location = new System.Drawing.Point(6, 35);
+      this.samplesLabel.Name = "samplesLabel";
+      this.samplesLabel.Size = new System.Drawing.Size(50, 13);
+      this.samplesLabel.TabIndex = 7;
+      this.samplesLabel.Text = "Samples:";
+      // 
+      // samplesTextBox
+      // 
+      this.samplesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.samplesTextBox.Location = new System.Drawing.Point(62, 32);
+      this.samplesTextBox.Name = "samplesTextBox";
+      this.samplesTextBox.ReadOnly = true;
+      this.samplesTextBox.Size = new System.Drawing.Size(81, 20);
+      this.samplesTextBox.TabIndex = 8;
+      // 
+      // variablesLabel
+      // 
+      this.variablesLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.variablesLabel.AutoSize = true;
+      this.variablesLabel.Location = new System.Drawing.Point(6, 61);
+      this.variablesLabel.Name = "variablesLabel";
+      this.variablesLabel.Size = new System.Drawing.Size(53, 13);
+      this.variablesLabel.TabIndex = 9;
+      this.variablesLabel.Text = "Variables:";
+      // 
+      // variablesTextBox
+      // 
+      this.variablesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.variablesTextBox.Location = new System.Drawing.Point(62, 58);
+      this.variablesTextBox.Name = "variablesTextBox";
+      this.variablesTextBox.ReadOnly = true;
+      this.variablesTextBox.Size = new System.Drawing.Size(81, 20);
+      this.variablesTextBox.TabIndex = 10;
+      // 
+      // StructIdProblemInjectorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "StructIdProblemInjectorView";
+      this.Size = new System.Drawing.Size(276, 184);
+      this.tabControl.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.dataTabPage.PerformLayout();
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.Button importInstanceButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage dataTabPage;
+    private System.Windows.Forms.TabPage variableInfosTabPage;
+    private HeuristicLab.Core.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    private System.Windows.Forms.TabPage descriptionTabPage;
+    private HeuristicLab.Core.OperatorBaseDescriptionView operatorBaseDescriptionView;
+    private System.Windows.Forms.Label variablesLabel;
+    private System.Windows.Forms.TextBox variablesTextBox;
+    private System.Windows.Forms.Label samplesLabel;
+    private System.Windows.Forms.TextBox samplesTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs	(revision 2)
@@ -0,0 +1,106 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.StructureIdentification {
+  public partial class StructIdProblemInjectorView : ViewBase {
+    public StructIdProblemInjector StructIdProblemInjector {
+      get { return (StructIdProblemInjector)Item; }
+      set { base.Item = value; }
+    }
+
+    public StructIdProblemInjectorView() {
+      InitializeComponent();
+    }
+    public StructIdProblemInjectorView(StructIdProblemInjector structIdProblemInjector)
+      : this() {
+      StructIdProblemInjector = structIdProblemInjector;
+    }
+
+    protected override void RemoveItemEvents() {
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseDescriptionView.Operator = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorBaseVariableInfosView.Operator = StructIdProblemInjector;
+      operatorBaseDescriptionView.Operator = StructIdProblemInjector;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (StructIdProblemInjector == null) {
+        nameTextBox.Text = "-";
+        variablesTextBox.Text = "-";
+        samplesTextBox.Text = "-";
+        importInstanceButton.Enabled = false;
+      } else {
+        Dataset dataset = (Dataset)StructIdProblemInjector.GetVariable("Dataset").Value;
+        nameTextBox.Text = dataset.Name;
+        samplesTextBox.Text = dataset.Rows+"";
+        variablesTextBox.Text = dataset.Columns+"";
+        importInstanceButton.Enabled = true;
+      }
+    }
+
+    private void importInstanceButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        DatasetParser parser = new DatasetParser();
+        bool success = false;
+        try {
+          parser.Import(openFileDialog.FileName, true);
+          success = true;
+        } catch (Exception) {
+          // not possible to parse strictly => try to parse non-strict
+          parser.Import(openFileDialog.FileName, false);
+          success = true;
+        }
+        if (success) {
+          Dataset dataset = (Dataset)StructIdProblemInjector.GetVariable("Dataset").Value;
+          dataset.Rows = parser.Rows;
+          dataset.Columns = parser.Columns;
+          dataset.VariableNames = parser.VariableNames;
+          dataset.Name = parser.ProblemName;
+          dataset.Samples = parser.Samples;
+
+          ((IntData)StructIdProblemInjector.GetVariable("TargetVariable").Value).Data = parser.TargetVariable;
+          ((IntData)StructIdProblemInjector.GetVariable("MaxTreeHeight").Value).Data = parser.MaxTreeHeight;
+          ((IntData)StructIdProblemInjector.GetVariable("MaxTreeSize").Value).Data = parser.MaxTreeSize;
+          ((IntData)StructIdProblemInjector.GetVariable("TrainingSamplesStart").Value).Data = parser.TrainingSamplesStart;
+          ((IntData)StructIdProblemInjector.GetVariable("TrainingSamplesEnd").Value).Data = parser.TrainingSamplesEnd;
+          Refresh();
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.resx
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.resx	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.resx	(revision 2)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.StructureIdentification/TreeGardener.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/TreeGardener.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.StructureIdentification/TreeGardener.cs	(revision 2)
@@ -0,0 +1,456 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Constraints;
+using System.Diagnostics;
+using HeuristicLab.Data;
+using System.Linq;
+using HeuristicLab.Random;
+using HeuristicLab.Operators;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.StructureIdentification {
+  internal class TreeGardener {
+    private IRandom random;
+    private IOperatorLibrary opLibrary;
+    private List<IOperator> functions;
+    private List<IOperator> terminals;
+
+    internal IList<IOperator> Terminals {
+      get { return terminals.AsReadOnly(); }
+    }
+    private List<IOperator> allOperators;
+
+    internal IList<IOperator> AllOperators {
+      get { return allOperators.AsReadOnly(); }
+    }
+
+    internal TreeGardener(IRandom random, IOperatorLibrary opLibrary) {
+      this.random = random;
+      this.opLibrary = opLibrary;
+
+      this.allOperators = new List<IOperator>();
+      terminals = new List<IOperator>();
+      functions = new List<IOperator>();
+
+      // init functions and terminals based on constraints
+      foreach (IOperator op in opLibrary.Group.Operators) {
+        int maxA, minA;
+        GetMinMaxArity(op, out minA, out maxA);
+        if (maxA == 0) {
+          terminals.Add(op);
+        } else {
+          functions.Add(op);
+        }
+      }
+
+      allOperators.AddRange(functions);
+      allOperators.AddRange(terminals);
+    }
+
+    #region random initialization
+    internal IOperator CreateRandomTree(ICollection<IOperator> allowedOperators, int maxTreeSize, int maxTreeHeight, bool balanceTrees) {
+
+      int minTreeHeight = allowedOperators.Select(op => ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_HEIGHT).Value).Data).Min();
+      if (minTreeHeight > maxTreeHeight)
+        maxTreeHeight = minTreeHeight;
+
+      int minTreeSize = allowedOperators.Select(op => ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_SIZE).Value).Data).Min();
+      if (minTreeSize > maxTreeSize)
+        maxTreeSize = minTreeSize;
+
+      int treeHeight = random.Next(minTreeHeight, maxTreeHeight + 1);
+      int treeSize = random.Next(minTreeSize, maxTreeSize + 1);
+
+      IOperator[] possibleOperators = allowedOperators.Where(op => ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_HEIGHT).Value).Data <= treeHeight &&
+        ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_SIZE).Value).Data <= treeSize).ToArray();
+      IOperator selectedOperator = (IOperator)possibleOperators[random.Next(possibleOperators.Length)].Clone();
+
+      IOperator rootOperator = CreateRandomTree(selectedOperator, treeSize, treeHeight, balanceTrees);
+
+      return rootOperator;
+    }
+
+    internal IOperator CreateRandomTree(int maxTreeSize, int maxTreeHeight, bool balanceTrees) {
+      if (balanceTrees) {
+        if (maxTreeHeight == 1) {
+          IOperator selectedTerminal = (IOperator)terminals[random.Next(terminals.Count())].Clone();
+          return selectedTerminal;
+        } else {
+          IOperator[] possibleFunctions = functions.Where(f => GetMinimalTreeHeight(f) <= maxTreeHeight &&
+            GetMinimalTreeSize(f) <= maxTreeSize).ToArray();
+          IOperator selectedFunction = (IOperator)possibleFunctions[random.Next(possibleFunctions.Length)].Clone();
+          MakeBalancedTree(selectedFunction, maxTreeSize - 1, maxTreeHeight - 1);
+          return selectedFunction;
+        }
+
+      } else {
+        IOperator[] possibleOperators = allOperators.Where(op => GetMinimalTreeHeight(op) <= maxTreeHeight &&
+          GetMinimalTreeSize(op) <= maxTreeSize).ToArray();
+        IOperator selectedOperator = (IOperator)possibleOperators[random.Next(possibleOperators.Length)].Clone();
+        MakeUnbalancedTree(selectedOperator, maxTreeSize - 1, maxTreeHeight - 1);
+        return selectedOperator;
+      }
+    }
+
+    internal IOperator CreateRandomTree(IOperator root, int maxTreeSize, int maxTreeHeight, bool balanceTrees) {
+      if (balanceTrees) {
+        MakeBalancedTree(root, maxTreeSize - 1, maxTreeHeight - 1);
+      } else {
+        MakeUnbalancedTree(root, maxTreeSize - 1, maxTreeHeight - 1);
+      }
+      if (GetTreeSize(root) > maxTreeSize ||
+         GetTreeHeight(root) > maxTreeHeight) {
+        throw new InvalidProgramException();
+      }
+      return root;
+    }
+
+
+    private void MakeUnbalancedTree(IOperator parent, int maxTreeSize, int maxTreeHeight) {
+      if (maxTreeHeight == 0 || maxTreeSize == 0) return;
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(parent, out minArity, out maxArity);
+      if (maxArity >= maxTreeSize) {
+        maxArity = maxTreeSize;
+      }
+      int actualArity = random.Next(minArity, maxArity + 1);
+      if (actualArity > 0) {
+        int maxSubTreeSize = maxTreeSize / actualArity;
+        for (int i = 0; i < actualArity; i++) {
+          IOperator[] possibleOperators = GetAllowedSubOperators(parent, i).Where(op => GetMinimalTreeHeight(op) <= maxTreeHeight &&
+            GetMinimalTreeSize(op) <= maxSubTreeSize).ToArray();
+          IOperator selectedOperator = (IOperator)possibleOperators[random.Next(possibleOperators.Length)].Clone();
+          parent.AddSubOperator(selectedOperator, i);
+          MakeUnbalancedTree(selectedOperator, maxSubTreeSize - 1, maxTreeHeight - 1);
+        }
+      }
+    }
+
+    // NOTE: this method doesn't build fully balanced trees because we have constraints on the
+    // types of possible suboperators which can indirectly impose a limit for the depth of a given suboperator
+    private void MakeBalancedTree(IOperator parent, int maxTreeSize, int maxTreeHeight) {
+      if (maxTreeHeight == 0 || maxTreeSize == 0) return; // should never happen anyway
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(parent, out minArity, out maxArity);
+      if (maxArity >= maxTreeSize) {
+        maxArity = maxTreeSize;
+      }
+      int actualArity = random.Next(minArity, maxArity + 1);
+      if (actualArity > 0) {
+        int maxSubTreeSize = maxTreeSize / actualArity;
+        for (int i = 0; i < actualArity; i++) {
+          if (maxTreeHeight == 1 || maxSubTreeSize == 1) {
+            IOperator[] possibleTerminals = GetAllowedSubOperators(parent, i).Where(
+              op => GetMinimalTreeHeight(op) <= maxTreeHeight &&
+              GetMinimalTreeSize(op) <= maxSubTreeSize &&
+              IsTerminal(op)).ToArray();
+            IOperator selectedTerminal = (IOperator)possibleTerminals[random.Next(possibleTerminals.Length)].Clone();
+            parent.AddSubOperator(selectedTerminal, i);
+          } else {
+            IOperator[] possibleFunctions = GetAllowedSubOperators(parent, i).Where(
+              op => GetMinimalTreeHeight(op) <= maxTreeHeight &&
+              GetMinimalTreeSize(op) <= maxSubTreeSize &&
+              !IsTerminal(op)).ToArray();
+            IOperator selectedFunction = (IOperator)possibleFunctions[random.Next(possibleFunctions.Length)].Clone();
+            parent.AddSubOperator(selectedFunction, i);
+            MakeBalancedTree(selectedFunction, maxSubTreeSize - 1, maxTreeHeight - 1);
+          }
+        }
+      }
+    }
+
+    internal CompositeOperation CreateInitializationOperation(ICollection<IOperator> operators, IScope scope) {
+      // needed for the parameter shaking operation
+      CompositeOperation initializationOperation = new CompositeOperation();
+      Scope tempScope = new Scope("Temp. initialization scope");
+
+      var parametricOperators = operators.Where(o => o.GetVariable(GPOperatorLibrary.INITIALIZATION) != null);
+
+      foreach (IOperator op in parametricOperators) {
+        // enqueue an initialization operation for each operator with local variables 
+        IOperator initialization = (IOperator)op.GetVariable(GPOperatorLibrary.INITIALIZATION).Value;
+        Scope initScope = new Scope();
+
+        // copy the local variables into a temporary scope used for initialization
+        foreach (VariableInfo info in op.VariableInfos) {
+          if (info.Local) {
+            initScope.AddVariable(op.GetVariable(info.FormalName));
+          }
+        }
+
+        tempScope.AddSubScope(initScope);
+        initializationOperation.AddOperation(new AtomicOperation(initialization, initScope));
+      }
+
+      Scope backupScope = new Scope("backup");
+      foreach (Scope subScope in scope.SubScopes) {
+        backupScope.AddSubScope(subScope);
+      }
+
+      scope.AddSubScope(tempScope);
+      scope.AddSubScope(backupScope);
+
+      // add an operation to remove the temporary scopes        
+      initializationOperation.AddOperation(new AtomicOperation(new RightReducer(), scope));
+      return initializationOperation;
+    }
+    #endregion
+
+    #region tree information gathering
+    internal int GetTreeSize(IOperator tree) {
+      return 1 + tree.SubOperators.Sum(f => GetTreeSize(f));
+    }
+
+    internal int GetTreeHeight(IOperator tree) {
+      if (tree.SubOperators.Count == 0) return 1;
+      return 1 + tree.SubOperators.Max(f => GetTreeHeight(f));
+    }
+
+    internal IOperator GetRandomParentNode(IOperator tree) {
+      List<IOperator> parentNodes = new List<IOperator>();
+
+      // add null for the parent of the root node
+      parentNodes.Add(null);
+
+      TreeForEach(tree, delegate(IOperator op) {
+        if (op.SubOperators.Count > 0) {
+          parentNodes.Add(op);
+        }
+      });
+
+      return parentNodes[random.Next(parentNodes.Count)];
+    }
+
+    internal IList<IOperator> GetAllowedSubOperators(IOperator op, int index) {
+      if (op == null) {
+        return allOperators;
+      } else {
+
+        SubOperatorsConstraintAnalyser analyser = new SubOperatorsConstraintAnalyser();
+        analyser.AllPossibleOperators = allOperators;
+
+        return analyser.GetAllowedOperators(op, index);
+      }
+    }
+    internal void GetMinMaxArity(IOperator root, out int minArity, out int maxArity) {
+      foreach (IConstraint constraint in root.Constraints) {
+        NumberOfSubOperatorsConstraint theConstraint = constraint as NumberOfSubOperatorsConstraint;
+        if (theConstraint != null) {
+          minArity = theConstraint.MinOperators.Data;
+          maxArity = theConstraint.MaxOperators.Data;
+          return;
+        }
+      }
+      // the default arity is 2
+      minArity = 2;
+      maxArity = 2;
+    }
+    internal bool IsTerminal(IOperator f) {
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(f, out minArity, out maxArity);
+      return minArity == 0 && maxArity == 0;
+    }
+
+    internal IList<IOperator> GetAllowedParents(IOperator child, int childIndex) {
+      List<IOperator> parents = new List<IOperator>();
+      foreach (IOperator function in functions) {
+        IList<IOperator> allowedSubOperators = GetAllowedSubOperators(function, childIndex);
+        if (allowedSubOperators.Contains(child, new OperatorEqualityComparer())) {
+          parents.Add(function);
+        }
+      }
+      return parents;
+    }
+
+    internal ICollection<IOperator> GetAllOperators(IOperator root) {
+      List<IOperator> allOps = new List<IOperator>();
+      TreeForEach(root, t => { allOps.Add(t); });
+      return allOps;
+    }
+
+    /// <summary>
+    /// returns the height level of op in the tree
+    /// if the op == tree => 1
+    /// if op is in the suboperators of tree => 2
+    /// ...
+    /// if op is not found => -1
+    /// </summary>
+    /// <param name="tree">operator tree to process</param>
+    /// <param name="op">operater that is searched in the tree</param>
+    /// <returns></returns>
+    internal int GetNodeLevel(IOperator tree, IOperator op) {
+      return GetNodeLevelHelper(tree, op, 1);
+    }
+
+    private int GetNodeLevelHelper(IOperator tree, IOperator op, int level) {
+      if (op == tree) return level;
+
+      foreach (IOperator subTree in tree.SubOperators) {
+        int result = GetNodeLevelHelper(subTree, op, level + 1);
+        if (result != -1) return result;
+      }
+
+      return -1;
+    }
+
+    internal bool IsValidTree(IOperator tree) {
+      if (!tree.IsValid())
+        return false;
+      foreach (IOperator subTree in tree.SubOperators) {
+        if (!subTree.IsValid())
+          return false;
+      }
+
+      return true;
+    }
+
+    // returns a random node from the specified level in the tree
+    internal IOperator GetRandomNode(IOperator tree, int level) {
+      if (level == 0) return tree;
+      List<IOperator> nodes = GetOperatorsAtLevel(tree, level);
+      return nodes[random.Next(nodes.Count)];
+    }
+    #endregion
+
+    #region private utility methods
+
+    private int GetMinimalTreeHeight(IOperator op) {
+      return ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_HEIGHT).Value).Data;
+    }
+
+    private int GetMinimalTreeSize(IOperator op) {
+      return ((IntData)op.GetVariable(GPOperatorLibrary.MIN_TREE_SIZE).Value).Data;
+    }
+
+    private void TreeForEach(IOperator tree, Action<IOperator> action) {
+      action(tree);
+      foreach (IOperator child in tree.SubOperators) {
+        TreeForEach(child, action);
+      }
+    }
+
+    private List<IOperator> GetOperatorsAtLevel(IOperator tree, int level) {
+      if (level == 1) return new List<IOperator>(tree.SubOperators);
+
+      List<IOperator> result = new List<IOperator>();
+      foreach (IOperator subOperator in tree.SubOperators) {
+        result.AddRange(GetOperatorsAtLevel(subOperator, level - 1));
+      }
+      return result;
+    }
+
+
+    #endregion
+
+    internal class OperatorEqualityComparer : IEqualityComparer<IOperator> {
+      #region IEqualityComparer<IOperator> Members
+
+      public bool Equals(IOperator x, IOperator y) {
+        return ((StringData)x.GetVariable(GPOperatorLibrary.TYPE_ID).Value).Data ==
+          ((StringData)y.GetVariable(GPOperatorLibrary.TYPE_ID).Value).Data;
+      }
+
+      public int GetHashCode(IOperator obj) {
+        return ((StringData)obj.GetVariable(GPOperatorLibrary.TYPE_ID).Value).Data.GetHashCode();
+      }
+
+      #endregion
+    }
+
+    internal ICollection<IOperator> GetPossibleParents(List<IOperator> list) {
+      List<IOperator> result = new List<IOperator>();
+      foreach (IOperator op in functions) {
+        if (IsPossibleParent(op, list)) {
+          result.Add(op);
+        }
+      }
+      return result;
+    }
+
+    private bool IsPossibleParent(IOperator op, List<IOperator> children) {
+      int minArity;
+      int maxArity;
+      GetMinMaxArity(op, out minArity, out maxArity);
+
+      // note: we can't assume that the operators in the children list have different types!
+
+      // when the maxArity of this function is smaller than the list of operators that
+      // should be included as sub-operators then it can't be a parent
+      if (maxArity < children.Count()) {
+        return false;
+      }
+      int nSlots = Math.Max(minArity, children.Count);
+
+      SubOperatorsConstraintAnalyser analyzer = new SubOperatorsConstraintAnalyser();
+      analyzer.AllPossibleOperators = children;
+
+      List<HashSet<IOperator>> slotSets = new List<HashSet<IOperator>>();
+
+      // we iterate through all slots for sub-operators and calculate the set of 
+      // allowed sub-operators for this slot.
+      // we only count those slots that can hold at least one of the children that we should combine
+      for (int slot = 0; slot < nSlots; slot++) {
+        HashSet<IOperator> operatorSet = new HashSet<IOperator>(analyzer.GetAllowedOperators(op, slot));
+        if (operatorSet.Count() > 0) {
+          slotSets.Add(operatorSet);
+        }
+      }
+
+      // ok at the end of this operation we know how many slots of the parent can actually
+      // hold one of our children.
+      // if the number of slots is smaller than the number of children we can be sure that
+      // we can never combine all children as sub-operators of the operator and thus the operator
+      // can't be a parent.
+      if (slotSets.Count() < children.Count()) {
+        return false;
+      }
+
+      // finally we sort the sets by size and beginning from the first set select one
+      // operator for the slot and thus remove it as possible sub-operator from the remaining sets.
+      // when we can successfully assign all available children to a slot the operator is a valid parent
+      // when only a subset of all children can be assigned to slots the operator is no valid parent
+      slotSets.Sort((p, q) => p.Count() - q.Count());
+
+      int assignments = 0;
+      for (int i = 0; i < slotSets.Count() - 1; i++) {
+        if (slotSets[i].Count > 0) {
+          IOperator selected = slotSets[i].ElementAt(0);
+          assignments++;
+          for (int j = i + 1; j < slotSets.Count(); j++) {
+            slotSets[j].Remove(selected);
+          }
+        }
+      }
+
+      // sanity check 
+      if (assignments > children.Count) throw new InvalidProgramException();
+      return assignments == children.Count - 1;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/AckleyEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/AckleyEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/AckleyEvaluator.cs	(revision 2)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public class AckleyEvaluator : TestFunctionEvaluatorBase {
+    public override string Description {
+      get { return
+@"Ackley Function
+
+Domain:  [-32.768 , 32.768]^n
+Optimum: 0.0 at (0, 0, ..., 0)";
+          }
+    }
+
+    protected override double EvaluateFunction(double[] point) {
+      double result = 20 + Math.E;
+      double val;
+
+      val = 0;
+      for (int i = 0; i < point.Length; i++)
+        val += point[i] * point[i];
+      val *= 1.0 / point.Length;
+      val = Math.Sqrt(val);
+      val *= -0.2;
+      result -= 20 * Math.Exp(val);
+
+      val = 0;
+      for (int i = 0; i < point.Length; i++)
+        val += Math.Cos(2 * Math.PI * point[i]);
+      val *= 1.0 / point.Length;
+      result -= Math.Exp(val);
+      return (result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/GriewangkEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/GriewangkEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/GriewangkEvaluator.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public class GriewangkEvaluator : TestFunctionEvaluatorBase {
+    public override string Description {
+      get { return
+@"Griewangk Function
+
+Domain:  [-600.0 , 600.0]^n
+Optimum: 0.0 at (0, 0, ..., 0)";
+          }
+    }
+
+    protected override double EvaluateFunction(double[] point) {
+      double result = 0;
+      double val = 0;
+
+      for (int i = 0; i < point.Length; i++)
+        result += point[i] * point[i];
+      result = result / 4000;
+
+      val = Math.Cos(point[0]);
+      for (int i = 1; i < point.Length; i++)
+        val *= Math.Cos(point[i] / Math.Sqrt(i + 1));
+
+      result = result - val + 1;
+      return (result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/HeuristicLab.TestFunctions.csproj
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/HeuristicLab.TestFunctions.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/HeuristicLab.TestFunctions.csproj	(revision 2)
@@ -0,0 +1,81 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9A781B2F-A58D-4270-A28A-3B14BBC11F4A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.TestFunctions</RootNamespace>
+    <AssemblyName>HeuristicLab.TestFunctions</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.TestFunctions.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AckleyEvaluator.cs" />
+    <Compile Include="GriewangkEvaluator.cs" />
+    <Compile Include="SchwefelEvaluator.cs" />
+    <Compile Include="RosenbrockEvaluator.cs" />
+    <Compile Include="RastriginEvaluator.cs" />
+    <Compile Include="SphereEvaluator.cs" />
+    <Compile Include="HeuristicLabTestFunctionsPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestFunctionEvaluatorBase.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.TestFunctions/HeuristicLabTestFunctionsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/HeuristicLabTestFunctionsPlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/HeuristicLabTestFunctionsPlugin.cs	(revision 2)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.TestFunctions {
+  [ClassInfo(Name = "HeuristicLab.TestFunctions")]
+  [PluginFile(Filename = "HeuristicLab.TestFunctions.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  [Dependency(Dependency = "HeuristicLab.Data")]
+  [Dependency(Dependency = "HeuristicLab.Operators")]
+  public class HeuristicLabTestFunctionsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.TestFunctions")]
+[assembly: AssemblyDescription("HeuristicLab n-dimensional test function classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f7c10f77-1067-4b4c-876a-92fe49b4f228")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.TestFunctions/RastriginEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/RastriginEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/RastriginEvaluator.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public class RastriginEvaluator : TestFunctionEvaluatorBase {
+    public override string Description {
+      get { return
+@"Rastrigin Function
+
+Domain:  [-5.12 , 5.12]^n
+Optimum: 0.0 at (0, 0, ..., 0)";
+          }
+    }
+
+    protected override double EvaluateFunction(double[] point) {
+      double result = 10 * point.Length;
+      for (int i = 0; i < point.Length; i++) {
+        result += point[i] * point[i];
+        result -= 10 * Math.Cos(2 * Math.PI * point[i]);
+      }
+      return (result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/RosenbrockEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/RosenbrockEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/RosenbrockEvaluator.cs	(revision 2)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public class RosenbrockEvaluator : TestFunctionEvaluatorBase {
+    public override string Description {
+      get { return
+@"Rosenbrock Function
+
+Domain:  [-2.048 , 2.048]^n
+Optimum: 0.0 at (1, 1, ..., 1)";
+          }
+    }
+
+    protected override double EvaluateFunction(double[] point) {
+      double result = 0;
+      for (int i = 0; i < point.Length - 1; i++) {
+        result += 100 * (point[i + 1] - point[i] * point[i]) * (point[i + 1] - point[i] * point[i]);
+        result += (1 - point[i]) * (1 - point[i]);
+      }
+      return result;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/SchwefelEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/SchwefelEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/SchwefelEvaluator.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public class SchwefelEvaluator : TestFunctionEvaluatorBase {
+    public override string Description {
+      get { return
+@"Schwefel Function (Sine Root)
+
+Domain:  [-500.0 , 500.0]^n
+Optimum: 0.0 at (420.968746453712, 420.968746453712, ..., 420.968746453712)";
+          }
+    }
+
+    protected override double EvaluateFunction(double[] point) {
+      double result = 418.982887272433 * point.Length;
+      for (int i = 0; i < point.Length; i++)
+        result -= point[i] * Math.Sin(Math.Sqrt(Math.Abs(point[i])));
+      return (result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/SphereEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/SphereEvaluator.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/SphereEvaluator.cs	(revision 2)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public class SphereEvaluator : TestFunctionEvaluatorBase {
+    public override string Description {
+      get { return
+@"Sphere Function
+
+Domain:  [-5.12 , 5.12]^n
+Optimum: 0.0 at (0, 0, ..., 0)";
+          }
+    }
+
+    protected override double EvaluateFunction(double[] point) {
+      double result = 0;
+      for (int i = 0; i < point.Length; i++)
+        result += point[i] * point[i];
+      return result;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.TestFunctions/TestFunctionEvaluatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.TestFunctions/TestFunctionEvaluatorBase.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.TestFunctions/TestFunctionEvaluatorBase.cs	(revision 2)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.TestFunctions {
+  public abstract class TestFunctionEvaluatorBase : SingleObjectiveEvaluatorBase {
+    public TestFunctionEvaluatorBase() {
+      AddVariableInfo(new VariableInfo("Point", "n-dimensional point for which the test function should be evaluated", typeof(DoubleArrayData), VariableKind.In));
+    }
+
+    protected sealed override double Evaluate(IScope scope) {
+      return EvaluateFunction(GetVariableValue<DoubleArrayData>("Point", scope, false).Data);
+    }
+
+    protected abstract double EvaluateFunction(double[] point);
+  }
+}
Index: /trunk/sources/HeuristicLab.ThreadParallelEngine/HeuristicLab.ThreadParallelEngine.csproj
===================================================================
--- /trunk/sources/HeuristicLab.ThreadParallelEngine/HeuristicLab.ThreadParallelEngine.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab.ThreadParallelEngine/HeuristicLab.ThreadParallelEngine.csproj	(revision 2)
@@ -0,0 +1,78 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6E757D0E-20F9-4E89-AF06-D7DA256870DB}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.ThreadParallelEngine</RootNamespace>
+    <AssemblyName>HeuristicLab.ThreadParallelEngine</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.ThreadParallelEngine.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="HeuristicLabThreadParallelEnginePlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ThreadParallelEngine.cs" />
+    <Compile Include="ThreadParallelEngineEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ThreadParallelEngineEditor.Designer.cs">
+      <DependentUpon>ThreadParallelEngineEditor.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.ThreadParallelEngine/HeuristicLabThreadParallelEnginePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.ThreadParallelEngine/HeuristicLabThreadParallelEnginePlugin.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.ThreadParallelEngine/HeuristicLabThreadParallelEnginePlugin.cs	(revision 2)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.ThreadParallelEngine {
+  [ClassInfo(Name = "HeuristicLab.ThreadParallelEngine")]
+  [PluginFile(Filename = "HeuristicLab.ThreadParallelEngine.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core")]
+  public class HeuristicLabThreadParallelEnginePlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.ThreadParallelEngine/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.ThreadParallelEngine/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.ThreadParallelEngine/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.ThreadParallelEngine")]
+[assembly: AssemblyDescription("HeuristicLab engine for parallel processing using multiple threads")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("015adceb-e1e1-405f-a0d1-be1a977772d9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngine.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngine.cs	(revision 2)
@@ -0,0 +1,191 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Threading;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.ThreadParallelEngine {
+  public class ThreadParallelEngine : EngineBase, IEditable {
+    #region Inner Class Task
+    private class TaskList {
+      public Stack<IOperation>[] tasks;
+      public int next;
+      public Semaphore semaphore;
+    }
+    #endregion
+
+    // currently executed operators
+    private IOperator[] currentOperators;
+    private int operatorIndex;
+
+    private int myWorkers;
+    public int Workers {
+      get { return myWorkers; }
+      set {
+        if (value != myWorkers) {
+          myWorkers = value;
+          OnWorkersChanged();
+        }
+      }
+    }
+
+
+    public ThreadParallelEngine() {
+      myWorkers = Environment.ProcessorCount;
+      currentOperators = new IOperator[1000];
+    }
+
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ThreadParallelEngine clone = (ThreadParallelEngine)base.Clone(clonedObjects);
+      clone.myWorkers = Workers;
+      return clone;
+    }
+
+    public override IView CreateView() {
+      return new ThreadParallelEngineEditor(this);
+    }
+    public virtual IEditor CreateEditor() {
+      return new ThreadParallelEngineEditor(this);
+    }
+
+    public override void ExecuteSteps(int steps) {
+      throw new InvalidOperationException("ThreadParallelEngine doesn't support stepwise execution");
+    }
+
+    public override void Abort() {
+      base.Abort();
+      for (int i = 0; i < currentOperators.Length; i++) {
+        if (currentOperators[i] != null)
+          currentOperators[i].Abort();
+      }
+    }
+
+    protected override void ProcessNextOperation() {
+      operatorIndex = 1;
+      ProcessNextOperation(myExecutionStack, 0);
+    }
+    private void ProcessNextOperation(Stack<IOperation> stack, int currentOperatorIndex) {
+      IOperation operation = stack.Pop();
+      if (operation is AtomicOperation) {
+        AtomicOperation atomicOperation = (AtomicOperation)operation;
+        IOperation next = null;
+        try {
+          currentOperators[currentOperatorIndex] = atomicOperation.Operator;
+          next = atomicOperation.Operator.Execute(atomicOperation.Scope);
+        }
+        catch (Exception ex) {
+          // push operation on stack again
+          stack.Push(atomicOperation);
+          Abort();
+          ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex); });
+        }
+        if (next != null)
+          stack.Push(next);
+        OnOperationExecuted(atomicOperation);
+        if (atomicOperation.Operator.Breakpoint) Abort();
+      } else if (operation is CompositeOperation) {
+        CompositeOperation compositeOperation = (CompositeOperation)operation;
+        if (compositeOperation.ExecuteInParallel) {
+          TaskList list = new TaskList();
+          list.tasks = new Stack<IOperation>[compositeOperation.Operations.Count];
+          for (int i = 0; i < list.tasks.Length; i++) {
+            list.tasks[i] = new Stack<IOperation>();
+            list.tasks[i].Push(compositeOperation.Operations[i]);
+          }
+          list.next = 0;
+          list.semaphore = new Semaphore(0, Workers);
+
+          for (int i = 0; i < Workers; i++)
+            ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessParallelOperation), list);
+          for (int i = 0; i < Workers; i++)
+            list.semaphore.WaitOne();
+          list.semaphore.Close();
+
+          if (Canceled) {
+            // write back not finished tasks
+            CompositeOperation remaining = new CompositeOperation();
+            remaining.ExecuteInParallel = true;
+            for (int i = 0; i < list.tasks.Length; i++) {
+              if (list.tasks[i].Count > 0) {
+                CompositeOperation task = new CompositeOperation();
+                while (list.tasks[i].Count > 0)
+                  task.AddOperation(list.tasks[i].Pop());
+                remaining.AddOperation(task);
+              }
+            }
+            if (remaining.Operations.Count > 0)
+              stack.Push(remaining);
+          }
+        } else {
+          for (int i = compositeOperation.Operations.Count - 1; i >= 0; i--)
+            stack.Push(compositeOperation.Operations[i]);
+        }
+      }
+    }
+    private void ProcessParallelOperation(object state) {
+      TaskList list = (TaskList)state;
+      int currentOperatorIndex, next;
+
+      do {
+        lock (currentOperators) {
+          currentOperatorIndex = operatorIndex;
+          operatorIndex++;
+        }
+        lock (list) {
+          next = list.next;
+          list.next++;
+        }
+
+        if (next < list.tasks.Length) {
+          Stack<IOperation> stack = list.tasks[next];
+          while ((!Canceled) && (stack.Count > 0))
+            ProcessNextOperation(stack, currentOperatorIndex);
+        }
+      } while ((!Canceled) && (next < list.tasks.Length));
+      list.semaphore.Release();
+    }
+
+    public event EventHandler WorkersChanged;
+    protected virtual void OnWorkersChanged() {
+      if (WorkersChanged != null)
+        WorkersChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute workersAttribute = document.CreateAttribute("Workers");
+      workersAttribute.Value = Workers.ToString();
+      node.Attributes.Append(workersAttribute);
+      return node;
+    }
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myWorkers = int.Parse(node.Attributes["Workers"].Value);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngineEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngineEditor.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngineEditor.Designer.cs	(revision 2)
@@ -0,0 +1,134 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.ThreadParallelEngine {
+  partial class ThreadParallelEngineEditor {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.workersNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.workersLabel = new System.Windows.Forms.Label();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.operatorGraphGroupBox.SuspendLayout();
+      this.globalScopeGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.workersNumericUpDown)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.TabIndex = 7;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.TabIndex = 6;
+      // 
+      // splitContainer1
+      // 
+      // 
+      // workersNumericUpDown
+      // 
+      this.workersNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.workersNumericUpDown.Location = new System.Drawing.Point(406, 460);
+      this.workersNumericUpDown.Maximum = new decimal(new int[] {
+            10000,
+            0,
+            0,
+            0});
+      this.workersNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.workersNumericUpDown.Name = "workersNumericUpDown";
+      this.workersNumericUpDown.Size = new System.Drawing.Size(87, 20);
+      this.workersNumericUpDown.TabIndex = 5;
+      this.workersNumericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.workersNumericUpDown.ValueChanged += new System.EventHandler(this.workersNumericUpDown_ValueChanged);
+      // 
+      // workersLabel
+      // 
+      this.workersLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.workersLabel.AutoSize = true;
+      this.workersLabel.Location = new System.Drawing.Point(403, 444);
+      this.workersLabel.Name = "workersLabel";
+      this.workersLabel.Size = new System.Drawing.Size(87, 13);
+      this.workersLabel.TabIndex = 4;
+      this.workersLabel.Text = "&Worker Threads:";
+      // 
+      // ThreadParallelEngineEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.workersNumericUpDown);
+      this.Controls.Add(this.workersLabel);
+      this.Name = "ThreadParallelEngineEditor";
+      this.Controls.SetChildIndex(this.workersLabel, 0);
+      this.Controls.SetChildIndex(this.workersNumericUpDown, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executeButton, 0);
+      this.Controls.SetChildIndex(this.abortButton, 0);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.splitContainer1, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.operatorGraphGroupBox.ResumeLayout(false);
+      this.globalScopeGroupBox.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.workersNumericUpDown)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.NumericUpDown workersNumericUpDown;
+    private System.Windows.Forms.Label workersLabel;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngineEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngineEditor.cs	(revision 2)
+++ /trunk/sources/HeuristicLab.ThreadParallelEngine/ThreadParallelEngineEditor.cs	(revision 2)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.ThreadParallelEngine {
+  public partial class ThreadParallelEngineEditor : EngineBaseEditor {
+    public ThreadParallelEngine ThreadParallelEngine {
+      get { return (ThreadParallelEngine)Engine; }
+      set { base.Engine = value; }
+    }
+
+    public ThreadParallelEngineEditor() {
+      InitializeComponent();
+    }
+    public ThreadParallelEngineEditor(ThreadParallelEngine threadParallelEngine)
+      : this() {
+      ThreadParallelEngine = threadParallelEngine;
+    }
+
+    protected override void RemoveItemEvents() {
+      ThreadParallelEngine.WorkersChanged -= new EventHandler(ThreadParallelEngine_WorkersChanged);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ThreadParallelEngine.WorkersChanged += new EventHandler(ThreadParallelEngine_WorkersChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ThreadParallelEngine == null) {
+        workersNumericUpDown.Value = 1;
+        workersNumericUpDown.Enabled = false;
+      } else {
+        workersNumericUpDown.Value = ThreadParallelEngine.Workers;
+        workersNumericUpDown.Enabled = true;
+      }
+    }
+
+    #region ThreadParallelEngine Events
+    private void ThreadParallelEngine_WorkersChanged(object sender, EventArgs e) {
+      workersNumericUpDown.Value = ThreadParallelEngine.Workers;
+    }
+    #endregion
+
+    #region NumericUpDown Events
+    private void workersNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      ThreadParallelEngine.Workers = (int)workersNumericUpDown.Value;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.sln
===================================================================
--- /trunk/sources/HeuristicLab.sln	(revision 2)
+++ /trunk/sources/HeuristicLab.sln	(revision 2)
@@ -0,0 +1,217 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{96396439-A764-4022-A8D2-BE021449B8D1}"
+	ProjectSection(SolutionItems) = preProject
+		..\documentation\License\gpl-3.0.txt = ..\documentation\License\gpl-3.0.txt
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab", "HeuristicLab\HeuristicLab.csproj", "{623FB817-8371-4A9A-A491-4DECC87B2BBB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Core", "HeuristicLab.Core\HeuristicLab.Core.csproj", "{F43B59AB-2B8C-4570-BC1E-15592086517C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Data", "HeuristicLab.Data\HeuristicLab.Data.csproj", "{F473D9AF-3F09-4296-9F28-3C65118DAFFA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Random", "HeuristicLab.Random\HeuristicLab.Random.csproj", "{47019A74-F7F7-482E-83AA-D3F4F777E879}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Routing.TSP", "HeuristicLab.Routing.TSP\HeuristicLab.Routing.TSP.csproj", "{9EF75B49-D507-44E0-BC5D-C200FDA53B9B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Operators", "HeuristicLab.Operators\HeuristicLab.Operators.csproj", "{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.PluginInfrastructure", "HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj", "{94186A6A-5176-4402-AE83-886557B53CCA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Logging", "HeuristicLab.Logging\HeuristicLab.Logging.csproj", "{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SequentialEngine", "HeuristicLab.SequentialEngine\HeuristicLab.SequentialEngine.csproj", "{B4BE8E53-BA06-4237-9A01-24255F880201}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.ThreadParallelEngine", "HeuristicLab.ThreadParallelEngine\HeuristicLab.ThreadParallelEngine.csproj", "{6E757D0E-20F9-4E89-AF06-D7DA256870DB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Permutation", "HeuristicLab.Permutation\HeuristicLab.Permutation.csproj", "{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Evolutionary", "HeuristicLab.Evolutionary\HeuristicLab.Evolutionary.csproj", "{F5614C53-153C-4A37-A608-121E1C087F07}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Selection", "HeuristicLab.Selection\HeuristicLab.Selection.csproj", "{F7CF0571-25CB-43D5-8443-0843A1E2861A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Selection.OffspringSelection", "HeuristicLab.Selection.OffspringSelection\HeuristicLab.Selection.OffspringSelection.csproj", "{205898D3-2717-4686-AF17-52409B7EC0C6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.PluginInfrastructure.GUI", "HeuristicLab.PluginInfrastructure.GUI\HeuristicLab.PluginInfrastructure.GUI.csproj", "{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Scheduling.JSSP", "HeuristicLab.Scheduling.JSSP\HeuristicLab.Scheduling.JSSP.csproj", "{4C0EF782-CC94-4A94-BC3E-661D2600559B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Charting", "HeuristicLab.Charting\HeuristicLab.Charting.csproj", "{B462D3CC-8866-42F0-9832-AD0967613B72}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Charting.Data", "HeuristicLab.Charting.Data\HeuristicLab.Charting.Data.csproj", "{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Functions", "HeuristicLab.Functions\HeuristicLab.Functions.csproj", "{B95CA6E2-34BC-4430-994D-BD6E99375319}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Operators.Programmable", "HeuristicLab.Operators.Programmable\HeuristicLab.Operators.Programmable.csproj", "{E3CCBFC6-900C-41B6-AFB8-6646DB097435}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SGA", "HeuristicLab.SGA\HeuristicLab.SGA.csproj", "{E39AF78A-9692-472B-B061-E2F1B1AB2C92}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.StructureIdentification", "HeuristicLab.StructureIdentification\HeuristicLab.StructureIdentification.csproj", "{5948F299-0A5E-43B9-8F17-2D15298EEC34}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Charting.Gantt", "HeuristicLab.Charting.Gantt\HeuristicLab.Charting.Gantt.csproj", "{5D2521D9-AD86-4B3F-9532-06F4C0F49D1B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Constraints", "HeuristicLab.Constraints\HeuristicLab.Constraints.csproj", "{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Charting.Grid", "HeuristicLab.Charting.Grid\HeuristicLab.Charting.Grid.csproj", "{36BADE08-A7C2-42C1-A57B-5EE31C431C36}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataAnalysis", "HeuristicLab.DataAnalysis\HeuristicLab.DataAnalysis.csproj", "{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.BitVector", "HeuristicLab.BitVector\HeuristicLab.BitVector.csproj", "{6D9564BB-956D-4808-8F92-AA7F776F90A5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.RealVector", "HeuristicLab.RealVector\HeuristicLab.RealVector.csproj", "{2D4E4565-3ED9-4BEB-AE75-39D871843D24}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.TestFunctions", "HeuristicLab.TestFunctions\HeuristicLab.TestFunctions.csproj", "{9A781B2F-A58D-4270-A28A-3B14BBC11F4A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.OptimizationFrontend", "HeuristicLab.OptimizationFrontend\HeuristicLab.OptimizationFrontend.csproj", "{C2FB432A-07CA-45B5-BAFE-FEC172D1107B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.AdvancedOptimizationFrontend", "HeuristicLab.AdvancedOptimizationFrontend\HeuristicLab.AdvancedOptimizationFrontend.csproj", "{74752FCD-9E10-48DB-9AF2-AF5518B62807}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DistributedEngine", "HeuristicLab.DistributedEngine\HeuristicLab.DistributedEngine.csproj", "{E66D1EAA-525C-4F6D-BD25-DBCAE3750E25}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Grid", "HeuristicLab.Grid\HeuristicLab.Grid.csproj", "{545CE756-98D8-423B-AC2E-6E7D70926E5C}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{623FB817-8371-4A9A-A491-4DECC87B2BBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{623FB817-8371-4A9A-A491-4DECC87B2BBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{623FB817-8371-4A9A-A491-4DECC87B2BBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{623FB817-8371-4A9A-A491-4DECC87B2BBB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F43B59AB-2B8C-4570-BC1E-15592086517C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F43B59AB-2B8C-4570-BC1E-15592086517C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F43B59AB-2B8C-4570-BC1E-15592086517C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F43B59AB-2B8C-4570-BC1E-15592086517C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F473D9AF-3F09-4296-9F28-3C65118DAFFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F473D9AF-3F09-4296-9F28-3C65118DAFFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F473D9AF-3F09-4296-9F28-3C65118DAFFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F473D9AF-3F09-4296-9F28-3C65118DAFFA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{47019A74-F7F7-482E-83AA-D3F4F777E879}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{47019A74-F7F7-482E-83AA-D3F4F777E879}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{47019A74-F7F7-482E-83AA-D3F4F777E879}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{47019A74-F7F7-482E-83AA-D3F4F777E879}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9EF75B49-D507-44E0-BC5D-C200FDA53B9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9EF75B49-D507-44E0-BC5D-C200FDA53B9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9EF75B49-D507-44E0-BC5D-C200FDA53B9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9EF75B49-D507-44E0-BC5D-C200FDA53B9B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{94186A6A-5176-4402-AE83-886557B53CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{94186A6A-5176-4402-AE83-886557B53CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{94186A6A-5176-4402-AE83-886557B53CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{94186A6A-5176-4402-AE83-886557B53CCA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B4BE8E53-BA06-4237-9A01-24255F880201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4BE8E53-BA06-4237-9A01-24255F880201}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B4BE8E53-BA06-4237-9A01-24255F880201}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B4BE8E53-BA06-4237-9A01-24255F880201}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E757D0E-20F9-4E89-AF06-D7DA256870DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E757D0E-20F9-4E89-AF06-D7DA256870DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E757D0E-20F9-4E89-AF06-D7DA256870DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E757D0E-20F9-4E89-AF06-D7DA256870DB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F5614C53-153C-4A37-A608-121E1C087F07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F5614C53-153C-4A37-A608-121E1C087F07}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F5614C53-153C-4A37-A608-121E1C087F07}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F5614C53-153C-4A37-A608-121E1C087F07}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F7CF0571-25CB-43D5-8443-0843A1E2861A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F7CF0571-25CB-43D5-8443-0843A1E2861A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F7CF0571-25CB-43D5-8443-0843A1E2861A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F7CF0571-25CB-43D5-8443-0843A1E2861A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{205898D3-2717-4686-AF17-52409B7EC0C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{205898D3-2717-4686-AF17-52409B7EC0C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{205898D3-2717-4686-AF17-52409B7EC0C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{205898D3-2717-4686-AF17-52409B7EC0C6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4C0EF782-CC94-4A94-BC3E-661D2600559B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4C0EF782-CC94-4A94-BC3E-661D2600559B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4C0EF782-CC94-4A94-BC3E-661D2600559B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4C0EF782-CC94-4A94-BC3E-661D2600559B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B462D3CC-8866-42F0-9832-AD0967613B72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B462D3CC-8866-42F0-9832-AD0967613B72}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B462D3CC-8866-42F0-9832-AD0967613B72}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B462D3CC-8866-42F0-9832-AD0967613B72}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B95CA6E2-34BC-4430-994D-BD6E99375319}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B95CA6E2-34BC-4430-994D-BD6E99375319}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B95CA6E2-34BC-4430-994D-BD6E99375319}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B95CA6E2-34BC-4430-994D-BD6E99375319}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E3CCBFC6-900C-41B6-AFB8-6646DB097435}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E3CCBFC6-900C-41B6-AFB8-6646DB097435}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E3CCBFC6-900C-41B6-AFB8-6646DB097435}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E3CCBFC6-900C-41B6-AFB8-6646DB097435}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E39AF78A-9692-472B-B061-E2F1B1AB2C92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E39AF78A-9692-472B-B061-E2F1B1AB2C92}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E39AF78A-9692-472B-B061-E2F1B1AB2C92}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E39AF78A-9692-472B-B061-E2F1B1AB2C92}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5948F299-0A5E-43B9-8F17-2D15298EEC34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5948F299-0A5E-43B9-8F17-2D15298EEC34}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5948F299-0A5E-43B9-8F17-2D15298EEC34}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5948F299-0A5E-43B9-8F17-2D15298EEC34}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5D2521D9-AD86-4B3F-9532-06F4C0F49D1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5D2521D9-AD86-4B3F-9532-06F4C0F49D1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5D2521D9-AD86-4B3F-9532-06F4C0F49D1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5D2521D9-AD86-4B3F-9532-06F4C0F49D1B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}.Release|Any CPU.Build.0 = Release|Any CPU
+		{36BADE08-A7C2-42C1-A57B-5EE31C431C36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{36BADE08-A7C2-42C1-A57B-5EE31C431C36}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{36BADE08-A7C2-42C1-A57B-5EE31C431C36}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{36BADE08-A7C2-42C1-A57B-5EE31C431C36}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6D9564BB-956D-4808-8F92-AA7F776F90A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6D9564BB-956D-4808-8F92-AA7F776F90A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6D9564BB-956D-4808-8F92-AA7F776F90A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6D9564BB-956D-4808-8F92-AA7F776F90A5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2D4E4565-3ED9-4BEB-AE75-39D871843D24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2D4E4565-3ED9-4BEB-AE75-39D871843D24}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2D4E4565-3ED9-4BEB-AE75-39D871843D24}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2D4E4565-3ED9-4BEB-AE75-39D871843D24}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9A781B2F-A58D-4270-A28A-3B14BBC11F4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9A781B2F-A58D-4270-A28A-3B14BBC11F4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9A781B2F-A58D-4270-A28A-3B14BBC11F4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9A781B2F-A58D-4270-A28A-3B14BBC11F4A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C2FB432A-07CA-45B5-BAFE-FEC172D1107B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C2FB432A-07CA-45B5-BAFE-FEC172D1107B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C2FB432A-07CA-45B5-BAFE-FEC172D1107B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C2FB432A-07CA-45B5-BAFE-FEC172D1107B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{74752FCD-9E10-48DB-9AF2-AF5518B62807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{74752FCD-9E10-48DB-9AF2-AF5518B62807}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{74752FCD-9E10-48DB-9AF2-AF5518B62807}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{74752FCD-9E10-48DB-9AF2-AF5518B62807}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E66D1EAA-525C-4F6D-BD25-DBCAE3750E25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E66D1EAA-525C-4F6D-BD25-DBCAE3750E25}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E66D1EAA-525C-4F6D-BD25-DBCAE3750E25}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E66D1EAA-525C-4F6D-BD25-DBCAE3750E25}.Release|Any CPU.Build.0 = Release|Any CPU
+		{545CE756-98D8-423B-AC2E-6E7D70926E5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{545CE756-98D8-423B-AC2E-6E7D70926E5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{545CE756-98D8-423B-AC2E-6E7D70926E5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{545CE756-98D8-423B-AC2E-6E7D70926E5C}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /trunk/sources/HeuristicLab/HeuristicLab.csproj
===================================================================
--- /trunk/sources/HeuristicLab/HeuristicLab.csproj	(revision 2)
+++ /trunk/sources/HeuristicLab/HeuristicLab.csproj	(revision 2)
@@ -0,0 +1,122 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{623FB817-8371-4A9A-A491-4DECC87B2BBB}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab</RootNamespace>
+    <AssemblyName>HeuristicLab</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <ApplicationIcon>HeuristicLab.ico</ApplicationIcon>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SplashScreen.resx">
+      <DependentUpon>SplashScreen.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <None Include="UpdateAssemblies.cmd" />
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="SplashScreen.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SplashScreen.Designer.cs">
+      <DependentUpon>SplashScreen.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure.GUI\HeuristicLab.PluginInfrastructure.GUI.csproj">
+      <Project>{D3F92C1F-42B4-4EFB-9E73-B64FD3428ADE}</Project>
+      <Name>HeuristicLab.PluginInfrastructure.GUI</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="HeuristicLab.ico" />
+    <Content Include="Resources\HeuristicLab.ico" />
+    <None Include="app.config" />
+    <None Include="Resources\LargeIcons.gif" />
+    <None Include="Resources\Details.gif" />
+    <None Include="Resources\List.gif" />
+    <None Include="Resources\Logo_white.gif" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PostBuildEvent>cmd /c ..\..\UpdateAssemblies.cmd $(ConfigurationName)</PostBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /trunk/sources/HeuristicLab/MainForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab/MainForm.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/MainForm.Designer.cs	(revision 2)
@@ -0,0 +1,198 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab {
+  partial class MainForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if(disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Plugin Management", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Applications", System.Windows.Forms.HorizontalAlignment.Left);
+      this.startButton = new System.Windows.Forms.Button();
+      this.largeImageList = new System.Windows.Forms.ImageList(this.components);
+      this.applicationsListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.smallImageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsButton = new System.Windows.Forms.Button();
+      this.listButton = new System.Windows.Forms.Button();
+      this.largeIconsButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.startButton.Enabled = false;
+      this.startButton.Location = new System.Drawing.Point(579, 511);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(75, 23);
+      this.startButton.TabIndex = 1;
+      this.startButton.Text = "Start";
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.applicationsListView_ItemActivate);
+      // 
+      // largeImageList
+      // 
+      this.largeImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("largeImageList.ImageStream")));
+      this.largeImageList.TransparentColor = System.Drawing.Color.Transparent;
+      this.largeImageList.Images.SetKeyName(0, "HeuristicLab.ico");
+      // 
+      // applicationsListView
+      // 
+      this.applicationsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.applicationsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.versionColumnHeader,
+            this.descriptionColumnHeader});
+      listViewGroup1.Header = "Plugin Management";
+      listViewGroup1.Name = "Plugin Management";
+      listViewGroup2.Header = "Applications";
+      listViewGroup2.Name = "Applications";
+      this.applicationsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup1,
+            listViewGroup2});
+      this.applicationsListView.LargeImageList = this.largeImageList;
+      this.applicationsListView.Location = new System.Drawing.Point(12, 12);
+      this.applicationsListView.MultiSelect = false;
+      this.applicationsListView.Name = "applicationsListView";
+      this.applicationsListView.ShowItemToolTips = true;
+      this.applicationsListView.Size = new System.Drawing.Size(642, 493);
+      this.applicationsListView.SmallImageList = this.smallImageList;
+      this.applicationsListView.TabIndex = 2;
+      this.applicationsListView.UseCompatibleStateImageBehavior = false;
+      this.applicationsListView.ItemActivate += new System.EventHandler(this.applicationsListView_ItemActivate);
+      this.applicationsListView.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.applicationsListBox_SelectedIndexChanged);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      this.nameColumnHeader.Width = 125;
+      // 
+      // versionColumnHeader
+      // 
+      this.versionColumnHeader.Text = "Version";
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      this.descriptionColumnHeader.Width = 453;
+      // 
+      // smallImageList
+      // 
+      this.smallImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("smallImageList.ImageStream")));
+      this.smallImageList.TransparentColor = System.Drawing.Color.Transparent;
+      this.smallImageList.Images.SetKeyName(0, "HeuristicLab.ico");
+      // 
+      // detailsButton
+      // 
+      this.detailsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.detailsButton.AutoSize = true;
+      this.detailsButton.Image = global::HeuristicLab.Properties.Resources.Details;
+      this.detailsButton.Location = new System.Drawing.Point(68, 511);
+      this.detailsButton.Name = "detailsButton";
+      this.detailsButton.Size = new System.Drawing.Size(22, 23);
+      this.detailsButton.TabIndex = 5;
+      this.detailsButton.UseVisualStyleBackColor = true;
+      this.detailsButton.Click += new System.EventHandler(this.detailsButton_Click);
+      // 
+      // listButton
+      // 
+      this.listButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.listButton.AutoSize = true;
+      this.listButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.listButton.Image = global::HeuristicLab.Properties.Resources.List;
+      this.listButton.Location = new System.Drawing.Point(40, 511);
+      this.listButton.Name = "listButton";
+      this.listButton.Size = new System.Drawing.Size(22, 22);
+      this.listButton.TabIndex = 4;
+      this.listButton.UseVisualStyleBackColor = true;
+      this.listButton.Click += new System.EventHandler(this.listButton_Click);
+      // 
+      // largeIconsButton
+      // 
+      this.largeIconsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.largeIconsButton.AutoSize = true;
+      this.largeIconsButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.largeIconsButton.Image = global::HeuristicLab.Properties.Resources.LargeIcons;
+      this.largeIconsButton.Location = new System.Drawing.Point(12, 511);
+      this.largeIconsButton.Name = "largeIconsButton";
+      this.largeIconsButton.Size = new System.Drawing.Size(22, 22);
+      this.largeIconsButton.TabIndex = 3;
+      this.largeIconsButton.UseVisualStyleBackColor = true;
+      this.largeIconsButton.Click += new System.EventHandler(this.largeIconsButton_Click);
+      // 
+      // MainForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(666, 546);
+      this.Controls.Add(this.detailsButton);
+      this.Controls.Add(this.listButton);
+      this.Controls.Add(this.largeIconsButton);
+      this.Controls.Add(this.applicationsListView);
+      this.Controls.Add(this.startButton);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.Name = "MainForm";
+      this.Text = "HeuristicLab Starter";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.ImageList largeImageList;
+    private System.Windows.Forms.ListView applicationsListView;
+    private System.Windows.Forms.ColumnHeader nameColumnHeader;
+    private System.Windows.Forms.ColumnHeader versionColumnHeader;
+    private System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    private System.Windows.Forms.Button largeIconsButton;
+    private System.Windows.Forms.Button listButton;
+    private System.Windows.Forms.Button detailsButton;
+    private System.Windows.Forms.ImageList smallImageList;
+  }
+}
Index: /trunk/sources/HeuristicLab/MainForm.cs
===================================================================
--- /trunk/sources/HeuristicLab/MainForm.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/MainForm.cs	(revision 2)
@@ -0,0 +1,121 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.PluginInfrastructure.GUI;
+using System.Threading;
+
+namespace HeuristicLab {
+  public partial class MainForm : Form {
+
+    private ListViewItem pluginManagerListViewItem;
+
+    public MainForm() {
+      SplashScreen splashScreen = new SplashScreen(1000, "Loading HeuristicLab...");
+      splashScreen.Owner = this;
+      splashScreen.Show();
+
+      Application.DoEvents();
+      this.Enabled = false;
+
+      PluginManager.Manager.Action += new PluginManagerActionEventHandler(splashScreen.Manager_Action);
+      PluginManager.Manager.Initialize();
+
+      InitializeComponent();
+
+      RefreshApplicationsList();
+
+      this.Enabled = true;
+      this.Visible = true;
+    }
+
+    private void RefreshApplicationsList() {
+      pluginManagerListViewItem = new ListViewItem("Plugin Manager", 0);
+      pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "-"));
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
+      pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
+
+      applicationsListView.Items.Add(pluginManagerListViewItem);
+
+      foreach(ApplicationInfo info in PluginManager.Manager.InstalledApplications) {
+        ListViewItem item = new ListViewItem(info.Name, 0);
+        item.Tag = info;
+        item.Group = applicationsListView.Groups["Applications"];
+        item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Version.ToString()));
+        item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Description));
+        item.ToolTipText = info.Description;
+        applicationsListView.Items.Add(item);
+      }
+    }
+
+    private void applicationsListView_ItemActivate(object sender, EventArgs e) {
+      if(applicationsListView.SelectedItems.Count > 0) {
+        Trace.Assert(applicationsListView.SelectedItems.Count == 1);
+        ListViewItem selected = applicationsListView.SelectedItems[0];
+        if(selected == pluginManagerListViewItem) {
+          ManagerForm form = new ManagerForm();
+          this.Visible = false;
+          form.ShowDialog();
+          this.Visible = true;
+        } else {
+          ApplicationInfo app = (ApplicationInfo)applicationsListView.SelectedItems[0].Tag;
+          SplashScreen splashScreen = new SplashScreen(1000, "Loading " + app.Name);
+          splashScreen.Owner = this;
+          splashScreen.Show();
+          this.Visible = false;
+          PluginManager.Manager.Action += new PluginManagerActionEventHandler(splashScreen.Manager_Action);
+          PluginManager.Manager.Run(app);
+          this.Visible = true;
+        }
+      }
+    }
+
+    private void applicationsListBox_SelectedIndexChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
+      if(e.IsSelected) {
+        startButton.Enabled = true;
+      } else {
+        startButton.Enabled = false;
+      }
+    }
+
+    private void largeIconsButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.LargeIcon;
+    }
+
+    private void listButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.List;
+    }
+
+    private void detailsButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.Details;
+    }
+
+  }
+}
Index: /trunk/sources/HeuristicLab/MainForm.resx
===================================================================
--- /trunk/sources/HeuristicLab/MainForm.resx	(revision 2)
+++ /trunk/sources/HeuristicLab/MainForm.resx	(revision 2)
@@ -0,0 +1,526 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="largeImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="largeImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAU
+        CQAAAk1TRnQBSQFMAwEBAAEEAQABBAEAASABAAEgAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
+        AYADAAEgAwABAQEAAQgGAAEQGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
+        AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
+        AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
+        AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
+        AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
+        AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
+        AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
+        AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
+        AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
+        ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
+        AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
+        ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
+        AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
+        AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
+        AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
+        AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
+        AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
+        AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
+        AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
+        ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
+        AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
+        ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
+        ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
+        AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
+        AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
+        AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
+        ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
+        Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/+CAB7/YgAB8QIHAfMK/wHz
+        DQcB8QH/YgAB7wIAAW0K/wHzDQABEgH/YgAB/wEQAQABDgHzCv8BbQ0AAfFiAAH/AZICAAHsCv8B8Q0A
+        AW1iAAL/AQ4BAAEOC/8BEgIAAQcK/2IAAv8B7AIAAZIK/wEHAgABFAr/YgAC/wHzAQ4BAAEQC/8BFAIA
+        AbwJ/2IAA/8BbQIAAe8K/wGSAgABbQn/YgAD/wHxAgABFAv/ARACAAHxCP9iAAT/AW0CAAEHCv8BkgIA
+        AesI/2IABP8BBwIAAW0K/wHzAQ4BAAEOAfMH/2IABf8BFAIAAfEK/wHsAgAB7Af/YgAF/wHvAgABbQr/
+        AfMCAAEQB/9iAAb/ARABAAEOCxQBDgIAAZIG/2IABv8BkhAAARAG/2IAB/8BDhAAAQcF/2IAB/8B7AIA
+        ARQK7AHrAgABFAX/YgAH/wHzAQ4BAAEQC/8BFAIAAbwE/2IACP8BbQIAAe8K/wGSAgABbQT/YgAI/wHx
+        AgABFAv/ARACAAHxA/9iAAn/AW0CAAEHCv8BkgIAAesD/2IACf8BBwIAAW0L/wEOAQABDgHzAv9iAAr/
+        ARQCAAHxCv8B7AIAAewC/2IACv8B7wIAAW0K/wHzAQ4BAAEQAv9iAAv/ARABAAEOAfMK/wFtAgABkgH/
+        YgAL/wGSAgAB7Ar/AfECAAEQAf9iAAz/AQ4BAAEOAfMK/wFtAgABB2IADP8B7wLsAfEK/wG8AuwB72IA
+        Hv/hAAFCAU0BPgcAAT4DAAEoAwABgAMAASADAAEBAQABAQYAAQIWAAP//wD/AAMACw==
+</value>
+  </data>
+  <metadata name="smallImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>142, 17</value>
+  </metadata>
+  <data name="smallImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC0
+        BwAAAk1TRnQBSQFMAwEBAAEEAQABBAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
+        AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
+        AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
+        AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
+        AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
+        AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
+        AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
+        AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
+        AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
+        AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
+        ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
+        AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
+        ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
+        AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
+        AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
+        AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
+        AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
+        AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
+        AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
+        AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
+        ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
+        AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
+        ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
+        ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
+        AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
+        AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
+        AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
+        ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
+        Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8CAA//MgABbQX/BwAB/zEA
+        AZIBAAX/AfEGAAFtMQAB/wEAAZIF/wEAARQF/zEAAf8BbQEABf8BkgEABf8xAAL/AQABBwX/AQAB6wT/
+        MQAC/wEUAQAF/wHsAQAE/zEAA/8BAAYUAQABkgP/MQAD/wEOCAAD/zEAA/8B8wEABv8BAAG8Av8xAAT/
+        AQABFAX/ARABAAL/MQAE/wEHAQAG/wEAAfMB/zEABf8BAAFtBf8BDgEQAf8xAAX/AZIBAAX/AfEBAAH/
+        MQAG/wHsAfEF/wHsAe9wAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/gQAL
+</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab/Program.cs
===================================================================
--- /trunk/sources/HeuristicLab/Program.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/Program.cs	(revision 2)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.Xml;
+using System.Threading;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab {
+  static class Program {
+    [STAThread]
+    static void Main() {
+      Application.EnableVisualStyles();
+      Application.SetCompatibleTextRenderingDefault(false);
+      Application.Run(new MainForm());
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab/Properties/AssemblyInfo.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/Properties/AssemblyInfo.cs	(revision 2)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab")]
+[assembly: AssemblyDescription("HeuristicLab")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("0add4132-8872-4c5c-bba5-1de2f6486dd8")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
Index: /trunk/sources/HeuristicLab/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab/Properties/Resources.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/Properties/Resources.Designer.cs	(revision 2)
@@ -0,0 +1,119 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Details {
+            get {
+                object obj = ResourceManager.GetObject("Details", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Icon HeuristicLab {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLab", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap LargeIcons {
+            get {
+                object obj = ResourceManager.GetObject("LargeIcons", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap List {
+            get {
+                object obj = ResourceManager.GetObject("List", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Logo_white {
+            get {
+                object obj = ResourceManager.GetObject("Logo_white", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab/Properties/Resources.resx	(revision 2)
+++ /trunk/sources/HeuristicLab/Properties/Resources.resx	(revision 2)
@@ -0,0 +1,136 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Details" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Details.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HeuristicLab" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\HeuristicLab.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="LargeIcons" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\LargeIcons.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="List" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\List.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Logo_white" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Logo_white.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab/Properties/Settings.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/Properties/Settings.Designer.cs	(revision 2)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string User {
+            get {
+                return ((string)(this["User"]));
+            }
+            set {
+                this["User"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string Organization {
+            get {
+                return ((string)(this["Organization"]));
+            }
+            set {
+                this["Organization"] = value;
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab/Properties/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab/Properties/Settings.settings	(revision 2)
+++ /trunk/sources/HeuristicLab/Properties/Settings.settings	(revision 2)
@@ -0,0 +1,12 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="User" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="Organization" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /trunk/sources/HeuristicLab/SplashScreen.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab/SplashScreen.Designer.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/SplashScreen.Designer.cs	(revision 2)
@@ -0,0 +1,251 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+namespace HeuristicLab {
+  partial class SplashScreen {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+    
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashScreen));
+      this.waitTimer = new System.Windows.Forms.Timer(this.components);
+      this.panel = new System.Windows.Forms.Panel();
+      this.closeButton = new System.Windows.Forms.Button();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.companyLabel = new System.Windows.Forms.Label();
+      this.userNameLabel = new System.Windows.Forms.Label();
+      this.licensedToLabel = new System.Windows.Forms.Label();
+      this.titleLabel = new System.Windows.Forms.Label();
+      this.versionLabel = new System.Windows.Forms.Label();
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.copyrightLabel = new System.Windows.Forms.Label();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.fadeTimer = new System.Windows.Forms.Timer(this.components);
+      this.panel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // waitTimer
+      // 
+      this.waitTimer.Interval = 1000;
+      this.waitTimer.Tick += new System.EventHandler(this.waitTimer_Tick);
+      // 
+      // panel
+      // 
+      this.panel.BackColor = System.Drawing.SystemColors.Window;
+      this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.panel.Controls.Add(this.closeButton);
+      this.panel.Controls.Add(this.companyLabel);
+      this.panel.Controls.Add(this.userNameLabel);
+      this.panel.Controls.Add(this.licensedToLabel);
+      this.panel.Controls.Add(this.titleLabel);
+      this.panel.Controls.Add(this.versionLabel);
+      this.panel.Controls.Add(this.infoLabel);
+      this.panel.Controls.Add(this.copyrightLabel);
+      this.panel.Controls.Add(this.pictureBox);
+      this.panel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.panel.Location = new System.Drawing.Point(0, 0);
+      this.panel.Name = "panel";
+      this.panel.Size = new System.Drawing.Size(625, 161);
+      this.panel.TabIndex = 0;
+      // 
+      // closeButton
+      // 
+      this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.closeButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+      this.closeButton.FlatAppearance.BorderColor = System.Drawing.Color.White;
+      this.closeButton.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray;
+      this.closeButton.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
+      this.closeButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.closeButton.ForeColor = System.Drawing.Color.White;
+      this.closeButton.ImageIndex = 0;
+      this.closeButton.ImageList = this.imageList;
+      this.closeButton.Location = new System.Drawing.Point(604, 3);
+      this.closeButton.Name = "closeButton";
+      this.closeButton.Size = new System.Drawing.Size(16, 16);
+      this.closeButton.TabIndex = 7;
+      this.closeButton.UseVisualStyleBackColor = true;
+      this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
+      // 
+      // imageList
+      // 
+      this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
+      this.imageList.TransparentColor = System.Drawing.Color.Magenta;
+      this.imageList.Images.SetKeyName(0, "BuilderDialog_delete.bmp");
+      // 
+      // companyLabel
+      // 
+      this.companyLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.companyLabel.Location = new System.Drawing.Point(248, 88);
+      this.companyLabel.Name = "companyLabel";
+      this.companyLabel.Size = new System.Drawing.Size(364, 16);
+      this.companyLabel.TabIndex = 5;
+      this.companyLabel.Text = "Company";
+      this.companyLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // userNameLabel
+      // 
+      this.userNameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userNameLabel.BackColor = System.Drawing.SystemColors.Window;
+      this.userNameLabel.Location = new System.Drawing.Point(248, 72);
+      this.userNameLabel.Name = "userNameLabel";
+      this.userNameLabel.Size = new System.Drawing.Size(364, 16);
+      this.userNameLabel.TabIndex = 4;
+      this.userNameLabel.Text = "User";
+      this.userNameLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // licensedToLabel
+      // 
+      this.licensedToLabel.Location = new System.Drawing.Point(170, 72);
+      this.licensedToLabel.Name = "licensedToLabel";
+      this.licensedToLabel.Size = new System.Drawing.Size(72, 16);
+      this.licensedToLabel.TabIndex = 3;
+      this.licensedToLabel.Text = "Licensed to:";
+      this.licensedToLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // titleLabel
+      // 
+      this.titleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.titleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.titleLabel.Location = new System.Drawing.Point(170, 8);
+      this.titleLabel.Name = "titleLabel";
+      this.titleLabel.Size = new System.Drawing.Size(442, 16);
+      this.titleLabel.TabIndex = 0;
+      this.titleLabel.Text = "Title";
+      this.titleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.versionLabel.Location = new System.Drawing.Point(170, 24);
+      this.versionLabel.Name = "versionLabel";
+      this.versionLabel.Size = new System.Drawing.Size(442, 16);
+      this.versionLabel.TabIndex = 1;
+      this.versionLabel.Text = "Version ";
+      this.versionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.infoLabel.ForeColor = System.Drawing.SystemColors.GradientActiveCaption;
+      this.infoLabel.Location = new System.Drawing.Point(170, 104);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(442, 47);
+      this.infoLabel.TabIndex = 6;
+      this.infoLabel.Text = "Startup Information";
+      this.infoLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // copyrightLabel
+      // 
+      this.copyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.copyrightLabel.Location = new System.Drawing.Point(170, 56);
+      this.copyrightLabel.Name = "copyrightLabel";
+      this.copyrightLabel.Size = new System.Drawing.Size(442, 16);
+      this.copyrightLabel.TabIndex = 2;
+      this.copyrightLabel.Text = "Copyright";
+      this.copyrightLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.pictureBox.Image = global::HeuristicLab.Properties.Resources.Logo_white;
+      this.pictureBox.Location = new System.Drawing.Point(-1, -1);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(165, 161);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      // 
+      // fadeTimer
+      // 
+      this.fadeTimer.Interval = 50;
+      this.fadeTimer.Tick += new System.EventHandler(this.fadeTimer_Tick);
+      // 
+      // SplashScreen
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(625, 161);
+      this.ControlBox = false;
+      this.Controls.Add(this.panel);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "SplashScreen";
+      this.Opacity = 0.99;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+      this.TopMost = true;
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SplashScreen_FormClosing);
+      this.panel.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Timer waitTimer;
+    private System.Windows.Forms.Panel panel;
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.Label companyLabel;
+    private System.Windows.Forms.Label userNameLabel;
+    private System.Windows.Forms.Label licensedToLabel;
+    private System.Windows.Forms.Label titleLabel;
+    private System.Windows.Forms.Label versionLabel;
+    private System.Windows.Forms.Label copyrightLabel;
+    private System.Windows.Forms.Label infoLabel;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.Button closeButton;
+    private System.Windows.Forms.Timer fadeTimer;
+  }
+}
Index: /trunk/sources/HeuristicLab/SplashScreen.cs
===================================================================
--- /trunk/sources/HeuristicLab/SplashScreen.cs	(revision 2)
+++ /trunk/sources/HeuristicLab/SplashScreen.cs	(revision 2)
@@ -0,0 +1,141 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Reflection;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab {
+  public partial class SplashScreen : Form {
+    private int myDisplayTime = 1000;
+    public int DisplayTime {
+      get { return (myDisplayTime); }
+      set {
+        if(value > 0) {
+          myDisplayTime = value;
+          waitTimer.Interval = value;
+        }
+      }
+    }
+
+    public SplashScreen() {
+      InitializeComponent();
+
+      Assembly assembly = this.GetType().Assembly;
+      object[] attributes = assembly.GetCustomAttributes(false);
+      string user, company;
+
+      titleLabel.Text = Application.ProductName;
+      versionLabel.Text = "Version " + Application.ProductVersion;
+      infoLabel.Text = "";
+
+      foreach(object obj in attributes) {
+        if(obj is AssemblyCopyrightAttribute) {
+          copyrightLabel.Text = "Copyright " + ((AssemblyCopyrightAttribute)obj).Copyright;
+        }
+      }
+
+      try {
+        user = HeuristicLab.Properties.Settings.Default.User;
+        company = HeuristicLab.Properties.Settings.Default.Organization;
+
+        if((user == null) || (user.Equals(""))) {
+          userNameLabel.Text = "-";
+        } else {
+          userNameLabel.Text = user;
+        }
+
+        if((company == null) || (company.Equals(""))) {
+          companyLabel.Text = "-";
+        } else {
+          companyLabel.Text = company;
+        }
+      } catch(Exception) {
+        userNameLabel.Text = "-";
+        companyLabel.Text = "-";
+      }
+      waitTimer.Start();
+    }
+
+    public SplashScreen(int displayTime, string initialText)
+      : this() {
+      waitTimer.Stop();
+      DisplayTime = displayTime;
+      waitTimer.Start();
+      infoLabel.Text = initialText;
+    }
+
+    private void SetInfoText(string text) {
+      this.Invoke((MethodInvoker)delegate() { infoLabel.Text = text; });
+    }
+
+    public void Manager_Action(object sender, PluginManagerActionEventArgs e) {
+      if(!this.Disposing && !this.IsDisposed) {
+        waitTimer.Stop();
+        string info;
+        if(e.Action == PluginManagerAction.Initializing) info = "Initializing ...";
+        else if(e.Action == PluginManagerAction.InitializingPlugin) info = "Initializing Plugin " + e.Id + " ...";
+        else if(e.Action == PluginManagerAction.InitializedPlugin) info = "Initializing Plugin " + e.Id + " ... Initialized";
+        else if(e.Action == PluginManagerAction.Initialized) info = "Initialization Completed";
+        else {
+          if(e.Id != null) info = e.Action.ToString() + "   (" + e.Id + ")";
+          else info = e.Action.ToString();
+        }
+        SetInfoText(info);
+        Application.DoEvents();
+        waitTimer.Start();
+      }
+    }
+
+    private void waitTimer_Tick(object sender, System.EventArgs e) {
+      if(!this.Disposing && !this.IsDisposed) {
+        waitTimer.Stop();
+        fadeTimer.Start();
+      }
+    }
+
+    private void fadeTimer_Tick(object sender, EventArgs e) {
+      if(Opacity > 0.9) {
+        Opacity = 0.9;
+      } else if(this.Opacity > 0) {
+        Opacity -= 0.1;
+      } else {
+        Opacity = 0;
+        fadeTimer.Stop();
+        Close();
+      }
+    }
+
+
+    private void SplashScreen_FormClosing(object sender, FormClosingEventArgs e) {
+      PluginManager.Manager.Action -= new PluginManagerActionEventHandler(this.Manager_Action);
+    }
+
+    private void closeButton_Click(object sender, EventArgs e) {
+      waitTimer.Stop();
+      Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab/SplashScreen.resx
===================================================================
--- /trunk/sources/HeuristicLab/SplashScreen.resx	(revision 2)
+++ /trunk/sources/HeuristicLab/SplashScreen.resx	(revision 2)
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="waitTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>16, 17</value>
+  </metadata>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>219, 17</value>
+  </metadata>
+  <data name="imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAi
+        AQAAAk1TRnQBSQFMAwEBAAEEAQABBAEAARABAAEQAQAE/wEZAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA
+        ARADAAEBAQABGAYAAQz8AAP/nwAD/8AAA/8VAAP/pQAD/xIAA/+rAAP/DwAD/64AA/8JAAP/ugAD/7oA
+        A//AAAP/tAAD/wYAA/+xAAP/DwAD/6gAA/8VAAP/nwAD/x4AA///AP8AFQABQgFNAT4HAAE+AwABKAMA
+        AUADAAEQAwABAQEAAQEFAAGAFwAD/wEAAv8GAAH/AfkGAAHnAf8GAAHDAfMGAAHDAecGAAHhAccGAAHw
+        AY8GAAH4AR8GAAH8AT8GAAH4AR8GAAHwAZ8GAAHBAccGAAGDAeMGAAGPAfEGAAL/BgAC/wYACw==
+</value>
+  </data>
+  <metadata name="fadeTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>116, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab/UpdateAssemblies.cmd
===================================================================
--- /trunk/sources/HeuristicLab/UpdateAssemblies.cmd	(revision 2)
+++ /trunk/sources/HeuristicLab/UpdateAssemblies.cmd	(revision 2)
@@ -0,0 +1,36 @@
+rmdir plugins /s /q 
+mkdir plugins
+mkdir plugins\cache
+mkdir plugins\temp
+mkdir plugins\backup
+copy ..\..\..\HeuristicLab.AdvancedOptimizationFrontend\bin\%1\HeuristicLab.AdvancedOptimizationFrontend.dll .\plugins
+copy ..\..\..\HeuristicLab.AdvancedOptimizationFrontend\bin\%1\WeifenLuo.WinFormsUI.Docking.dll .\plugins
+copy ..\..\..\HeuristicLab.BitVector\bin\%1\HeuristicLab.BitVector.dll .\plugins
+copy ..\..\..\HeuristicLab.Charting\bin\%1\HeuristicLab.Charting.dll .\plugins
+copy ..\..\..\HeuristicLab.Charting.Data\bin\%1\HeuristicLab.Charting.Data.dll .\plugins
+copy ..\..\..\HeuristicLab.Charting.Gantt\bin\%1\HeuristicLab.Charting.Gantt.dll .\plugins
+copy ..\..\..\HeuristicLab.Charting.Grid\bin\%1\HeuristicLab.Charting.Grid.dll .\plugins
+copy ..\..\..\HeuristicLab.Core\bin\%1\HeuristicLab.Core.dll .\plugins
+copy ..\..\..\HeuristicLab.Constraints\bin\%1\HeuristicLab.Constraints.dll .\plugins
+copy ..\..\..\HeuristicLab.Data\bin\%1\HeuristicLab.Data.dll .\plugins
+copy ..\..\..\HeuristicLab.DataAnalysis\bin\%1\HeuristicLab.DataAnalysis.dll .\plugins
+copy ..\..\..\HeuristicLab.DistributedEngine\bin\%1\HeuristicLab.DistributedEngine.dll .\plugins
+copy ..\..\..\HeuristicLab.Evolutionary\bin\%1\HeuristicLab.Evolutionary.dll .\plugins
+copy ..\..\..\HeuristicLab.Functions\bin\%1\HeuristicLab.Functions.dll .\plugins
+copy ..\..\..\HeuristicLab.Grid\bin\%1\HeuristicLab.Grid.dll .\plugins
+copy ..\..\..\HeuristicLab.Logging\bin\%1\HeuristicLab.Logging.dll .\plugins
+copy ..\..\..\HeuristicLab.Operators\bin\%1\HeuristicLab.Operators.dll .\plugins
+copy ..\..\..\HeuristicLab.Operators.Programmable\bin\%1\HeuristicLab.Operators.Programmable.dll .\plugins
+copy ..\..\..\HeuristicLab.OptimizationFrontend\bin\%1\HeuristicLab.OptimizationFrontend.dll .\plugins
+copy ..\..\..\HeuristicLab.Permutation\bin\%1\HeuristicLab.Permutation.dll .\plugins
+copy ..\..\..\HeuristicLab.Random\bin\%1\HeuristicLab.Random.dll .\plugins
+copy ..\..\..\HeuristicLab.RealVector\bin\%1\HeuristicLab.RealVector.dll .\plugins
+copy ..\..\..\HeuristicLab.Routing.TSP\bin\%1\HeuristicLab.Routing.TSP.dll .\plugins
+copy ..\..\..\HeuristicLab.Scheduling.JSSP\bin\%1\HeuristicLab.Scheduling.JSSP.dll .\plugins
+copy ..\..\..\HeuristicLab.Selection\bin\%1\HeuristicLab.Selection.dll .\plugins
+copy ..\..\..\HeuristicLab.Selection.OffspringSelection\bin\%1\HeuristicLab.Selection.OffspringSelection.dll .\plugins
+copy ..\..\..\HeuristicLab.SequentialEngine\bin\%1\HeuristicLab.SequentialEngine.dll .\plugins
+copy ..\..\..\HeuristicLab.SGA\bin\%1\HeuristicLab.SGA.dll .\plugins
+copy ..\..\..\HeuristicLab.StructureIdentification\bin\%1\HeuristicLab.StructureIdentification.dll .\plugins
+copy ..\..\..\HeuristicLab.TestFunctions\bin\%1\HeuristicLab.TestFunctions.dll .\plugins
+copy ..\..\..\HeuristicLab.ThreadParallelEngine\bin\%1\HeuristicLab.ThreadParallelEngine.dll .\plugins
Index: /trunk/sources/HeuristicLab/app.config
===================================================================
--- /trunk/sources/HeuristicLab/app.config	(revision 2)
+++ /trunk/sources/HeuristicLab/app.config	(revision 2)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <HeuristicLab.Properties.Settings>
+            <setting name="User" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="Organization" serializeAs="String">
+                <value />
+            </setting>
+        </HeuristicLab.Properties.Settings>
+    </userSettings>
+</configuration>
