Index: ithub/workflows/codeql-analysis.yml
===================================================================
--- .github/workflows/codeql-analysis.yml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,1 +1,0 @@
-
Index: PYING
===================================================================
--- COPYING	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,674 +1,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://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 <https://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
-<https://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
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
Index: STALLATION.md
===================================================================
--- INSTALLATION.md	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,233 +1,0 @@
-# dbLearn* - Installation
-
-## Building the web application from source
-
-
-
-### 0. Get the source:
-
-```bash
-git clone https://github.com/ajanovski/dbLearnStar.git
-```
-
-
-
-### 1. Setup a CAS instance for authentication.
-
-The web application is configured to use CAS for authentication. If you don't have access to a production/development CAS server to use for testing purposes, you can run your own development CAS instance in a container by following these instructions.
-
-First, go into the directory for a CAS container example.
-
-```bash
-cd dbLearnStar-other/container_cas_example/
-```
-
-Then, edit cas.properties and configure a list of experimental users that you will use to test authentication in the web application.
-
-```bash
-$EDITOR config/cas.properties 
-```
-
-Next, setup the podman/docker command for starting the container - modify the container name, modify the port and the local directories that are mapped to the container.
-
-```bash
-$EDITOR webstart.sh
-```
-
-Finally, run the CAS container. Tested with podman, but the command should be 100% compatibile with docker too.
-
-```bash
-./webstart.sh
-```
-
-Run podman ps or docker ps to view the list of running containers, to check if the startup was successful.
-
-```bash
-podman ps
-```
-
-
-
-### 2. Setup a DBMS instance for the main database.
-
-The web application is built and tested with PostgreSQL for the main database. It should be possible to run against another DBMS, but some source code modifications will be required. If you don't have access to a production/development PostgreSQL server, you can run your own PostgreSQL instance in a container by following these instructions. 
-
-First, go into the directory for the DB container example.
-
-```bash
-cd dbLearnStar-other/container_maindb_example/
-```
-
-Next, setup the docker/podman command for starting the container - modify the port and the local directories that are mapped to the container if you need to do so.
-
-```bash
-$EDITOR dbstart.sh
-```
-
-Next, run the DB container. Tested with podman, but the command should be 100% compatibile with docker too.
-
-```bash
-./dbstart.sh
-```
-
-Run podman ps or docker ps to view the list of running containers, to check if the startup was successful.
-
-```bash
-podman ps
-```
-
-Finally, enter console within the container to initialize the MAIN DB.
-
-```bash
-podman exec -u postgres -it dblearnstar_maindb bash
-```
-
-```sql
-psql
-CREATE USER dblearnstar_owner ENCRYPTED PASSWORD 'DBLEARNSTAR_OWNER_PASSWORD';
-CREATE DATABASE dblearnstar ENCODING 'UTF-8' OWNER DBLEARNSTAR_OWNER;
-\c dblearnstar
-CREATE SCHEMA dblearnstar AUTHORIZATION dblearnstar_owner;
-```
-
-
-
-### 3. Build and run from source
-
-First, configure a maven build profile.
-
-Edit the local maven settings file:
-
-```bash
-$EDITOR ~/.m2/settings.xml
-```
-
-If you don't have this file, setup an initial file, like documented here: https://maven.apache.org/settings.html
-
-Under the *profiles* section add a new build profile called development-dbLearnStar, setting up for your local needs.
-
-
-```xml
-<profiles>
-	<profile>
-		<id>development-dbLearnStar-example</id>
-		<activation>
-			<property>
-				<name>env</name>
-				<value>development-dbLearnStar-example</value>
-			</property>
-		</activation>
-		<properties>
-			<!-- CAS (Apereo Central Authentication Service) SETUP -->
-
-			<!-- CAS URL, without the /cas suffix from step 1. -->
-			<cas.server>CAS URL</cas.server>
-			<!-- the address of this webapp, where CAS will redirect after a successful login. -->
-			<app.server>APPLICATION_URL_AFTER_LOGIN</app.server>
-			<logout.redirectToServer>APPLICATION_URL_AFTER_LOGOUT</logout.redirectToServer>
-
-			<!-- MAIN DATABASE SETUP -->
-
-			<!-- This is the database containing the main tables used by the web application, from step 2. -->
-			<!-- Tested and built against PostgreSQL. 
-			Could work with another DBMS with few changes in the sources.-->
-
-			<jdbc.url>jdbc:postgresql://address:port/MAINDB_NAME</jdbc.url>
-			<jdbc.username>MAINDB_USERNAME</jdbc.username>
-			<jdbc.password>MAINDB_PASSWORD</jdbc.password>
-			<jdbc.default_schema>dbLearnStar</jdbc.default_schema>
-
-			<!-- For the first run on an empty database, this needs to be 'create', so that the import.sql script 
-			in src/main/resources will be run to initialize the database.
-			After that you can change it to update or validate. -->
-			<hib.hbm2ddlauto>create</hib.hbm2ddlauto>
-
-			<tapestry.hmac-passphrase>CHANGE_IT!</tapestry.hmac-passphrase>
-
-			<production.mode>false</production.mode>
-
-			<logging.path>/tmp</logging.path>
-			<logging.rootCategory>INFO,Console</logging.rootCategory>
-
-			<!-- SETUP DIRECTORIES CONTAINING ADDITIONAL FILES-->
-			
-			<!-- Main directory-->
-			<additionalFiles.path>/.../.../dbLearnStar_files</additionalFiles.path>
-			<!-- Subdirectories of the main directory, setup as relative paths-->
-			<xls.path>/excel</xls.path>
-			<fonts.path>/fonts</fonts.path>
-			<data.path>/data</data.path>
-			<upload.path>/upload</upload.path>
-			<upload.path.submissions>/submissions</upload.path.submissions>
-
-
-
-			<!-- STUDENT DATABASES SETUP -->
-
-			<!-- Here we setup how the system connects to databases developed by students, as part of an automated assessments.-->
-			<!-- Tested and built against PostgreSQL. 
-			Could work with another DBMS with few changes in the sources.-->
-
-			<studentdbs.jdbc.driver>org.postgresql.Driver</studentdbs.jdbc.driver>
-			<studentdbs.jdbc.url>jdbc:postgresql://address:port</studentdbs.jdbc.url>
-			<studentdbs.jdbc.username></studentdbs.jdbc.username>
-			<studentdbs.jdbc.password></studentdbs.jdbc.password>
-			<studentdbs.jdbc.default_schema>tables</studentdbs.jdbc.default_schema>
-
-
-
-			<!-- EPRMS DATABASE SETUP -->
-
-			<!-- Here we setup how the system connects to the EPRMS database, if we with to integrate EPRMS. -->
-			<!-- Tested and built against PostgreSQL. 
-			Could work with another DBMS with few changes in the sources.-->
-
-			<eprms.jdbc.driver>org.postgresql.Driver</eprms.jdbc.driver>
-			<eprms.jdbc.url>jdbc:postgresql://address:port/EPRMSDB_NAME</eprms.jdbc.url>
-			<eprms.jdbc.username>EPRMSDB_USERNAME</eprms.jdbc.username>
-			<eprms.jdbc.password>EPRMSDB_PASS</eprms.jdbc.password>
-			<eprms.jdbc.default_schema>eprms_main</eprms.jdbc.default_schema>
-		</properties>
-	</profile>
-</profiles>
-```
-
-The latest version is tested with Java 21 and Maven 3.9.9.
-
-Build and install the model sub-project first. The jar will be installed in the local maven repo.
-
-```bash
-cd dbLearnStar-model/
-mvn -P development-dbLearnStar-example clean install
-cd ..
-```
-
-After the model is successfully built, one can build and run the web application.
-
-Setup the port on which the app runs here:
-
-```bash
-cd dbLearnStar-webApp/
-$EDITOR src/main/resources/application.yml
-```
-
-```bash
-mvn -P development-dbLearnStar-example clean spring-boot:run
-```
-
-If the build is successful, the web application will be running on the configured port under localhost.
-
-You can test it at: [http://localhost:8081](http://localhost:8081) (change to configured port)
-
-If all is setup properly the browser will automatically redirect you to the CAS instance at [http://localhost:8080](http://localhost:8080) (or configured address and port).
-
-Before first run, you need to register the account of the admin user and username in the person table in the MAIN DB.
-This process is automated by running the script import.sql which is in dbLearnStar-webapp/src/main/resources. 
-It should run automatically to seed initial data in the database during runs with the 'create' parameter in maven settings hib.dbm2ddl.auto.
-Otherwise run the script manually on the first run, before logging in.
-
-Then you can authenticate. Enter a user/password configured in your CAS instance in step 1.
-
-If authentication is successful you will be redirected back to the web aplication at [http://localpost:8081](http://localpost:8081) (or configured address and port).
-
-The webaplication main screen will welcome you.
Index: README.md
===================================================================
--- README.md	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ README.md	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,47 +1,3 @@
 # dbLearn* - Open-Source System for Conducting Iterative Exercises and Exams in a Databases Course
 
-## Features
 
-- Library of tasks and tests for individual practice
-  * Flexibility in defining as many task types as needed - each task type can be associated with a specific code editors in case such an editor is needed (there is support for SQL code to be used in coding and practical tasks, and there are text editors using specific symbol sets to be used in written and theory-based tasks)
-  * Flexibility in defining as many collections as needed and their organization in a hierarchy if needed
-- Test administration and management for organized group testing or individual testing
-  * Test templates can be defined using a specific test structure
-  * Test instances can be created based on test templates and conducted at a specific date
-  * Test groups who are allowed to take each tests can be defined
-  * Tests can be graded and reviewed
-  * Support for transparency in grading - students can be allowed to view 
-- Support for automatic and semi-automatic evaluation of SQL tasks based on correct solutions test samples implemented as database views
-- Support for rapid and semi-automated evaluation of database and schema design DDL tasks
-
-The system was presented at the following conferences:
-- Vangel V. Ajanovski. 2022. Rapid Aspect-Oriented Assessment of Relational Database Design Assignments. In Proceedings of the 23rd Annual Conference on Information Technology Education (SIGITE '22). Association for Computing Machinery, New York, NY, USA, 86–87. DOI: https://doi.org/10.1145/3537674.3555794
-- Vangel Ajanovski. 2021. DbLearn*: Open-Source System and a Set of Practices for Conducting Iterative Exercises and Exams in a Databases Course. In Proceedings of the 22nd Annual Conference on Information Technology Education (SIGITE '21). Association for Computing Machinery, New York, NY, USA, 61–62. https://doi.org/10.1145/3450329.3478317
-
-The system is used in production:
-- Database courses taught by the main author since 2019 at the Faculty of Computer Science and Engineering, Ss. Cyril and Methodius University in Skopje.
-
-## Screenshots
-
-Library of Test Collections and Tasks
-
-![Image](https://github.com/ajanovski/dbLearnStar/raw/main/dbLearnStar-presentations/screenShots/LibraryOfTestCollectionsAndTasks.png)
-
----
-
-Taking a Practical Exam - SQL
-
-![Image](https://github.com/ajanovski/dbLearnStar/raw/main/dbLearnStar-presentations/screenShots/TakingAPracticalExam-WorkingOnAQueryTask.png)
-
----
-
-Taking a Theoretical Exam - Models
-
-![Image](https://github.com/ajanovski/dbLearnStar/raw/main/dbLearnStar-presentations/screenShots/TakingATheoreticalExam-WorkingOnATask.png)
-
----
-
-System Translation Process
-
-![Image](https://github.com/ajanovski/dbLearnStar/raw/main/dbLearnStar-presentations/screenShots/TranslationProcess.png)
-
Index: LearnStar-model/COPYING
===================================================================
--- dbLearnStar-model/COPYING	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,674 +1,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://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 <https://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
-<https://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
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
Index: dbLearnStar-model/pom.xml
===================================================================
--- dbLearnStar-model/pom.xml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/pom.xml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,3 +1,3 @@
-<project  xmlns="http://maven.apache.org/POM/4.0.0"
+<project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -6,5 +6,5 @@
 	<groupId>dblearnstar</groupId>
 	<artifactId>dblearnstar-model</artifactId>
-	<version>0.2.1-SNAPSHOT</version>
+	<version>0.0.1-SNAPSHOT</version>
 
 	<name>dbLearnStar - Model</name>
@@ -26,7 +26,7 @@
 
 	<properties>
-		<maven.compiler.source>21</maven.compiler.source>
-		<maven.compiler.target>21</maven.compiler.target>
-		<java.version>21</java.version>
+		<maven.compiler.source>15</maven.compiler.source>
+		<maven.compiler.target>15</maven.compiler.target>
+		<java.version>15</java.version>
 
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -40,9 +40,4 @@
 			<version>2.2</version>
 		</dependency>
-		<dependency>
-		    <groupId>org.hibernate.validator</groupId>
-		    <artifactId>hibernate-validator</artifactId>
-		    <version>8.0.2.Final</version>
-		</dependency>
 	</dependencies>
 </project>
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/ActivityInTask.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/ActivityInTask.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/ActivityInTask.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "activity_in_task")
+@Table(schema = "sql_learning", name = "activity_in_task")
 public class ActivityInTask implements java.io.Serializable {
 	private long activityInTaskId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/AssessmentDiscussion.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/AssessmentDiscussion.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/AssessmentDiscussion.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "assessment_discussion")
+@Table(schema = "sql_learning", name = "assessment_discussion")
 public class AssessmentDiscussion implements java.io.Serializable {
 	private long assessmentDiscussionId;
@@ -37,5 +37,4 @@
 	private AssessmentDiscussion replyTo;
 	private Person person;
-	private List<AssessmentDiscussion> replies;
 
 	@Id
@@ -60,5 +59,5 @@
 	}
 
-	@Column(name = "message", nullable = false, length = 10000000)
+	@Column(name = "message", nullable = false, length = 10000)
 	public String getMessage() {
 		return this.message;
@@ -118,12 +117,3 @@
 	}
 
-	@OneToMany(fetch = FetchType.LAZY, mappedBy = "replyTo")
-	public List<AssessmentDiscussion> getReplies() {
-		return replies;
-	}
-
-	public void setReplies(List<AssessmentDiscussion> replies) {
-		this.replies = replies;
-	}
-
 }
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Group.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Group.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Group.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "group")
+@Table(schema = "sql_learning", name = "group")
 public class Group implements java.io.Serializable {
 	private long groupId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/GroupFocusOnTest.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/GroupFocusOnTest.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/GroupFocusOnTest.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "group_focus_on_test")
+@Table(schema = "sql_learning", name = "group_focus_on_test")
 public class GroupFocusOnTest implements java.io.Serializable {
 	private long groupFocusOnTestId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/GroupMember.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/GroupMember.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/GroupMember.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "group_member")
+@Table(schema = "sql_learning", name = "group_member")
 public class GroupMember implements java.io.Serializable {
 	private long groupMemberId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Model.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Model.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Model.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "model")
+@Table(schema = "sql_learning", name = "model")
 public class Model implements java.io.Serializable {
 	private long modelId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Person.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Person.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Person.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "person")
+@Table(schema = "sql_learning", name = "person")
 public class Person implements java.io.Serializable {
 	private long personId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/PersonRole.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/PersonRole.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/PersonRole.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "person_role")
+@Table(schema = "sql_learning", name = "person_role")
 public class PersonRole implements java.io.Serializable {
 	private long personRoleId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Role.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Role.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Role.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "roles")
+@Table(schema = "sql_learning", name = "roles")
 public class Role implements java.io.Serializable {
 	private long roleId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/SolutionAssessment.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/SolutionAssessment.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/SolutionAssessment.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "solution_assessment")
+@Table(schema = "sql_learning", name = "solution_assessment")
 public class SolutionAssessment implements java.io.Serializable {
 	private long solutionAssessmentId;
@@ -35,5 +35,4 @@
 	private String type;
 	private Float grade;
-	private String feedbackSource;
 	private StudentSubmitSolution studentSubmitSolution;
 	private TestInstanceParameters testInstanceParameters;
@@ -98,13 +97,4 @@
 	}
 
-	@Column(name = "feedback_source", length = 1000000, columnDefinition = "TEXT")
-	public String getFeedbackSource() {
-		return this.feedbackSource;
-	}
-
-	public void setFeedbackSource(String feedbackSource) {
-		this.feedbackSource = feedbackSource;
-	}
-
 	@ManyToOne(fetch = FetchType.LAZY)
 	@JoinColumn(name = "student_submit_solution_id", nullable = false, foreignKey = @ForeignKey(name = "fk_solution_assessment_student_submit_solution"))
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Student.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Student.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Student.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "student")
+@Table(schema = "sql_learning", name = "student")
 public class Student implements java.io.Serializable {
 	private long studentId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/StudentStartedTest.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/StudentStartedTest.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/StudentStartedTest.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "student_started_test")
+@Table(schema = "sql_learning", name = "student_started_test")
 public class StudentStartedTest implements java.io.Serializable {
 	private long studentStartedTestId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/StudentSubmitSolution.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/StudentSubmitSolution.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/StudentSubmitSolution.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "student_submit_solution")
+@Table(schema = "sql_learning", name = "student_submit_solution")
 public class StudentSubmitSolution implements java.io.Serializable {
 	private long studentSubmitSolutionId;
Index: LearnStar-model/src/main/java/dblearnstar/model/entities/SystemParameter.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/SystemParameter.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,104 +1,0 @@
-/*******************************************************************************
-
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the dbLearn* system (hereinafter: dbLearn*).
- *     
- * dbLearn* is free software: you can redistribute it and/or modify it under the 
- * terms of the GNU General Public License as published by the Free Software 
- * Foundation, either version 3 of the License, or (at your option) any later 
- * version.
- *     
- * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
- * details.
- *     
- * You should have received a copy of the GNU General Public License along 
- * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
- * 
- ******************************************************************************/
-
-package dblearnstar.model.entities;
-
-import java.util.*;
-import javax.persistence.*;
-
-import jakarta.validation.constraints.NotNull;
-
-/*
-*/
-@Entity
-@Table (schema="dblearnstar", name="system_parameter")
-public class SystemParameter implements java.io.Serializable {
-	private long systemParameterId;
-	private String className;
-	private long originalObjectId;
-	private String type;
-	private String code;
-	private String value;
-
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.IDENTITY)
-	@NotNull
-	@Column(name = "system_parameter_id", unique = true, nullable = false)
-	public long getSystemParameterId() {
-		return this.systemParameterId;
-	}
-
-	public void setSystemParameterId(long systemParameterId) {
-		this.systemParameterId=systemParameterId;
-	}
-
-	@NotNull
-	@Column(name = "class_name", nullable = false)
-	public String getClassName() {
-		return this.className;
-	}
-
-	public void setClassName(String className) {
-		this.className=className;
-	}
-
-	@NotNull
-	@Column(name = "original_object_id", nullable = false)
-	public long getOriginalObjectId() {
-		return this.originalObjectId;
-	}
-
-	public void setOriginalObjectId(long originalObjectId) {
-		this.originalObjectId=originalObjectId;
-	}
-
-	@NotNull
-	@Column(name = "type", nullable = false)
-	public String getType() {
-		return this.type;
-	}
-
-	public void setType(String type) {
-		this.type=type;
-	}
-
-	@NotNull
-	@Column(name = "code", nullable = false)
-	public String getCode() {
-		return this.code;
-	}
-
-	public void setCode(String code) {
-		this.code=code;
-	}
-
-	@NotNull
-	@Column(name = "value", nullable = false)
-	public String getValue() {
-		return this.value;
-	}
-
-	public void setValue(String value) {
-		this.value=value;
-	}
-
-}
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Task.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Task.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Task.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "task")
+@Table(schema = "sql_learning", name = "task")
 public class Task implements java.io.Serializable {
 	private long taskId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskInTestInstance.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskInTestInstance.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskInTestInstance.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "task_in_test_instance")
+@Table(schema = "sql_learning", name = "task_in_test_instance")
 public class TaskInTestInstance implements java.io.Serializable {
 	private long taskInTestInstanceId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskIsOfType.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskIsOfType.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskIsOfType.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "task_is_of_type")
+@Table(schema = "sql_learning", name = "task_is_of_type")
 public class TaskIsOfType implements java.io.Serializable {
 	private long taskIsOfTypeId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskType.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskType.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskType.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "task_type")
+@Table(schema = "sql_learning", name = "task_type")
 public class TaskType implements java.io.Serializable {
 	private long taskTypeId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskTypeInTemplate.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskTypeInTemplate.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TaskTypeInTemplate.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "task_type_in_template")
+@Table(schema = "sql_learning", name = "task_type_in_template")
 public class TaskTypeInTemplate implements java.io.Serializable {
 	private long taskTypeInTemplateId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestCollection.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestCollection.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestCollection.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "test_collection")
+@Table(schema = "sql_learning", name = "test_collection")
 public class TestCollection implements java.io.Serializable {
 	private long testCollectionId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestInstance.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestInstance.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestInstance.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "test_instance")
+@Table(schema = "sql_learning", name = "test_instance")
 public class TestInstance implements java.io.Serializable {
 	private long testInstanceId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestInstanceParameters.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestInstanceParameters.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestInstanceParameters.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "test_instance_parameters")
+@Table(schema = "sql_learning", name = "test_instance_parameters")
 public class TestInstanceParameters implements java.io.Serializable {
 	private long testInstanceParametersId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestTemplate.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestTemplate.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestTemplate.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "test_template")
+@Table(schema = "sql_learning", name = "test_template")
 public class TestTemplate implements java.io.Serializable {
 	private long testTemplateId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestType.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestType.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/TestType.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "test_type")
+@Table(schema = "sql_learning", name = "test_type")
 public class TestType implements java.io.Serializable {
 	private long testTypeId;
Index: dbLearnStar-model/src/main/java/dblearnstar/model/entities/Translation.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/entities/Translation.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/entities/Translation.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,5 +27,5 @@
 */
 @Entity
-@Table(schema = "dblearnstar", name = "translations")
+@Table(schema = "sql_learning", name = "translations")
 public class Translation implements java.io.Serializable {
 	private long translationId;
Index: LearnStar-model/src/main/java/dblearnstar/model/model/ComparatorTaskInTestInstance.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/model/ComparatorTaskInTestInstance.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,44 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the dbLearnStar system (hereinafter: dbLearn*).
- *     
- * dbLearn* is free software: you can redistribute it and/or modify it under the 
- * terms of the GNU General Public License as published by the Free Software 
- * Foundation, either version 3 of the License, or (at your option) any later 
- * version.
- *     
- * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
- * details.
- *     
- * You should have received a copy of the GNU General Public License along 
- * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
- * 
- ******************************************************************************/
-
-package dblearnstar.model.model;
-
-import java.util.Comparator;
-
-import dblearnstar.model.entities.TaskInTestInstance;
-
-public class ComparatorTaskInTestInstance implements Comparator<TaskInTestInstance> {
-
-	@Override
-	public int compare(TaskInTestInstance o1, TaskInTestInstance o2) {
-		if (o1.getTestInstance().getTestInstanceId() == o2.getTestInstance().getTestInstanceId()) {
-			if (o1.getTask().getTitle() != null && o2.getTask().getTitle() != null
-					&& !o1.getTask().getTitle().equals(o2.getTask().getTitle())) {
-				return o1.getTask().getTitle().compareTo(o2.getTask().getTitle());
-			} else {
-				return Long.compare(o1.getTaskInTestInstanceId(), o2.getTaskInTestInstanceId());
-			}
-		} else {
-			ComparatorTestInstance cti = new ComparatorTestInstance();
-			return cti.compare(o1.getTestInstance(), o2.getTestInstance());
-		}
-	}
-
-}
Index: dbLearnStar-model/src/main/java/dblearnstar/model/model/ComparatorTestCollection.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/model/ComparatorTestCollection.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/model/ComparatorTestCollection.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,7 +21,5 @@
 package dblearnstar.model.model;
 
-import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.List;
 
 import dblearnstar.model.entities.TestCollection;
@@ -29,30 +27,21 @@
 public class ComparatorTestCollection implements Comparator<TestCollection> {
 
-	public List<Integer> getCoding(TestCollection i) {
+	public String getCoding(TestCollection i) {
 		Integer broj = i.getOrdering();
 		if (broj == null) {
 			broj = 0;
 		}
-		List<Integer> l;
 		if (i.getParentCollection() == null) {
-			l = new ArrayList<Integer>();
+			return Long.toString(broj) + "-";
 		} else {
-			l = getCoding(i.getParentCollection());
+			return getCoding(i.getParentCollection()) + Long.toString(broj) + "-";
 		}
-		l.add(broj);
-		return l;
 	}
 
 	@Override
-	public int compare(TestCollection tc1, TestCollection tc2) {
-		List<Integer> o1 = getCoding(tc1);
-		List<Integer> o2 = getCoding(tc2);
-		for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) {
-			int c = o1.get(i).compareTo(o2.get(i));
-			if (c != 0) {
-				return c;
-			}
-		}
-		return Integer.compare(o1.size(), o2.size());
+	public int compare(TestCollection o1, TestCollection o2) {
+		String hier1 = getCoding(o1);
+		String hier2 = getCoding(o2);
+		return hier1.compareTo(hier2);
 	}
 
Index: dbLearnStar-model/src/main/java/dblearnstar/model/model/ModelConstants.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/model/ModelConstants.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/model/ModelConstants.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -23,42 +23,23 @@
 public class ModelConstants {
 
-	public static final String TaskCodeSQL = "SQL";
-	public static final String TaskCodeDDL = "DDL";
-	public static final String TaskCodeTEXT = "TEXT";
-	public static final String TaskCodeUPLOAD = "UPLOAD";
+	public final static String	TaskCodeSQL		= "SQL";
+	public final static String	TaskCodeDDL		= "DDL";
+	public final static String	TaskCodeTEXT	= "TEXT";
+	public final static String	TaskCodeUPLOAD	= "UPLOAD";
 
-	public static final String ActivityEval = "TASK_EVAL";
-	public static final String ActivityExecAll = "TASK_RUNONLY";
-	public static final String ActivityExecSelection = "TASK_RUNONLY_SELECTION";
-	public static final String ActivityPlan = "TASK_PLANONLY";
-	public static final String ActivityViewTask = "VIEW_TASK";
-	public static final String ActivityStillViewing = "TASK_STILL_VIEWING";
-	public static final String ActivitySubmitText = "TASK_SUBMIT_TEXT";
-	public static final String ActivityTryUpload = "TRIED TASK_UPLOAD";
+   public static final String ActivityEval = "TASK_EVAL";
+   public static final String ActivityExecAll = "TASK_RUNONLY";
+   public static final String ActivityExecSelection = "TASK_RUNONLY_SELECTION";
+   public static final String ActivityPlan = "TASK_PLANONLY";
+   public static final String ActivityViewTask = "VIEW_TASK";
+   public static final String ActivityStillViewing = "TASK_STILL_VIEWING";
+   public static final String ActivitySubmitText = "TASK_SUBMIT_TEXT";
+   public static final String ActivityTryUpload = "TRIED TASK_UPLOAD";
 
-	public static final String PersonDeactivatedSuffix = "---";
-
+	
 	/**
 	 * Pages
 	 */
-	public static final String PageIndex = "Index";
-
-	public static final Object InstructorRole = "INSTRUCTOR";
-	public static final Object AdministratorRole = "ADMINISTRATOR";
-
-	/*
-	 * Object types
-	 */
-	public static final String DBRelationalObjectTypesTABLE = "TABLE";
-	public static final String DBRelationalObjectTypesPK = "PK";
-	public static final String DBRelationalObjectTypesFK = "FK";
-	public static final String DBRelationalObjectTypesNN = "NN";
-	public static final String DBRelationalObjectTypesCHECK = "CHECK";
-	public static final String DBRelationalObjectTypesUK = "UK";
-	public static final String DBRelationalObjectTypesDATA = "DATA";
-
-	public static final String[] AllDBRelationalObjectTypes = { DBRelationalObjectTypesTABLE, DBRelationalObjectTypesPK,
-			DBRelationalObjectTypesFK, DBRelationalObjectTypesNN, DBRelationalObjectTypesCHECK,
-			DBRelationalObjectTypesUK, DBRelationalObjectTypesDATA };
+	public final static String	PageIndex		= "Index";
 
 }
Index: dbLearnStar-model/src/main/java/dblearnstar/model/model/Triplet.java
===================================================================
--- dbLearnStar-model/src/main/java/dblearnstar/model/model/Triplet.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-model/src/main/java/dblearnstar/model/model/Triplet.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -27,8 +27,9 @@
 	private T3 thirdItem;
 
-	public Triplet(T1 firstItem, T2 secondItem, T3 thirdItem) {
-		super();
-		this.firstItem = firstItem;
-		this.secondItem = secondItem;
+	public T3 getThirdItem() {
+		return thirdItem;
+	}
+
+	public void setThirdItem(T3 thirdItem) {
 		this.thirdItem = thirdItem;
 	}
@@ -46,15 +47,14 @@
 	}
 
+	public Triplet(T1 firstItem, T2 secondItem, T3 thirdItem) {
+		super();
+		this.firstItem = firstItem;
+		this.secondItem = secondItem;
+		this.thirdItem = thirdItem;
+	}
+
 	public void setSecondItem(T2 secondItem) {
 		this.secondItem = secondItem;
 	}
 
-	public T3 getThirdItem() {
-		return thirdItem;
-	}
-
-	public void setThirdItem(T3 thirdItem) {
-		this.thirdItem = thirdItem;
-	}
-
 }
Index: LearnStar-other/container_cas_example/config/cas.properties
===================================================================
--- dbLearnStar-other/container_cas_example/config/cas.properties	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,2 +1,0 @@
-cas.authn.accept.users=admin::adminpass,user1::pass1,user2::pass2
-#cas.service-registry.json.location=file:/etc/cas/services
Index: LearnStar-other/container_cas_example/docker-compose.yml
===================================================================
--- dbLearnStar-other/container_cas_example/docker-compose.yml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,23 +1,0 @@
-version: '3.8'
-
-networks:
-  samples:
-    driver: bridge
-
-services:
-  cas:
-    image: apereo/cas:6.6.6
-    container_name: cas
-    restart: always
-    ports:
-      - "8090:8080"
-    command: >
-      --cas.standalone.configuration-directory=/etc/cas/config
-      --server.ssl.enabled=false
-      --server.port=8080
-      --cas.service-registry.core.init-from-json=true
-      --cas.service-registry.json.location=file:/etc/cas/services
-    volumes:
-      - ./services/http-1.json:/etc/cas/services/http-1.json
-    networks:
-      - samples
Index: LearnStar-other/container_cas_example/services/http-1.json
===================================================================
--- dbLearnStar-other/container_cas_example/services/http-1.json	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,8 +1,0 @@
-{
-  "@class": "org.apereo.cas.services.CasRegisteredService",
-  "serviceId": "^(https?)://.*",
-  "name": "HTTP/HTTPS",
-  "id": 1,
-  "description": "This service definition authorizes all application urls that support HTTP and HTTPS protocols.",
-  "evaluationOrder": 10000
-}
Index: LearnStar-other/container_cas_example/webstart.sh
===================================================================
--- dbLearnStar-other/container_cas_example/webstart.sh	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,15 +1,0 @@
-podman run \
-	--name docker_cas \
-	-v ./services:/etc/cas/services:Z \
-	-v ./config:/etc/cas/config:Z \
-	--rm \
-	-p 8080:8080 \
-	-d \
-	--name cas \
-	apereo/cas:6.6.7 \
-		--cas.standalone.configuration-directory=/etc/cas/config \
-		--server.ssl.enabled=false \
-		--server.port=8080 \
-		--management.server.port=10000 \
-		--cas.service-registry.core.init-from-json=true \
-		--cas.service-registry.json.location=file:/etc/cas/services
Index: LearnStar-other/container_maindb_example/DatabaseFolder/README.md
===================================================================
--- dbLearnStar-other/container_maindb_example/DatabaseFolder/README.md	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,2 +1,0 @@
-When starting the container as proposed, it's internal database data directory will be mapped to this external directory. As an effect, all the database files created by the container will persist in this directory instead of insinde the container, so removing or deleting the container will not delete the database.
-
Index: LearnStar-other/container_maindb_example/dbstart.sh
===================================================================
--- dbLearnStar-other/container_maindb_example/dbstart.sh	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,10 +1,0 @@
-podman run \
-	--cgroup-manager=cgroupfs  \
-	-d \
-	-e POSTGRES_USER=postgres \
-	-e POSTGRES_PASSWORD=CHANGEPASS \
-	--privileged \
-	--mount type=bind,source=./DatabaseFolder,target=/var/lib/postgresql/data  \
-	-p 5432:5432 \
-	--name dblearnstar_maindb \
-	postgres:17
Index: LearnStar-other/evaluation_method_view_example/eval_view_template.sql
===================================================================
--- dbLearnStar-other/evaluation_method_view_example/eval_view_template.sql	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,17 +1,0 @@
--- drop view
-drop view if exists EVALPREFIX_TASKNAME;
-
--- create view
-CREATE OR REPLACE VIEW EVALPREFIX_TASKNAME
-AS
-
-
-VIEWTEKST
-
-
-;
-
--- Permissions
-ALTER TABLE        EVALPREFIX_TASKNAME OWNER TO MAINDB_OWNER;
-GRANT ALL ON TABLE EVALPREFIX_TASKNAME TO MAINDB_OWNER;
-GRANT ALL ON TABLE EVALPREFIX_TASKNAME TO MAINDB_EVALUSER;
Index: dbLearnStar-webApp/pom.xml
===================================================================
--- dbLearnStar-webApp/pom.xml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/pom.xml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,12 +1,12 @@
 <project
-	xmlns="http://maven.apache.org/POM/4.0.0"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
->
+	xmlns="http://maven.apache.org/POM/4.0.0">
+
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>3.1.3</version>
+		<version>2.5.3</version>
 		<relativePath />
 	</parent>
@@ -14,5 +14,5 @@
 	<groupId>dblearnstar</groupId>
 	<artifactId>dblearnstar</artifactId>
-	<version>0.15.2-SNAPSHOT</version>
+	<version>0.8-T5.7.3</version>
 	<name>dbLearnStar</name>
 
@@ -33,24 +33,27 @@
 
 	<properties>
+		<maven.compiler.source>15</maven.compiler.source>
+		<maven.compiler.target>15</maven.compiler.target>
+		<java.version>15</java.version>
+
+		<spring-boot-version>2.5.3</spring-boot-version>
+		<tapestry-version>5.7.3</tapestry-version>
+		<tapestry-testify-version>1.0.4</tapestry-testify-version>
+		<tapestry-xpath-version>1.0.1</tapestry-xpath-version>
+
+		<jackson-version>2.12.4</jackson-version>
+		<geb-version>2.3.1</geb-version>
+		<htmlunit-driver-version>2.33.3</htmlunit-driver-version>
+		<json-version>1.1.4</json-version>
+		<selenium-version>3.141.59</selenium-version>
+		<servlet-api-version>3.0.1</servlet-api-version>
+		<spock-version>1.3-groovy-2.5</spock-version>
+		<yasson-version>1.0.9</yasson-version>
+
+		<postgresql-version>42.2.23</postgresql-version>
+		<cas-client-version>3.6.2</cas-client-version>
+
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-
-		<maven-compiler-version>3.13.0</maven-compiler-version>
-		<maven-surefire-version>3.5.0</maven-surefire-version>
-		<maven-enforcer-version>3.0.0</maven-enforcer-version>
-		<maven.compiler.source>21</maven.compiler.source>
-		<maven.compiler.target>21</maven.compiler.target>
-		<java.version>21</java.version>
-
-		<spring-boot-version>3.1.3</spring-boot-version>
-		<tapestry-version>5.9.0</tapestry-version>
-		<jackson-version>2.19.0</jackson-version>
-		<log4j-version>2.24.0</log4j-version>
-		<junit-version>5.8.2</junit-version>
-		<yasson-version>2.0.4</yasson-version>
-		<servlet-version>5.0.0</servlet-version>
-
-		<postgresql-version>42.7.7</postgresql-version>
-		<cas-client-version>4.0.4</cas-client-version>
 	</properties>
 
@@ -62,9 +65,10 @@
 	</repositories>
 
+
 	<dependencies>
 		<dependency>
 			<groupId>dblearnstar</groupId>
 			<artifactId>dblearnstar-model</artifactId>
-			<version>0.2.1-SNAPSHOT</version>
+			<version>0.0.1-SNAPSHOT</version>
 		</dependency>
 
@@ -99,17 +103,19 @@
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-log4j2</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-tomcat</artifactId>
 			<scope>provided</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-log4j2</artifactId>
+			<scope>compile</scope>
+		</dependency>
 
 		<!-- Apache Tapestry -->
+		<!-- <dependency> <groupId>org.apache.tapestry</groupId> <artifactId>tapestry-core</artifactId> 
+			<version>${tapestry-version}</version> <scope>compile</scope> </dependency> -->
 		<dependency>
 			<groupId>org.apache.tapestry</groupId>
-			<artifactId>tapestry-core-jakarta</artifactId>
+			<artifactId>tapestry-hibernate</artifactId>
 			<version>${tapestry-version}</version>
 			<scope>compile</scope>
@@ -118,70 +124,91 @@
 		<dependency>
 			<groupId>org.apache.tapestry</groupId>
-			<artifactId>tapestry-webresources-jakarta</artifactId>
+			<artifactId>tapestry-webresources</artifactId>
 			<version>${tapestry-version}</version>
 			<scope>compile</scope>
 		</dependency>
-		<!-- Uncomment this to add support for spring, hibernate, bean
-		validation and file uploads -->
-		<!--
-        <dependency>
-            <groupId>org.apache.tapestry</groupId>
-            <artifactId>tapestry-spring-jakarta</artifactId>
-            <version>${tapestry-version}</version>
-            <scope>compile</scope>
-        </dependency>
-		-->
+		<!-- <dependency> <groupId>org.apache.tapestry</groupId> <artifactId>tapestry-beanvalidator</artifactId> 
+			<version>${tapestry-version}</version> <scope>compile</scope> </dependency> -->
 		<dependency>
 			<groupId>org.apache.tapestry</groupId>
-			<artifactId>tapestry-hibernate-jakarta</artifactId>
+			<artifactId>tapestry-upload</artifactId>
 			<version>${tapestry-version}</version>
 			<scope>compile</scope>
 		</dependency>
+
+		<!-- <dependency> <groupId>org.tynamo</groupId> <artifactId>tapestry-conversations</artifactId> 
+			<version>0.3.0</version> </dependency> -->
+
+		<!-- Unit Testing -->
 		<dependency>
 			<groupId>org.apache.tapestry</groupId>
-			<artifactId>tapestry-beanvalidator-jakarta</artifactId>
+			<artifactId>tapestry-test</artifactId>
 			<version>${tapestry-version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-		    <groupId>org.hibernate.validator</groupId>
-		    <artifactId>hibernate-validator</artifactId>
-		    <version>8.0.2.Final</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.tapestry</groupId>
-			<artifactId>tapestry-upload-jakarta</artifactId>
-			<version>${tapestry-version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<!-- Unit Testing -->
-		<dependency>
-			<groupId>org.apache.tapestry</groupId>
-			<artifactId>tapestry-test-jakarta</artifactId>
-			<version>${tapestry-version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.junit.jupiter</groupId>
-			<artifactId>junit-jupiter</artifactId>
-			<version>${junit-version}</version>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.testng</groupId>
+					<artifactId>testng</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>net.sourceforge.tapestrytestify</groupId>
+			<artifactId>tapestry-testify</artifactId>
+			<version>${tapestry-testify-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>net.sourceforge.tapestryxpath</groupId>
+			<artifactId>tapestry-xpath</artifactId>
+			<version>${tapestry-xpath-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.spockframework</groupId>
+			<artifactId>spock-core</artifactId>
+			<version>${spock-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.spockframework</groupId>
+			<artifactId>spock-spring</artifactId>
+			<version>${spock-version}</version>
+			<scope>test</scope>
+		</dependency>
+
+		<!-- Integration Testing -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.springframework.boot</groupId>
+					<artifactId>spring-boot-starter-logging</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.gebish</groupId>
+			<artifactId>geb-spock</artifactId>
+			<version>${geb-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.seleniumhq.selenium</groupId>
+			<artifactId>selenium-support</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.seleniumhq.selenium</groupId>
+			<artifactId>htmlunit-driver</artifactId>
 			<scope>test</scope>
 		</dependency>
 
 		<!-- Miscellaneous -->
-		<dependency>
-			<groupId>org.apache.logging.log4j</groupId>
-			<artifactId>log4j-api</artifactId>
-			<version>${log4j-version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.logging.log4j</groupId>
-			<artifactId>log4j-core</artifactId>
-			<version>${log4j-version}</version>
-		</dependency>
 		<dependency>
 			<groupId>org.apache.logging.log4j</groupId>
 			<artifactId>log4j-slf4j-impl</artifactId>
-			<version>${log4j-version}</version>
 		</dependency>
 		<dependency>
@@ -191,76 +218,54 @@
 		</dependency>
 		<dependency>
+			<groupId>org.glassfish</groupId>
+			<artifactId>javax.json</artifactId>
+			<version>${json-version}</version>
+		</dependency>
+		<dependency>
 			<groupId>com.fasterxml.jackson.core</groupId>
 			<artifactId>jackson-core</artifactId>
-			<version>${jackson-version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.fasterxml.jackson.core</groupId>
 			<artifactId>jackson-databind</artifactId>
-			<version>${jackson-version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.fasterxml.jackson.dataformat</groupId>
 			<artifactId>jackson-dataformat-yaml</artifactId>
-			<version>${jackson-version}</version>
-		</dependency>
-		<dependency>
-			<groupId>jakarta.servlet</groupId>
-			<artifactId>jakarta.servlet-api</artifactId>
-			<version>${servlet-version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-annotations</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<version>${servlet-api-version}</version>
 			<scope>provided</scope>
 		</dependency>
 
+		<!-- Hibernate 5.1.17 is the last supported by tapestry 5.6.1 -->
+		<!-- <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> 
+			<version>5.1.17.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> 
+			<artifactId>hibernate-validator</artifactId> <version>5.4.3.Final</version> 
+			</dependency> -->
 		<!-- PostgreSQL is used as the main DBMS engine for this app -->
 		<dependency>
 			<groupId>org.postgresql</groupId>
 			<artifactId>postgresql</artifactId>
-			<version>${postgresql-version}</version>
-		</dependency>
-		<dependency>
-			<groupId>com.zaxxer</groupId>
-			<artifactId>HikariCP</artifactId>
-			<version>6.2.1</version>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-hikaricp</artifactId>
-			<version>5.4.33.Final</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.apereo.cas.client</groupId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.jasig.cas.client</groupId>
 			<artifactId>cas-client-core</artifactId>
 			<version>${cas-client-version}</version>
 		</dependency>
 
-		<!-- jaxb for error -->
-		<dependency>
-			<groupId>jakarta.xml.bind</groupId>
-			<artifactId>jakarta.xml.bind-api</artifactId>
-			<version>2.3.3</version>
-		</dependency>
-		<!-- Runtime, com.sun.xml.bind module -->
-		<dependency>
-			<groupId>org.glassfish.jaxb</groupId>
-			<artifactId>jaxb-runtime</artifactId>
-			<version>2.3.9</version>
-		</dependency>
-
+		<!-- for Java 14-15 -->
+		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
 		<dependency>
 			<groupId>commons-fileupload</groupId>
 			<artifactId>commons-fileupload</artifactId>
-			<version>1.5</version>
-		</dependency>
-
-		<dependency>
-			<groupId>commons-codec</groupId>
-			<artifactId>commons-codec</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-text</artifactId>
-			<version>1.10.0</version>
+			<version>1.4</version>
 		</dependency>
 
@@ -269,5 +274,5 @@
 			<groupId>org.webjars</groupId>
 			<artifactId>webjars-locator</artifactId>
-			<version>0.52</version>
+			<version>0.42</version>
 		</dependency>
 		<dependency>
@@ -279,10 +284,15 @@
 			<groupId>org.webjars.npm</groupId>
 			<artifactId>feather-icons</artifactId>
-			<version>4.29.1</version>
+			<version>4.28.0</version>
 		</dependency>
 		<dependency>
 			<groupId>org.webjars</groupId>
 			<artifactId>ckeditor</artifactId>
-			<version>4.19.0</version>
+			<version>4.16.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.webjars</groupId>
+			<artifactId>codemirror</artifactId>
+			<version>5.62.2</version>
 		</dependency>
 		<dependency>
@@ -291,32 +301,6 @@
 			<version>1.205.0</version>
 		</dependency>
-		<dependency>
-			<groupId>org.webjars.npm</groupId>
-			<artifactId>codemirror</artifactId>
-			<version>6.65.7</version>
-		</dependency>
-
-		<dependency>
-			<groupId>com.github.vertical-blank</groupId>
-			<artifactId>sql-formatter</artifactId>
-			<version>2.0.4</version>
-		</dependency>
-
-		<dependency>
-			<groupId>net.objecthunter</groupId>
-			<artifactId>exp4j</artifactId>
-			<version>0.4.8</version>
-		</dependency>
+
 	</dependencies>
-
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>org.hibernate.orm</groupId>
-				<artifactId>hibernate-core</artifactId>
-				<version>5.4.33.Final</version>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
 
 	<build>
@@ -380,60 +364,10 @@
 		</testResources>
 
+
 		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-enforcer-plugin</artifactId>
-				<version>${maven-enforcer-version}</version>
-				<executions>
-					<execution>
-						<id>enforce-maven</id>
-						<goals>
-							<goal>enforce</goal>
-						</goals>
-						<configuration>
-							<rules>
-								<requireMavenVersion>
-									<version>3.5.0</version>
-								</requireMavenVersion>
-							</rules>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<version>${maven-compiler-version}</version>
-				<configuration>
-					<release>${java.version}</release>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<version>${maven-surefire-version}</version>
-				<configuration>
-					<systemPropertyVariables>
-						<propertyName>firefox</propertyName>
-					</systemPropertyVariables>
-				</configuration>
-				<dependencies>
-					<dependency>
-						<groupId>org.apache.maven.surefire</groupId>
-						<artifactId>surefire-junit-platform</artifactId>
-						<version>${maven-surefire-version}</version>
-					</dependency>
-					<dependency>
-						<groupId>org.apache.maven.surefire</groupId>
-						<artifactId>surefire-testng</artifactId>
-						<version>${maven-surefire-version}</version>
-					</dependency>
-				</dependencies>
-			</plugin>
 			<plugin>
 				<groupId>org.springframework.boot</groupId>
 				<artifactId>spring-boot-maven-plugin</artifactId>
 			</plugin>
-
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
@@ -441,66 +375,4 @@
 				<version>2.6</version>
 			</plugin>
-
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-dependency-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>unpack</id>
-						<phase>generate-test-sources</phase>
-						<goals>
-							<goal>unpack</goal>
-						</goals>
-						<configuration>
-							<artifactItems>
-								<artifactItem>
-									<groupId>org.webjars.npm</groupId>
-									<artifactId>fontsource-fira-sans</artifactId>
-									<type>jar</type>
-									<includes>META-INF/resources/webjars/**/*</includes>
-									<outputDirectory>${project.basedir}/target/classes/META-INF/assets/</outputDirectory>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.webjars.npm</groupId>
-									<artifactId>firacode</artifactId>
-									<type>jar</type>
-									<includes>META-INF/resources/webjars/**/*</includes>
-									<outputDirectory>${project.basedir}/target/classes/META-INF/assets/</outputDirectory>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.webjars.npm</groupId>
-									<artifactId>feather-icons</artifactId>
-									<type>jar</type>
-									<includes>META-INF/resources/webjars/**/*</includes>
-									<outputDirectory>${project.basedir}/target/classes/META-INF/assets/</outputDirectory>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.webjars</groupId>
-									<artifactId>ckeditor</artifactId>
-									<type>jar</type>
-									<includes>META-INF/resources/webjars/**/*</includes>
-									<outputDirectory>${project.basedir}/target/classes/META-INF/assets/</outputDirectory>
-								</artifactItem>
-								<artifactItem>
-									<groupId>org.webjars.npm</groupId>
-									<artifactId>codemirror</artifactId>
-									<type>jar</type>
-									<includes>META-INF/resources/webjars/**/*</includes>
-									<outputDirectory>${project.basedir}/target/classes/META-INF/assets/codemirror/</outputDirectory>
-									<fileMappers>
-										<org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
-											<pattern>^\QMETA-INF/resources/webjars/codemirror/6.65.7/\E</pattern>
-											<replacement>./</replacement>
-										</org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
-									</fileMappers>
-								</artifactItem>
-							</artifactItems>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-
-
 		</plugins>
 
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/App.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/App.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/App.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -25,4 +25,5 @@
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
 
 @SpringBootApplication
@@ -36,5 +37,5 @@
 	public static void main(String[] args) throws Exception {
 		SpringApplication application = new SpringApplication(App.class);
-		//application.setApplicationContextClass(AnnotationConfigWebApplicationContext.class);
+		application.setApplicationContextClass(AnnotationConfigWebApplicationContext.class);
 		SpringApplication.run(App.class, args);
 	}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/AppConfiguration.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/AppConfiguration.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/AppConfiguration.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -23,10 +23,15 @@
 import java.util.EnumSet;
 
+import javax.servlet.DispatcherType;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.SessionTrackingMode;
+
 import org.apache.tapestry5.TapestryFilter;
-import org.apereo.cas.client.authentication.AuthenticationFilter;
-import org.apereo.cas.client.session.SingleSignOutFilter;
-import org.apereo.cas.client.session.SingleSignOutHttpSessionListener;
-import org.apereo.cas.client.util.HttpServletRequestWrapperFilter;
-import org.apereo.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
+import org.jasig.cas.client.authentication.AuthenticationFilter;
+import org.jasig.cas.client.session.SingleSignOutFilter;
+import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
+import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
+import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
 import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
 import org.springframework.boot.web.server.ErrorPage;
@@ -40,8 +45,4 @@
 import dblearnstar.webapp.services.UTF8Filter;
 import dblearnstar.webapp.util.AppConfig;
-import jakarta.servlet.DispatcherType;
-import jakarta.servlet.ServletContext;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.SessionTrackingMode;
 
 @Configuration
@@ -53,40 +54,47 @@
 		return new ServletContextInitializer() {
 			@Override
-			public void onStartup(ServletContext ctx) throws ServletException {
-				// Tapestry init parameters
-				ctx.setInitParameter("tapestry.app-package", "dblearnstar.webapp");
-				ctx.setInitParameter("tapestry.development-modules", "dblearnstar.webapp.services.DevelopmentModule");
-				ctx.setInitParameter("tapestry.qa-modules", "dblearnstar.webapp.services.QaModule");
+			public void onStartup(ServletContext servletContext) throws ServletException {
+				servletContext.setInitParameter("tapestry.app-package", "dblearnstar.webapp");
+				servletContext.setInitParameter("tapestry.development-modules",
+						"dblearnstar.webapp.services.DevelopmentModule");
+				servletContext.setInitParameter("tapestry.qa-modules", "dblearnstar.webapp.services");
 
-				ctx.setInitParameter("artifactParameterName", "ticket");
+				servletContext.setInitParameter("artifactParameterName", "ticket");
 
-				// Apereo CAS init parameters
-				ctx.setInitParameter("casServerLogoutUrl", AppConfig.getString("cas.server") + "/cas/logout");
-				ctx.setInitParameter("casServerLoginUrl", AppConfig.getString("cas.server") + "/cas/login");
-				ctx.setInitParameter("casServerUrlPrefix", AppConfig.getString("cas.server") + "/cas");
-				ctx.setInitParameter("service", AppConfig.getString("app.server") + ctx.getContextPath());
+				servletContext.setInitParameter("casServerLogoutUrl",
+						AppConfig.getString("cas.server") + "/cas/logout");
 
-				// Filters
+				servletContext.setInitParameter("casServerLoginUrl", AppConfig.getString("cas.server") + "/cas/login");
 
-				EnumSet<DispatcherType> esDTs = EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR);
+				servletContext.setInitParameter("casServerUrlPrefix", AppConfig.getString("cas.server") + "/cas");
 
-				ctx.addFilter("encodingFilter", UTF8Filter.class)
-					.addMappingForUrlPatterns(esDTs, false, "/*");
+				servletContext.setInitParameter("service",
+						AppConfig.getString("app.server") + servletContext.getContextPath());
 
-				ctx.addFilter("CAS Single Sign Out Filter", SingleSignOutFilter.class)
-					.addMappingForUrlPatterns(esDTs, false, "/*");
-				ctx.addFilter("CAS Authentication Filter", AuthenticationFilter.class)
-					.addMappingForUrlPatterns(esDTs, false, "/*");
-				ctx.addFilter("CAS Validation Filter", Cas20ProxyReceivingTicketValidationFilter.class)
-					.addMappingForUrlPatterns(esDTs, false, "/*");
-				ctx.addFilter("CAS HttpServletRequest Wrapper Filter", HttpServletRequestWrapperFilter.class)
-					.addMappingForUrlPatterns(esDTs, false, "/*");
+				servletContext.addFilter("encodingFilter", UTF8Filter.class).addMappingForUrlPatterns(
+						EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false, "/*");
 
-				ctx.addFilter("app", TapestryFilter.class)
-					.addMappingForUrlPatterns(esDTs, false, "/*");
+				servletContext.addFilter("CAS Single Sign Out Filter", SingleSignOutFilter.class)
+						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
+								"/*");
 
-				ctx.addListener(SingleSignOutHttpSessionListener.class);
+				servletContext.addFilter("CAS Authentication Filter", AuthenticationFilter.class)
+						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
+								"/*");
 
-				ctx.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
+				servletContext.addFilter("CAS Validation Filter", Cas20ProxyReceivingTicketValidationFilter.class)
+						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
+								"/*");
+
+				servletContext.addFilter("CAS HttpServletRequest Wrapper Filter", HttpServletRequestWrapperFilter.class)
+						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
+								"/*");
+
+				servletContext.addFilter("app", TapestryFilter.class).addMappingForUrlPatterns(
+						EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false, "/*");
+
+				servletContext.addListener(SingleSignOutHttpSessionListener.class);
+
+				servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
 			}
 		};
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Code.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Code.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Code.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,5 +21,4 @@
 package dblearnstar.webapp.components;
 
-import org.apache.commons.text.StringEscapeUtils;
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.annotations.Parameter;
@@ -43,8 +42,4 @@
 	}
 
-	public String getEscapedValue() {
-		return StringEscapeUtils.escapeHtml4(value);
-	}
-	
 	public Boolean getNullValue() {
 		if (value == null) {
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Layout.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Layout.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Layout.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -44,8 +44,8 @@
 import dblearnstar.webapp.services.PersonManager;
 
-@Import(stylesheet = { "classpath:META-INF/assets/META-INF/resources/webjars/fontsource-fira-sans/3.0.5/index.css",
-		"classpath:META-INF/assets/META-INF/resources/webjars/fontsource-fira-sans/3.0.5/500.css",
-		"classpath:META-INF/assets/META-INF/resources/webjars/fontsource-fira-sans/3.0.5/700.css",
-		"classpath:META-INF/assets/META-INF/resources/webjars/firacode/1.205.0/distr/fira_code.css",
+@Import(stylesheet = { "classpath:META-INF/resources/webjars/fontsource-fira-sans/3.0.5/index.css",
+		"classpath:META-INF/resources/webjars/fontsource-fira-sans/3.0.5/500.css",
+		"classpath:META-INF/resources/webjars/fontsource-fira-sans/3.0.5/700.css",
+		"classpath:META-INF/resources/webjars/firacode/1.205.0/distr/fira_code.css",
 		"site-overrides.css" }, module = { "bootstrap/dropdown", "bootstrap/collapse", "zoneUpdateEffect" })
 @PublicPage
@@ -92,23 +92,12 @@
 
 	public String[] getStudentPageNames() {
-		return new String[] { "TasksOverview", "ExamsAndTasksOverview", "OpenDiscussions", "PersonalAnalytics" };
-	}
-
-	public String[] getInstructorPageNames() {
-		if (userInfo.isInstructor()) {
-			return new String[] { "admin/ManageModels", "admin/TestAdmin",
-					"admin/TestCollectionManagement", "admin/GroupManagement", "admin/StudentGroupProgress", "admin/SubmissionEvaluations",
-					"admin/Reevaluation", "admin/TranslationPage", "admin/SystemParameters" };
-		} else {
-			return null;
-		}
+		return new String[] { "ExamsAndTasksOverview", "SolutionComparator", "OpenDiscussions", "PersonalAnalytics" };
 	}
 
 	public String[] getAdminPageNames() {
 		if (userInfo.isAdministrator()) {
-			return new String[] { "admin/ManagePersons", "admin/GroupManagement", "admin/ManageModels",
-					"admin/TestAdmin", "admin/TestCollectionManagement", "admin/StudentGroupProgress",
-					"admin/SubmissionEvaluations", "admin/Reevaluation", "admin/ActiveUsers", "admin/TranslationPage",
-					"admin/SystemParameters" };
+			return new String[] { "admin/ManagePersons", "admin/GroupManagement", "admin/StudentGroupProgress",
+					"admin/ManageModels", "admin/TestAdmin", "admin/Reevaluation", "admin/SubmissionLogViewer",
+					"admin/TestCollectionManagement", "admin/ActiveUsers" };
 		} else {
 			return null;
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/ModalBox.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/ModalBox.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/ModalBox.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,4 +21,6 @@
 package dblearnstar.webapp.components;
 
+import javax.inject.Inject;
+
 import org.apache.tapestry5.BindingConstants;
 import org.apache.tapestry5.ClientElement;
@@ -27,5 +29,4 @@
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.http.services.Request;
-import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
@@ -59,5 +60,5 @@
 	void setupRender() {
 		JSONObject json = new JSONObject();
-		json.put("keyboard", false);
+		json.put("keyboard", true);
 		json.put("backdrop", "static");
 		json.put("focus", true);
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/model/ApplicationConstants.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/ApplicationConstants.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,27 +1,0 @@
-package dblearnstar.webapp.model;
-
-public class ApplicationConstants {
-
-	public static String EPRMS_JDBC_DRIVER = "eprms.jdbc.driver";
-	public static String EPRMS_JDBC_URL = "eprms.jdbc.url";
-	public static String EPRMS_JDBC_SCHEMA = "eprms.jdbc.default_schema";
-	public static String EPRMS_JDBC_USERNAME = "eprms.jdbc.username";
-	public static String EPRMS_JDBC_PASSWORD = "eprms.jdbc.password";
-
-	public static String STUDENTDBS_JDBC_DRIVER = "studentdbs.jdbc.driver";
-	public static String STUDENTDBS_JDBC_URL = "studentdbs.jdbc.url";
-	public static String STUDENTDBS_JDBC_SCHEMA = "studentdbs.jdbc.default_schema";
-	public static String STUDENTDBS_JDBC_USERNAME = "studentdbs.jdbc.username";
-	public static String STUDENTDBS_JDBC_PASSWORD = "studentdbs.jdbc.password";
-
-	public static String DATEFORMAT_SUBMISSION = "yyyyMMdd-HHmmss";
-	public static String DATEFORMAT_AUDIT = "yyyy-MM-dd'T'HH:mm:ss";
-	public static String DATEFORMAT_AUDITDATEONLY = "yyyy-MM-dd";
-	public static String DATEFORMAT_GUI_DATE = "dd.MM.yyyy";
-	public static String DATEFORMAT_GUI_TIME = "HH:mm";
-	public static String DATEFORMAT_GUI_DATETIME = "dd.MM.yyyy HH:mm:ss";
-	public static String DATEFORMAT_CONDENSED = "yyyyMMdd";
-
-	public static String AUTH_AUTO_CREATE_USER="auth.autoCreateUser";
-	
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/StudentSelectModel.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/StudentSelectModel.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/StudentSelectModel.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -34,5 +34,4 @@
 public class StudentSelectModel extends AbstractSelectModel {
 	private List<Student> students;
-	private Boolean hideNames;
 
 	public StudentSelectModel(List<Student> students) {
@@ -42,14 +41,4 @@
 			this.students = students;
 		}
-		this.hideNames = false;
-	}
-
-	public StudentSelectModel(List<Student> students, Boolean hideNames) {
-		if (students == null) {
-			this.students = new ArrayList<Student>();
-		} else {
-			this.students = students;
-		}
-		this.hideNames = hideNames;
 	}
 
@@ -64,9 +53,5 @@
 		for (Student student : students) {
 			Person p = student.getPerson();
-			String name = " [" + p.getUserName() + "]";
-			if (hideNames != null && hideNames) {
-			} else {
-				name = p.getLastName() + " " + p.getFirstName() + name;
-			}
+			String name = p.getLastName() + " " + p.getFirstName() + " [" + p.getUserName() + "]";
 			options.add(new OptionModelImpl(name, student));
 		}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/model/TaskInTestInstanceSelectModel.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/TaskInTestInstanceSelectModel.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package dblearnstar.webapp.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tapestry5.OptionGroupModel;
-import org.apache.tapestry5.OptionModel;
-import org.apache.tapestry5.internal.OptionModelImpl;
-import org.apache.tapestry5.util.AbstractSelectModel;
-
-import dblearnstar.model.entities.TaskInTestInstance;
-
-public class TaskInTestInstanceSelectModel extends AbstractSelectModel {
-	private List<TaskInTestInstance> taskInTestInstances;
-
-	public TaskInTestInstanceSelectModel(List<TaskInTestInstance> taskInTestInstances) {
-		if (taskInTestInstances == null) {
-			this.taskInTestInstances = new ArrayList<TaskInTestInstance>();
-		} else {
-			this.taskInTestInstances = taskInTestInstances;
-		}
-	}
-
-	@Override
-	public List<OptionGroupModel> getOptionGroups() {
-		return null;
-	}
-
-	@Override
-	public List<OptionModel> getOptions() {
-		List<OptionModel> options = new ArrayList<OptionModel>();
-		for (TaskInTestInstance taskInTestInstance : taskInTestInstances) {
-			options.add(new OptionModelImpl(taskInTestInstance.getTask().getTitle(), taskInTestInstance));
-		}
-		return options;
-	}
-}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/model/TestCollectionSelectModel.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/TestCollectionSelectModel.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,79 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the dbLearnStar system (hereinafter: dbLearn*).
- *     
- * dbLearn* is free software: you can redistribute it and/or modify it under the 
- * terms of the GNU General Public License as published by the Free Software 
- * Foundation, either version 3 of the License, or (at your option) any later 
- * version.
- *     
- * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
- * details.
- *     
- * You should have received a copy of the GNU General Public License along 
- * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
- * 
- ******************************************************************************/
-
-package dblearnstar.webapp.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tapestry5.OptionGroupModel;
-import org.apache.tapestry5.OptionModel;
-import org.apache.tapestry5.internal.OptionModelImpl;
-import org.apache.tapestry5.services.PersistentLocale;
-import org.apache.tapestry5.util.AbstractSelectModel;
-
-import dblearnstar.model.entities.TestCollection;
-import dblearnstar.webapp.services.TranslationService;
-
-public class TestCollectionSelectModel extends AbstractSelectModel {
-	private List<TestCollection> testCollections;
-
-	private TranslationService translationService;
-	private PersistentLocale persistentLocale;
-
-	public TestCollectionSelectModel(List<TestCollection> testCollections, TranslationService translationService,
-			PersistentLocale persistentLocale) {
-		if (testCollections == null) {
-			this.testCollections = new ArrayList<TestCollection>();
-		} else {
-			this.testCollections = testCollections;
-		}
-		this.persistentLocale = persistentLocale;
-		this.translationService = translationService;
-	}
-
-	@Override
-	public List<OptionGroupModel> getOptionGroups() {
-		return null;
-	}
-
-	public String getPrefix(TestCollection i) {
-		if (i.getParentCollection() == null) {
-			return "";
-		} else {
-			return getPrefix(i.getParentCollection()) + "  "; // unicode double em-space
-		}
-	}
-
-	@Override
-	public List<OptionModel> getOptions() {
-		List<OptionModel> options = new ArrayList<OptionModel>();
-		for (TestCollection tc : testCollections) {
-			String title = translationService.getTranslation(TestCollection.class.getSimpleName(), "title",
-					tc.getTestCollectionId(), persistentLocale.get().getLanguage().toLowerCase());
-			if (title == null) {
-				title = tc.getTitle();
-			}
-			String name = getPrefix(tc) + title;
-			options.add(new OptionModelImpl(name, tc));
-		}
-		return options;
-	}
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ComplaintsAndDiscussions.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ComplaintsAndDiscussions.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ComplaintsAndDiscussions.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -31,5 +31,4 @@
 import org.apache.tapestry5.hibernate.annotations.CommitAfter;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.slf4j.Logger;
 
 import dblearnstar.model.entities.AssessmentDiscussion;
@@ -37,15 +36,12 @@
 import dblearnstar.model.entities.SolutionAssessment;
 import dblearnstar.model.model.ComparatorAssessmentDiscussionByReplyTo;
-import dblearnstar.model.model.TaskTypeChecker;
 import dblearnstar.model.model.UserInfo;
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.annotations.StudentPage;
 import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.PersonManager;
-import dblearnstar.webapp.services.TestManager;
 
 @StudentPage
 @AdministratorPage
-@Import(module = { "bootstrap/collapse" }, stylesheet = { "ComplaintsAndDiscussions.css", "feedback-styles.css" })
+@Import(module = { "bootstrap/collapse" })
 public class ComplaintsAndDiscussions {
 
@@ -55,21 +51,14 @@
 	@Inject
 	private GenericService genericService;
-	@Inject
-	private Logger logger;
-	@Inject
-	private PersonManager personManager;
-	@Inject
-	private TestManager testManager;
 
 	@Persist
 	@Property
 	SolutionAssessment solutionAssessmentToDiscuss;
+	@Property
+	private AssessmentDiscussion runningAssessmentDiscussion;
 
 	@Persist
 	@Property
 	AssessmentDiscussion newAssessmentDiscussion;
-
-	@Property
-	private AssessmentDiscussion runningAssessmentDiscussion;
 
 	public void onActivate() {
@@ -78,4 +67,5 @@
 					solutionAssessmentToDiscuss.getSolutionAssessmentId());
 		}
+
 	}
 
@@ -111,7 +101,4 @@
 		newAssessmentDiscussion.setPostedOn(new Date());
 		newAssessmentDiscussion.setReplyTo(replyTo);
-		if (userInfo.isAdministrator() || userInfo.isInstructor()) {
-			newAssessmentDiscussion.setMessage("<div class=\"box\">" + replyTo.getMessage() + "</div>\n<p></p>");
-		}
 		newAssessmentDiscussion.setSolutionEvaluation(solutionAssessmentToDiscuss);
 	}
@@ -120,8 +107,4 @@
 	public void onSuccessFromNewAssessmentDiscussionForm() {
 		genericService.save(newAssessmentDiscussion);
-		newAssessmentDiscussion = null;
-	}
-
-	void onCancelNewAssessmentDiscussionForm() {
 		newAssessmentDiscussion = null;
 	}
@@ -151,8 +134,4 @@
 	}
 
-	public boolean isPostedByInstructor() {
-		return personManager.isInstructor(runningAssessmentDiscussion.getPerson());
-	}
-
 	@CommitAfter
 	public void onActionFromDeleteDiscussion(long assessmentDiscussionId) {
@@ -160,6 +139,3 @@
 	}
 
-	public boolean isSQL() {
-		return TaskTypeChecker.isSQL(testManager.getCodeType(solutionAssessmentToDiscuss.getStudentSubmitSolution()));
-	}
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,39 +21,24 @@
 package dblearnstar.webapp.pages;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.tapestry5.SelectModel;
 import org.apache.tapestry5.annotations.Import;
-import org.apache.tapestry5.annotations.InjectComponent;
 import org.apache.tapestry5.annotations.InjectPage;
-import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.corelib.components.Zone;
-import org.apache.tapestry5.hibernate.annotations.CommitAfter;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.services.PersistentLocale;
-import org.apache.tapestry5.services.SelectModelFactory;
-import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
 import org.apache.tapestry5.services.javascript.JavaScriptSupport;
 import org.slf4j.Logger;
 
-import dblearnstar.model.entities.Task;
 import dblearnstar.model.entities.TaskInTestInstance;
 import dblearnstar.model.entities.TaskIsOfType;
-import dblearnstar.model.entities.TestCollection;
 import dblearnstar.model.entities.TestInstance;
 import dblearnstar.model.entities.TestType;
-import dblearnstar.model.model.ComparatorTestCollection;
 import dblearnstar.model.model.UserInfo;
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.annotations.StudentPage;
-import dblearnstar.webapp.model.TestCollectionSelectModel;
-import dblearnstar.webapp.pages.admin.SubmissionEvaluations;
-import dblearnstar.webapp.services.DigestService;
 import dblearnstar.webapp.services.GenericService;
 import dblearnstar.webapp.services.PersonManager;
@@ -69,19 +54,6 @@
 	@Inject
 	private Logger logger;
-	@Inject
-	private JavaScriptSupport javaScriptSupport;
-	@Inject
-	private PersistentLocale persistentLocale;
-	@Inject
-	private SelectModelFactory selectModelFactory;
-	@Inject
-	private AjaxResponseRenderer ajaxResponseRenderer;
-	@Inject
-	private DigestService digestService;
-
 	@SessionState
-	@Property
 	private UserInfo userInfo;
-
 	@Inject
 	private PersonManager pm;
@@ -91,10 +63,12 @@
 	private TestManager testManager;
 	@Inject
+	private JavaScriptSupport javaScriptSupport;
+	@Inject
+	private PersistentLocale persistentLocale;
+	@Inject
 	private TranslationService translationService;
 
 	@InjectPage
 	private QueryTest queryTest;
-	@InjectPage
-	private SubmissionEvaluations submissionEvaluations;
 
 	@Property
@@ -106,18 +80,8 @@
 	@Property
 	private TaskIsOfType taskIsOfType;
-	@Persist
-	@Property
-	private TestCollection testCollection;
-
-	@InjectComponent
-	private Zone collectionZone;
-
 	private long studentId;
 
 	public void onActivate() {
 		studentId = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0).getStudentId();
-		if (testCollection == null) {
-			testCollection = getTestCollections().stream().findFirst().orElse(null);
-		}
 	}
 
@@ -130,51 +94,12 @@
 	}
 
-	public String getHashedTestInstanceId() {
-		return digestService.obfuscate(Long.toString(testInstance.getTestInstanceId()));
-	}
-
-	/* selectTestCollection Form */
-
-	public List<TestCollection> getTestCollections() {
-		List<TestCollection> list = testManager.getTestCollectionsWithTestInstances();
-		ComparatorTestCollection c = new ComparatorTestCollection();
-		Collections.sort(list, c);
-		return list;
-	}
-
-	public SelectModel getTestCollectionModel() {
-		List<TestCollection> list = getTestCollections();
-		if (list == null) {
+	public List<TestInstance> getTestInstances() {
+		if (userInfo.isAdministrator()) {
+			return testManager.getAllTestInstancesByTestType(testType.getTestTypeId());
+		} else if (userInfo.isStudent()) {
+			return testManager.getTestInstancesForStudentByTestType(studentId, testType.getTestTypeId());
+		} else {
 			return null;
-		} else {
-			return new TestCollectionSelectModel(list, translationService, persistentLocale);
 		}
-	}
-
-	public void onValueChanged(TestCollection newTestCollection) {
-		testCollection = newTestCollection;
-		ajaxResponseRenderer.addRender(collectionZone);
-	}
-
-	public List<TestInstance> getTestInstances() {
-		List<TestInstance> list;
-		if (userInfo.isAdministrator()) {
-			if (testCollection == null) {
-				list = testManager.getAllTestInstancesByTestType(testType.getTestTypeId());
-			} else {
-				list = testManager.getAllTestInstancesByTestTypeAndCollection(testType.getTestTypeId(),
-						testCollection.getTestCollectionId());
-			}
-		} else if (userInfo.isStudent()) {
-			if (testCollection == null) {
-				list = testManager.getTestInstancesForStudentByTestType(studentId, testType.getTestTypeId());
-			} else {
-				list = testManager.getTestInstancesForStudentByTestTypeAndCollection(studentId,
-						testType.getTestTypeId(), testCollection.getTestCollectionId());
-			}
-		} else {
-			list = new ArrayList<TestInstance>();
-		}
-		return list;
 	}
 
@@ -192,23 +117,6 @@
 	}
 
-	public String getBtnBooleanClass(Boolean value) {
-		if (value != null && value) {
-			return "btn-success";
-		} else {
-			return "btn-warning";
-		}
-
-	}
-
-	public String getClassOpenToAllStudents() {
-		return getBtnBooleanClass(testInstance.getOpenToAllStudents());
-	}
-
-	public String getClassOpenForReviewByStudents() {
-		return getBtnBooleanClass(testInstance.getOpenForReviewByStudents());
-	}
-
 	public List<TaskInTestInstance> getTaskInTestInstances() {
-		return testManager.getTaskInTestInstancesByTestInstance(testInstance.getTestInstanceId());
+		return testManager.getTasksInTestInstance(testInstance.getTestInstanceId());
 	}
 
@@ -222,25 +130,13 @@
 
 	public String getTranslateTestInstanceTitle() {
-		String translated = translationService.getTranslation(TestInstance.class.getSimpleName(), "title",
-				testInstance.getTestInstanceId(), persistentLocale.get().getLanguage().toLowerCase());
+		String translated = translationService.getTranslation("TestInstance", "title", testInstance.getTestInstanceId(),
+				persistentLocale.get().getLanguage().toLowerCase());
 		return (translated != null ? translated : testInstance.getTitle());
 	}
 
-	public String getTranslatedTestInstanceDescription() {
-		String translated = translationService.getTranslation(TestInstance.class.getSimpleName(), "description",
-				testInstance.getTestInstanceId(), persistentLocale.get().getLanguage().toLowerCase());
-		return (translated != null ? translated : testInstance.getDescription());
-	}
-
 	public String getTranslateTestTypeTitle() {
-		String translated = translationService.getTranslation(TestType.class.getSimpleName(), "title",
-				testType.getTestTypeId(), persistentLocale.get().getLanguage().toLowerCase());
+		String translated = translationService.getTranslation("TestType", "title", testType.getTestTypeId(),
+				persistentLocale.get().getLanguage().toLowerCase());
 		return (translated != null ? translated : testType.getTitle());
-	}
-
-	public String getTranslatedTaskInTestInstanceTaskTitle() {
-		String translated = translationService.getTranslation(Task.class.getSimpleName(), "title",
-				taskInTestInstance.getTask().getTaskId(), persistentLocale.get().getLanguage().toLowerCase());
-		return (translated != null ? translated : taskInTestInstance.getTask().getTitle());
 	}
 
@@ -273,23 +169,3 @@
 		}
 	}
-
-	public Object onEvaluate(TestInstance ti) {
-		submissionEvaluations.onValueChangedFromSelectTestInstance(ti);
-		return submissionEvaluations;
-	}
-
-	@CommitAfter
-	public void onToggleOpenToAll(TestInstance ti) {
-		if (userInfo != null && userInfo.isInstructor()) {
-			ti.setOpenToAllStudents(!ti.getOpenToAllStudents());
-		}
-	}
-
-	@CommitAfter
-	public void onToggleOpenForReviewByStudents(TestInstance ti) {
-		if (userInfo != null && userInfo.isInstructor()) {
-			ti.setOpenForReviewByStudents(!ti.getOpenForReviewByStudents());
-		}
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/Logout.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/Logout.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/Logout.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -37,5 +37,5 @@
 
 @PublicPage
-@Import(stylesheet = { "classpath:META-INF/assets/META-INF/resources/webjars/fontsource-fira-sans/3.0.5/index.css",
+@Import(stylesheet = { "classpath:META-INF/resources/webjars/fontsource-fira-sans/3.0.5/index.css",
 		"site-overrides.css" }, module = { "bootstrap/dropdown", "bootstrap/collapse" })
 public class Logout {
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/OpenDiscussions.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/OpenDiscussions.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/OpenDiscussions.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -43,5 +43,4 @@
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.annotations.StudentPage;
-import dblearnstar.webapp.services.EvaluationService;
 import dblearnstar.webapp.services.GenericService;
 import dblearnstar.webapp.services.PersonManager;
@@ -66,9 +65,5 @@
 	private TestManager testManager;
 	@Inject
-	private PersonManager personManager;
-	@Inject
-	private EvaluationService evaluationService;
-
-
+	private PersonManager pm;
 	@Inject
 	private AjaxResponseRenderer ajaxResponseRenderer;
@@ -82,17 +77,12 @@
 	SolutionAssessment runningSolutionAssessment;
 
-	public void onActivate() {
-		if (selectedTestInstance != null) {
-			selectedTestInstance = genericService.getByPK(TestInstance.class, selectedTestInstance.getTestInstanceId());
-		}
-	}
-
-	public void onActivate(TestInstance ti) {
-		selectedTestInstance = ti;
-	}
-
 	public List<SolutionAssessment> getSolutionAssessmentsWithDiscussion() {
-		return evaluationService
-				.getSolutionAssessmentsWithDiscussionForTestInstance(selectedTestInstance.getTestInstanceId());
+		return ((List<SolutionAssessment>) UsefulMethods.castList(SolutionAssessment.class,
+				genericService.getAll(SolutionAssessment.class)))
+						.stream()
+						.filter(p -> p.getAssessmentDiscussions().size() > 0
+								&& p.getStudentSubmitSolution().getStudentStartedTest().getTestInstance()
+										.getTestInstanceId() == selectedTestInstance.getTestInstanceId())
+						.collect(Collectors.toList());
 	}
 
@@ -108,5 +98,5 @@
 			return tilist;
 		} else if (userInfo.isStudent()) {
-			long studentId = personManager.getStudentsByPersonId(userInfo.getPersonId()).get(0).getStudentId();
+			long studentId = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0).getStudentId();
 			List<AssessmentDiscussion> listAD = UsefulMethods.castList(AssessmentDiscussion.class,
 					genericService.getAll(AssessmentDiscussion.class));
@@ -133,30 +123,3 @@
 	}
 
-	public boolean answered(AssessmentDiscussion ad) {
-		logger.debug("   ad = {} {}", ad.getAssessmentDiscussionId(), ad.getPerson().getUserName());
-		if (ad.getReplies() != null && ad.getReplies().size() > 0) {
-			logger.debug("      has replies");
-			boolean allAnswered = true;
-			for (AssessmentDiscussion i : ad.getReplies()) {
-				if (!answered(i)) {
-					allAnswered = false;
-				}
-			}
-			return allAnswered;
-		} else {
-			logger.info("      no replies");
-			return personManager.isInstructor(ad.getPerson());
-		}
-	}
-
-	public boolean isAnsweredByInstructor() {
-		boolean allAnswered = true;
-		logger.debug("sa = {}", runningSolutionAssessment.getSolutionAssessmentId());
-		for (AssessmentDiscussion ad : runningSolutionAssessment.getAssessmentDiscussions().stream()
-				.filter(p -> p.getReplyTo() == null).toList()) {
-			allAnswered = allAnswered && answered(ad);
-		}
-		return allAnswered;
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/QueryTest.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/QueryTest.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/QueryTest.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -28,4 +28,8 @@
 import java.io.InputStream;
 import java.security.MessageDigest;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLWarning;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -33,15 +37,15 @@
 import java.util.Enumeration;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
+import java.util.Properties;
 import java.util.stream.Collectors;
 
-import jakarta.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.fileupload.FileUploadException;
-import org.apache.tapestry5.EventContext;
 import org.apache.tapestry5.PersistenceConstants;
 import org.apache.tapestry5.StreamResponse;
 import org.apache.tapestry5.annotations.Import;
 import org.apache.tapestry5.annotations.InjectComponent;
+import org.apache.tapestry5.annotations.InjectPage;
 import org.apache.tapestry5.annotations.OnEvent;
 import org.apache.tapestry5.annotations.Persist;
@@ -59,10 +63,8 @@
 import org.apache.tapestry5.services.PersistentLocale;
 import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
-import org.apache.tapestry5.services.ajax.JavaScriptCallback;
 import org.apache.tapestry5.services.javascript.JavaScriptSupport;
 import org.apache.tapestry5.upload.services.UploadedFile;
 import org.slf4j.Logger;
 
-import dblearnstar.model.entities.Person;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentStartedTest;
@@ -76,6 +78,4 @@
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.annotations.StudentPage;
-import dblearnstar.webapp.components.ModalBox;
-import dblearnstar.webapp.services.ActivityManager;
 import dblearnstar.webapp.services.EvaluationService;
 import dblearnstar.webapp.services.GenericService;
@@ -95,7 +95,4 @@
 	private UserInfo userInfo;
 
-	@Property
-	private Boolean accessAllowed;
-
 	@Inject
 	private Logger logger;
@@ -122,10 +119,10 @@
 	private TestManager testManager;
 	@Inject
-	private ActivityManager activityManager;
-	@Inject
 	private EvaluationService evaluationService;
 	@Inject
 	private PersonManager pm;
 
+	@InjectPage
+	private ExamsAndTasksOverviewPage examsAndTasksOverviewPage;
 	@InjectComponent
 	private Zone historyZone;
@@ -136,29 +133,20 @@
 	@InjectComponent
 	private Zone evalZone;
-	@InjectComponent
-	private Zone currentTimeZone;
-
-	private Student activeStudent;
-
-	@Property
-//	@Persist
+
+	@Property
+	@Persist
 	private TaskInTestInstance taskInTestInstance;
-
 	@Property
 	@Persist
 	private Boolean filterNotForEvalution;
-	
 	@Property
 	@Persist
 	private UploadedFile file;
-	
 	@Property
 	@Persist
 	private String fileComment;
-	
 	@Property
 	@Persist(PersistenceConstants.FLASH)
 	private String message;
-	
 	@Property
 	@Persist(PersistenceConstants.FLASH)
@@ -166,8 +154,4 @@
 
 	@Property
-	@Persist
-	private String errorPosition;
-
-	@Property
 	private String codeType;
 
@@ -203,5 +187,5 @@
 	private String oneHeader;
 
-	private Long studentId;
+	private long studentId;
 	private boolean toUpload;
 	private boolean toSubmitText;
@@ -213,8 +197,5 @@
 		toUpload = false;
 		toSubmitText = false;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityStillViewing, payload, issuer);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(currentTimeZone);
-		}
+		recordActivity(ModelConstants.ActivityStillViewing, payload, issuer);
 	}
 
@@ -225,5 +206,5 @@
 		toUpload = false;
 		toSubmitText = false;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityExecSelection, query, issuer);
+		recordActivity(ModelConstants.ActivityExecSelection, query, issuer);
 		runQueryAndEval(true, query); // field is NotForEvaluation
 		if (request.isXHR()) {
@@ -238,5 +219,5 @@
 		toUpload = false;
 		toSubmitText = false;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityExecAll, query, issuer);
+		recordActivity(ModelConstants.ActivityExecAll, query, issuer);
 		runQueryAndEval(true, query); // field is NotForEvaluation
 		if (request.isXHR()) {
@@ -249,5 +230,5 @@
 	public void execEvalAll(@RequestParameter(value = "query") String query,
 			@RequestParameter(value = "issuer") String issuer) {
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityEval, query, issuer);
+		recordActivity(ModelConstants.ActivityEval, query, issuer);
 	}
 
@@ -258,5 +239,5 @@
 		toUpload = false;
 		toSubmitText = false;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityPlan, query, issuer);
+		recordActivity(ModelConstants.ActivityPlan, query, issuer);
 		runQueryAndEval(true, "explain " + query); // field is
 													// NotForEvaluation
@@ -266,72 +247,42 @@
 	}
 
-	@InjectComponent
-	private ModalBox errorModal;
-
-	public void onActionFromHideModal() {
-		errorModal.hide();
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(errorZone).addCallback(positionToError());
-		}
-	}
-
-	private JavaScriptCallback positionToError() {
-		return new JavaScriptCallback() {
-			public void run(JavaScriptSupport javascriptSupport) {
-				javaScriptSupport.require("codemirror-error").invoke("positionToError").with(errorPosition);
-			}
-		};
-	}
-
-	public void onActionFromHideEvalModal() {
-		errorModal.hide();
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(evalZone).addCallback(positionToError());
-		}
-	}
-
-	public Object onActivate(EventContext eventContext) {
-		if (eventContext.getCount() > 1) {
-			return ExamsAndTasksOverviewPage.class;
-		} else if (eventContext.getCount() == 1) {
-			TaskInTestInstance tti = eventContext.get(TaskInTestInstance.class, 0);
-			if (tti == null) {
-				logger.error("tti is null, username:{}", userInfo.getUserName());
-				return ExamsAndTasksOverviewPage.class;
-			} else {
-				taskInTestInstance = genericService.getByPK(TaskInTestInstance.class, tti.getTaskInTestInstanceId());
-				activeStudent = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0);
-				studentId = activeStudent.getStudentId();
-
-				if (userInfo.isAdministrator() || testManager.accessToTaskInTestInstanceAllowed(activeStudent, tti)) {
-					studentId = activeStudent.getStudentId();
-					codeType = taskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype();
-
-					resultsErrors = null;
-					resultsSimple = null;
-
-					resultsEvaluation = null;
-					resultsHeadersSimple = null;
-					taskInTestInstance = genericService.getByPK(TaskInTestInstance.class,
-							taskInTestInstance.getTaskInTestInstanceId());
-					if (filterNotForEvalution == null) {
-						filterNotForEvalution = false;
-					}
-					recordActivity(activeStudent.getPerson(), ModelConstants.ActivityViewTask, "", "onActivity");
-					toUpload = false;
-					logger.debug("access allowed");
-					accessAllowed = true;
-					return null;
-				} else {
-					accessAllowed = false;
-					logger.error("Task not allowed: ttiId:{} username:{}", tti.getTaskInTestInstanceId(),
-							userInfo.getUserName());
-					return ExamsAndTasksOverviewPage.class;
-				}
-			}
-		} else {
-			logger.error("Task not selected username:{}", userInfo.getUserName());
-			return ExamsAndTasksOverviewPage.class; // no tti selected
-		}
+	public Date getCurrentTime() {
+		return new Date();
+	}
+
+	public void onActivate() {
+		logger.debug("onActivate: empty");
+		studentId = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0).getStudentId();
+	}
+
+	public void onActivate(TaskInTestInstance tti) {
+		logger.debug("onActivate: {}", tti.getTaskInTestInstanceId());
+		Student student = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0);
+		if (userInfo.isAdministrator() || testManager
+				.getTestInstancesForStudentByTestType(student.getStudentId(),
+						tti.getTestInstance().getTestTemplate().getTestType().getTestTypeId())
+				.stream().anyMatch(ti -> ti.getTestInstanceId() == tti.getTestInstance().getTestInstanceId())) {
+			studentId = student.getStudentId();
+			taskInTestInstance = genericService.getByPK(TaskInTestInstance.class, tti.getTaskInTestInstanceId());
+			codeType = taskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype();
+
+			resultsErrors = null;
+			resultsSimple = null;
+
+			resultsEvaluation = null;
+			resultsHeadersSimple = null;
+			taskInTestInstance = genericService.getByPK(TaskInTestInstance.class,
+					taskInTestInstance.getTaskInTestInstanceId());
+			if (filterNotForEvalution == null) {
+				filterNotForEvalution = false;
+			}
+			toUpload = false;
+		} else {
+			logger.error("Task not allowed: ttiId:{} username:{}", tti.getTaskInTestInstanceId(),
+					student.getPerson().getUserName());
+			throw new RuntimeException(student.getPerson().getUserName()
+					+ " tried to access a task that is not allowed. Access was logged.");
+		}
+		recordActivity(ModelConstants.ActivityViewTask, "", "onActivity");
 	}
 
@@ -344,5 +295,4 @@
 			if (isSQL()) {
 				javaScriptSupport.require("codemirror-run");
-				javaScriptSupport.require("codemirror-error");
 			}
 		}
@@ -350,10 +300,11 @@
 
 	@CommitAfter
-	public void recordActivity(Person p, String type, String payload, String issuer) {
+	public void recordActivity(String type, String payload, String issuer) {
 		logger.debug("recordActivity RECEIVED: {},{},{}", type, issuer, payload);
-		activityManager.recordActivityInTask(p, taskInTestInstance, type, payload);
-	}
-
-	public String getQueryErrorPosition() {
+		Student student = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0);
+		testManager.recordActivityInTask(student.getPerson(), taskInTestInstance, type, payload);
+	}
+
+	public String getErrorPosition() {
 		if (resultsErrors != null && resultsErrors.size() > 0) {
 			try {
@@ -362,6 +313,5 @@
 				if (lines != null && lines.size() > 0) {
 					String s = lines.get(0);
-					String posit = s.substring(s.indexOf("Position:") + 10).split(" ")[0];
-					return posit;
+					return s.substring(s.indexOf("Position:") + 10).split(" ")[0];
 				} else {
 					return "0";
@@ -375,4 +325,93 @@
 	}
 
+	public void getResultsFrom(String queryToRun, TestInstanceParameters tip, String schema, String type) {
+		if (queryToRun != null) {
+			String qtlc = queryToRun.toLowerCase();
+			if (qtlc.contains("delete") || qtlc.contains("update") || qtlc.contains("insert") || qtlc.contains("create")
+					|| qtlc.contains("drop") || qtlc.contains("alter") || qtlc.contains("information_schema")) {
+				resultsErrors.add(messages.get("sql-db-modifications"));
+				logger.error("Database modification or catalog or directory query issued by {}",
+						userInfo.getUserName());
+			} else {
+				resultsSimple = new ArrayList<Object[]>();
+				resultsHeadersSimple = new ArrayList<String>();
+
+				Connection connection = null;
+				int statusCounter = 0;
+				try {
+					Properties props = new Properties();
+					props.setProperty("user", tip.getDbUser());
+					props.setProperty("password", tip.getDbPass());
+					String url = "jdbc:postgresql://" + tip.getHostname() + ":" + tip.getPort() + "/" + tip.getDbName();
+
+					connection = DriverManager.getConnection(url, props);
+					statusCounter = 1;
+
+					connection.setClientInfo("ApplicationName", "dbLearn*Evaluator");
+					connection.setReadOnly(true);
+					connection.setAutoCommit(false);
+					connection.setSavepoint();
+					connection.setSchema(schema);
+					statusCounter = 2;
+
+					ResultSet rs = connection.prepareStatement(queryToRun).executeQuery();
+					boolean isNextRow = rs.next();
+					int numColumns = rs.getMetaData().getColumnCount();
+					for (int i = 1; i <= numColumns; i++) {
+						resultsHeadersSimple.add(rs.getMetaData().getColumnName(i));
+					}
+					statusCounter = 3;
+
+					int count = 1;
+					while (isNextRow && count < 500) {
+						Object[] o = new Object[numColumns];
+						for (int i = 1; i <= numColumns; i++) {
+							o[i - 1] = rs.getObject(i);
+						}
+						resultsSimple.add(o);
+						isNextRow = rs.next();
+						count++;
+					}
+					statusCounter = 4;
+					rs.close();
+					SQLWarning w = connection.getWarnings();
+					if (w != null) {
+						logger.debug("warning");
+						resultsErrors.add(w.getMessage());
+					}
+					if (count >= 500) {
+						logger.debug("count");
+						resultsErrors.add(messages.get("sql-moreThan500Rows"));
+					}
+					connection.rollback();
+				} catch (Exception e) {
+					if (statusCounter == 0) {
+						logger.error("Error when connecting to evaluation database for testinstance: {}",
+								tip.getTestInstance().getTestInstanceId());
+						logger.debug("Exception: {}", e);
+						resultsErrors.add(messages.get("evalDBNA-label"));
+					} else {
+						logger.error(
+								"Connected to evaluation database for test instance {}, but failed in running query: {} ",
+								tip.getTestInstance().getTestInstanceId(), queryToRun);
+						logger.debug("Exception: {}", e);
+						resultsErrors.add(e.getMessage());
+					}
+				} finally {
+					if (connection != null) {
+						try {
+							connection.close();
+						} catch (Exception e) {
+							logger.error("Connection can't be closed {} {}", userInfo.getUserName(), e.getMessage());
+						}
+					}
+				}
+			}
+		} else {
+			resultsSimple = new ArrayList<Object[]>();
+			resultsHeadersSimple = new ArrayList<String>();
+		}
+	}
+
 	private void startTestIfNotStarted() {
 		studentStartedTest = testManager.studentStartTest(studentId,
@@ -380,8 +419,8 @@
 	}
 
-	private StudentSubmitSolution recordQueryAsStudentSubmitSolution(Boolean notForEvaluation, String query) {
+	private StudentSubmitSolution recordQueryInLog(Boolean notForEvaluation, String query) {
 		if (query != null) {
 			StudentSubmitSolution solution = new StudentSubmitSolution();
-			solution.setSubmittedOn(getCurrentTime());
+			solution.setSubmittedOn(new Date());
 			solution.setStudentStartedTest(studentStartedTest);
 			solution.setSubmission(query);
@@ -434,12 +473,5 @@
 
 		// For printing purposes
-		Triplet<List<Object[]>, List<String>, List<String>> rezultatiteZaListanje = evaluationService
-				.getResultsForPrintingPurposes(userInfo.getUserName(), queryToRun, testInstanceParameters,
-						testInstanceParameters.getSchemaSimple(), "simple");
-		resultsSimple = rezultatiteZaListanje.getFirstItem();
-		resultsHeadersSimple = rezultatiteZaListanje.getSecondItem();
-		resultsErrors = rezultatiteZaListanje.getThirdItem();
-
-		errorPosition = getQueryErrorPosition();
+		getResultsFrom(queryToRun, testInstanceParameters, testInstanceParameters.getSchemaSimple(), "simple");
 
 		// For evaluation
@@ -461,5 +493,5 @@
 		}
 		startTestIfNotStarted();
-		recordQueryAsStudentSubmitSolution(notForEvaluation, queryToRun);
+		recordQueryInLog(notForEvaluation, queryToRun);
 	}
 
@@ -467,5 +499,5 @@
 		toUpload = false;
 		toSubmitText = false;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityEval, queryString, "onSelectedFromEvaluate");
+		recordActivity(ModelConstants.ActivityEval, queryString, "onSelectedFromEvaluate");
 		runQueryAndEval(false, queryString); // field is NotForEvaluation
 	}
@@ -475,5 +507,5 @@
 		toUpload = true;
 		toSubmitText = false;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivityTryUpload, "", "onSelectedFromUpload");
+		recordActivity(ModelConstants.ActivityTryUpload, "", "onSelectedFromUpload");
 		// doTheUpload();
 	}
@@ -483,6 +515,5 @@
 		toUpload = false;
 		toSubmitText = true;
-		recordActivity(activeStudent.getPerson(), ModelConstants.ActivitySubmitText, "",
-				"onSelectedFromSubmitTextSolution");
+		recordActivity(ModelConstants.ActivitySubmitText, "", "onSelectedFromSubmitTextSolution");
 	}
 
@@ -520,5 +551,5 @@
 	}
 
-	public StreamResponse onActionFromDownloadFile(StudentSubmitSolution sss) {
+	private StreamResponse onActionFromDownloadFile(StudentSubmitSolution sss) {
 		logger.info("Start Download of {}", sss.getStudentSubmitSolutionId());
 		if (sss.getStudentStartedTest().getStudent().getPerson().getPersonId() == userInfo.getPersonId()) {
@@ -573,5 +604,5 @@
 
 	Object onActionFromBackToExamsOverview() {
-		return ExamsAndTasksOverviewPage.class;
+		return examsAndTasksOverviewPage;
 	}
 
@@ -648,5 +679,5 @@
 	@CommitAfter
 	public void onSuccess() {
-		logger.debug("onSuccess");
+		logger.info("onSuccess");
 		if (toUpload) {
 			logger.info("Processing upload");
@@ -656,10 +687,9 @@
 			evalResultsExam = false;
 			queryString = "FILE:" + file.getFileName();
-			StudentSubmitSolution solution = recordQueryAsStudentSubmitSolution(false, queryString);
-			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
-					AppConfig.getString("date.upload.submission.format"));
+			StudentSubmitSolution solution = recordQueryInLog(false, queryString);
+			SimpleDateFormat sdf = new SimpleDateFormat(AppConfig.getString("date.upload.submission.format"));
 			String emde5 = "";
 			try {
-				MessageDigest md = MessageDigest.getInstance("SHA-1");
+				MessageDigest md = MessageDigest.getInstance("MD5");
 				md.update(file.getStream().readAllBytes());
 				byte[] hashBytes = md.digest();
@@ -677,5 +707,5 @@
 								+ "/STUDENT_" + solution.getStudentStartedTest().getStudent().getPerson().getUserName()
 								+ "_SUBMISSION_" + solution.getStudentSubmitSolutionId() + "_"
-								+ simpleDateFormat.format(solution.getSubmittedOn()) + "_MD5_" + emde5);
+								+ sdf.format(solution.getSubmittedOn()) + "_MD5_" + emde5);
 				file.write(copied);
 
@@ -685,6 +715,5 @@
 				genericService.saveOrUpdate(solution);
 			} catch (Exception e) {
-				logger.error("Error uploading: {} {} {}", userInfo.getUserName(), file.getFileName(), e);
-				e.printStackTrace();
+				logger.error("Error uploading: {} {} {}", userInfo.getUserName(), file.getFileName(), e.getMessage());
 			}
 			toUpload = false;
@@ -695,5 +724,5 @@
 			evalResultsComplex = false;
 			evalResultsExam = false;
-			recordQueryAsStudentSubmitSolution(false, queryString);
+			recordQueryInLog(false, queryString);
 		}
 		if (request.isXHR()) {
@@ -749,5 +778,5 @@
 
 	public boolean isTEXT() {
-		return TaskTypeChecker.isTEXT(codeType) || TaskTypeChecker.isDDL(codeType);
+		return TaskTypeChecker.isTEXT(codeType);
 	}
 
@@ -770,79 +799,3 @@
 	}
 
-	public Date getCurrentTime() {
-		return new Date();
-	}
-
-	public String getDisplayCurrentTime() {
-		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(AppConfig.getString("datetime.gui.format"));
-		return simpleDateFormat.format(getCurrentTime());
-	}
-
-	public String getDisplayEndTime() {
-		Date dateFrom = taskInTestInstance.getTestInstance().getScheduledFor();
-		Date dateUntil = taskInTestInstance.getTestInstance().getScheduledUntil();
-		if (dateFrom != null && dateUntil != null) {
-			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(AppConfig.getString("datetime.gui.format"));
-			if (dateFrom.before(getCurrentTime()) && dateUntil.after(getCurrentTime())) {
-				if ((new Date(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(5))).after(dateUntil)) {
-					return simpleDateFormat.format(dateUntil);
-				} else {
-					return simpleDateFormat.format(dateUntil);
-				}
-			} else {
-				if ((new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5))).before(dateUntil)) {
-					return simpleDateFormat.format(dateUntil);
-				} else {
-					return null;
-				}
-			}
-		} else {
-			return null;
-		}
-	}
-
-	public String getClassTestIsNow() {
-		Date dateFrom = taskInTestInstance.getTestInstance().getScheduledFor();
-		Date dateUntil = taskInTestInstance.getTestInstance().getScheduledUntil();
-		if (dateFrom != null && dateUntil != null) {
-			if (dateFrom.before(getCurrentTime()) && dateUntil.after(getCurrentTime())) {
-				if ((new Date(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(5))).after(dateUntil)) {
-					return "alert alert-danger";
-				} else {
-					return "alert alert-success";
-				}
-			} else {
-				if ((new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5))).before(dateUntil)) {
-					return "alert alert-dark";
-				} else {
-					return "";
-				}
-			}
-		} else {
-			return "";
-		}
-	}
-
-	public String getTestIsNow() {
-		Date dateFrom = taskInTestInstance.getTestInstance().getScheduledFor();
-		Date dateUntil = taskInTestInstance.getTestInstance().getScheduledUntil();
-		if (dateFrom != null && dateUntil != null) {
-			if (dateFrom.before(getCurrentTime()) && dateUntil.after(getCurrentTime())) {
-				if ((new Date(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(5))).after(dateUntil)) {
-					return messages.get("timeIsRunningOut-label");
-				} else {
-					return messages.get("timeTestIsActive-label");
-				}
-			} else {
-				if ((new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5))).before(dateUntil)) {
-					return messages.get("timehasRunOut-label");
-				} else {
-					return null;
-				}
-			}
-		} else {
-			return null;
-		}
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/SolutionComparatorPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/SolutionComparatorPage.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/SolutionComparatorPage.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -28,4 +28,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -33,9 +34,12 @@
 import java.util.stream.Collectors;
 
+import org.apache.tapestry5.SelectModel;
 import org.apache.tapestry5.StreamResponse;
 import org.apache.tapestry5.annotations.Import;
+import org.apache.tapestry5.annotations.InjectComponent;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.annotations.SessionState;
+import org.apache.tapestry5.corelib.components.Zone;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.services.SelectModelFactory;
@@ -46,5 +50,4 @@
 import dblearnstar.model.entities.StudentSubmitSolution;
 import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.entities.TestCollection;
 import dblearnstar.model.entities.TestInstance;
 import dblearnstar.model.model.ModelConstants;
@@ -78,14 +81,11 @@
 	private GenericService genericService;
 
+	@InjectComponent
+	private Zone zTestInstance;
+
 	@Persist
 	@Property
 	private TestInstance selectedTestInstance;
 
-	@Persist
-	@Property
-	private TestCollection testCollection;
-
-	@Property
-	private SolutionAssessment oneOfTheEvaluatedSolutions;
 	@Property
 	private StudentSubmitSolution otherStudentSubmitSolution;
@@ -95,9 +95,38 @@
 	private TaskInTestInstance taskInTestInstance;
 	@Property
-	private Float totalPoints;
-	@Property
-	Map<TaskInTestInstance, List<SolutionAssessment>> mapTTItoSA;
+	private float totalPoints;
+	@Property
+	Map<TaskInTestInstance, SolutionAssessment> mapTTItoSA;
 
 	private long studentId;
+
+	public void prepareMapOfEvaluationsAndTotal() {
+		totalPoints = 0;
+		mapTTItoSA = new HashMap<TaskInTestInstance, SolutionAssessment>();
+		for (TaskInTestInstance tti : taskInTestInstances) {
+			List<StudentSubmitSolution> lista = testManager.getEvaluatedSolutionsForTaskInTestInstance(studentId,
+					tti.getTaskInTestInstanceId());
+			if (lista != null && lista.size() > 0) {
+				SolutionAssessment sa;
+				List<StudentSubmitSolution> podlista = lista.stream().filter(p -> p.getEvaluations().size() > 0)
+						.collect(Collectors.toList());
+				if (podlista != null && podlista.size() > 0) {
+					sa = podlista.get(0).getEvaluations().get(0);
+				} else {
+					if (lista.get(0).getEvaluations() != null && lista.get(0).getEvaluations().size() > 0) {
+						sa = lista.get(0).getEvaluations().get(0);
+					} else {
+						sa = null;
+					}
+				}
+				mapTTItoSA.put(tti, sa);
+				if (sa != null && sa.getGrade() != null) {
+					totalPoints += sa.getGrade();
+				}
+			} else {
+				mapTTItoSA.put(tti, null);
+			}
+		}
+	}
 
 	public void onActivate() {
@@ -105,43 +134,36 @@
 		if (selectedTestInstance != null) {
 			selectedTestInstance = genericService.getByPK(TestInstance.class, selectedTestInstance.getTestInstanceId());
-			taskInTestInstances = testManager.getTaskInTestInstancesByTestInstance(selectedTestInstance.getTestInstanceId());
+			taskInTestInstances = testManager.getTasksInTestInstance(selectedTestInstance.getTestInstanceId());
 			prepareMapOfEvaluationsAndTotal();
 		}
 	}
 
-	public void onActivate(TestInstance ti) {
-		selectedTestInstance = ti;
-	}
-
-	public void prepareMapOfEvaluationsAndTotal() {
-		totalPoints = testManager.getTotalPoints(studentId, selectedTestInstance.getTestInstanceId());
-		mapTTItoSA = new HashMap<TaskInTestInstance, List<SolutionAssessment>>();
-		for (TaskInTestInstance tti : taskInTestInstances) {
-			List<SolutionAssessment> lista = testManager.getAllEvaluationsOfSolutionsForTaskInTestInstance(studentId,
-					tti.getTaskInTestInstanceId());
-			if (lista != null && lista.size() > 0) {
-				mapTTItoSA.put(tti, lista);
-			} else {
-				mapTTItoSA.put(tti, null);
-			}
-		}
-	}
-
-	public Boolean getHasManySolutions() {
-		List<SolutionAssessment> list = mapTTItoSA.get(taskInTestInstance);
-		if (list != null && list.size() > 1) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	public List<SolutionAssessment> getListEvaluatedSolutionsForTaskInTestInstance() {
-		List<SolutionAssessment> sa = mapTTItoSA.get(taskInTestInstance);
-		return sa;
+	public StudentSubmitSolution getLastSolutionForTaskInTestInstance() {
+		// if there are correct solutions, return the last correct, and if there
+		// are not return the last evaluated solution
+		List<StudentSubmitSolution> sss = testManager.getCorrectSolutionsByStudentAndTaskInTestInstance(studentId,
+				taskInTestInstance.getTaskInTestInstanceId());
+		if (sss == null || sss.isEmpty()) {
+			sss = testManager.getIncorrectSolutionsByStudentAndTaskInTestInstance(studentId,
+					taskInTestInstance.getTaskInTestInstanceId());
+		}
+		if (sss.isEmpty()) {
+			return null;
+		} else {
+			return sss.get(0);
+		}
+	}
+
+	public StudentSubmitSolution getLastEvaluatedSolutionForTaskInTestInstance() {
+		SolutionAssessment sa = mapTTItoSA.get(taskInTestInstance);
+		if (sa != null) {
+			return sa.getStudentSubmitSolution();
+		} else {
+			return null;
+		}
 	}
 
 	public boolean isLastSolutionCorrect() {
-		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
+		StudentSubmitSolution sss = getLastEvaluatedSolutionForTaskInTestInstance();
 		if (sss.getTaskInTestInstance().getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
 				.equals(ModelConstants.TaskCodeSQL)) {
@@ -153,5 +175,5 @@
 
 	public String getClassLastSolutionForTaskInTestInstance() {
-		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
+		StudentSubmitSolution sss = getLastEvaluatedSolutionForTaskInTestInstance();
 		if (sss != null) {
 			if (isLastSolutionCorrect()) {
@@ -166,5 +188,5 @@
 
 	public List<StudentSubmitSolution> getOtherSolutions() {
-		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
+		StudentSubmitSolution sss = getLastEvaluatedSolutionForTaskInTestInstance();
 		if (sss.getTaskInTestInstance().getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
 				.equals(ModelConstants.TaskCodeSQL)) {
@@ -178,8 +200,34 @@
 			return sss.getTaskInTestInstance().getStudentSubmitSolutions().stream()
 					.filter(p -> (p.getEvaluations() != null && p.getEvaluations().size() > 0
-							&& p.getEvaluations().get(0).getPassed() != null && p.getEvaluations().get(0).getPassed()
+							&& p.getEvaluations().get(0).getPassed()
 							&& p.getStudentSubmitSolutionId() != sss.getStudentSubmitSolutionId()))
 					.collect(Collectors.toList());
 		}
+	}
+
+	public List<TestInstance> getTestInstances() {
+		if (userInfo.isAdministrator()) {
+			return testManager.getAllTestInstances();
+		} else if (userInfo.isStudent()) {
+			long studentId = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0).getStudentId();
+			return testManager.getTestInstancesForStudent(studentId);
+		} else {
+			return null;
+		}
+	}
+
+	public SelectModel getTestInstanceSelectModel() {
+		return selectModelFactory.create(getTestInstances(), "title");
+	}
+
+	public void onValueChanged(TestInstance newTestInstance) {
+		selectedTestInstance = newTestInstance;
+		if (selectedTestInstance != null) {
+			taskInTestInstances = testManager.getTasksInTestInstance(selectedTestInstance.getTestInstanceId());
+		} else {
+			taskInTestInstances = new ArrayList<>();
+		}
+		prepareMapOfEvaluationsAndTotal();
+		ajaxResponseRenderer.addRender(zTestInstance);
 	}
 
@@ -246,5 +294,5 @@
 
 	public String getFileFromSubmission() {
-		return processFileNameFromSubmission(oneOfTheEvaluatedSolutions.getStudentSubmitSolution());
+		return processFileNameFromSubmission(getLastEvaluatedSolutionForTaskInTestInstance());
 	}
 
@@ -274,7 +322,7 @@
 
 	public SolutionAssessment getSubmissionsFirstEvaluation() {
-		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
-		if (sss != null && sss.getEvaluations() != null && sss.getEvaluations().size() > 0) {
-			return sss.getEvaluations().get(0);
+		StudentSubmitSolution ssa = getLastEvaluatedSolutionForTaskInTestInstance();
+		if (ssa != null && ssa.getEvaluations() != null && ssa.getEvaluations().size() > 0) {
+			return ssa.getEvaluations().get(0);
 		} else {
 			return null;
@@ -282,14 +330,4 @@
 
 	}
-	
-	public String getSolutionCorrectnessClass() {
-		if (oneOfTheEvaluatedSolutions.getPassed()) {
-			return " solutionCorrect ";
-		}
-		if (!oneOfTheEvaluatedSolutions.getPassed()) {
-			return " solutionInCorrect ";
-		}
-		return " ";
-	}
 
 }
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/TasksOverviewPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/TasksOverviewPage.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,245 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the dbLearnStar system (hereinafter: dbLearn*).
- *     
- * dbLearn* is free software: you can redistribute it and/or modify it under the 
- * terms of the GNU General Public License as published by the Free Software 
- * Foundation, either version 3 of the License, or (at your option) any later 
- * version.
- *     
- * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
- * details.
- *     
- * You should have received a copy of the GNU General Public License along 
- * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
- * 
- ******************************************************************************/
-
-package dblearnstar.webapp.pages;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.tapestry5.annotations.Import;
-import org.apache.tapestry5.annotations.InjectPage;
-import org.apache.tapestry5.annotations.Persist;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.services.PersistentLocale;
-import org.apache.tapestry5.services.SelectModelFactory;
-import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
-import org.apache.tapestry5.services.javascript.JavaScriptSupport;
-import org.slf4j.Logger;
-
-import dblearnstar.model.entities.Model;
-import dblearnstar.model.entities.Student;
-import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.entities.TaskType;
-import dblearnstar.model.entities.TestInstance;
-import dblearnstar.model.model.UserInfo;
-import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.annotations.StudentPage;
-import dblearnstar.webapp.pages.admin.SubmissionEvaluations;
-import dblearnstar.webapp.services.DigestService;
-import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.PersonManager;
-import dblearnstar.webapp.services.TestManager;
-import dblearnstar.webapp.services.TranslationService;
-
-@AdministratorPage
-@StudentPage
-@Import(stylesheet = "ExamsAndTasksOverviewPage.css", module = "bootstrap/collapse")
-
-public class TasksOverviewPage {
-	@Inject
-	private Logger logger;
-	@Inject
-	private JavaScriptSupport javaScriptSupport;
-	@Inject
-	private PersistentLocale persistentLocale;
-	@Inject
-	private SelectModelFactory selectModelFactory;
-	@Inject
-	private AjaxResponseRenderer ajaxResponseRenderer;
-	@Inject
-	private DigestService digestService;
-
-	@SessionState
-	@Property
-	private UserInfo userInfo;
-
-	@Persist
-	@Property
-	private Model chosenModel;
-
-	@Property
-	private TaskInTestInstance listedTaskInTestInstance;
-
-	@Persist
-	@Property
-	private TaskType chosenTaskType;
-
-	@Inject
-	private PersonManager pm;
-	@Inject
-	private GenericService genericService;
-	@Inject
-	private TestManager testManager;
-	@Inject
-	private TranslationService translationService;
-
-	@InjectPage
-	private SubmissionEvaluations submissionEvaluations;
-
-	@Property
-	private Model listedModel;
-	@Property
-	private TaskType listedTaskType;
-
-	private Student student;
-
-	public void onActivate() {
-		// @TODO better implementation is needed for many students per user
-		student = pm.getStudentsByPersonId(userInfo.getPersonId()).get(0);
-		prevTestInstance = null;
-	}
-
-	public List<Model> getAllModels() {
-		List<Model> list = testManager.getAllModels();
-		return list.stream().sorted((o1, o2) -> {
-			return o1.getTitle().compareTo(o2.getTitle());
-		}).toList();
-	}
-
-	public List<TaskType> getAllTaskTypes() {
-		List<TaskType> list = new ArrayList<TaskType>();
-		if (chosenModel != null) {
-			list = testManager.getAllTaskTypesDefinedOverModel(chosenModel);
-		} else {
-			list = testManager.getAllTaskTypes();
-		}
-		return list.stream().sorted((o1, o2) -> {
-			return o1.getTitle().compareTo(o2.getTitle());
-		}).toList();
-	}
-
-	public String getClassSelectedModel() {
-		if (chosenModel != null) {
-			if (listedModel.getModelId() == chosenModel.getModelId()) {
-				return " btn-primary text-light ";
-			} else {
-				return "";
-			}
-		} else {
-			return "";
-		}
-	}
-
-	public String getClassSelectedTaskType() {
-		if (chosenTaskType != null) {
-			if (listedTaskType.getTaskTypeId() == chosenTaskType.getTaskTypeId()) {
-				return " btn-primary text-light ";
-			} else {
-				return "";
-			}
-		} else {
-			return "";
-		}
-	}
-
-	public void onChooseModel(Model m) {
-		chosenModel = m;
-	}
-
-	public void onUnchooseModel() {
-		chosenModel = null;
-	}
-
-	public void onChooseTaskType(TaskType tt) {
-		chosenTaskType = tt;
-	}
-
-	public void onUnchooseTaskType() {
-		chosenTaskType = null;
-	}
-
-	private TestInstance prevTestInstance;
-
-	public Boolean getPrevTestInstance() {
-		if (prevTestInstance == null) {
-			prevTestInstance = listedTaskInTestInstance.getTestInstance();
-			return true;
-		} else {
-			if (prevTestInstance.getTestInstanceId() == listedTaskInTestInstance.getTestInstance()
-					.getTestInstanceId()) {
-				return false;
-			} else {
-				prevTestInstance = listedTaskInTestInstance.getTestInstance();
-				return true;
-			}
-		}
-	}
-
-	public List<TaskInTestInstance> getAllTasks() {
-		if (chosenModel != null) {
-			List<TaskInTestInstance> list = testManager.getTaskInTestInstancesByModel(chosenModel.getModelId());
-			if (chosenTaskType != null) {
-				list = list.stream()
-						.filter(p -> p.getTask().getTaskIsOfTypes().stream()
-								.anyMatch(q -> q.getTaskType().getTaskTypeId() == chosenTaskType.getTaskTypeId()))
-						.collect(Collectors.toList());
-				if (student != null) {
-					list = list.stream().filter(p -> testManager.accessToTaskInTestInstanceAllowed(student, p))
-							.toList();
-				}
-			}
-			return list;
-		} else {
-			if (chosenTaskType != null) {
-				List<TaskInTestInstance> list = new ArrayList<TaskInTestInstance>();
-				list = testManager.getTaskInTestInstancesByTaskType(chosenTaskType);
-				if (student != null) {
-					list = list.stream().filter(p -> testManager.accessToTaskInTestInstanceAllowed(student, p))
-							.toList();
-				}
-				return list;
-			} else {
-				return null;
-			}
-		}
-	}
-
-	public Long getNumPersonsSuccessful() {
-		return testManager
-				.getNumPersonsSuccessfulForTaskInTestInstance(listedTaskInTestInstance.getTaskInTestInstanceId());
-	}
-
-	public long getNumPersonsTriedToSolve() {
-		return testManager
-				.getNumPersonsTriedToSolveTaskInTestInstance(listedTaskInTestInstance.getTaskInTestInstanceId());
-	}
-
-	public String getClassForSolved() {
-		Boolean solved = isTaskInTestInstanceSolved();
-		if (solved != null && solved) {
-			return "text-white bg-success";
-		} else {
-			return "";
-		}
-	}
-
-	public Boolean isTaskInTestInstanceSolved() {
-		if (student != null) {
-			return testManager.isTaskInTestInstanceSolvedByStudent(listedTaskInTestInstance.getTaskInTestInstanceId(),
-					student.getStudentId());
-		} else {
-			return false;
-		}
-	}
-
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/GroupManagement.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/GroupManagement.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/GroupManagement.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,5 +21,4 @@
 package dblearnstar.webapp.pages.admin;
 
-import java.util.ArrayList;
 import java.util.List;
 
@@ -29,5 +28,4 @@
 import org.apache.tapestry5.beanmodel.BeanModel;
 import org.apache.tapestry5.beanmodel.services.BeanModelSource;
-import org.apache.tapestry5.beanmodel.services.PropertyConduitSource;
 import org.apache.tapestry5.commons.Messages;
 import org.apache.tapestry5.hibernate.annotations.CommitAfter;
@@ -40,5 +38,4 @@
 import dblearnstar.model.entities.GroupMember;
 import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.Student;
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.model.StudentSelectModel;
@@ -65,17 +62,10 @@
 	private SelectModelFactory selectModelFactory;
 
-	@Inject
-	private BeanModelSource beanModelSource;
-	@Inject
-	private Messages messages;
-	@Inject
-	private PropertyConduitSource pcs;
-
-	@Persist
-	@Property
-	private String errors;
+	@Property
+	private Group group;
 	@Property
 	@Persist
 	private Group selectedGroup;
+
 	@Property
 	@Persist
@@ -87,7 +77,4 @@
 	@Persist
 	private GroupFocusOnTest editGroupFocusOnTest;
-
-	@Property
-	private Group group;
 	@Property
 	private GroupMember groupMember;
@@ -96,6 +83,4 @@
 	@Property
 	private Person personToAdd;
-	@Property
-	private String studentsToImport;
 
 	public void onActivate() {
@@ -106,7 +91,4 @@
 			}
 		}
-		if (groupCopyFrom != null) {
-			groupCopyFrom = genericService.getByPK(Group.class, groupCopyFrom.getGroupId());
-		}
 	}
 
@@ -131,37 +113,10 @@
 	public void onSuccessFromNewGroupForm() {
 		logger.info("Submitting new group");
-		errors = "";
-		genericService.saveOrUpdate(editGroup);
 		if (editGroupMember != null) {
 			genericService.saveOrUpdate(editGroupMember);
 		}
-		if (studentsToImport != null) {
-			for (String line : studentsToImport.split("\\r?\\n")) {
-				logger.info(">>> Importing {} <<<", line);
-				for (String lineField : line.split("[,\t]")) {
-					try {
-						Student s = personManager
-								.getStudentsByPersonId(personManager.getPersonByUsername(lineField).getPersonId())
-								.get(0);
-						if (editGroup.getGroupMembers().stream()
-								.noneMatch(p -> p.getStudent().getStudentId() == s.getStudentId())) {
-							GroupMember gm = new GroupMember();
-							gm.setGroup(editGroup);
-							gm.setStudent(s);
-							genericService.save(gm);
-						}
-					} catch (Exception e) {
-						errors += ">>> Student " + line + " can not be imported due to: " + e.getLocalizedMessage();
-					}
-				}
-			}
-			if (!(errors.length() > 0)) {
-				errors = "";
-				studentsToImport = null;
-				editGroupMember = null;
-			}
-		} else {
-			editGroup = null;
-		}
+		genericService.saveOrUpdate(editGroup);
+		editGroupMember = null;
+		editGroup = null;
 	}
 
@@ -199,4 +154,10 @@
 	}
 
+	@Inject
+	private BeanModelSource beanModelSource;
+
+	@Inject
+	private Messages messages;
+
 	@Property
 	@Persist
@@ -214,14 +175,4 @@
 		modelGroupFocusOnTest.add("testInstance");
 		modelGroupFocusOnTest.exclude("groupFocusOnTestId");
-	}
-
-	public BeanModel<GroupMember> getGroupMemberGridModel() {
-		BeanModel<GroupMember> model = beanModelSource.createDisplayModel(GroupMember.class, messages);
-		model.exclude("groupMemberId");
-		model.add("userName", pcs.create(GroupMember.class, "student.person.userName"));
-		model.add("firstName", pcs.create(GroupMember.class, "student.person.firstName"));
-		model.add("lastName", pcs.create(GroupMember.class, "student.person.lastName"));
-		model.addEmpty("actions");
-		return model;
 	}
 
@@ -247,41 +198,3 @@
 		}
 	}
-
-	void onCancelEditGroup() {
-		editGroup = null;
-	}
-
-	void onCancelNewMemberForm() {
-		editGroupMember = null;
-	}
-
-	void onCancelNewFocusOnTestForm() {
-		editGroupFocusOnTest = null;
-	}
-
-	@Persist
-	@Property
-	private Group groupCopyFrom;
-
-	void onCopyMembers(Group g) {
-		groupCopyFrom = g;
-	}
-
-	void onForgetCopy() {
-		groupCopyFrom = null;
-	}
-
-	@CommitAfter
-	void onPasteMembers(Group g) {
-		g.getGroupMembers().forEach(p -> genericService.delete(p));
-		if (groupCopyFrom.getGroupMembers() != null && groupCopyFrom.getGroupMembers().size() > 0) {
-			for (GroupMember gm : groupCopyFrom.getGroupMembers()) {
-				GroupMember newGm = new GroupMember();
-				newGm.setGroup(g);
-				newGm.setStudent(gm.getStudent());
-				genericService.save(newGm);
-			}
-		}
-		groupCopyFrom = null;
-	}
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManageModels.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManageModels.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManageModels.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -11,5 +11,4 @@
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.TestManager;
 
 @AdministratorPage
@@ -18,7 +17,4 @@
 	@Inject
 	private GenericService genericService;
-
-	@Inject
-	private TestManager testManager;
 
 	@Property
@@ -30,5 +26,5 @@
 
 	public List<Model> getAllModels() {
-		return testManager.getAllModels();
+		return (List<Model>) genericService.getAll(Model.class);
 	}
 
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManagePersons.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManagePersons.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManagePersons.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -22,5 +22,6 @@
 
 import java.util.List;
-import java.util.stream.Collectors;
+
+import javax.inject.Inject;
 
 import org.apache.tapestry5.SelectModel;
@@ -31,5 +32,4 @@
 import org.apache.tapestry5.corelib.components.Form;
 import org.apache.tapestry5.hibernate.annotations.CommitAfter;
-import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.services.SelectModelFactory;
 import org.slf4j.Logger;
@@ -39,5 +39,4 @@
 import dblearnstar.model.entities.Role;
 import dblearnstar.model.entities.Student;
-import dblearnstar.model.model.ModelConstants;
 import dblearnstar.model.model.UserInfo;
 import dblearnstar.webapp.annotations.AdministratorPage;
@@ -53,7 +52,4 @@
 
 	@Inject
-	private SelectModelFactory selectModelFactory;
-
-	@Inject
 	private PersonManager personManager;
 
@@ -64,15 +60,6 @@
 	private Logger logger;
 
-	@InjectComponent
-	private Form frmImport;
-
-	private Boolean cancelForm = false;
-
 	@Property
 	private Person person;
-
-	@Persist
-	@Property
-	private Person personToEdit;
 
 	@Property
@@ -80,29 +67,18 @@
 	private String personListToImport;
 
-	@Property
-	Role selectedRole;
+	public List<Person> getAllPersons() {
+		return personManager.getAllPersons();
+	}
 
-	@Property
-	@Persist
-	private String searchString;
+	public void onActionFromImportPersons() {
+		personListToImport = "firstName,lastName,email,userName";
+	}
+
+	@InjectComponent
+	private Form frmImport;
 
 	@Persist
 	@Property
 	private String errors;
-
-	public List<Person> getAllPersons() {
-		List<Person> list = personManager.getAllPersons();
-		if (searchString == null || searchString.equals("")) {
-			return list;
-		} else {
-			return list.stream()
-					.filter(p -> (p.getFirstName() + p.getLastName() + p.getUserName()).contains(searchString))
-					.collect(Collectors.toList());
-		}
-	}
-
-	public void onActionFromImportPersons() {
-		personListToImport = "firstName\tlastName\tuserName";
-	}
 
 	@CommitAfter
@@ -115,17 +91,13 @@
 				Person p;
 				try {
-					p = personManager.getPersonByUsername(lineFields[2]);
+					p = personManager.getPersonByUsername(lineFields[3]);
 					if (p != null) {
-						errors += ">>> Person " + p.getUserName() + " already exists, skipping creation, activating.";
-						if (p.getStudents().size() > 0) {
-							p.setFirstName(lineFields[0]);
-							p.setLastName(lineFields[1]);
-							genericService.save(p);
-						}
+						errors += ">>> Person " + p.getUserName() + " already exists, skipping.";
 					} else {
 						p = new Person();
 						p.setFirstName(lineFields[0]);
 						p.setLastName(lineFields[1]);
-						p.setUserName(lineFields[2]);
+						// p.setEmail(lineFields[2]);
+						p.setUserName(lineFields[3]);
 						genericService.save(p);
 						Student pr = new Student();
@@ -134,5 +106,5 @@
 					}
 				} catch (Exception e) {
-					errors += ">>> Person " + lineFields[2] + " can not be imported due to: " + e.getLocalizedMessage();
+					errors += ">>> Person " + lineFields[3] + " can not be imported due to: " + e.getLocalizedMessage();
 				}
 			}
@@ -160,12 +132,17 @@
 	}
 
-	@CommitAfter
-	public void onTogglePersonStatus(Person p) {
-		if (p.getUserName().contains(ModelConstants.PersonDeactivatedSuffix)) {
-			p.setUserName(p.getUserName().replace(ModelConstants.PersonDeactivatedSuffix, ""));
-		} else {
-			p.setUserName(p.getUserName() + ModelConstants.PersonDeactivatedSuffix);
-		}
+	@Inject
+	private SelectModelFactory selectModelFactory;
+
+	@Property
+	Role selectedRole;
+
+	public SelectModel getSelectRoleModel() {
+		return selectModelFactory.create(genericService.getAll(Role.class), "name");
 	}
+
+	@Persist
+	@Property
+	private Person personToEdit;
 
 	public void onActionFromNewPerson() {
@@ -188,4 +165,6 @@
 	}
 
+	private Boolean cancelForm = false;
+
 	public void onCanceledFromFrmNewPerson() {
 		cancelForm = true;
@@ -202,7 +181,3 @@
 	}
 
-	public SelectModel getSelectRoleModel() {
-		return selectModelFactory.create(genericService.getAll(Role.class), "name");
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/Reevaluation.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/Reevaluation.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/Reevaluation.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -31,5 +31,4 @@
 
 import dblearnstar.model.entities.StudentSubmitSolution;
-import dblearnstar.model.entities.TaskInTestInstance;
 import dblearnstar.model.entities.TestInstance;
 import dblearnstar.model.model.UserInfo;
@@ -68,7 +67,4 @@
 	private TestInstance testInstance;
 
-	@Property
-	private TaskInTestInstance taskInTestInstance;
-
 	@Inject
 	Request request;
@@ -80,23 +76,26 @@
 
 	@CommitAfter
+	public void processSolution(StudentSubmitSolution s) {
+		evaluationService.processSolution(userInfo.getUserName(), s);
+	}
+
 	public void onActionFromReEvalTest(TestInstance selectedTestInstance) {
 		List<StudentSubmitSolution> list = evaluationService
 				.getAllSolutionsForEvalutionFromTestInstance(selectedTestInstance);
-		evaluationService.reEvalListOfSubmissions(userInfo.getUserName(), list);
+		for (StudentSubmitSolution s : list) {
+			try {
+				processSolution(s);
+			} catch (Exception e) {
+				logger.error("Fail evaluation for sssId: {}", s.getStudentSubmitSolutionId());
+			}
+		}
 		logger.info("Finished reEvalTest and processed {} entries", list.size());
 	}
 
-	@CommitAfter
-	public void onActionFromReEvalTaskInTestInstance(TaskInTestInstance taskInTestInstance) {
-		List<StudentSubmitSolution> list = evaluationService
-				.getAllSolutionsForEvalutionFromTaskInTestInstance(taskInTestInstance);
-		evaluationService.reEvalListOfSubmissions(userInfo.getUserName(), list);
-		logger.info("Finished reEvalTaskInTestInstance and processed {} entries", list.size());
-	}
-
-	@CommitAfter
 	public void onActionFromReEvalAll() {
 		List<StudentSubmitSolution> list = evaluationService.getAllSolutionsForEvaluation();
-		evaluationService.reEvalListOfSubmissions(userInfo.getUserName(), list);
+		for (StudentSubmitSolution s : list) {
+			processSolution(s);
+		}
 		logger.info("Finished reEvalAll and processed {} entries", list.size());
 	}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SimilarQueries.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SimilarQueries.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SimilarQueries.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -288,5 +288,5 @@
 	@CommitAfter
 	public void onActionFromReevaluateSubmission(StudentSubmitSolution s) {
-		evaluationService.reEvalSolution(userInfo.getUserName(), s);
+		evaluationService.processSolution(userInfo.getUserName(), s);
 	}
 
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/StudentGroupProgress.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/StudentGroupProgress.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/StudentGroupProgress.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -31,4 +31,5 @@
 import org.apache.tapestry5.services.PersistentLocale;
 import org.apache.tapestry5.services.SelectModelFactory;
+import org.slf4j.Logger;
 
 import dblearnstar.model.entities.Group;
@@ -37,5 +38,4 @@
 import dblearnstar.model.entities.TaskInTestInstance;
 import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.services.EvaluationService;
 import dblearnstar.webapp.services.GenericService;
 import dblearnstar.webapp.services.GroupManager;
@@ -45,9 +45,11 @@
 
 @AdministratorPage
-@Import(module = { "zoneUpdateEffect" }, stylesheet = { "StudentGroupProgress.css" })
+@Import(module = { "zoneUpdateEffect" })
 public class StudentGroupProgress {
 
 	@Inject
 	private SelectModelFactory selectModelFactory;
+	@Inject
+	private Logger logger;
 
 	@Inject
@@ -59,6 +61,4 @@
 	@Inject
 	private PersonManager personManager;
-	@Inject
-	private EvaluationService evaluationService;
 
 	@Property
@@ -91,4 +91,10 @@
 	}
 
+	public Boolean getSolvedTaskByStudent() {
+		Boolean test = testManager.isTaskInTestInstanceSolvedByStudent(taskInTestInstance.getTaskInTestInstanceId(),
+				groupMember.getStudent().getStudentId());
+		return test;
+	}
+
 	public Float getAssessmentsForTaskForStudent() {
 		return testManager.getGradeForTaskInTestInstanceByStudent(taskInTestInstance.getTaskInTestInstanceId(),
@@ -100,28 +106,20 @@
 	}
 
-	public Integer getResultGrade() {
-		return (Integer) result[0];
-	}
-
-	public String getResultColorClass() {
-		Boolean shouldPass = (Boolean) result[1];
-		Boolean passed = (Boolean) result[2];
-
-		String colorClass = " ";
-		if (passed != null && passed) {
-			colorClass += " result-passed ";
-		} else if (passed != null && !passed) {
-			colorClass += " result-notpassed ";
+	public String getColorClass() {
+		Boolean solved = getSolvedTaskByStudent();
+		Float grade = getAssessmentsForTaskForStudent();
+		if (solved == null) {
+			if (grade != null) {
+				return " color-queryError ";
+			} else {
+				return " ";
+			}
 		} else {
-
+			if (solved) {
+				return " color-queryCorrect ";
+			} else {
+				return " color-queryError ";
+			}
 		}
-		if (shouldPass != null && shouldPass) {
-			colorClass += " result-queryCorrect ";
-		} else if (shouldPass != null && !shouldPass) {
-			colorClass += " result-queryError ";
-		} else {
-
-		}
-		return colorClass;
 	}
 
@@ -135,13 +133,5 @@
 
 	public List<TaskInTestInstance> getTaskInTestInstances() {
-		return testManager.getTaskInTestInstancesByTestInstance(groupFocusOnTest.getTestInstance().getTestInstanceId());
-	}
-
-	@Property
-	private Object[] result;
-
-	public List<Object[]> getTestInstanceResultsByStudentSortedByTaskName() {
-		return testManager.getTestInstanceResultsByStudentSortedByTaskName(groupMember.getStudent(),
-				groupFocusOnTest.getTestInstance());
+		return testManager.getTasksInTestInstance(groupFocusOnTest.getTestInstance().getTestInstanceId());
 	}
 
@@ -171,12 +161,9 @@
 
 	public String getTaskInTestInstanceTaskTitleTranslated() {
-		String translated = translationService.getTranslation("Task", "title", taskInTestInstance.getTask().getTaskId(),
+		String translated = translationService.getTranslation("Task", "title",
+				taskInTestInstance.getTask().getTaskId(),
 				persistentLocale.get().getLanguage().toLowerCase());
 		return (translated != null ? translated : taskInTestInstance.getTask().getTitle());
 	}
-	
-	public List<GroupMember> getSelectedGroupMembersSorted() {
-		return evaluationService.groupMembersSortedByTestTotals(selectedGroup);
-	}
 
 }
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionEvaluations.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionEvaluations.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,641 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the dbLearnStar system (hereinafter: dbLearn*).
- *     
- * dbLearn* is free software: you can redistribute it and/or modify it under the 
- * terms of the GNU General Public License as published by the Free Software 
- * Foundation, either version 3 of the License, or (at your option) any later 
- * version.
- *     
- * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
- * details.
- *     
- * You should have received a copy of the GNU General Public License along 
- * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
- * 
- ******************************************************************************/
-
-package dblearnstar.webapp.pages.admin;
-
-import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.tapestry5.SelectModel;
-import org.apache.tapestry5.annotations.Import;
-import org.apache.tapestry5.annotations.InjectComponent;
-import org.apache.tapestry5.annotations.Persist;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.beaneditor.RelativePosition;
-import org.apache.tapestry5.beanmodel.BeanModel;
-import org.apache.tapestry5.beanmodel.services.BeanModelSource;
-import org.apache.tapestry5.beanmodel.services.PropertyConduitSource;
-import org.apache.tapestry5.commons.Messages;
-import org.apache.tapestry5.corelib.components.Zone;
-import org.apache.tapestry5.hibernate.annotations.CommitAfter;
-import org.apache.tapestry5.http.services.Request;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.services.PersistentLocale;
-import org.apache.tapestry5.services.SelectModelFactory;
-import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
-import org.slf4j.Logger;
-
-import com.github.vertical_blank.sqlformatter.SqlFormatter;
-import com.github.vertical_blank.sqlformatter.core.FormatConfig;
-import com.github.vertical_blank.sqlformatter.languages.Dialect;
-
-import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.SolutionAssessment;
-import dblearnstar.model.entities.Student;
-import dblearnstar.model.entities.StudentSubmitSolution;
-import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.entities.TestInstance;
-import dblearnstar.model.entities.TestInstanceParameters;
-import dblearnstar.model.model.ModelConstants;
-import dblearnstar.model.model.TaskTypeChecker;
-import dblearnstar.model.model.Triplet;
-import dblearnstar.model.model.UserInfo;
-import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.model.StudentSelectModel;
-import dblearnstar.webapp.model.TaskInTestInstanceSelectModel;
-import dblearnstar.webapp.services.EvaluationService;
-import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.PersonManager;
-import dblearnstar.webapp.services.TestManager;
-import dblearnstar.webapp.services.TranslationService;
-import dblearnstar.webapp.services.UsefulMethods;
-
-@AdministratorPage
-@Import(stylesheet = { "SubmissionEvaluations.css", "feedback-styles.css" }, module = { "zoneUpdateEffect",
-		"bootstrap/modal", "bootstrap/collapse" })
-public class SubmissionEvaluations {
-
-	@SessionState
-	private UserInfo userInfo;
-
-	@Inject
-	private Logger logger;
-	@Inject
-	private AjaxResponseRenderer ajaxResponseRenderer;
-
-	@Inject
-	private BeanModelSource beanModelSource;
-	@Inject
-	private Messages messages;
-	@Inject
-	private PropertyConduitSource pcs;
-
-	@Inject
-	private SelectModelFactory selectModelFactory;
-	@Inject
-	private Request request;
-	@Inject
-	private PersistentLocale persistentLocale;
-
-	@Inject
-	private EvaluationService evaluationService;
-	@Inject
-	private GenericService genericService;
-	@Inject
-	private TestManager testManager;
-	@Inject
-	private PersonManager personManager;
-	@Inject
-	private TranslationService translationService;
-
-	@InjectComponent
-	private Zone zTask;
-	@InjectComponent
-	private Zone zStudent;
-	@InjectComponent
-	private Zone zSubmissions;
-	@InjectComponent
-	private Zone zModal;
-	@InjectComponent
-	private Zone zSQLEval;
-	@InjectComponent
-	private Zone zSolution;
-
-	@Persist
-	@Property
-	private Student filterStudent;
-	@Persist
-	@Property
-	private TestInstance filterTestInstance;
-	@Persist
-	@Property
-	private TaskInTestInstance filterTaskInTestInstance;
-	@Persist
-	@Property
-	private Boolean onlyEval;
-	@Persist
-	@Property
-	private Boolean onlyLast;
-	@Persist
-	@Property
-	private Boolean onlyCorrect;
-	@Persist
-	@Property
-	private Boolean onlyDateOfExam;
-	@Persist
-	@Property
-	private Boolean onlyAssessed;
-	@Persist
-	@Property
-	private Boolean onlyUnAssessed;
-	@Persist
-	@Property
-	private Boolean hideClientInfo;
-	@Persist
-	@Property
-	private Boolean hideNames;
-	@Persist
-	@Property
-	SolutionAssessment editedAssessment;
-	@Persist
-	@Property
-	private Boolean prettyFormat;
-	@Property
-	@Persist
-	private List<String> resultsHeaders1;
-	@Property
-	@Persist
-	private List<String> resultsHeaders2;
-	@Property
-	@Persist
-	private List<Object[]> resultsEvaluation1;
-	@Property
-	@Persist
-	private List<Object[]> resultsEvaluation2;
-	@Property
-	@Persist
-	private List<String> resultsErrors1;
-	@Property
-	@Persist
-	private List<String> resultsErrors2;
-
-	@Property
-	private StudentSubmitSolution submission;
-	@Property
-	private String resultsError;
-	@Property
-	private String oneHeader;
-	@Property
-	private Object[] oneRow;
-	@Property
-	private Object oneColumn;
-
-	public void onActivate() {
-		logger.warn("Activated from {} by {} {}", request.getRemoteHost(), userInfo.getUserName(),
-				request.getHeader("User-Agent"));
-		if (onlyLast == null) {
-			onlyLast = true;
-		}
-		if (onlyEval == null) {
-			onlyEval = true;
-		}
-		if (hideClientInfo == null) {
-			hideClientInfo = true;
-		}
-		if (hideNames == null) {
-			hideNames = true;
-		}
-		if (filterStudent != null) {
-			filterStudent = genericService.getByPK(Student.class, filterStudent.getStudentId());
-		}
-		if (filterTestInstance != null) {
-			filterTestInstance = genericService.getByPK(TestInstance.class, filterTestInstance.getTestInstanceId());
-		}
-		if (filterTaskInTestInstance != null) {
-			filterTaskInTestInstance = genericService.getByPK(TaskInTestInstance.class,
-					filterTaskInTestInstance.getTaskInTestInstanceId());
-		}
-		if (prettyFormat == null) {
-			prettyFormat = false;
-		}
-	}
-
-	public void onActivate(SolutionAssessment sa) {
-		logger.warn("Activated with sa={} from {} by {} {}", sa, request.getRemoteHost(), userInfo.getUserName(),
-				request.getHeader("User-Agent"));
-		editedAssessment = genericService.getByPK(SolutionAssessment.class, sa.getSolutionAssessmentId());
-	}
-
-	public List<StudentSubmitSolution> getAllSubmissions() {
-		List<StudentSubmitSolution> lista = null;
-		if (filterTestInstance != null) {
-			if (onlyLast != null && onlyLast) {
-				lista = evaluationService.getOnlyLastSubmissionsByStudentAndTaskInTestInstance(filterStudent,
-						filterTestInstance, filterTaskInTestInstance, onlyEval, onlyCorrect);
-			} else {
-				lista = evaluationService.getSubmissionsByStudentAndTaskInTestInstance(filterStudent,
-						filterTestInstance, filterTaskInTestInstance, onlyEval, onlyCorrect);
-			}
-		}
-		if (lista != null && onlyDateOfExam != null && onlyDateOfExam) {
-			lista = lista.stream().filter(sss -> sss.getSubmittedOn()
-					.after(sss.getTaskInTestInstance().getTestInstance().getScheduledFor())
-					&& sss.getSubmittedOn().before(sss.getTaskInTestInstance().getTestInstance().getScheduledUntil()))
-					.collect(Collectors.toList());
-		}
-		if (lista != null && onlyAssessed != null && onlyAssessed) {
-			lista = lista.stream().filter(sss -> (sss.getEvaluations() != null && sss.getEvaluations().size() > 0))
-					.collect(Collectors.toList());
-		}
-		if (lista != null && onlyUnAssessed != null && onlyUnAssessed) {
-			lista = lista.stream().filter(sss -> (sss.getEvaluations() == null || sss.getEvaluations().size() == 0))
-					.collect(Collectors.toList());
-		}
-
-		return lista;
-	}
-
-	public BeanModel<StudentSubmitSolution> getModelSSS() {
-		BeanModel<StudentSubmitSolution> modelSSS = beanModelSource.createDisplayModel(StudentSubmitSolution.class,
-				messages);
-		modelSSS.add(RelativePosition.BEFORE, "submission", "submittedBy",
-				pcs.create(StudentSubmitSolution.class, "studentStartedTest.student.person.lastName"));
-		modelSSS.add(RelativePosition.BEFORE, "submission", "task",
-				pcs.create(StudentSubmitSolution.class, "taskInTestInstance.task.title"));
-		modelSSS.add(RelativePosition.BEFORE, "submission", "test",
-				pcs.create(StudentSubmitSolution.class, "taskInTestInstance.testInstance.title"));
-		modelSSS.addEmpty("assessment");
-		modelSSS.reorder("submittedBy", "task", "submission", "submittedOn", "evaluationSimple", "evaluationComplex",
-				"evaluationExam", "notForEvaluation", "assessment", "ipAddress");
-		if (filterStudent != null) {
-			modelSSS.exclude("submittedBy");
-		}
-		if (filterTestInstance != null) {
-			modelSSS.exclude("test");
-		}
-		if (onlyCorrect != null && onlyCorrect) {
-			modelSSS.exclude("evaluationSimple", "evaluationComplex", "evaluationExam");
-		}
-		if (hideClientInfo != null && hideClientInfo) {
-			modelSSS.exclude("ipAddress", "clientInfo");
-		}
-		if (filterTaskInTestInstance != null && filterTaskInTestInstance.getTask().getTaskIsOfTypes() != null
-				&& filterTaskInTestInstance.getTask().getTaskIsOfTypes().size() > 1) {
-			if (filterTaskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
-					.equals(ModelConstants.TaskCodeTEXT)) {
-				modelSSS.exclude("evaluationSimple", "evaluationComplex", "evaluationExam", "notForEvaluation", "task");
-			}
-			if (filterTaskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
-					.equals(ModelConstants.TaskCodeSQL)) {
-				modelSSS.exclude("task");
-			}
-			if (filterTaskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
-					.equals(ModelConstants.TaskCodeUPLOAD)) {
-				modelSSS.exclude("evaluationSimple", "evaluationComplex", "evaluationExam", "notForEvaluation", "task");
-			}
-		}
-		modelSSS.exclude("studentSubmitSolutionId");
-		return modelSSS;
-	}
-
-	public List<Student> getAllStudents() {
-		if (filterTestInstance != null) {
-			return testManager.getStudentsWhoStartedTestInstance(filterTestInstance);
-		} else {
-			return UsefulMethods.castList(Student.class, genericService.getAll(Student.class));
-		}
-	}
-
-	public SelectModel getSelectTestInstanceModel() {
-		List<TestInstance> list = testManager.getAllTestInstances();
-		Comparator<TestInstance> comparator = (ti1,
-				ti2) -> (ti1 != null && ti2 != null && ti1.getScheduledFor() != null && ti2.getScheduledFor() != null
-						? ti1.getScheduledFor().toInstant().truncatedTo(ChronoUnit.DAYS)
-								.compareTo(ti2.getScheduledFor().toInstant().truncatedTo(ChronoUnit.DAYS))
-						: 0);
-		Comparator<TestInstance> reverser = comparator.reversed();
-		list.sort(reverser);
-		return selectModelFactory.create(list, "title");
-	}
-
-	public SelectModel getSelectStudentsModel() {
-		return new StudentSelectModel(getAllStudents(), hideNames);
-	}
-
-	public SelectModel getSelectTaskInTestInstanceModel() {
-		List<TaskInTestInstance> list = new ArrayList<TaskInTestInstance>();
-		if (filterTestInstance != null) {
-			list = filterTestInstance.getTaskInTestInstances();
-		}
-		return new TaskInTestInstanceSelectModel(list);
-	}
-
-	public void onValueChangedFromSelectStudent(Student newStudent) {
-		filterStudent = newStudent;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSubmissions);
-		}
-	}
-
-	public void onValueChangedFromSelectTestInstance(TestInstance ti) {
-		filterTestInstance = ti;
-		filterTaskInTestInstance = null;
-		filterStudent = null;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zTask).addRender(zStudent).addRender(zSubmissions);
-		}
-	}
-
-	public void onValueChangedFromSelectTaskInTestInstance(TaskInTestInstance tti) {
-		filterTaskInTestInstance = tti;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSubmissions);
-		}
-	}
-
-	public void onActionFromShowUserActivities(StudentSubmitSolution selectedSubmission) {
-		filterStudent = selectedSubmission.getStudentStartedTest().getStudent();
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSubmissions);
-		}
-	}
-
-	public String getSubmittedByNameWithId() {
-		if (hideNames != null && hideNames) {
-			return "[" + submission.getStudentStartedTest().getStudent().getPerson().getUserName() + "]";
-		} else {
-			return personManager.getPersonFullNameWithId(submission.getStudentStartedTest().getStudent().getPerson());
-		}
-	}
-
-	private void clearResultsAndErrors() {
-		resultsEvaluation1 = null;
-		resultsEvaluation2 = null;
-		resultsErrors1 = null;
-		resultsErrors2 = null;
-	}
-
-	@CommitAfter
-	public void onReevaluateSubmission(StudentSubmitSolution s) {
-		evaluationService.reEvalSolution(userInfo.getUserName(), s);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSubmissions);
-		}
-	}
-
-	@CommitAfter
-	public void onReevaluateEditedSubmission(StudentSubmitSolution s) {
-		clearResultsAndErrors();
-		evaluationService.reEvalSolution(userInfo.getUserName(), s);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSQLEval);
-		}
-	}
-
-	public boolean isEditedAssessmentTaskSQL() {
-		if (editedAssessment != null) {
-			StudentSubmitSolution sss = genericService.getByPK(StudentSubmitSolution.class,
-					editedAssessment.getStudentSubmitSolution().getStudentSubmitSolutionId());
-			return TaskTypeChecker.isSQL(testManager.getCodeType(sss));
-		} else {
-			return false;
-		}
-	}
-
-	public boolean isSQL() {
-		return TaskTypeChecker.isSQL(testManager.getCodeType(submission));
-	}
-
-	public boolean isTEXT() {
-		return TaskTypeChecker.isTEXT(testManager.getCodeType(submission));
-	}
-
-	public boolean isDDL() {
-		return TaskTypeChecker.isDDL(testManager.getCodeType(submission));
-	}
-
-	public boolean isFilterTaskDDL() {
-		if (filterTaskInTestInstance != null) {
-			return filterTaskInTestInstance.getTask().getTaskIsOfTypes().stream()
-					.anyMatch(tti -> tti.getTaskType().getCodetype().equals(ModelConstants.TaskCodeDDL));
-		} else {
-			return false;
-		}
-	}
-
-	public boolean isUPLOAD() {
-		return TaskTypeChecker.isUPLOAD(testManager.getCodeType(submission));
-	}
-
-	public SolutionAssessment getSubmissionsFirstEvaluation() {
-		return submission.getEvaluations().get(0);
-	}
-
-	void onActionFromAddAssessment(StudentSubmitSolution s) {
-		clearResultsAndErrors();
-		editedAssessment = new SolutionAssessment();
-		editedAssessment.setStudentSubmitSolution(s);
-		prettyFormat = false;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zModal);
-		}
-	}
-
-	void onActionFromEditAssessment(SolutionAssessment sa) {
-		editedAssessment = sa;
-		prettyFormat = false;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zModal);
-		}
-	}
-
-	@CommitAfter
-	public void onSuccessFromFormEditor() {
-		if (editedAssessment != null) {
-			editedAssessment.setEvaluatedOn(Calendar.getInstance().getTime());
-			genericService.saveOrUpdate(editedAssessment);
-		}
-		editedAssessment = null;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zModal).addRender(zSubmissions);
-		}
-	}
-
-	public void onActionFromCancelFormEditor() {
-		clearResultsAndErrors();
-		editedAssessment = null;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zModal).addRender(zSubmissions);
-		}
-	}
-
-	public String getEvaluationClass() {
-		String output = "";
-		try {
-			if (submission.getEvaluations() != null && submission.getEvaluations().size() > 0) {
-				if (submission.getEvaluations().get(0).getPassed()) {
-					output = "correct";
-				} else {
-					output = "incorrect";
-				}
-			} else {
-				output = "noeval";
-			}
-		} catch (Exception e) {
-			output = "exception";
-		}
-		return output;
-	}
-
-	public String getTranslateTaskDescription() {
-		String trans = translationService.getTranslation("Task", "description",
-				editedAssessment.getStudentSubmitSolution().getTaskInTestInstance().getTask().getTaskId(),
-				persistentLocale.get().getLanguage().toLowerCase());
-		if (trans == null) {
-			return editedAssessment.getStudentSubmitSolution().getTaskInTestInstance().getTask().getDescription();
-		} else {
-			return trans;
-		}
-	}
-
-	void onViewEvaluationResults(StudentSubmitSolution s) {
-		if (resultsEvaluation1 != null || resultsEvaluation2 != null) {
-			clearResultsAndErrors();
-		} else {
-			TaskInTestInstance tti = s.getTaskInTestInstance();
-			/*
-			 * TODO: Only supports TestInstances with a single TestInstanceParameter line
-			 */
-			TestInstanceParameters tip = tti.getTestInstance().getTestInstanceParameters().get(0);
-
-			Triplet<List<Object[]>, List<String>, List<String>> rsltsSimple = evaluationService
-					.getEvalResultsForViewing(userInfo.getUserName(), s.getSubmission(), tti, tip,
-							tip.getSchemaSimple());
-			Triplet<List<Object[]>, List<String>, List<String>> rsltsComplex = evaluationService
-					.getEvalResultsForViewing(userInfo.getUserName(), s.getSubmission(), tti, tip,
-							tip.getSchemaComplex());
-			resultsEvaluation1 = rsltsSimple.getFirstItem();
-			resultsEvaluation2 = rsltsComplex.getFirstItem();
-			resultsHeaders1 = rsltsSimple.getSecondItem();
-			resultsHeaders2 = rsltsComplex.getSecondItem();
-			resultsErrors1 = rsltsSimple.getThirdItem();
-			resultsErrors2 = rsltsComplex.getThirdItem();
-		}
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSQLEval);
-		}
-	}
-
-	public String getClassSQLsolution() {
-		if (isEditedAssessmentTaskSQL()) {
-			return "sqlSolution";
-		} else {
-			return "nonSqlSolution";
-		}
-	}
-
-	public void onPrettyFormatToggle() {
-		prettyFormat = !prettyFormat;
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSolution);
-		}
-	}
-
-	public String getClassPrettyFormat() {
-		if (prettyFormat) {
-			return "btn-info";
-		} else {
-			return " ";
-		}
-	}
-
-	public String getFormattedSolution() {
-		if (isEditedAssessmentTaskSQL() && prettyFormat) {
-			return SqlFormatter.of(Dialect.PostgreSql)
-					.format(editedAssessment.getStudentSubmitSolution().getSubmission(), FormatConfig.builder()
-							.indent("   ").uppercase(true).linesBetweenQueries(2).maxColumnLength(100).build());
-		} else {
-			return editedAssessment.getStudentSubmitSolution().getSubmission();
-		}
-	}
-
-	@CommitAfter
-	void onAssessAsCorrectSubmission(StudentSubmitSolution submission) {
-		SolutionAssessment sa = new SolutionAssessment();
-		sa.setStudentSubmitSolution(submission);
-		sa.setFeedback(messages.get("assessmentComment-correct"));
-		sa.setEvaluatedOn(new Date());
-		sa.setGrade(submission.getTaskInTestInstance().getPoints());
-		sa.setPassed(true);
-		genericService.save(sa);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSubmissions);
-		}
-	}
-
-	@CommitAfter
-	void onAssessAsIncorrectSubmission(StudentSubmitSolution submission) {
-		SolutionAssessment sa = new SolutionAssessment();
-		sa.setStudentSubmitSolution(submission);
-		sa.setFeedback(messages.get("assessmentComment-incorrect"));
-		sa.setEvaluatedOn(new Date());
-		sa.setGrade(0.0F);
-		sa.setPassed(false);
-		genericService.save(sa);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zSubmissions);
-		}
-	}
-
-	@CommitAfter
-	void onAssessEditedAsCorrectSubmission() {
-		editedAssessment.setFeedback(messages.get("assessmentComment-correct"));
-		editedAssessment.setEvaluatedOn(new Date());
-		editedAssessment.setGrade(editedAssessment.getStudentSubmitSolution().getTaskInTestInstance().getPoints());
-		editedAssessment.setPassed(true);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zModal);
-		}
-	}
-
-	@CommitAfter
-	void onAssessEditedAsIncorrectSubmission() {
-		editedAssessment.setFeedback(messages.get("assessmentComment-incorrect"));
-		editedAssessment.setEvaluatedOn(new Date());
-		editedAssessment.setGrade(0.0F);
-		editedAssessment.setPassed(false);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zModal);
-		}
-	}
-
-	public boolean isAnyErrors() {
-		return (resultsErrors1 != null && resultsErrors1.size() > 0)
-				|| (resultsErrors2 != null && resultsErrors2.size() > 0);
-	}
-
-	public boolean isAnyResults() {
-		return (resultsEvaluation1 != null) || (resultsEvaluation2 != null);
-	}
-
-	public boolean isAnyStatus() {
-		return isAnyErrors() || isAnyResults();
-	}
-
-	void onCopySolutionToFeedback() {
-		editedAssessment.setFeedback(getFormattedSolution());
-	}
-
-	public String getEditedAssessmentSubmitterName() {
-		Person p = editedAssessment.getStudentSubmitSolution().getStudentStartedTest().getStudent().getPerson();
-		String name = " [" + p.getUserName() + "]";
-		if (hideNames != null && hideNames) {
-		} else {
-			name = p.getLastName() + " " + p.getFirstName() + name;
-		}
-		return name;
-	}
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionLogViewer.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionLogViewer.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionLogViewer.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -0,0 +1,439 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the dbLearnStar system (hereinafter: dbLearn*).
+ *     
+ * dbLearn* is free software: you can redistribute it and/or modify it under the 
+ * terms of the GNU General Public License as published by the Free Software 
+ * Foundation, either version 3 of the License, or (at your option) any later 
+ * version.
+ *     
+ * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
+ * details.
+ *     
+ * You should have received a copy of the GNU General Public License along 
+ * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
+ * 
+ ******************************************************************************/
+
+package dblearnstar.webapp.pages.admin;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.tapestry5.OptionGroupModel;
+import org.apache.tapestry5.OptionModel;
+import org.apache.tapestry5.SelectModel;
+import org.apache.tapestry5.annotations.Import;
+import org.apache.tapestry5.annotations.InjectComponent;
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.SessionState;
+import org.apache.tapestry5.beaneditor.RelativePosition;
+import org.apache.tapestry5.beanmodel.BeanModel;
+import org.apache.tapestry5.beanmodel.services.BeanModelSource;
+import org.apache.tapestry5.beanmodel.services.PropertyConduitSource;
+import org.apache.tapestry5.commons.Messages;
+import org.apache.tapestry5.corelib.components.Zone;
+import org.apache.tapestry5.hibernate.annotations.CommitAfter;
+import org.apache.tapestry5.http.services.Request;
+import org.apache.tapestry5.internal.OptionModelImpl;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.services.PersistentLocale;
+import org.apache.tapestry5.services.SelectModelFactory;
+import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
+import org.apache.tapestry5.util.AbstractSelectModel;
+import org.slf4j.Logger;
+
+import dblearnstar.model.entities.SolutionAssessment;
+import dblearnstar.model.entities.Student;
+import dblearnstar.model.entities.StudentSubmitSolution;
+import dblearnstar.model.entities.TaskInTestInstance;
+import dblearnstar.model.entities.TaskIsOfType;
+import dblearnstar.model.entities.TestInstance;
+import dblearnstar.model.model.ModelConstants;
+import dblearnstar.model.model.TaskTypeChecker;
+import dblearnstar.model.model.UserInfo;
+import dblearnstar.webapp.annotations.AdministratorPage;
+import dblearnstar.webapp.model.StudentSelectModel;
+import dblearnstar.webapp.services.EvaluationService;
+import dblearnstar.webapp.services.GenericService;
+import dblearnstar.webapp.services.PersonManager;
+import dblearnstar.webapp.services.TestManager;
+import dblearnstar.webapp.services.TranslationService;
+import dblearnstar.webapp.services.UsefulMethods;
+
+@AdministratorPage
+@Import(stylesheet = { "SubmissionLogViewer.css" }, module = { "zoneUpdateEffect", "bootstrap/modal",
+		"bootstrap/collapse" })
+public class SubmissionLogViewer {
+
+	@SessionState
+	private UserInfo userInfo;
+
+	@Inject
+	private Logger logger;
+	@Inject
+	private AjaxResponseRenderer ajaxResponseRenderer;
+
+	@Inject
+	private BeanModelSource beanModelSource;
+	@Inject
+	private Messages messages;
+
+	@Inject
+	private PropertyConduitSource pcs;
+	@Inject
+	private SelectModelFactory selectModelFactory;
+	@Inject
+	private Request request;
+	@Inject
+	private PersistentLocale persistentLocale;
+
+	@Inject
+	private EvaluationService evaluationService;
+	@Inject
+	private GenericService genericService;
+	@Inject
+	private TestManager testManager;
+	@Inject
+	private PersonManager personManager;
+	@Inject
+	private TranslationService translationService;
+
+	@InjectComponent
+	private Zone zTask;
+	@InjectComponent
+	private Zone zStudent;
+
+	@InjectComponent
+	private Zone zSubmissions;
+	@InjectComponent
+	private Zone zModal;
+
+	@Property
+	private StudentSubmitSolution submission;
+
+	@Persist
+	@Property
+	private Student filterStudent;
+	@Persist
+	@Property
+	private TestInstance filterTestInstance;
+	@Persist
+	@Property
+	private TaskInTestInstance filterTaskInTestInstance;
+	@Persist
+	@Property
+	private Boolean onlyEval;
+	@Persist
+	@Property
+	private Boolean onlyLast;
+	@Persist
+	@Property
+	private Boolean onlyCorrect;
+	@Persist
+	@Property
+	private Boolean onlyDateOfExam;
+	@Persist
+	@Property
+	private Boolean onlyAssessed;
+	@Persist
+	@Property
+	private Boolean hideClientInfo;
+	@Persist
+	@Property
+	SolutionAssessment editedAssessment;
+
+	private Boolean toCancel;
+
+	public void onActivate() {
+		logger.info("Activated from {} by {} {}", request.getRemoteHost(), userInfo.getUserName(),
+				request.getHeader("User-Agent"));
+		if (onlyLast == null) {
+			onlyLast = true;
+		}
+		if (onlyEval == null) {
+			onlyEval = true;
+		}
+		if (hideClientInfo == null) {
+			hideClientInfo = true;
+		}
+		if (filterStudent != null) {
+			filterStudent = genericService.getByPK(Student.class, filterStudent.getStudentId());
+		}
+		if (filterTestInstance != null) {
+			filterTestInstance = genericService.getByPK(TestInstance.class, filterTestInstance.getTestInstanceId());
+		}
+		if (filterTaskInTestInstance != null) {
+			filterTaskInTestInstance = genericService.getByPK(TaskInTestInstance.class,
+					filterTaskInTestInstance.getTaskInTestInstanceId());
+		}
+	}
+
+	public List<StudentSubmitSolution> getAllSubmissions() {
+		List<StudentSubmitSolution> lista = null;
+		if (filterTestInstance != null) {
+			if (onlyLast != null && onlyLast) {
+				lista = evaluationService.getOnlyLastSubmissionsByStudentAndTaskInTestInstance(filterStudent,
+						filterTestInstance, filterTaskInTestInstance, onlyEval, onlyCorrect);
+			} else {
+				lista = evaluationService.getSubmissionsByStudentAndTaskInTestInstance(filterStudent,
+						filterTestInstance, filterTaskInTestInstance, onlyEval, onlyCorrect);
+			}
+		}
+		if (lista != null && onlyDateOfExam != null && onlyDateOfExam) {
+			lista = lista.stream().filter(sss -> sss.getSubmittedOn()
+					.after(sss.getTaskInTestInstance().getTestInstance().getScheduledFor())
+					&& sss.getSubmittedOn().before(sss.getTaskInTestInstance().getTestInstance().getScheduledUntil()))
+					.collect(Collectors.toList());
+		}
+		if (lista != null && onlyAssessed != null && onlyAssessed) {
+			lista = lista.stream().filter(sss -> (sss.getEvaluations() != null && sss.getEvaluations().size() > 0))
+					.collect(Collectors.toList());
+		}
+		return lista;
+	}
+
+	public BeanModel<StudentSubmitSolution> getModelSSS() {
+		BeanModel<StudentSubmitSolution> modelSSS = beanModelSource.createDisplayModel(StudentSubmitSolution.class,
+				messages);
+		modelSSS.add(RelativePosition.BEFORE, "submission", "submittedBy",
+				pcs.create(StudentSubmitSolution.class, "studentStartedTest.student.person.lastName"));
+		modelSSS.add(RelativePosition.BEFORE, "submission", "task",
+				pcs.create(StudentSubmitSolution.class, "taskInTestInstance.task.title"));
+		modelSSS.add(RelativePosition.BEFORE, "submission", "test",
+				pcs.create(StudentSubmitSolution.class, "taskInTestInstance.testInstance.title"));
+		modelSSS.addEmpty("assessment");
+		modelSSS.reorder("submittedBy", "task", "submission", "submittedOn", "evaluationSimple", "evaluationComplex",
+				"evaluationExam", "notForEvaluation", "assessment", "ipAddress");
+		if (filterStudent != null) {
+			modelSSS.exclude("submittedBy");
+		}
+		if (filterTestInstance != null) {
+			modelSSS.exclude("test");
+		}
+		if (onlyCorrect != null && onlyCorrect) {
+			modelSSS.exclude("evaluationSimple", "evaluationComplex", "evaluationExam");
+		}
+		if (hideClientInfo != null && hideClientInfo) {
+			modelSSS.exclude("ipAddress", "clientInfo");
+		}
+		if (filterTaskInTestInstance != null && filterTaskInTestInstance.getTask().getTaskIsOfTypes() != null
+				&& filterTaskInTestInstance.getTask().getTaskIsOfTypes().size() > 1) {
+			if (filterTaskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
+					.equals(ModelConstants.TaskCodeTEXT)) {
+				modelSSS.exclude("evaluationSimple", "evaluationComplex", "evaluationExam", "notForEvaluation", "task");
+			}
+			if (filterTaskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
+					.equals(ModelConstants.TaskCodeSQL)) {
+				modelSSS.exclude("task");
+			}
+			if (filterTaskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
+					.equals(ModelConstants.TaskCodeUPLOAD)) {
+				modelSSS.exclude("evaluationSimple", "evaluationComplex", "evaluationExam", "notForEvaluation", "task");
+			}
+		}
+		modelSSS.exclude("studentSubmitSolutionId");
+		return modelSSS;
+	}
+
+	public List<Student> getAllStudents() {
+		if (filterTestInstance != null) {
+			return testManager.getStudentsWhoStartedTestInstance(filterTestInstance);
+		} else {
+			return UsefulMethods.castList(Student.class, genericService.getAll(Student.class));
+		}
+	}
+
+	public SelectModel getSelectTestInstanceModel() {
+		List<TestInstance> list = testManager.getAllTestInstances();
+		Comparator<TestInstance> comparator = (ti1,
+				ti2) -> (ti1 != null && ti2 != null && ti1.getScheduledFor() != null && ti2.getScheduledFor() != null
+						? ti1.getScheduledFor().compareTo(ti2.getScheduledFor())
+						: 0);
+		Comparator<TestInstance> reverser = comparator.reversed();
+		list.sort(reverser);
+		return selectModelFactory.create(list, "title");
+	}
+
+	public SelectModel getSelectStudentsModel() {
+		return new StudentSelectModel(getAllStudents());
+	}
+
+	public SelectModel getSelectTaskInTestInstanceModel() {
+
+		class TaskInTestInstanceSelectModel extends AbstractSelectModel {
+			private List<TaskInTestInstance> taskInTestInstances;
+
+			public TaskInTestInstanceSelectModel(List<TaskInTestInstance> taskInTestInstances) {
+				if (taskInTestInstances == null) {
+					this.taskInTestInstances = new ArrayList<TaskInTestInstance>();
+				} else {
+					this.taskInTestInstances = taskInTestInstances;
+				}
+			}
+
+			@Override
+			public List<OptionGroupModel> getOptionGroups() {
+				return null;
+			}
+
+			@Override
+			public List<OptionModel> getOptions() {
+				List<OptionModel> options = new ArrayList<OptionModel>();
+				for (TaskInTestInstance taskInTestInstance : taskInTestInstances) {
+					options.add(new OptionModelImpl(taskInTestInstance.getTask().getTitle(), taskInTestInstance));
+				}
+				return options;
+			}
+		}
+
+		if (filterTestInstance == null) {
+			return new TaskInTestInstanceSelectModel(new ArrayList<TaskInTestInstance>());
+		} else {
+			return new TaskInTestInstanceSelectModel(filterTestInstance.getTaskInTestInstances());
+		}
+	}
+
+	public void onValueChangedFromSelectStudent(Student newStudent) {
+		filterStudent = newStudent;
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zSubmissions);
+		}
+	}
+
+	public void onValueChangedFromSelectTestInstance(TestInstance ti) {
+		filterTestInstance = ti;
+		filterTaskInTestInstance = null;
+		filterStudent = null;
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zTask).addRender(zStudent).addRender(zSubmissions);
+		}
+	}
+
+	public void onValueChangedFromSelectTaskInTestInstance(TaskInTestInstance tti) {
+		filterTaskInTestInstance = tti;
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zSubmissions);
+		}
+	}
+
+	public void onActionFromShowUserActivities(StudentSubmitSolution selectedSubmission) {
+		filterStudent = selectedSubmission.getStudentStartedTest().getStudent();
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zSubmissions);
+		}
+	}
+
+	public String getSubmittedByNameWithId() {
+		return personManager.getPersonFullNameWithId(submission.getStudentStartedTest().getStudent().getPerson());
+	}
+
+	@CommitAfter
+	public void onActionFromReevaluateSubmission(StudentSubmitSolution s) {
+		evaluationService.processSolution(userInfo.getUserName(), s);
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zSubmissions);
+		}
+	}
+
+	public String getCodeType() {
+		List<TaskIsOfType> listTypes = submission.getTaskInTestInstance().getTask().getTaskIsOfTypes();
+		if (listTypes != null && listTypes.size() > 0) {
+			return listTypes.get(0).getTaskType().getCodetype();
+		} else {
+			return "/";
+		}
+	}
+
+	public boolean isSQL() {
+		return TaskTypeChecker.isSQL(getCodeType());
+	}
+
+	public boolean isTEXT() {
+		return TaskTypeChecker.isTEXT(getCodeType());
+	}
+
+	public boolean isDDL() {
+		return TaskTypeChecker.isDDL(getCodeType());
+	}
+
+	public boolean isUPLOAD() {
+		return TaskTypeChecker.isUPLOAD(getCodeType());
+	}
+
+	public SolutionAssessment getSubmissionsFirstEvaluation() {
+		return submission.getEvaluations().get(0);
+	}
+
+	void onActionFromAddAssessment(StudentSubmitSolution s) {
+		editedAssessment = new SolutionAssessment();
+		editedAssessment.setStudentSubmitSolution(s);
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zModal);
+		}
+	}
+
+	void onActionFromEditAssessment(SolutionAssessment sa) {
+		editedAssessment = sa;
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zModal);
+		}
+	}
+
+	public void onCanceledFromFormEditor() {
+		toCancel = true;
+	}
+
+	@CommitAfter
+	public void onSubmitFromFormEditor() {
+		if (toCancel != null && toCancel) {
+			toCancel = null;
+		} else {
+			if (editedAssessment != null) {
+				editedAssessment.setEvaluatedOn(Calendar.getInstance().getTime());
+				genericService.saveOrUpdate(editedAssessment);
+			}
+		}
+		editedAssessment = null;
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zModal).addRender(zSubmissions);
+		}
+	}
+
+	public String getEvaluationClass() {
+		String output = "";
+		try {
+			if (submission.getEvaluations() != null && submission.getEvaluations().size() > 0) {
+				if (submission.getEvaluations().get(0).getPassed()) {
+					output = "correct";
+				} else {
+					output = "incorrect";
+				}
+			} else {
+				output = "noeval";
+			}
+		} catch (Exception e) {
+			output = "exception";
+		}
+		return output;
+	}
+
+	public String getTranslateTaskDescription() {
+		String trans = translationService.getTranslation("Task", "description",
+				editedAssessment.getStudentSubmitSolution().getTaskInTestInstance().getTask().getTaskId(),
+				persistentLocale.get().getLanguage().toLowerCase());
+		if (trans == null) {
+			return editedAssessment.getStudentSubmitSolution().getTaskInTestInstance().getTask().getDescription();
+		} else {
+			return trans;
+		}
+	}
+
+}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SystemParameters.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SystemParameters.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,78 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the EPRMS - Educational Project and Resource 
- * Management System (hereinafter: EPRMS).
- *     
- * EPRMS is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *     
- * EPRMS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *     
- * You should have received a copy of the GNU General Public License
- * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
- ******************************************************************************/
-
-package dblearnstar.webapp.pages.admin;
-
-import java.util.List;
-
-import org.apache.tapestry5.annotations.Persist;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.hibernate.annotations.CommitAfter;
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-import dblearnstar.model.entities.SystemParameter;
-import dblearnstar.model.model.UserInfo;
-import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.annotations.InstructorPage;
-import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.UsefulMethods;
-
-@InstructorPage
-@AdministratorPage
-public class SystemParameters {
-	@SessionState
-	@Property
-	private UserInfo userInfo;
-
-	@Inject
-	private GenericService genericService;
-
-	@Property
-	private SystemParameter systemParameter;
-
-	@Persist
-	@Property
-	private SystemParameter editSystemParameter;
-
-	public List<SystemParameter> getSystemParameters() {
-		return (List<SystemParameter>) UsefulMethods.castList(SystemParameter.class,
-				genericService.getAll(SystemParameter.class));
-	}
-
-	void onActionFromNewSystemParameter() {
-		editSystemParameter = new SystemParameter();
-	}
-
-	void onActionFromEditParameter(SystemParameter sp) {
-		editSystemParameter = sp;
-	}
-
-	@CommitAfter
-	void onActionFromDeleteParameter(SystemParameter sp) {
-		genericService.delete(sp);
-	}
-
-	@CommitAfter
-	void onSuccessFromEditSystemParameter() {
-		genericService.saveOrUpdate(editSystemParameter);
-		editSystemParameter = null;
-	}
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestAdminPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestAdminPage.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestAdminPage.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -22,5 +22,4 @@
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -33,7 +32,4 @@
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.beanmodel.BeanModel;
-import org.apache.tapestry5.beanmodel.services.BeanModelSource;
-import org.apache.tapestry5.commons.Messages;
 import org.apache.tapestry5.corelib.components.Zone;
 import org.apache.tapestry5.hibernate.annotations.CommitAfter;
@@ -53,5 +49,4 @@
 import dblearnstar.model.entities.TestTemplate;
 import dblearnstar.model.entities.TestType;
-import dblearnstar.model.model.ComparatorTaskInTestInstance;
 import dblearnstar.model.model.UserInfo;
 import dblearnstar.webapp.annotations.AdministratorPage;
@@ -63,5 +58,5 @@
 
 @AdministratorPage
-@Import(stylesheet = { "TestAdmin.css" }, module = { "zoneUpdateEffect", "bootstrap/modal", "bootstrap/collapse" })
+@Import(stylesheet = { "TestAdmin.css" })
 public class TestAdminPage {
 
@@ -96,59 +91,49 @@
 	@InjectComponent
 	private Zone testInstanceZone;
-	@InjectComponent
-	private Zone testTemplateZone;
 
 	@InjectPage
 	private QueryTest queryTest;
 
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private TestTemplate editedTestTemplate;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private TaskType chosentaskType;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private TestType testType;
-	@Persist
-	@Property
+	@Property
+	@Persist
+	private TestInstance testInstance;
+	@Property
+	private TaskInTestInstance taskInTestInstance;
+	@Property
+	private TaskIsOfType taskIsOfType;
+	@Property
+	@Persist
 	private TestInstance editedTestInstance;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private TestInstanceParameters editedTestInstanceParameters;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private Boolean creatingANewTask;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private TaskInTestInstance editedTaskInTestInstance;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private Boolean isNewTaskInTestInstance;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private Task editedTask;
-	@Persist
-	@Property
+	@Property
+	@Persist
 	private TestInstance whereToPutNewTask;
-	@Persist
-	@Property
-	private TestInstance selectedTestInstance;
-	@Property
-	private TestInstance listedTestInstance;
-	@Property
-	private TaskInTestInstance taskInTestInstance;
-	@Property
-	private TaskIsOfType taskIsOfType;
 
 	public void onActivate() {
 		logger.info("activated from {} by {} {}", request.getRemoteHost(), userInfo.getUserName(),
 				request.getHeader("User-Agent"));
-		if (selectedTestInstance != null) {
-			selectedTestInstance = genericService.getByPK(TestInstance.class, selectedTestInstance.getTestInstanceId());
-		}
-		if (editedTestInstance != null) {
-			editedTestInstance = genericService.getByPK(TestInstance.class, editedTestInstance.getTestInstanceId());
-		}
 	}
 
@@ -158,5 +143,6 @@
 
 	public Object getModelTestTypes() {
-		return selectModelFactory.create(testManager.getAllTestTypes(), "title");
+		return selectModelFactory.create(UsefulMethods.castList(TestType.class, genericService.getAll(TestType.class)),
+				"title");
 	}
 
@@ -166,33 +152,38 @@
 	}
 
-	public List<TestInstance> getTestInstancesByTestType() {
-		return testManager.getTestInstancesByTestType(testType.getTestTypeId());
+	public Object getModelTestInstances() {
+		return selectModelFactory.create(testManager.getTestInstancesByTestType(testType.getTestTypeId()), "title");
+	}
+
+	public Object onValueChangedFromSelectTestInstance(TestInstance selectedTestInstance) {
+		testInstance = selectedTestInstance;
+		return testInstanceZone.getBody();
 	}
 
 	public List<TaskInTestInstance> getTaskInTestInstances() {
-		List<TaskInTestInstance> list = selectedTestInstance.getTaskInTestInstances();
-		ComparatorTaskInTestInstance ctti = new ComparatorTaskInTestInstance();
-		Collections.sort(list, ctti);
-		return list;
-	}
-
-	void onActionFromEditTestInstance(TestInstance ti) {
-		editedTestInstance = ti;
-		if (ti.getTestInstanceParameters().isEmpty()) {
+		return testInstance.getTaskInTestInstances();
+	}
+
+	void onActionFromEditTestInstance(TestInstance testInstance) {
+		editedTestInstance = testInstance;
+		if (testInstance.getTestInstanceParameters().isEmpty()) {
 			editedTestInstanceParameters = new TestInstanceParameters();
 			editedTestInstanceParameters.setTestInstance(editedTestInstance);
 		} else {
-			editedTestInstanceParameters = ti.getTestInstanceParameters().get(0);
+			editedTestInstanceParameters = testInstance.getTestInstanceParameters().get(0);
 		}
 		ajaxResponseRenderer.addRender(testInstanceEditZone);
 	}
 
-	void onActionFromNewTestInstance(TestType tt) {
+	void onActionFromNewTestInstance(TestType testType) {
 		editedTestInstance = new TestInstance();
-		if (editedTestTemplate != null) {
-			editedTestInstance.setTestTemplate(editedTestTemplate);
-		}
 		editedTestInstanceParameters = null;
 		ajaxResponseRenderer.addRender(testInstanceEditZone);
+	}
+
+	void onActionFromAddTask(TestInstance testInstance) {
+		editedTaskInTestInstance = new TaskInTestInstance();
+		editedTaskInTestInstance.setTestInstance(testInstance);
+		isNewTaskInTestInstance = true;
 	}
 
@@ -204,5 +195,4 @@
 			editedTestInstance = null;
 			editedTestInstanceParameters = null;
-			editedTestTemplate = null;
 		} else {
 			editedTestInstanceParameters = new TestInstanceParameters();
@@ -217,5 +207,4 @@
 		editedTestInstance = null;
 		editedTestInstanceParameters = null;
-		editedTestTemplate = null;
 	}
 
@@ -232,5 +221,4 @@
 	void onActionFromDeleteTestInstance(TestInstance testInstance) {
 		testInstance.getTestInstanceParameters().forEach(tip -> genericService.delete(tip));
-		testInstance.getTaskInTestInstances().forEach(tti -> genericService.delete(tti));
 		genericService.delete(testInstance);
 	}
@@ -330,5 +318,4 @@
 	void onActionFromCancelFrmTask() {
 		editedTask = null;
-		ajaxResponseRenderer.addRender(testInstanceZone);
 	}
 
@@ -351,12 +338,7 @@
 			whereToPutNewTask = null;
 			creatingANewTask = null;
-		} else {
-			TaskIsOfType type = editedTask.getTaskIsOfTypes().get(0);
-			type.setTaskType(chosentaskType);
-			genericService.saveOrUpdate(type);
 		}
 
 		editedTask = null;
-		//ajaxResponseRenderer.addRender(testInstanceZone);
 	}
 
@@ -371,5 +353,4 @@
 		editedTestTemplate = new TestTemplate();
 		editedTestTemplate.setTestType(testType);
-		ajaxResponseRenderer.addRender(testTemplateZone);
 	}
 
@@ -378,14 +359,8 @@
 		genericService.saveOrUpdate(editedTestTemplate);
 		editedTestTemplate = null;
-		ajaxResponseRenderer.addRender(testTemplateZone);
-	}
-
-	void onCancelFrmTestTemplate() {
-		editedTestTemplate = null;
-		ajaxResponseRenderer.addRender(testTemplateZone);
 	}
 
 	public SelectModel getAllTaskTypes() {
-		return selectModelFactory.create(testManager.getAllTaskTypes(), "title");
+		return selectModelFactory.create(genericService.getAll(TaskType.class), "title");
 	}
 
@@ -401,24 +376,3 @@
 	}
 
-	@Inject
-	private BeanModelSource beanModelSource;
-	@Inject
-	private Messages messages;
-	@Property
-	@Persist
-	private BeanModel<TestTemplate> modelTestTemplate;
-
-	void setupRender() {
-		modelTestTemplate = beanModelSource.createEditModel(TestTemplate.class, messages);
-		modelTestTemplate.add("model");
-		modelTestTemplate.exclude("testTemplateId");
-	}
-
-	void onShowTestInstance(TestInstance ti) {
-		selectedTestInstance = ti;
-	}
-
-	void onHideTestInstance() {
-		selectedTestInstance = null;
-	}
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestCollectionManagement.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestCollectionManagement.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestCollectionManagement.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -122,4 +122,16 @@
 	}
 
+	public String getCoding(TestCollection i) {
+		Integer broj = i.getOrdering();
+		if (broj == null) {
+			broj = 0;
+		}
+		if (i.getParentCollection() == null) {
+			return Long.toString(broj) + "-";
+		} else {
+			return getCoding(i.getParentCollection()) + Long.toString(broj) + "-";
+		}
+	}
+
 	public List<TestCollection> getListTestCollections() {
 		List<TestCollection> list = UsefulMethods.castList(TestCollection.class,
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TranslationPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TranslationPage.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,75 +1,0 @@
-package dblearnstar.webapp.pages.admin;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.tapestry5.annotations.Import;
-import org.apache.tapestry5.annotations.Persist;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.hibernate.annotations.CommitAfter;
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-import dblearnstar.model.entities.Translation;
-import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.annotations.InstructorPage;
-import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.TranslationService;
-import dblearnstar.webapp.services.UsefulMethods;
-
-@AdministratorPage
-@InstructorPage
-@Import(stylesheet = { "TranslationPage.css" })
-public class TranslationPage {
-
-	@Inject
-	private TranslationService translationService;
-	@Inject
-	private GenericService genericService;
-
-	@Persist
-	@Property
-	private String filter;
-
-	@Persist
-	@Property
-	private Translation editedTranslation;
-
-	@Property
-	private Translation translationRow;
-
-	public List<Translation> getListTranslations() {
-		List<Translation> l = UsefulMethods.castList(Translation.class, genericService.getAll(Translation.class));
-		if (filter != null && filter.length() > 0) {
-			for (String filterWord : filter.split(" ")) {
-				l = l.stream().filter(
-						t -> (t.getOriginalObjectId() + t.getClassName() + t.getAttributeCode() + t.getTranslatedText())
-								.toLowerCase().contains(filterWord.toLowerCase()))
-						.collect(Collectors.toList());
-			}
-		}
-		return l;
-	}
-
-	void onActionFromEditTranslation(Translation t) {
-		editedTranslation = t;
-	}
-
-	void onActionFromNewTranslation() {
-		editedTranslation = new Translation();
-	}
-
-	void onActionFromCancelTranslation() {
-		editedTranslation = null;
-	}
-
-	@CommitAfter
-	void onActionFromDeleteTranslation(Translation t) {
-		genericService.delete(t);
-	}
-
-	@CommitAfter
-	void onSuccessFromFrmTranslation() {
-		genericService.save(editedTranslation);
-		editedTranslation = null;
-	}
-}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/instructor/ActivityMonitor.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/instructor/ActivityMonitor.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,66 +1,0 @@
-package dblearnstar.webapp.pages.instructor;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.tapestry5.EventContext;
-import org.apache.tapestry5.annotations.Persist;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-import dblearnstar.model.entities.ActivityInTask;
-import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.model.UserInfo;
-import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.annotations.InstructorPage;
-import dblearnstar.webapp.services.ActivityManager;
-
-@InstructorPage
-@AdministratorPage
-public class ActivityMonitor {
-
-	@SessionState
-	private UserInfo userInfo;
-
-	@Inject
-	private ActivityManager activityManager;
-
-	private Person selectedPerson;
-
-	private TaskInTestInstance selectedTaskInTestInstance;
-
-	@Property
-	private ActivityInTask activityInTask;
-
-	@Property
-	@Persist
-	private String filterType;
-
-	public void onActivate(EventContext ec) {
-		if (!ec.isEmpty()) {
-			selectedPerson = ec.get(Person.class, 0);
-			selectedTaskInTestInstance = ec.get(TaskInTestInstance.class, 1);
-		}
-	}
-
-	public Object[] onPassivate() {
-		Object[] a = { selectedPerson, selectedTaskInTestInstance };
-		return a;
-	}
-
-	public List<ActivityInTask> getActivitiesInTaskForPerson() {
-		List<ActivityInTask> list = activityManager.getActivitiesInTaskForPerson(selectedPerson,
-				selectedTaskInTestInstance);
-		if (filterType != null && filterType.length() > 0) {
-			return list.stream().filter(p -> p.getType().equals(filterType)).collect(Collectors.toList());
-		} else {
-			return list;
-		}
-	}
-
-	public String getHash() {
-		return Integer.toString(activityInTask.getPayload().trim().hashCode());
-	}
-}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/instructor/RelationSchemaEvaluation.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/instructor/RelationSchemaEvaluation.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,448 +1,0 @@
-package dblearnstar.webapp.pages.instructor;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.tapestry5.annotations.Import;
-import org.apache.tapestry5.annotations.InjectComponent;
-import org.apache.tapestry5.annotations.Persist;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.commons.Messages;
-import org.apache.tapestry5.corelib.components.Zone;
-import org.apache.tapestry5.hibernate.annotations.CommitAfter;
-import org.apache.tapestry5.http.services.Request;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.services.SelectModelFactory;
-import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
-import org.slf4j.Logger;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-
-import dblearnstar.model.entities.SolutionAssessment;
-import dblearnstar.model.entities.StudentSubmitSolution;
-import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.model.ModelConstants;
-import dblearnstar.model.model.Triplet;
-import dblearnstar.model.model.UserInfo;
-import dblearnstar.webapp.annotations.AdministratorPage;
-import dblearnstar.webapp.annotations.InstructorPage;
-import dblearnstar.webapp.services.EvaluationService;
-import dblearnstar.webapp.services.GenericService;
-import dblearnstar.webapp.services.SystemConfigService;
-import net.objecthunter.exp4j.Expression;
-import net.objecthunter.exp4j.ExpressionBuilder;
-
-@AdministratorPage
-@InstructorPage
-@Import(module = { "zoneUpdateEffect" }, stylesheet = { "SubmissionEvaluations.css" })
-public class RelationSchemaEvaluation {
-
-	@Inject
-	private Logger logger;
-	@Inject
-	private Messages messages;
-
-	@SessionState
-	private UserInfo userInfo;
-
-	@Inject
-	private GenericService genericService;
-	@Inject
-	private EvaluationService evaluationService;
-	@Inject
-	private SystemConfigService systemConfigService;
-
-	public String[] getModel() {
-		return ModelConstants.AllDBRelationalObjectTypes;
-	}
-
-	@Property
-	private TaskInTestInstance taskInTestInstanceToGrade;
-
-	@Property
-	private StudentSubmitSolution submission;
-	@Persist
-	@Property
-	private String filterType;
-	@Persist
-	@Property
-	private String filterTableName;
-
-	@Persist
-	@Property
-	private String filterDB;
-
-	@Property
-	private String oneHeader;
-	@Property
-	private String[] oneRow;
-	@Property
-	private String oneColumn;
-
-	@Persist
-	@Property
-	List<String[]> evaluationData;
-	@Persist
-	@Property
-	List<String> resultsHeadersSimple;
-	@Persist
-	@Property
-	List<String> resultsErrors;
-	@Property
-	String resultError;
-
-	void onActivate(TaskInTestInstance taskInTestInstance) {
-		taskInTestInstanceToGrade = genericService.getByPK(TaskInTestInstance.class,
-				taskInTestInstance.getTaskInTestInstanceId());
-		if (evaluationData == null || evaluationData.size() == 0) {
-			onLoadSavedData();
-			ComparatorEvaluationData ced = new ComparatorEvaluationData();
-			Collections.sort(evaluationData, ced);
-		}
-	}
-
-	List<StudentSubmitSolution> getSubmissions() {
-		return evaluationService.getOnlyLastSubmissionsByStudentAndTaskInTestInstance(null,
-				taskInTestInstanceToGrade.getTestInstance(), taskInTestInstanceToGrade, true, false);
-	}
-
-	public TaskInTestInstance onPassivate() {
-		return taskInTestInstanceToGrade;
-	}
-
-	public List<String[]> getFilteredEvaluationData() {
-		try {
-			List<String[]> list = evaluationData;
-			if (filterType != null) {
-				list = list.stream().filter(r -> ((String) r[2]).contains(filterType)).collect(Collectors.toList());
-			}
-			if (filterDB != null && filterDB.length() > 0) {
-				list = list.stream().filter(r -> ((String) r[3]).toLowerCase().contains(filterDB.toLowerCase()))
-						.collect(Collectors.toList());
-			}
-			if (filterTableName != null && filterTableName.length() > 0) {
-				list = list.stream().filter(r -> ((String) r[4]).toLowerCase().contains(filterTableName.toLowerCase()))
-						.collect(Collectors.toList());
-			}
-			return list;
-		} catch (Exception e) {
-			logger.error("filtering error {}", e.getMessage());
-			return new ArrayList<String[]>();
-		}
-	}
-
-	@Inject
-	private SelectModelFactory selectModelFactory;
-
-	@InjectComponent
-	private Zone zEvaluationTable;
-
-	@Inject
-	private Request request;
-
-	@Inject
-	private AjaxResponseRenderer ajaxResponseRenderer;
-
-	public void onSuccessFromFormFilter() {
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	private void setEvaluationPointGrade(Object[] context, String grade) {
-		String[] object = evaluationData.stream().filter(e -> Arrays.equals(e, context)).findFirst().orElse(null);
-		if (object == null) {
-			logger.error("{} not found", context);
-		} else {
-			object[1] = grade;
-		}
-	}
-
-	public void onMarkPos(Object[] context) {
-		setEvaluationPointGrade(context, "1");
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onMarkPos2(Object[] context) {
-		setEvaluationPointGrade(context, "2");
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onMarkNeg(Object[] context) {
-		setEvaluationPointGrade(context, "-1");
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onMarkZero(Object[] context) {
-		setEvaluationPointGrade(context, "0");
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onMarkReset(Object[] context) {
-		setEvaluationPointGrade(context, null);
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onSetUngradedPos() {
-		for (String[] ss : getFilteredEvaluationData()) {
-			if (ss[1] == null || ss[1].equals("")) {
-				setEvaluationPointGrade(ss, "1");
-			}
-		}
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onSetUngradedPos2() {
-		for (String[] ss : getFilteredEvaluationData()) {
-			if (ss[1] == null || ss[1].equals("")) {
-				setEvaluationPointGrade(ss, "2");
-			}
-		}
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onSetUngradedNeg() {
-		for (String[] ss : getFilteredEvaluationData()) {
-			if (ss[1] == null || ss[1].equals("")) {
-				setEvaluationPointGrade(ss, "-1");
-			}
-		}
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onSetUngradedZero() {
-		for (String[] ss : getFilteredEvaluationData()) {
-			if (ss[1] == null || ss[1].equals("")) {
-				setEvaluationPointGrade(ss, "0");
-			}
-		}
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public void onResetGraded() {
-		for (String[] ss : getFilteredEvaluationData()) {
-			setEvaluationPointGrade(ss, null);
-		}
-		if (request.isXHR()) {
-			ajaxResponseRenderer.addRender(zEvaluationTable);
-		}
-	}
-
-	public String getGenContext() {
-		return oneRow[0] + "!" + oneRow[1] + "!" + oneRow[2] + "!" + oneRow[3];
-	}
-
-	public String[] getParsedRow() {
-		return Arrays.copyOfRange(oneRow, 1, oneRow.length);
-	}
-
-	public String getCorrectnessClass() {
-		if (oneRow != null && oneRow[1] != null) {
-			Integer grade = Integer.parseInt(oneRow[1]);
-			if (grade >= 2) {
-				return "grade-pos2";
-			} else if (grade == 1) {
-				return "grade-pos";
-			} else if (grade == 0) {
-				return "grade-zero";
-			} else if (grade < 0) {
-				return "grade-neg";
-			} else {
-				return "";
-			}
-		} else {
-			return "";
-		}
-	}
-
-	private Long evalPoints(long submissionId, String evalPart) {
-		Long sum = 0L;
-		for (String[] tableUserDataPoint : evaluationData.stream()
-				.filter(e -> e[2].equals(evalPart) && e[0].equals(Long.toString(submissionId)))
-				.collect(Collectors.toList())) {
-			if (tableUserDataPoint[1] != null) {
-				sum += Long.parseLong(tableUserDataPoint[1]);
-			}
-		}
-		return sum;
-	}
-
-	private long calcNumElements(long submissionId, String evalPart) {
-		return evaluationData.stream().filter(e -> e[2].equals(evalPart) && e[0].equals(Long.toString(submissionId)))
-				.collect(Collectors.toList()).size();
-	}
-
-	public void onLoadSavedData() {
-		evaluationData = new ArrayList<String[]>();
-		for (StudentSubmitSolution submission : getSubmissions()) {
-			if (submission.getEvaluations() != null && submission.getEvaluations().size() > 0) {
-				if (submission.getEvaluations().size() == 1) {
-					SolutionAssessment sa = submission.getEvaluations().get(0);
-					if (sa.getFeedbackSource() != null) {
-						ObjectMapper mapper = new ObjectMapper();
-						mapper.enable(SerializationFeature.INDENT_OUTPUT);
-						try {
-							List<String[]> partialData = mapper.readValue(sa.getFeedbackSource(),
-									new TypeReference<List<String[]>>() {
-									});
-							logger.info("From JSON {} {}", submission.getStudentSubmitSolutionId(), partialData.size());
-							evaluationData.addAll(partialData);
-						} catch (Exception e) {
-							e.printStackTrace();
-						}
-					}
-				} else {
-					throw new RuntimeException("Too many evaluations");
-				}
-			}
-		}
-	}
-
-	@CommitAfter
-	public void onSaveDataAndGenerateReports() {
-		for (StudentSubmitSolution submission : getSubmissions()) {
-			String assessmentComment = "<h2>Evaluation report of the relational schema</h2>\n";
-			double total = 0;
-			String formula = systemConfigService.getCode("Task", taskInTestInstanceToGrade.getTask().getTaskId(),
-					"FORMULA");
-			HashMap<String, Long> sums = new HashMap<String, Long>();
-
-			for (String s : ModelConstants.AllDBRelationalObjectTypes) {
-				Long points = evalPoints(submission.getStudentSubmitSolutionId(), s);
-				sums.put(s, points);
-				Long numElements = calcNumElements(submission.getStudentSubmitSolutionId(), s);
-				assessmentComment += "<p>Evaluting part <b>" + s.toString() + "</b>: we have found "
-						+ numElements.toString() + " elements in your DB relational schema.<br/>\n";
-				assessmentComment += "After checking for correctness you were awarded " + points.toString()
-						+ " points.<p>";
-			}
-
-			if (formula != null) {
-				Expression e = new ExpressionBuilder(formula)
-						.variables(ModelConstants.DBRelationalObjectTypesTABLE,
-								ModelConstants.DBRelationalObjectTypesPK, ModelConstants.DBRelationalObjectTypesFK,
-								ModelConstants.DBRelationalObjectTypesNN, ModelConstants.DBRelationalObjectTypesCHECK,
-								ModelConstants.DBRelationalObjectTypesUK, ModelConstants.DBRelationalObjectTypesDATA)
-						.build()
-						.setVariable(ModelConstants.DBRelationalObjectTypesTABLE,
-								sums.get(ModelConstants.DBRelationalObjectTypesTABLE))
-						.setVariable(ModelConstants.DBRelationalObjectTypesPK,
-								sums.get(ModelConstants.DBRelationalObjectTypesPK))
-						.setVariable(ModelConstants.DBRelationalObjectTypesFK,
-								sums.get(ModelConstants.DBRelationalObjectTypesFK))
-						.setVariable(ModelConstants.DBRelationalObjectTypesNN,
-								sums.get(ModelConstants.DBRelationalObjectTypesNN))
-						.setVariable(ModelConstants.DBRelationalObjectTypesCHECK,
-								sums.get(ModelConstants.DBRelationalObjectTypesCHECK))
-						.setVariable(ModelConstants.DBRelationalObjectTypesUK,
-								sums.get(ModelConstants.DBRelationalObjectTypesUK))
-						.setVariable(ModelConstants.DBRelationalObjectTypesDATA,
-								sums.get(ModelConstants.DBRelationalObjectTypesDATA));
-				total = e.evaluate();
-			} else {
-				total = -1;
-			}
-
-			assessmentComment += "<p>Total score: " + total + "</p>";
-			SolutionAssessment sa = null;
-			if (submission.getEvaluations() == null || submission.getEvaluations().size() == 0) {
-				sa = new SolutionAssessment();
-				sa.setStudentSubmitSolution(submission);
-			} else {
-				sa = submission.getEvaluations().get(0);
-			}
-			sa.setGrade((float) total);
-			sa.setEvaluatedOn(new Date());
-			sa.setFeedback(assessmentComment);
-			sa.setPassed(true);
-
-			ObjectMapper mapper = new ObjectMapper();
-			mapper.enable(SerializationFeature.INDENT_OUTPUT);
-			try {
-				List<String[]> partialData = evaluationData.stream()
-						.filter(e -> e[0].equals(Long.toString(submission.getStudentSubmitSolutionId())))
-						.collect(Collectors.toList());
-				logger.info("To JSON {} {}", submission.getStudentSubmitSolutionId(), partialData.size());
-				String json = mapper.writeValueAsString(partialData);
-				sa.setFeedbackSource(json);
-			} catch (Exception e) {
-				logger.error("JSON convertion {}", e.getMessage());
-			}
-			genericService.saveOrUpdate(sa);
-		}
-	}
-
-	void onRefreshData() {
-		Triplet<List<String[]>, List<String>, List<String>> results = evaluationService
-				.getDDLEvaluationDataFromStudentDatabases(getSubmissions());
-		evaluationData = results.getFirstItem();
-		for (int i = 0; i < evaluationData.size(); i++) {
-			evaluationData.get(i)[3] = evaluationData.get(i)[3].replaceFirst("202122z_va_ispit_......",
-					"exam_by_******"); // @TODO: направено за SIGITE презентација да се преправи
-		}
-		resultsHeadersSimple = results.getSecondItem();
-		resultsErrors = results.getThirdItem();
-	}
-
-	public class ComparatorEvaluationData implements Comparator<String[]> {
-
-		public String getCoding(String[] array) {
-			String res = "";
-			for (int i = 4; i < array.length; i++) {
-				if (array[i] != null) {
-					res += array[i] + "|";
-				} else {
-					res += "|";
-				}
-			}
-			return res;
-		}
-
-		@Override
-		public int compare(String[] s1, String[] s2) {
-			String coded1 = getCoding(s1);
-			String coded2 = getCoding(s2);
-			if (coded1.length() < coded2.length()) {
-				return -1;
-			} else {
-				if (coded1.length() > coded2.length()) {
-					return 1;
-				} else {
-					return coded1.compareTo(coded2);
-				}
-			}
-		}
-
-	}
-
-	void onClearErrors() {
-		resultsErrors = null;
-	}
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityDao.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityDao.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityDao.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -23,7 +23,5 @@
 import java.util.List;
 
-import dblearnstar.model.entities.ActivityInTask;
 import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.TaskInTestInstance;
 
 public interface ActivityDao {
@@ -31,8 +29,3 @@
 	List<Person> activePersonsInInterval(int seconds);
 
-	List<ActivityInTask> getActivitiesInTaskForPerson(Person selectedPerson,
-			TaskInTestInstance selectedTaskInTestInstance);
-
-	void recordActivityInTask(Person person, TaskInTestInstance taskInTestInstance, String type, String payload);
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityDaoImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityDaoImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityDaoImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -30,9 +30,6 @@
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.hibernate.Session;
-import org.slf4j.Logger;
 
-import dblearnstar.model.entities.ActivityInTask;
 import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.TaskInTestInstance;
 
 public class ActivityDaoImpl implements ActivityDao {
@@ -40,7 +37,4 @@
 	@Inject
 	private Session session;
-
-	@Inject
-	private Logger logger;
 
 	private Session getEntityManager() {
@@ -60,30 +54,3 @@
 	}
 
-	@Override
-	public List<ActivityInTask> getActivitiesInTaskForPerson(Person p, TaskInTestInstance tti) {
-		Query q = getEntityManager().createQuery("""
-				select ait
-				from ActivityInTask ait 
-				join ait.person p 
-				join ait.taskInTestInstance tti
-				where p.personId=:personId and tti.taskInTestInstanceId=:taskInTestInstanceId
-				order by ait.whenOccured desc
-				""");
-		q.setParameter("personId", p.getPersonId());
-		q.setParameter("taskInTestInstanceId", tti.getTaskInTestInstanceId());
-		return UsefulMethods.castList(ActivityInTask.class, q.getResultList());
-	}
-
-	@Override
-	public void recordActivityInTask(Person person, TaskInTestInstance taskInTestInstance, String type,
-			String payload) {
-		ActivityInTask activityInTask = new ActivityInTask();
-		activityInTask.setPerson(person);
-		activityInTask.setTaskInTestInstance(taskInTestInstance);
-		activityInTask.setType(type);
-		activityInTask.setWhenOccured(new Date());
-		activityInTask.setPayload(payload);
-		getEntityManager().save(activityInTask);
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityManager.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityManager.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityManager.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -23,7 +23,5 @@
 import java.util.List;
 
-import dblearnstar.model.entities.ActivityInTask;
 import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.TaskInTestInstance;
 
 public interface ActivityManager {
@@ -31,8 +29,3 @@
 	public List<Person> activePersonsInInterval(int seconds);
 
-	public List<ActivityInTask> getActivitiesInTaskForPerson(Person selectedPerson,
-			TaskInTestInstance selectedTaskInTestInstance);
-
-	public void recordActivityInTask(Person person, TaskInTestInstance taskInTestInstance, String type, String payload);
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityManagerImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityManagerImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/ActivityManagerImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,12 +21,9 @@
 package dblearnstar.webapp.services;
 
-import java.util.Date;
 import java.util.List;
 
 import org.apache.tapestry5.ioc.annotations.Inject;
 
-import dblearnstar.model.entities.ActivityInTask;
 import dblearnstar.model.entities.Person;
-import dblearnstar.model.entities.TaskInTestInstance;
 
 public class ActivityManagerImpl implements ActivityManager {
@@ -40,15 +37,3 @@
 	}
 
-	@Override
-	public List<ActivityInTask> getActivitiesInTaskForPerson(Person selectedPerson,
-			TaskInTestInstance selectedTaskInTestInstance) {
-		return activityDao.getActivitiesInTaskForPerson(selectedPerson, selectedTaskInTestInstance);
-	}
-
-	@Override
-	public void recordActivityInTask(Person person, TaskInTestInstance taskInTestInstance, String type,
-			String payload) {
-		activityDao.recordActivityInTask(person, taskInTestInstance, type, payload);
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/AppModule.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/AppModule.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/AppModule.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -46,5 +46,4 @@
 import org.apache.tapestry5.services.ComponentRequestFilter;
 import org.apache.tapestry5.services.ComponentSource;
-import org.apache.tapestry5.services.ExceptionReporter;
 import org.apache.tapestry5.services.PersistentLocale;
 import org.hibernate.Session;
@@ -53,9 +52,6 @@
 import dblearnstar.model.entities.Person;
 import dblearnstar.model.entities.PersonRole;
-import dblearnstar.model.entities.Student;
 import dblearnstar.model.model.UserInfo;
 import dblearnstar.model.model.UserInfo.UserRole;
-import dblearnstar.webapp.model.ApplicationConstants;
-import dblearnstar.webapp.util.AppConfig;
 
 @ImportModule(Bootstrap4Module.class)
@@ -63,5 +59,4 @@
 	public static void bind(ServiceBinder binder) {
 		binder.bind(AccessControllerRequestFilter.class);
-		binder.bind(DigestService.class);
 		binder.bind(GenericDao.class);
 		binder.bind(GenericService.class);
@@ -74,9 +69,8 @@
 		binder.bind(TestManager.class);
 		binder.bind(TranslationService.class);
-		binder.bind(SystemConfigService.class);
 	}
 
 	public static void contributeFactoryDefaults(MappedConfiguration<String, Object> configuration) {
-		configuration.override(SymbolConstants.APPLICATION_VERSION, AppConfig.getString("app.version"));
+		configuration.override(SymbolConstants.APPLICATION_VERSION, "0.8-T5.7.2");
 		configuration.override(SymbolConstants.PRODUCTION_MODE, false);
 	}
@@ -84,6 +78,5 @@
 	public static void contributeApplicationDefaults(MappedConfiguration<String, Object> configuration) {
 		configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en,mk");
-		configuration.add(SymbolConstants.HMAC_PASSPHRASE,
-				AppConfig.getString("tapestry.hmac-passphrase") + UUID.randomUUID());
+		configuration.add(SymbolConstants.HMAC_PASSPHRASE, "JxIJa1SIjasihd08as09!W!" + UUID.randomUUID());
 		configuration.add(SymbolConstants.ENABLE_HTML5_SUPPORT, true);
 		configuration.add(SymbolConstants.COMPRESS_WHITESPACE, false);
@@ -92,16 +85,4 @@
 
 		configuration.add(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER, "jquery");
-
-		configuration.add(SymbolConstants.EXCEPTION_REPORTS_DIR,
-				AppConfig.getString("additionalFiles.path") + AppConfig.getString("exceptionReports.path"));
-	}
-
-	@Decorate(serviceInterface = ExceptionReporter.class)
-	public static ExceptionReporter preventExceptionFileWriting(final ExceptionReporter exceptionReporter) {
-		return new ExceptionReporter() {
-			@Override
-			public void reportException(Throwable exception) {
-			}
-		};
 	}
 
@@ -154,74 +135,64 @@
 				userInfo.setUserName(null);
 
-				String userName = requestGlobals.getHTTPServletRequest().getRemoteUser();
-				userInfo.setUserName(userName);
-				logger.info("External auth login by user {}. Checking privileges.", userName);
-
-				Person loggedInPerson = (Person) session.getEntityManagerFactory().createEntityManager()
-						.createQuery("from Person p where userName=:userName").setParameter("userName", userName)
-						.getResultStream().findFirst().orElse(null);
-
-				if (loggedInPerson == null) {
-					logger.debug("These is no Person with userName: {}", userName);
-					if (AppConfig.getString(ApplicationConstants.AUTH_AUTO_CREATE_USER).equalsIgnoreCase("true")) {
-						logger.debug("  Creating Person with userName: {}", userName);
-						loggedInPerson = new Person();
-						loggedInPerson.setUserName(userName);
-						loggedInPerson.setFirstName(userName);
-						loggedInPerson.setLastName(userName);
-						logger.debug("  Creating Student for the Person with userName: {}", userName);
-						Student s = new Student();
-						s.setPerson(loggedInPerson);
-						session.save(loggedInPerson);
-						session.save(s);
-						session.getSession().getTransaction().commit();
-						logger.info("  Created user {}", userName);
-						loggedInPerson = (Person) session.getSession()
-								.createQuery("from Person p where userName=:userName")
-								.setParameter("userName", userName).getResultStream().findFirst().orElse(null);
+				try {
+					String userName = requestGlobals.getHTTPServletRequest().getRemoteUser();
+					userInfo.setUserName(userName);
+					logger.info("Login by user: " + userName);
+
+					Person loggedInPerson = (Person) session.getSession()
+							.createQuery("from Person p where userName=:userName").setParameter("userName", userName)
+							.getSingleResult();
+
+					if (loggedInPerson == null) {
+						userInfo.setUserRoles(null);
+						userInfo.setPersonId(null);
+					} else {
+						logger.debug("Login personId: {}", loggedInPerson.getPersonId());
+
+						List<UserInfo.UserRole> userRoles = new ArrayList<UserRole>();
+
+						if (!(loggedInPerson.getStudents().isEmpty())) {
+							logger.debug("Login user is student");
+							userRoles.add(UserRole.STUDENT);
+						}
+
+						for (PersonRole pr : personManager.getPersonRolesForPerson(loggedInPerson.getPersonId())) {
+							if (pr.getRole().getName().equals("ADMINISTRATOR")) {
+								logger.debug("Login user is administrator");
+								userRoles.add(UserRole.ADMINISTRATOR);
+							} else if (pr.getRole().getName().equals("INSTRUCTOR")) {
+								logger.debug("Login user is instructor");
+								userRoles.add(UserRole.INSTRUCTOR);
+							}
+						}
+
+						if (userRoles.size() == 0) {
+							logger.debug("Login user role is set to NONE");
+							userRoles.add(UserRole.NONE);
+						}
+
+						logger.debug("Login user has {} roles", userRoles.size());
+
+						userInfo.setUserName(userName);
+						userInfo.setPersonId(loggedInPerson.getPersonId());
+						userInfo.setUserRoles(userRoles);
+						logger.debug("userInfo is now initialized");
+
 					}
+
+					return userInfo;
+
+				} catch (Exception e) {
+					if (userInfo.getUserName() != null) {
+						logger.error("userName {} is not found", userInfo.getUserName());
+					} else {
+						logger.error("userName is empty");
+					}
+					// throw new NoSuchUserException();
+					return userInfo;
 				}
-
-				if (loggedInPerson == null) {
-					userInfo.setUserRoles(null);
-					userInfo.setPersonId(null);
-					logger.info("Logged in userName: {} is not found", userInfo.getUserName());
-				} else {
-					logger.debug("Logged in personId: {}", loggedInPerson.getPersonId());
-
-					List<UserInfo.UserRole> userRoles = new ArrayList<UserRole>();
-
-					if (!(loggedInPerson.getStudents().isEmpty())) {
-						logger.debug("Logged in user: {} is a student", userName);
-						userRoles.add(UserRole.STUDENT);
-					}
-
-					for (PersonRole pr : personManager.getPersonRolesForPerson(loggedInPerson.getPersonId())) {
-						if (pr.getRole().getName().equals("ADMINISTRATOR")) {
-							logger.debug("Logged in user: {} is an administrator", userName);
-							userRoles.add(UserRole.ADMINISTRATOR);
-						} else if (pr.getRole().getName().equals("INSTRUCTOR")) {
-							logger.debug("Logged in user: {} is instructor", userName);
-							userRoles.add(UserRole.INSTRUCTOR);
-						}
-					}
-
-					if (userRoles.size() == 0) {
-						logger.debug("Loggen in user: {} role is set to NONE", userName);
-						userRoles.add(UserRole.NONE);
-					}
-
-					logger.debug("Logged in user: {} has {} roles", userName, userRoles.size());
-
-					userInfo.setUserName(userName);
-					userInfo.setPersonId(loggedInPerson.getPersonId());
-					userInfo.setUserRoles(userRoles);
-					logger.debug("userInfo is now initialized for logged in user: {}", userName);
-				}
-				return userInfo;
 			}
 		};
 		configuration.add(UserInfo.class, new ApplicationStateContribution("session", userInfoCreator));
-
 	}
 
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestService.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestService.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package dblearnstar.webapp.services;
-
-public interface DigestService {
-
-	public String obfuscate(String shortText);
-
-}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestServiceImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestServiceImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package dblearnstar.webapp.services;
-
-import org.apache.commons.codec.digest.DigestUtils;
-
-import dblearnstar.webapp.util.AppConfig;
-
-public class DigestServiceImpl implements DigestService {
-
-	@Override
-	public String obfuscate(String text) {
-		String message = AppConfig.getString("tapestry.hmac-passphrase") + text;
-		return DigestUtils.sha1Hex(message);
-	}
-
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationService.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationService.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationService.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,11 +21,6 @@
 package dblearnstar.webapp.services;
 
-import java.sql.Connection;
-import java.sql.SQLException;
 import java.util.List;
 
-import dblearnstar.model.entities.Group;
-import dblearnstar.model.entities.GroupMember;
-import dblearnstar.model.entities.SolutionAssessment;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentSubmitSolution;
@@ -46,7 +41,4 @@
 	public List<StudentSubmitSolution> getAllSolutionsForEvalutionFromTestInstance(TestInstance selectedTestInstance);
 
-	public List<StudentSubmitSolution> getAllSolutionsForEvalutionFromTaskInTestInstance(
-			TaskInTestInstance taskInTestInstance);
-
 	public List<StudentSubmitSolution> getAllSubmissionsOrdered();
 
@@ -57,26 +49,5 @@
 			TestInstance testInstance, TaskInTestInstance taskInTestInstance, Boolean onlyForEval, Boolean onlyCorrect);
 
-	public void reEvalSolution(String issuedByUserName, StudentSubmitSolution s);
-
-	public Triplet<List<Object[]>, List<String>, List<String>> getResultsForPrintingPurposes(String userName,
-			String queryToRun, TestInstanceParameters tip, String schema, String type);
-
-	/**
-	 * @return <evaluationData, resultsHeadersSimple, resultsErrors>
-	 */
-	Triplet<List<Object[]>, List<String>, List<String>> getEvalResultsForViewing(String userName, String queryToRun,
-			TaskInTestInstance taskInTestInstance, TestInstanceParameters tip, String schema);
-
-	public List<String[]> execQuery(StudentSubmitSolution submission, Connection connection, String gradingSchema,
-			String string) throws SQLException;
-
-	public Triplet<List<String[]>, List<String>, List<String>> getDDLEvaluationDataFromStudentDatabases(
-			List<StudentSubmitSolution> submissions);
-
-	public List<SolutionAssessment> getSolutionAssessmentsWithDiscussionForTestInstance(long testInstanceId);
-
-	public void reEvalListOfSubmissions(String userName, List<StudentSubmitSolution> list);
-
-	public List<GroupMember> groupMembersSortedByTestTotals(Group selectedGroup);
+	public void processSolution(String issuedByUserName, StudentSubmitSolution s);
 
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationServiceImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationServiceImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationServiceImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -25,15 +25,8 @@
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.sql.SQLWarning;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
-import java.util.Properties;
-import java.util.regex.Pattern;
-
-import javax.persistence.Query;
+
 import javax.persistence.TypedQuery;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -48,7 +41,4 @@
 import org.slf4j.Logger;
 
-import dblearnstar.model.entities.Group;
-import dblearnstar.model.entities.GroupMember;
-import dblearnstar.model.entities.SolutionAssessment;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentSubmitSolution;
@@ -57,6 +47,4 @@
 import dblearnstar.model.entities.TestInstanceParameters;
 import dblearnstar.model.model.Triplet;
-import dblearnstar.webapp.model.ApplicationConstants;
-import dblearnstar.webapp.util.AppConfig;
 
 public class EvaluationServiceImpl implements EvaluationService {
@@ -69,7 +57,4 @@
 
 	@Inject
-	private SystemConfigService systemConfigService;
-
-	@Inject
 	private Session session;
 
@@ -78,87 +63,16 @@
 	}
 
-	private String prepareQueryStringCurrentTime(TaskInTestInstance taskInTestInstance, String query, String schema) {
-		String nowString = systemConfigService.getValue("Task", taskInTestInstance.getTask().getTaskId(),
-				"TEST_NOW_" + schema);
-		if (nowString == null) {
-			logger.warn("Missing system parameter {}", "TEST_NOW_" + schema);
-		}
-		logger.debug("TEST_NOW {}", nowString);
-		String queryStringModified = query;
-		String replaceString = schema + ".now()";
-		if (nowString != null && nowString.length() == 35 && nowString.startsWith("TIMESTAMP '")
-				&& nowString.endsWith("'")) {
-			String checkParse = nowString.substring(11, nowString.length() - 1);
-			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
-			Date now = null;
-			try {
-				now = sdf.parse(checkParse);
-				replaceString = nowString;
-			} catch (ParseException e) {
-				logger.error("Parsing parameter {} failed with error {}", "TEST_NOW_" + schema, e.getMessage());
-			}
-		}
-		queryStringModified = Pattern.compile(Pattern.quote("now()"), Pattern.CASE_INSENSITIVE)
-				.matcher(queryStringModified).replaceAll(replaceString);
-		queryStringModified = Pattern.compile(Pattern.quote("current_date"), Pattern.CASE_INSENSITIVE)
-				.matcher(queryStringModified).replaceAll(replaceString);
-		logger.debug(
-				"Modded query for evaluation is \n------------------------------\n{}\n==============================",
-				queryStringModified);
-		return queryStringModified;
-	}
-
-	private String prepareQueryStringForViewing(TaskInTestInstance taskInTestInstance, String query, String schema,
-			String evalViewName, String userName) {
-		String queryStringModified = query;
-		queryStringModified = prepareQueryStringCurrentTime(taskInTestInstance, query, schema);
-
-		String evalQueryString = //
-				" select '<span class=\"inSubmission\">In Submission</span>' as WHERE, *   from " //
-						+ " ( ( " + queryStringModified + " ) " //
-						+ " EXCEPT ALL " //
-						+ " ( select * from " + evalViewName + " ) ) eden " //
-						+ " UNION ALL " //
-						+ " select '<span class=\"inCorrectSolution\">In Correct Solution</span>' as WHERE, *  from " //
-						+ " ( ( select * from " + evalViewName + " ) " //
-						+ " EXCEPT ALL " //
-						+ " ( " + queryStringModified + " ) ) dva " //
-						+ " order by 1,2 ";
-		logger.debug("user {} issued evalQueryString for viewing: {}", userName, evalQueryString);
-		return evalQueryString;
-	}
-
-	private String prepareQueryStringForEval(TaskInTestInstance taskInTestInstance, String query, String schema,
-			String evalViewName, String userName) {
-		String queryStringModified = query;
-		queryStringModified = prepareQueryStringCurrentTime(taskInTestInstance, query, schema);
-
-		String evalQueryString = //
-				" select *, 'EDEN' from " //
-						+ " ( ( " + queryStringModified + " ) " //
-						+ " EXCEPT ALL " //
-						+ " ( select * from " + evalViewName + " ) ) eden " //
-						+ " UNION ALL " //
-						+ " select *, 'DVA' from " //
-						+ " ( ( select * from " + evalViewName + " ) " //
-						+ " EXCEPT ALL " //
-						+ " ( " + queryStringModified + " ) ) dva ";
-		logger.debug("user {} issued evalQueryString for evaluation: {}", userName, evalQueryString);
-		return evalQueryString;
-	}
-
-	/**
-	 * @return < resultsEval, resultsErrors, evaluation result >
-	 */
-	@Override
-	public Triplet<List<String>, List<String>, Boolean> evalResultsIn(String userName, String queryToRun,
+	@Override
+	public Triplet<List<String>, List<String>, Boolean> evalResultsIn(String userName, String queryString,
 			TaskInTestInstance taskInTestInstance, TestInstanceParameters tip, String schema) {
 		Triplet<List<String>, List<String>, Boolean> rslts = new Triplet<List<String>, List<String>, Boolean>(
 				new ArrayList<String>(), new ArrayList<String>(), Boolean.valueOf(false));
-
-		if (queryToRun != null) {
-			String qtlc = queryToRun.toLowerCase();
+		// rslts.firstItem will be used for resultsEval
+		// rslts.secondItem will be used for resultsErrors
+		// rslts.thirdItem will be used to pass evaluation result
+		if (queryString != null) {
+			String qtlc = queryString.toLowerCase();
 			if (qtlc.contains("delete") || qtlc.contains("update") || qtlc.contains("insert") || qtlc.contains("create")
-					|| qtlc.contains("drop") || qtlc.contains("alter") || qtlc.contains("information_schema")) {
+					|| qtlc.contains("drop") || qtlc.contains("alter")) {
 			} else {
 				Connection connection = null;
@@ -175,9 +89,14 @@
 					connection.setSchema(schema);
 
-					String evalQueryString = prepareQueryStringForEval(taskInTestInstance, queryToRun, schema,
-							evalViewName, userName);
+					String queryStringManip = queryString.replace("now()", schema + ".now()");
+					queryStringManip = queryStringManip.replace("current_date", schema + ".now()");
+
+					String evalQueryString = "((" + queryStringManip + ") except (select * from " + evalViewName
+							+ ")) union ((select * from " + evalViewName + ") except (" + queryStringManip + "))";
+
+					logger.debug("user {} issued evalQueryString: {}", userName, evalQueryString);
 
 					PreparedStatement pstmt = connection.prepareStatement(evalQueryString);
-					pstmt.setQueryTimeout(10 * 60);
+					pstmt.setQueryTimeout(30);
 					ResultSet rs = pstmt.executeQuery();
 					if (rs.next()) {
@@ -190,5 +109,4 @@
 					}
 					rs.close();
-					pstmt.close();
 					SQLWarning w = connection.getWarnings();
 					if (w != null) {
@@ -197,5 +115,5 @@
 					connection.rollback();
 				} catch (Exception e) {
-					logger.error("Error occured when evaluating submission <<<\n{}\n>>> - {}", queryToRun, e.getMessage());
+					logger.error("Error occured {}", e.getMessage());
 					if (e.getMessage().contains("ERROR: each EXCEPT query must have the same number of columns")) {
 						rslts.getFirstItem().add(messages.get("sql-outputSchemaFormatError"));
@@ -206,6 +124,4 @@
 								evalViewName, taskInTestInstance.getTaskInTestInstanceId());
 						rslts.getSecondItem().add(messages.get("sql-notPossibleToEvaluate"));
-					} else if (e.getMessage().toLowerCase().contains("DateStyle parameter was changed")) {
-						logger.error("" + e);
 					} else {
 						rslts.getSecondItem().add(e.getMessage());
@@ -277,14 +193,4 @@
 
 	@Override
-	public List<StudentSubmitSolution> getAllSolutionsForEvalutionFromTaskInTestInstance(
-			TaskInTestInstance taskInTestInstance) {
-		return UsefulMethods.castList(StudentSubmitSolution.class, getEntityManager().createQuery("""
-					from StudentSubmitSolution sss where sss.notForEvaluation=false and
-				sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
-				""").setParameter("taskInTestInstanceId", taskInTestInstance.getTaskInTestInstanceId())
-				.getResultList());
-	}
-
-	@Override
 	public List<StudentSubmitSolution> getAllSubmissionsOrdered() {
 		return UsefulMethods.castList(StudentSubmitSolution.class, getEntityManager()
@@ -344,56 +250,35 @@
 				return null;
 			}
-			String newLine = System.getProperty("line.separator");
 			String queryStringIntro = """
-					SELECT sss.*
-					FROM student_submit_solution sss
-					JOIN student_started_test sst ON sss.student_started_test_id=sst.student_started_test_id
-					WHERE 
-						sst.test_instance_id=:testInstanceId
+					from StudentSubmitSolution sssL where
+					sssL.taskInTestInstance.testInstance.testInstanceId=:testInstanceId
 					""";
 			String queryStringMiddle = "";
 			if (student != null) {
-				queryStringMiddle += """
-						AND sst.student_id=:studentId
-						""";
-			} else {
-				queryStringMiddle += """
-						AND sst.student_id IN
-						(
-							SELECT gm.student_id
-							FROM
-								group_focus_on_test gfot
-								JOIN group_member gm ON gm.group_id=gfot.group_id
-							WHERE gfot.test_instance_id=sst.test_instance_id
-						)
-						""";
+				queryStringMiddle += " and sssL.studentStartedTest.student.studentId=:studentId ";
 			}
 			if (taskInTestInstance != null) {
-				queryStringMiddle += """
-						AND sss.task_in_test_instance_id=:taskInTestInstanceId
-						""";
+				queryStringMiddle += " and sssL.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId ";
 			}
 			if (onlyCorrect != null && onlyCorrect) {
 				queryStringMiddle += """
-						AND sss.evaluation_simple
-						AND sss.evaluation_complex
-						AND sss.evaluation_exam
+						and sssL.evaluationSimple=true
+						and sssL.evaluationComplex=true
+						and sssL.evaluationExam=true
 						""";
 			}
 			if (onlyForEval != null && onlyForEval) {
-				queryStringMiddle += """
-						AND sss.not_for_evaluation=false
-						""";
+				queryStringMiddle += " and sssL.notForEvaluation=false ";
 			}
 			String queryStringOutro = """
-					AND sss.submitted_on=
-					(
-						SELECT max(sssin.submitted_on) FROM student_submit_solution sssin
-						WHERE sssin.student_started_test_id=sss.student_started_test_id AND sssin.task_in_test_instance_id=sss.task_in_test_instance_id
-					)
-					order by sss.submitted_on desc
+					and sssL.submittedOn>=all (
+					    select sssR.submittedOn from StudentSubmitSolution sssR
+					    where
+					    	sssL.studentStartedTest.student.studentId=sssR.studentStartedTest.student.studentId and
+					    	sssL.taskInTestInstance.taskInTestInstanceId=sssR.taskInTestInstance.taskInTestInstanceId
+					) order by sssL.submittedOn desc
 					""";
-			String queryString = queryStringIntro + queryStringMiddle + queryStringOutro;
-			Query q = getEntityManager().createNativeQuery(queryString, StudentSubmitSolution.class);
+			javax.persistence.Query q = getEntityManager()
+					.createQuery(queryStringIntro + queryStringMiddle + queryStringOutro);
 			q.setParameter("testInstanceId", testInstance.getTestInstanceId());
 			if (student != null) {
@@ -410,19 +295,16 @@
 	}
 
-	public void reEvalSolution(String issuedByUserName, StudentSubmitSolution s) {
-		TaskInTestInstance tti = s.getTaskInTestInstance();
-		/*
-		 * TODO: Only supports TestInstances with a single TestInstanceParameter line
-		 */
-		TestInstanceParameters tip = tti.getTestInstance().getTestInstanceParameters().get(0);
-
-		logger.info("Reevaluation started for studentSubmitSolutionId: {}", s.getStudentSubmitSolutionId());
+	public void processSolution(String issuedByUserName, StudentSubmitSolution s) {
 		Triplet<List<String>, List<String>, Boolean> rsltsSimple = evalResultsIn(issuedByUserName, s.getSubmission(),
-				tti, tip, tip.getSchemaSimple());
+				s.getTaskInTestInstance(),
+				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0),
+				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0).getSchemaSimple());
 		Triplet<List<String>, List<String>, Boolean> rsltsComplex = evalResultsIn(issuedByUserName, s.getSubmission(),
-				tti, tip, tip.getSchemaComplex());
-		logger.info("Reevaluation Simple studentSubmitSolutionId: {} reevaluated as: {}",
-				s.getStudentSubmitSolutionId(), rsltsSimple.getThirdItem());
-		logger.info("Reevaluation Complex studentSubmitSolutionId: {} reevaluated as: {}",
+				s.getTaskInTestInstance(),
+				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0),
+				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0).getSchemaComplex());
+		logger.info("Reevaluation studentSubmitSolutionId Simple: {} reevaluated as {}", s.getStudentSubmitSolutionId(),
+				rsltsSimple.getThirdItem());
+		logger.info("Reevaluation studentSubmitSolutionId Complex: {} reevaluated as {}",
 				s.getStudentSubmitSolutionId(), rsltsComplex.getThirdItem());
 		if (rsltsSimple.getThirdItem() == true) {
@@ -440,584 +322,3 @@
 	}
 
-	/**
-	 * @return <evaluationData, resultsHeadersSimple, resultsErrors>
-	 */
-	@Override
-	public Triplet<List<Object[]>, List<String>, List<String>> getResultsForPrintingPurposes(String userName,
-			String queryToRun, TestInstanceParameters tip, String schema, String type) {
-		List<Object[]> resultsSimple = new ArrayList<Object[]>();
-		List<String> resultsHeadersSimple = new ArrayList<String>();
-		List<String> resultsErrors = new ArrayList<String>();
-
-		if (queryToRun != null) {
-			String qtlc = queryToRun.toLowerCase();
-			if (qtlc.contains("delete") || qtlc.contains("update") || qtlc.contains("insert") || qtlc.contains("create")
-					|| qtlc.contains("drop") || qtlc.contains("alter") || qtlc.contains("information_schema")) {
-				resultsErrors.add(messages.get("sql-db-modifications"));
-				logger.error("Database modification or catalog or directory query issued by {}", userName);
-			} else {
-				resultsSimple = new ArrayList<Object[]>();
-				resultsHeadersSimple = new ArrayList<String>();
-
-				Connection connection = null;
-				int statusCounter = 0;
-				try {
-					Properties props = new Properties();
-					props.setProperty("user", tip.getDbUser());
-					props.setProperty("password", tip.getDbPass());
-					String url = "jdbc:postgresql://" + tip.getHostname() + ":" + tip.getPort() + "/" + tip.getDbName();
-
-					connection = DriverManager.getConnection(url, props);
-					statusCounter = 1;
-
-					connection.setClientInfo("ApplicationName", "dbLearn*Evaluator");
-					connection.setReadOnly(true);
-					connection.setAutoCommit(false);
-					connection.setSavepoint();
-					connection.setSchema(schema);
-					statusCounter = 2;
-
-					ResultSet rs = connection.prepareStatement(queryToRun).executeQuery();
-					boolean isNextRow = rs.next();
-					int numColumns = rs.getMetaData().getColumnCount();
-					for (int i = 1; i <= numColumns; i++) {
-						resultsHeadersSimple.add(rs.getMetaData().getColumnName(i));
-					}
-					statusCounter = 3;
-
-					int count = 1;
-					while (isNextRow && count < 500) {
-						Object[] o = new Object[numColumns];
-						for (int i = 1; i <= numColumns; i++) {
-							o[i - 1] = rs.getObject(i);
-						}
-						resultsSimple.add(o);
-						isNextRow = rs.next();
-						count++;
-					}
-					statusCounter = 4;
-					rs.close();
-					SQLWarning w = connection.getWarnings();
-					if (w != null) {
-						logger.debug("warning");
-						resultsErrors.add(w.getMessage());
-					}
-					if (count >= 500) {
-						logger.debug("count");
-						resultsErrors.add(messages.get("sql-moreThan500Rows"));
-					}
-					connection.rollback();
-				} catch (Exception e) {
-					if (statusCounter == 0) {
-						logger.error("Error when connecting to evaluation database for testinstance: {}",
-								tip.getTestInstance().getTestInstanceId());
-						logger.debug("Exception: {}", e);
-						resultsErrors.add(messages.get("evalDBNA-label"));
-					} else {
-						logger.error(
-								"Connected to evaluation database for test instance {}, but failed in running query: {} ",
-								tip.getTestInstance().getTestInstanceId(), queryToRun);
-						logger.debug("Exception: {}", e);
-						resultsErrors.add(e.getMessage());
-					}
-				} finally {
-					if (connection != null) {
-						try {
-							connection.close();
-						} catch (Exception e) {
-							logger.error("Connection can't be closed {} {}", userName, e.getMessage());
-						}
-					}
-				}
-			}
-		} else {
-			resultsSimple = new ArrayList<Object[]>();
-			resultsHeadersSimple = new ArrayList<String>();
-		}
-
-		Triplet<List<Object[]>, List<String>, List<String>> results = new Triplet<List<Object[]>, List<String>, List<String>>(
-				resultsSimple, resultsHeadersSimple, resultsErrors);
-		return results;
-	}
-
-	/**
-	 * @return <evaluationData, resultsHeadersSimple, resultsErrors>
-	 */
-	@Override
-	public Triplet<List<Object[]>, List<String>, List<String>> getEvalResultsForViewing(String userName,
-			String queryToRun, TaskInTestInstance taskInTestInstance, TestInstanceParameters tip, String schema) {
-		List<Object[]> resultsSimple = new ArrayList<Object[]>();
-		List<String> resultsHeadersSimple = new ArrayList<String>();
-		List<String> resultsErrors = new ArrayList<String>();
-
-		if (queryToRun != null) {
-			String qtlc = queryToRun.toLowerCase();
-			if (qtlc.contains("delete") || qtlc.contains("update") || qtlc.contains("insert") || qtlc.contains("create")
-					|| qtlc.contains("drop") || qtlc.contains("alter") || qtlc.contains("information_schema")) {
-				resultsErrors.add(messages.get("sql-db-modifications"));
-				logger.error("Database modification or catalog or directory query issued by {}", userName);
-			} else {
-				resultsSimple = new ArrayList<Object[]>();
-				resultsHeadersSimple = new ArrayList<String>();
-
-				Connection connection = null;
-				String evalViewName = tip.getEvaluationViewPrefix() + taskInTestInstance.getTask().getTitle();
-
-				int statusCounter = 0;
-
-				try {
-					Properties props = new Properties();
-					props.setProperty("user", tip.getDbUser());
-					props.setProperty("password", tip.getDbPass());
-					String url = "jdbc:postgresql://" + tip.getHostname() + ":" + tip.getPort() + "/" + tip.getDbName();
-
-					connection = DriverManager.getConnection(url, props);
-					statusCounter = 1;
-
-					connection.setClientInfo("ApplicationName", "dbLearnStarEvaluator");
-					connection.setReadOnly(true);
-					connection.setAutoCommit(false);
-					connection.setSavepoint();
-					connection.setSchema(schema);
-					statusCounter = 2;
-
-					String evalQueryString = prepareQueryStringForViewing(taskInTestInstance, queryToRun, schema,
-							evalViewName, userName);
-
-					PreparedStatement pstmt = connection.prepareStatement(evalQueryString);
-					pstmt.setQueryTimeout(10 * 60);
-					ResultSet rs = pstmt.executeQuery();
-					boolean isNextRow = rs.next();
-					int numColumns = rs.getMetaData().getColumnCount();
-					for (int i = 1; i <= numColumns; i++) {
-						resultsHeadersSimple.add(rs.getMetaData().getColumnName(i));
-					}
-					statusCounter = 3;
-
-					int count = 1;
-					while (isNextRow && count < 500) {
-						Object[] o = new Object[numColumns];
-						for (int i = 1; i <= numColumns; i++) {
-							o[i - 1] = rs.getObject(i);
-						}
-						resultsSimple.add(o);
-						isNextRow = rs.next();
-						count++;
-					}
-					statusCounter = 4;
-					rs.close();
-					SQLWarning w = connection.getWarnings();
-					if (w != null) {
-						logger.debug("warning");
-						resultsErrors.add(w.getMessage());
-					}
-					if (count >= 500) {
-						logger.debug("count");
-						resultsErrors.add(messages.get("sql-moreThan500Rows"));
-					}
-					connection.rollback();
-				} catch (Exception e) {
-					if (statusCounter == 0) {
-						logger.error("Error when connecting to evaluation database for testinstance: {}",
-								tip.getTestInstance().getTestInstanceId());
-						logger.debug("Exception: {}", e);
-						resultsErrors.add(messages.get("evalDBNA-label"));
-					} else {
-						if (e.getMessage().contains("ERROR: each EXCEPT query must have the same number of columns")) {
-							resultsErrors.add(messages.get("sql-outputSchemaFormatError"));
-						} else if (e.getMessage().contains("ERROR: EXCEPT types")) {
-							resultsErrors.add(messages.get("sql-outputSchemaFormatError"));
-						} else if (e.getMessage().toLowerCase().contains(evalViewName.toLowerCase())) {
-							logger.error(
-									"The view: {} with the correct solution for taskInTestInstanceId: {} is missing!",
-									evalViewName, taskInTestInstance.getTaskInTestInstanceId());
-							resultsErrors.add(messages.get("sql-notPossibleToEvaluate"));
-						} else if (e.getMessage().toLowerCase().contains("DateStyle parameter was changed")) {
-							logger.error("" + e);
-						} else {
-							resultsErrors.add(e.getMessage());
-						}
-					}
-				} finally {
-					if (connection != null) {
-						try {
-							connection.close();
-						} catch (Exception e) {
-							logger.error("Connection can't be closed {} {}", userName, e.getMessage());
-						}
-					}
-				}
-			}
-		} else {
-			resultsSimple = new ArrayList<Object[]>();
-			resultsHeadersSimple = new ArrayList<String>();
-		}
-
-		return new Triplet<List<Object[]>, List<String>, List<String>>(resultsSimple, resultsHeadersSimple,
-				resultsErrors);
-	}
-
-	@Override
-	public List<String[]> execQuery(StudentSubmitSolution submission, Connection connection, String gradingSchema,
-			String queryToRun) throws SQLException {
-		List<String[]> resultData = new ArrayList<String[]>();
-
-		PreparedStatement stat = connection.prepareStatement(queryToRun);
-		if (gradingSchema != null) {
-			stat.setString(1, gradingSchema);
-		}
-		ResultSet rs = stat.executeQuery();
-		boolean isNextRow = rs.next();
-		int numColumns = rs.getMetaData().getColumnCount();
-
-		logger.debug("Executing Query {} {} {} ",
-				submission.getStudentStartedTest().getStudent().getPerson().getUserName(), queryToRun, numColumns);
-
-		while (isNextRow) {
-			String[] o = new String[numColumns + 2];
-			o[0] = Long.toString(submission.getStudentSubmitSolutionId());
-			o[1] = null; // grade
-			for (int i = 1; i <= numColumns; i++) {
-				Object ofromq = rs.getObject(i);
-				if (ofromq == null) {
-					o[i + 1] = null;
-				} else {
-					o[i + 1] = ofromq.toString();
-				}
-			}
-			resultData.add(o);
-			isNextRow = rs.next();
-		}
-		rs.close();
-
-		return resultData;
-	}
-
-	@Override
-	public Triplet<List<String[]>, List<String>, List<String>> getDDLEvaluationDataFromStudentDatabases(
-			List<StudentSubmitSolution> submissions) {
-		List<String[]> ddlEvaluationData = new ArrayList<String[]>();
-		List<String> resultsHeadersSimple = new ArrayList<String>();
-		List<String> resultsDbConnErrors = new ArrayList<String>();
-
-		String[] queryToRun = {
-				"""
-						select
-							'TABLE' type,
-						 	current_database() as DB,
-						 	table_name,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=1) col1,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=2) col2,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=3) col3,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=4) col4,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=5) col5,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=6) col6,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=7) col7,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=8) col8,
-							(select column_name  from information_schema.columns isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and ordinal_position=9) col9
-						from information_schema.tables ist
-						where table_schema=?
-						order by table_catalog, table_name
-						""",
-				"""
-						select 'PK',
-							current_database() as DB,
-							table_name,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=1) col1,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=2) col2,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=3) col3,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=4) col4,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=5) col5,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=6) col6,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=7) col7,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=8) col8,
-							(select column_name  from information_schema.key_column_usage isc where isc.table_catalog=ist.table_catalog and isc.table_schema=ist.table_schema and
-								isc.table_name=ist.table_name and isc.constraint_name=ist.constraint_name and isc.ordinal_position=9) col9
-							from information_schema.table_constraints ist
-						where table_schema =? and ist.constraint_type='PRIMARY KEY'
-							order by table_catalog, table_schema, table_name
-						""",
-				"""
-						SELECT 'FK',
-						    current_database() as DB,
-							conrelid::regclass  AS table_from,
-							confrelid::regclass as table_to,
-							regexp_replace(pg_get_constraintdef(oid), '^FOREIGN KEY (.*) REFERENCES .*$', '\\1') foreign_key_columns,
-							regexp_replace(pg_get_constraintdef(oid), '^.*REFERENCES (.*).*$', '\\1') primary_key_columns
-						FROM   pg_catalog.pg_constraint pc
-						WHERE  pc.contype IN ('f')
-						AND    pc.connamespace=?::regnamespace
-						ORDER  BY 1,2,3
-						""",
-				"""
-						select 'NN',
-							current_database() as DB,
-							table_name,
-							column_name
-						from information_schema.columns where is_nullable='NO' and table_schema=?
-						order by table_catalog, table_name;
-						""",
-				"""
-						SELECT 'CHECK',
-						       current_database(),
-						       source_table::regclass,
-						       source_attr1.attname AS source_col1,
-						       source_attr2.attname AS source_col2,
-						       source_attr3.attname AS source_col3,
-						       source_attr4.attname AS source_col4,
-						       source_attr5.attname AS source_col5,
-						       consrc
-						FROM
-						  (SELECT consrc, connamespace, conname,
-						          source_table,
-						          target_table,
-						          source_constraints[1] AS source_cons1,
-						          source_constraints[2] AS source_cons2,
-						          source_constraints[3] AS source_cons3,
-						          source_constraints[4] AS source_cons4,
-						          source_constraints[5] AS source_cons5
-						   FROM
-						     (SELECT pg_get_constraintdef(oid) consrc, conname, connamespace, conrelid as source_table,
-						             confrelid AS target_table, conkey AS source_constraints, confkey AS target_constraints
-						      FROM pg_constraint
-						      WHERE contype = 'c'
-						     ) query1
-						  ) query2
-						  left outer join pg_attribute source_attr1 on source_attr1.attnum = source_cons1 AND source_attr1.attrelid = source_table
-						  left outer join pg_attribute source_attr2 on source_attr2.attnum = source_cons2 AND source_attr2.attrelid = source_table
-						  left outer join pg_attribute source_attr3 on source_attr3.attnum = source_cons3 AND source_attr3.attrelid = source_table
-						  left outer join pg_attribute source_attr4 on source_attr4.attnum = source_cons4 AND source_attr4.attrelid = source_table
-						  left outer join pg_attribute source_attr5 on source_attr5.attnum = source_cons5 AND source_attr5.attrelid = source_table
-						where (SELECT nspname FROM pg_namespace WHERE oid=connamespace)=?
-						""",
-				"""
-						SELECT 'UK',
-						       current_database() as DB,
-						       source_table::regclass,
-						       source_attr1.attname AS source_col1,
-						       source_attr2.attname AS source_col2,
-						       source_attr3.attname AS source_col3,
-						       source_attr4.attname AS source_col4,
-						       source_attr5.attname AS source_col5,
-						       consrc
-						FROM
-						  (SELECT consrc, connamespace, conname,
-						          source_table,
-						          target_table,
-						          source_constraints[1] AS source_cons1,
-						          source_constraints[2] AS source_cons2,
-						          source_constraints[3] AS source_cons3,
-						          source_constraints[4] AS source_cons4,
-						          source_constraints[5] AS source_cons5
-						   FROM
-						     (SELECT pg_get_constraintdef(oid) consrc, conname, connamespace, conrelid as source_table, confrelid AS target_table,
-						     	conkey AS source_constraints, confkey AS target_constraints
-						      FROM pg_constraint
-						      WHERE contype = 'u'
-						     ) query1
-						  ) query2
-						  left outer join pg_attribute source_attr1 on source_attr1.attnum = source_cons1 AND source_attr1.attrelid = source_table
-						  left outer join pg_attribute source_attr2 on source_attr2.attnum = source_cons2 AND source_attr2.attrelid = source_table
-						  left outer join pg_attribute source_attr3 on source_attr3.attnum = source_cons3 AND source_attr3.attrelid = source_table
-						  left outer join pg_attribute source_attr4 on source_attr4.attnum = source_cons4 AND source_attr4.attrelid = source_table
-						  left outer join pg_attribute source_attr5 on source_attr5.attnum = source_cons5 AND source_attr5.attrelid = source_table
-						where (SELECT nspname FROM pg_namespace WHERE oid=connamespace)=?
-												""",
-				"""
-						select 'DATA',
-							current_database() as DB,
-							c.table_name,
-							0 as broj
-						from information_schema.tables c
-						where
-							c.table_schema=? and
-							c.table_name not in ('')
-						order by table_catalog, table_schema, table_name
-														""" };
-
-		if (submissions.size() < 100) {
-			Connection connectionEpm = null;
-			try {
-				connectionEpm = DriverManager.getConnection(AppConfig.getString(ApplicationConstants.EPRMS_JDBC_URL),
-						AppConfig.getString(ApplicationConstants.EPRMS_JDBC_USERNAME),
-						AppConfig.getString(ApplicationConstants.EPRMS_JDBC_PASSWORD));
-				connectionEpm.setSchema(AppConfig.getString(ApplicationConstants.EPRMS_JDBC_SCHEMA));
-				connectionEpm.setAutoCommit(false);
-				connectionEpm.setReadOnly(true);
-				PreparedStatement statEpm = connectionEpm.prepareStatement("select * from database where name like ?");
-
-				for (StudentSubmitSolution submission : submissions) {
-					String student = submission.getStudentStartedTest().getStudent().getPerson().getUserName();
-
-					Connection connection = null;
-					String DbPass = "", DbName = "", DbUser = "";
-					String DbNameCensored = "*****";
-					String gradingSchema = AppConfig.getString(ApplicationConstants.STUDENTDBS_JDBC_SCHEMA);
-					String mainUrl = AppConfig.getString(ApplicationConstants.STUDENTDBS_JDBC_URL);
-
-					for (int n = 0; n < 7; n++) {
-						int statusCounter = 0;
-
-						try {
-							SimpleDateFormat sdf = new SimpleDateFormat(ApplicationConstants.DATEFORMAT_CONDENSED);
-							String formattedTestDate = sdf
-									.format(submission.getStudentStartedTest().getTestInstance().getScheduledFor());
-
-							String likestring = "db%ispit%" + student + "%" + formattedTestDate + "%";
-							statEpm.setString(1, likestring);
-							ResultSet rsEpm = statEpm.executeQuery();
-							if (rsEpm != null && rsEpm.next()) {
-								DbPass = rsEpm.getString("password");
-								DbName = rsEpm.getString("name");
-								DbUser = rsEpm.getString("owner");
-							} else {
-								logger.error("Did not find student data for {}", likestring);
-								resultsDbConnErrors.add(DbNameCensored + " - Did not find student data");
-							}
-
-							Properties props = new Properties();
-							props.setProperty("user", DbUser);
-							props.setProperty("password", DbPass);
-							String url = mainUrl + "/" + DbName;
-
-							connection = DriverManager.getConnection(url, props);
-							statusCounter = 1;
-
-							connection.setClientInfo("ApplicationName", "dbLearn*RelationalEvaluator");
-							connection.setReadOnly(true);
-							connection.setAutoCommit(false);
-							connection.setSavepoint();
-							connection.setSchema(gradingSchema);
-							statusCounter = 2;
-
-							List<String[]> tempResults = execQuery(submission, connection, gradingSchema,
-									queryToRun[n]);
-							if (n == 6) {
-								for (String[] l : tempResults) {
-									String query = "SELECT count(*) FROM " + gradingSchema + "." + l[4];
-									List<String[]> countResults = execQuery(submission, connection, null, query);
-									if (countResults != null) {
-
-									}
-									l[5] = countResults.get(0)[2];
-									logger.debug("{} {} {} {} ", query, countResults.get(0)[0], countResults.get(0)[1],
-											countResults.get(0)[2]);
-								}
-							}
-							ddlEvaluationData.addAll(tempResults);
-							statusCounter = 4; // 3 should be before the preparedstatement, but it is not set
-
-							SQLWarning w = connection.getWarnings();
-							if (w != null) {
-								logger.debug("warning");
-								resultsDbConnErrors.add(DbNameCensored + " - " + w.getMessage());
-							}
-							connection.rollback();
-						} catch (Exception e) {
-							if (statusCounter == 0) {
-								logger.error("{}", e.getMessage());
-								resultsDbConnErrors.add(DbNameCensored + " - " + e.getMessage());
-							} else {
-								logger.error(
-										"Connected to evaluation database {}, but failed in running query {} due to {}",
-										DbName, queryToRun[n], e.getMessage());
-								logger.debug("Exception: {}", e);
-								resultsDbConnErrors.add(DbNameCensored + " - " + e.getMessage());
-							}
-						} finally {
-							if (connection != null) {
-								try {
-									connection.close();
-								} catch (Exception e) {
-									logger.error("Connection can't be closed {} {}", DbName, e.getMessage());
-								}
-							}
-						}
-					}
-				}
-			} catch (Exception e) {
-				logger.error("Cant connect to epm due to {}", e.getMessage());
-			} finally {
-				if (connectionEpm != null) {
-					try {
-						connectionEpm.close();
-					} catch (Exception e) {
-						logger.error("EPM connection can't be closed {} ", e.getMessage());
-					}
-				}
-			}
-		}
-
-		return new Triplet<List<String[]>, List<String>, List<String>>(ddlEvaluationData, resultsHeadersSimple,
-				resultsDbConnErrors);
-	}
-
-	@Override
-	public List<SolutionAssessment> getSolutionAssessmentsWithDiscussionForTestInstance(long testInstanceId) {
-		return UsefulMethods.castList(SolutionAssessment.class,
-				getEntityManager()
-						.createQuery(
-								"""
-										select distinct ad.solutionEvaluation
-										from AssessmentDiscussion ad
-										where ad.solutionEvaluation.studentSubmitSolution.studentStartedTest.testInstance.testInstanceId=:testInstanceId
-										order by ad.solutionEvaluation.evaluatedOn
-														""")
-						.setParameter("testInstanceId", testInstanceId).getResultList());
-	}
-
-	@Override
-	public void reEvalListOfSubmissions(String userName, List<StudentSubmitSolution> list) {
-		list.forEach((studentSubmitSolution) -> {
-			try {
-				reEvalSolution(userName, studentSubmitSolution);
-			} catch (Exception e) {
-				logger.error("Fail evaluation for sssId: {}", studentSubmitSolution.getStudentSubmitSolutionId());
-			}
-		});
-	}
-
-	@Override
-	public List<GroupMember> groupMembersSortedByTestTotals(Group selectedGroup) {
-		return getEntityManager().createNativeQuery(
-				"""
-						SELECT
-						group_member_id, group_id, student_id
-						FROM (
-							SELECT gm.group_member_id, gm.group_id, gm.student_id, ti.test_instance_id, titi.task_in_test_instance_id, max(sa.grade) test_task_grade, max(sss.submitted_on) prateno_na
-							FROM
-							"group" g
-							JOIN group_member gm ON g.group_id=gm.group_id
-							JOIN group_focus_on_test gfot ON g.group_id=gfot.group_id
-							JOIN test_instance ti ON ti.test_instance_id=gfot.test_instance_id
-							JOIN task_in_test_instance titi ON ti.test_instance_id=titi.test_instance_id
-							LEFT JOIN student_started_test sst ON sst.test_instance_id=ti.test_instance_id AND sst.student_id=gm.student_id
-							LEFT JOIN student_submit_solution sss ON titi.task_in_test_instance_id=sss.task_in_test_instance_id AND sss.student_started_test_id=sst.student_started_test_id
-							LEFT JOIN solution_assessment sa ON sss.student_submit_solution_id=sa.student_submit_solution_id
-							WHERE g.group_id=?
-							GROUP BY gm.group_member_id, ti.test_instance_id, titi.task_in_test_instance_id
-						) temp1
-						GROUP BY group_member_id, group_id, student_id
-						ORDER BY sum(test_task_grade) DESC, max(prateno_na) asc
-																						""",
-				GroupMember.class).setParameter(1, selectedGroup.getGroupId()).getResultList();
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/GenericDaoImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/GenericDaoImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/GenericDaoImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -94,6 +94,5 @@
 	@Override
 	public List<?> getAll(Class<?> classToLoad) {
-		return UsefulMethods.castList(classToLoad,
-				getEntityManager().createQuery("from " + classToLoad.getName()).getResultList());
+		return getEntityManager().createQuery("from " + classToLoad.getName()).getResultList();
 	}
 
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonDao.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonDao.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonDao.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -46,5 +46,3 @@
 	public List<Student> getAllStudents();
 
-	public boolean isInstructor(Person person);
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonDaoImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonDaoImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonDaoImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -30,5 +30,4 @@
 import dblearnstar.model.entities.PersonRole;
 import dblearnstar.model.entities.Student;
-import dblearnstar.model.model.ModelConstants;
 
 public class PersonDaoImpl implements PersonDao {
@@ -137,27 +136,8 @@
 					getEntityManager().createQuery("from Student s order by s.person.lastName").getResultList());
 		} catch (Exception e) {
-			logger.error("getAllStudents {}", e);
+			logger.error("getAllStudents{}", e);
 			return null;
 		}
 	}
 
-	@Override
-	public boolean isInstructor(Person person) {
-		try {
-			List list = getEntityManager()
-					.createQuery(
-							"from PersonRole pr where pr.person.personId=:personId and pr.role.name=:instructorRole")
-					.setParameter("personId", person.getPersonId())
-					.setParameter("instructorRole", ModelConstants.InstructorRole).getResultList();
-			if (list != null && list.size() > 0) {
-				return true;
-			} else {
-				return false;
-			}
-		} catch (Exception e) {
-			logger.error("isInstructor {}", e);
-			return false;
-		}
-	}
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonManager.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonManager.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonManager.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -45,5 +45,3 @@
 	public List<Student> getAllStudents();
 
-	public boolean isInstructor(Person person);
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonManagerImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonManagerImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/PersonManagerImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -84,8 +84,3 @@
 		return personDao.getAllStudents();
 	}
-
-	@Override
-	public boolean isInstructor(Person person) {
-		return personDao.isInstructor(person);
-	}
 }
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/services/SystemConfigService.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/SystemConfigService.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package dblearnstar.webapp.services;
-
-public interface SystemConfigService {
-	public String getCode(String className, long originalObjectId, String type);
-
-	public String getValue(String className, long originalObjectId, String type);
-}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/services/SystemConfigServiceImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/SystemConfigServiceImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,39 +1,0 @@
-package dblearnstar.webapp.services;
-
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-import dblearnstar.model.entities.SystemParameter;
-
-public class SystemConfigServiceImpl implements SystemConfigService {
-
-	@Inject
-	private GenericService genericService;
-
-	@Override
-	public String getValue(String className, long originalObjectId, String type) {
-		SystemParameter sp = (UsefulMethods.castList(SystemParameter.class,
-				genericService.getAll(SystemParameter.class))).stream()
-				.filter(p -> p.getClassName().equals(className) && p.getOriginalObjectId() == originalObjectId
-						&& p.getType().equals(type))
-				.findFirst().orElse(null);
-		if (sp != null) {
-			return sp.getValue();
-		} else {
-			return null;
-		}
-	}
-
-	@Override
-	public String getCode(String className, long originalObjectId, String type) {
-		SystemParameter sp = (UsefulMethods.castList(SystemParameter.class,
-				genericService.getAll(SystemParameter.class))).stream()
-				.filter(p -> p.getClassName().equals(className) && p.getOriginalObjectId() == originalObjectId
-						&& p.getType().equals(type))
-				.findFirst().orElse(null);
-		if (sp != null) {
-			return sp.getCode();
-		} else {
-			return null;
-		}
-	}
-}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManager.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManager.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManager.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -23,6 +23,5 @@
 import java.util.List;
 
-import dblearnstar.model.entities.Model;
-import dblearnstar.model.entities.SolutionAssessment;
+import dblearnstar.model.entities.Person;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentStartedTest;
@@ -30,23 +29,7 @@
 import dblearnstar.model.entities.Task;
 import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.entities.TaskType;
-import dblearnstar.model.entities.TestCollection;
 import dblearnstar.model.entities.TestInstance;
-import dblearnstar.model.entities.TestType;
 
 public interface TestManager {
-
-	public boolean accessToTaskInTestInstanceAllowed(Student student, TaskInTestInstance tti);
-
-	public List<TestInstance> getAllCurrentlyAvailableTestInstancesByTestType(long testTypeId);
-
-	public List<SolutionAssessment> getAllEvaluationsOfSolutionsForTaskInTestInstance(long studentId,
-			long taskInTestInstanceId);
-
-	public List<Model> getAllModels();
-
-	public List<TaskType> getAllTaskTypes();
-
-	public List<TaskType> getAllTaskTypesDefinedOverModel(Model chosenModel);
 
 	public List<TestInstance> getAllTestInstances();
@@ -54,27 +37,24 @@
 	public List<TestInstance> getAllTestInstancesByTestType(long testTypeId);
 
-	public List<TestInstance> getAllTestInstancesByTestTypeAndCollection(long testTypeId, long testCollectionId);
+	public List<TestInstance> getAllCurrentlyAvailableTestInstancesByTestType(long testTypeId);
 
-	public List<TestType> getAllTestTypes();
+	public List<TestInstance> getTestInstancesForStudent(long studentId);
 
-	public String getCodeType(StudentSubmitSolution submittedSolution);
+	public List<TestInstance> getTestInstancesForStudentByTestType(long studentId, long testTypeId);
 
-	public List<StudentSubmitSolution> getCorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
-			long taskInTestInstanceId);
-
-	public List<StudentSubmitSolution> getEvaluatedSolutionsForTaskInTestInstance(long studentId,
-			long taskInTestInstanceId);
+	public Boolean isTaskInTestInstanceSolvedByStudent(long taskInTestInstanceId, long studentId);
 
 	public Float getGradeForTaskInTestInstanceByStudent(long taskInTestInstanceId, long studentId);
+
+	public Long getNumPersonsSuccessfulForTaskInTestInstance(long taskInTestInstanceId);
+
+	public Long getNumPersonsTriedToSolveTaskInTestInstance(long taskInTestInstanceId);
+
+	public List<Object[]> getStudentsSolving();
 
 	public List<StudentSubmitSolution> getHistoryOfSolutions(long taskInTestInstanceId, Boolean filterNotForEvalution,
 			long studentId);
 
-	public List<StudentSubmitSolution> getIncorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
-			long taskInTestInstanceId);
-
-	public Long getNumPersonsSuccessfulForTaskInTestInstance(long taskInTestInstanceId);
-
-	public Long getNumPersonsTriedToSolveTaskInTestInstance(long taskInTestInstanceId);
+	public StudentStartedTest studentStartTest(long studentId, long testInstanceId);
 
 	public List<StudentSubmitSolution> getSolutionsByStudent(long studentId);
@@ -83,35 +63,24 @@
 			long studentId);
 
-	public List<Object[]> getStudentsSolving();
+	public List<TestInstance> getTestInstancesByTestType(long testTypeId);
+
+	public List<Task> getTasksByModel(long modelId);
+
+	public List<StudentSubmitSolution> getCorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
+			long taskInTestInstanceId);
+
+	public List<StudentSubmitSolution> getIncorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
+			long taskInTestInstanceId);
+
+	public List<TaskInTestInstance> getTasksInTestInstance(long testInstanceId);
+
+	public void recordActivityInTask(Person person, TaskInTestInstance taskInTestInstance, String type, String payload);
 
 	public List<Student> getStudentsWhoStartedTestInstance(TestInstance testInstance);
 
-	public List<TaskInTestInstance> getTaskInTestInstancesByModel(long modelId);
-
-	public List<TaskInTestInstance> getTaskInTestInstancesByTaskType(TaskType taskType);
-
-	public List<TaskInTestInstance> getTaskInTestInstancesByTestInstance(long testInstanceId);
-
-	public List<Task> getTasksByModel(long modelId);
-
-	public List<TestCollection> getTestCollectionsWithTestInstances();
-
-	public List<Object[]> getTestInstanceResultsByStudentSortedByTaskName(Student student, TestInstance testInstance);
-
-	
-	public List<TestInstance> getTestInstancesByTestType(long testTypeId);
-
-	public List<TestInstance> getTestInstancesForStudent(long studentId);
-
-	public List<TestInstance> getTestInstancesForStudentByTestType(long studentId, long testTypeId);
-
-	public List<TestInstance> getTestInstancesForStudentByTestTypeAndCollection(long studentId, long testTypeId,
-			long testCollectionId);
+	public List<StudentSubmitSolution> getEvaluatedSolutionsForTaskInTestInstance(long studentId,
+			long taskInTestInstanceId);
 
 	public Float getTotalPoints(long studentId, long testInstanceId);
 
-	public Boolean isTaskInTestInstanceSolvedByStudent(long taskInTestInstanceId, long studentId);
-
-	public StudentStartedTest studentStartTest(long studentId, long testInstanceId);
-
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManagerImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManagerImpl.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManagerImpl.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -34,6 +34,6 @@
 import org.slf4j.Logger;
 
-import dblearnstar.model.entities.Model;
-import dblearnstar.model.entities.SolutionAssessment;
+import dblearnstar.model.entities.ActivityInTask;
+import dblearnstar.model.entities.Person;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentStartedTest;
@@ -41,9 +41,5 @@
 import dblearnstar.model.entities.Task;
 import dblearnstar.model.entities.TaskInTestInstance;
-import dblearnstar.model.entities.TaskIsOfType;
-import dblearnstar.model.entities.TaskType;
-import dblearnstar.model.entities.TestCollection;
 import dblearnstar.model.entities.TestInstance;
-import dblearnstar.model.entities.TestType;
 
 public class TestManagerImpl implements TestManager {
@@ -53,79 +49,8 @@
 
 	@Inject
-	private GenericService genericService;
-
-	@Inject
 	private Session session;
 
-	@Override
-	public boolean accessToTaskInTestInstanceAllowed(Student student, TaskInTestInstance tti) {
-		// need a more appropriate implementation
-		return getTestInstancesForStudentByTestType(student.getStudentId(),
-				tti.getTestInstance().getTestTemplate().getTestType().getTestTypeId()).stream()
-				.anyMatch(ti -> ti.getTestInstanceId() == tti.getTestInstance().getTestInstanceId());
-	}
-
-	@Override
-	public List<TestInstance> getAllCurrentlyAvailableTestInstancesByTestType(long testTypeId) {
-		return UsefulMethods.castList(TestInstance.class, getEntityManager().createQuery("""
-				from TestInstance t
-				where
-					(t.scheduledFor is null or t.scheduledFor<=current_timestamp()) and
-					t.testTemplate.testType.testTypeId = :testTypeId
-				order by t.title desc
-				""").setParameter("testTypeId", testTypeId).getResultList());
-	}
-
-	@Override
-	public List<SolutionAssessment> getAllEvaluationsOfSolutionsForTaskInTestInstance(long studentId,
-			long taskInTestInstanceId) {
-		try {
-			Query q = getEntityManager().createQuery("""
-					select sa
-					from SolutionAssessment sa
-					where
-						sa.studentSubmitSolution.studentStartedTest.student.studentId = :studentId and
-					    sa.studentSubmitSolution.taskInTestInstance.taskInTestInstanceId = :taskInTestInstanceId
-					order by sa.evaluatedOn desc, sa.studentSubmitSolution.submittedOn desc
-					""");
-			q.setParameter("studentId", studentId);
-			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
-			List<SolutionAssessment> output = UsefulMethods.castList(SolutionAssessment.class, q.getResultList());
-			return output;
-		} catch (Exception e) {
-			logger.error("getAllEvaluationsOfSolutionsForTaskInTestInstance failed {}", e);
-			return null;
-		}
-	}
-
-	@Override
-	public List<Model> getAllModels() {
-		return UsefulMethods.castList(Model.class, genericService.getAll(Model.class));
-	}
-
-	@Override
-	public List<TaskType> getAllTaskTypes() {
-		return UsefulMethods.castList(TaskType.class, genericService.getAll(TaskType.class)).stream()
-				.sorted((o1, o2) -> {
-					return o1.getTitle().compareTo(o2.getTitle());
-				}).toList();
-	}
-
-	@Override
-	public List<TaskType> getAllTaskTypesDefinedOverModel(Model chosenModel) {
-		List<TaskType> list = UsefulMethods.castList(TaskType.class,
-				getEntityManager()
-						.createQuery(
-								"""
-										select distinct tiot.taskType
-										from TaskInTestInstance tti
-										join tti.task.taskIsOfTypes tiot
-										where
-											(tti.task.model.modelId is not null and tti.task.model.modelId=:modelId) or
-											(tti.testInstance.testTemplate.model.modelId is not null and tti.testInstance.testTemplate.model.modelId=:modelId)
-										order by tiot.taskType.title asc
-										""")
-						.setParameter("modelId", chosenModel.getModelId()).getResultList());
-		return list;
+	private Session getEntityManager() {
+		return session.getSession();
 	}
 
@@ -135,350 +60,4 @@
 				getEntityManager().createQuery("from TestInstance order by title desc").getResultList());
 		return testInstances;
-	}
-
-	@Override
-	public List<TestInstance> getAllTestInstancesByTestType(long testTypeId) {
-		String query = """
-				from TestInstance t
-				where
-					t.testTemplate.testType.testTypeId = :testTypeId
-				order by t.ordering asc, t.title desc
-				""";
-		return UsefulMethods.castList(TestInstance.class,
-				getEntityManager().createQuery(query).setParameter("testTypeId", testTypeId).getResultList());
-	}
-
-	@Override
-	public List<TestInstance> getAllTestInstancesByTestTypeAndCollection(long testTypeId, long testCollectionId) {
-		String query = """
-				from TestInstance t
-				where
-					t.testTemplate.testType.testTypeId = :testTypeId and
-					t.testCollection.testCollectionId = :testCollectionId
-				order by t.ordering asc, t.title desc
-				""";
-		return UsefulMethods.castList(TestInstance.class,
-				getEntityManager().createQuery(query).setParameter("testTypeId", testTypeId)
-						.setParameter("testCollectionId", testCollectionId).getResultList());
-	}
-
-	@Override
-	public List<TestType> getAllTestTypes() {
-		return UsefulMethods.castList(TestType.class, genericService.getAll(TestType.class)).stream()
-				.sorted((o1, o2) -> {
-					return o1.getTitle().compareTo(o2.getTitle());
-				}).toList();
-	}
-
-	@Override
-	public String getCodeType(StudentSubmitSolution submittedSolution) {
-		List<TaskIsOfType> listTypes = submittedSolution.getTaskInTestInstance().getTask().getTaskIsOfTypes();
-		if (listTypes != null && listTypes.size() > 0) {
-			return listTypes.get(0).getTaskType().getCodetype();
-		} else {
-			return "/";
-		}
-	}
-
-	@Override
-	public List<StudentSubmitSolution> getCorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
-			long taskInTestInstanceId) {
-		try {
-			Query q = getEntityManager().createQuery("""
-					select sss
-					from StudentSubmitSolution sss
-					left outer join sss.evaluations eval
-					where
-						((eval.solutionAssessmentId is not null) or
-						(sss.evaluationSimple=true and sss.evaluationComplex=true)) and
-						sss.studentStartedTest.student.studentId=:studentId and
-						sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
-					order by sss.submittedOn desc
-					""");
-			q.setParameter("studentId", studentId);
-			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
-			return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
-		} catch (Exception e) {
-			logger.error("getCorrectSolutionsByStudentAndTaskInTestInstance failed {}", e);
-			return null;
-		}
-	}
-
-	private EntityManager getEntityManager() {
-		return session.getEntityManagerFactory().createEntityManager();
-	}
-
-	@Override
-	public List<StudentSubmitSolution> getEvaluatedSolutionsForTaskInTestInstance(long studentId,
-			long taskInTestInstanceId) {
-		try {
-			Query q = getEntityManager().createQuery("""
-					select sss
-					from StudentSubmitSolution sss
-					left outer join sss.evaluations eval
-					where
-						sss.studentStartedTest.student.studentId = :studentId and
-					    sss.taskInTestInstance.taskInTestInstanceId = :taskInTestInstanceId
-					order by eval.evaluatedOn desc, sss.submittedOn desc
-					""");
-			q.setParameter("studentId", studentId);
-			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
-			List<StudentSubmitSolution> output = UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
-			return output;
-		} catch (Exception e) {
-			logger.error("getEvaluatedSolutionsForTaskInTestInstance failed {}", e);
-			return null;
-		}
-	}
-
-	@Override
-	public Float getGradeForTaskInTestInstanceByStudent(long taskInTestInstanceId, long studentId) {
-		try {
-			return (Float) getEntityManager().createQuery("""
-					select max(sa.grade) from SolutionAssessment sa join sa.studentSubmitSolution sss
-					where
-						sss.taskInTestInstance.taskInTestInstanceId = :taskInTestInstanceId and
-						sss.studentStartedTest.student.studentId = :studentId
-					""").setParameter("taskInTestInstanceId", taskInTestInstanceId).setParameter("studentId", studentId)
-					.getSingleResult();
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	@Override
-	public List<StudentSubmitSolution> getHistoryOfSolutions(long taskInTestInstanceId, Boolean filterNotForEvalution,
-			long studentId) {
-		return UsefulMethods.castList(StudentSubmitSolution.class, getEntityManager().createQuery("""
-				from StudentSubmitSolution sss
-				where
-					sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId and
-					sss.notForEvaluation=:filterNotForEvalution and
-					sss.studentStartedTest.student.studentId=:studentId
-				order by sss.submittedOn desc
-				""").setParameter("taskInTestInstanceId", taskInTestInstanceId).setParameter("studentId", studentId)
-				.setParameter("filterNotForEvalution", filterNotForEvalution).getResultList());
-	}
-
-	@Override
-	public List<StudentSubmitSolution> getIncorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
-			long taskInTestInstanceId) {
-		try {
-			Query q = getEntityManager().createQuery("""
-					from StudentSubmitSolution sss
-					where
-						not(sss.evaluationSimple=true and sss.evaluationComplex=true) and
-						sss.studentStartedTest.student.studentId=:studentId and
-						sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
-					order by sss.submittedOn desc
-					""");
-			q.setParameter("studentId", studentId);
-			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
-			return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
-		} catch (Exception e) {
-			logger.error("getIncorrectSolutionsByStudentAndTaskInTestInstance failed {}", e);
-			return null;
-		}
-	}
-
-	@Override
-	public Long getNumPersonsSuccessfulForTaskInTestInstance(long taskInTestInstanceId) {
-		try {
-			return (Long) getEntityManager().createQuery("""
-					select count(distinct sss.studentStartedTest.student.studentId)
-					from StudentSubmitSolution sss
-					where
-						sss.evaluationSimple=true and sss.evaluationComplex=true and
-						sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
-					""").setParameter("taskInTestInstanceId", taskInTestInstanceId).getSingleResult();
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	@Override
-	public Long getNumPersonsTriedToSolveTaskInTestInstance(long taskInTestInstanceId) {
-		try {
-			return (Long) getEntityManager().createQuery("""
-					select count(distinct sss.studentStartedTest.student.studentId)
-					from StudentSubmitSolution sss
-					where sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
-					""").setParameter("taskInTestInstanceId", taskInTestInstanceId).getSingleResult();
-		} catch (Exception e) {
-			return Long.valueOf(0);
-		}
-	}
-
-	@Override
-	public List<StudentSubmitSolution> getSolutionsByStudent(long studentId) {
-		javax.persistence.Query q = getEntityManager().createQuery(
-				"from StudentSubmitSolution sss where sss.studentStartedTest.student.studentId = :studentId");
-		q.setParameter("studentId", studentId);
-		return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
-	}
-
-	@Override
-	public List<StudentSubmitSolution> getSolutionsOfTaskInTestInstanceByOtherStudents(long taskInTestInstanceId,
-			long studentId) {
-		javax.persistence.Query q = getEntityManager().createQuery("""
-				from StudentSubmitSolution sss
-				where sss.evaluationSimple=true and
-					sss.evaluationComplex=true and
-					sss.studentStartedTest.student.studentId!=:studentId  and
-					sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
-				order by sss.submittedOn desc
-				""");
-		q.setParameter("studentId", studentId);
-		q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
-		return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
-	}
-
-	@Override
-	public List<Object[]> getStudentsSolving() {
-		try {
-			Query query = getEntityManager().createQuery("""
-					select p, count(distinct sss.taskInTestInstance.taskInTestInstanceId)
-					from StudentSubmitSolution sss
-					join sss.studentStartedTest sst
-					join sst.student s join s.person p
-					where
-						sss.evaluationExam=true and sss.submittedOn>:datum
-					group by p
-					order by count(distinct sss.taskInTestInstance.taskInTestInstanceId) desc
-					""");
-			Calendar cal = Calendar.getInstance();
-			cal.add(Calendar.MONTH, -3);
-			Date datum = cal.getTime();
-			query.setParameter("datum", datum);
-			return query.getResultList();
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	@Override
-	public List<Student> getStudentsWhoStartedTestInstance(TestInstance testInstance) {
-		try {
-			return UsefulMethods.castList(Student.class, getEntityManager().createQuery("""
-					select s
-					from StudentStartedTest sst join sst.student s
-					where sst.testInstance.testInstanceId = :testInstanceId
-					order by s.person.lastName, s.person.firstName
-					""").setParameter("testInstanceId", testInstance.getTestInstanceId()).getResultList());
-		} catch (Exception e) {
-			logger.error("Error {}", e.getMessage());
-			return new ArrayList<Student>();
-		}
-	}
-
-	@Override
-	public List<TaskInTestInstance> getTaskInTestInstancesByModel(long modelId) {
-		List<TaskInTestInstance> tasks = UsefulMethods.castList(TaskInTestInstance.class,
-				getEntityManager()
-						.createQuery(
-								"""
-										from TaskInTestInstance tti
-										where
-											(tti.task.model.modelId is not null and tti.task.model.modelId=:modelId) or
-											(tti.testInstance.testTemplate.model.modelId is not null and tti.testInstance.testTemplate.model.modelId=:modelId)
-										order by tti.testInstance.title, tti.task.title
-										""")
-						.setParameter("modelId", modelId).getResultList());
-		return tasks;
-	}
-
-	@Override
-	public List<TaskInTestInstance> getTaskInTestInstancesByTaskType(TaskType taskType) {
-		List<TaskInTestInstance> tasks = UsefulMethods.castList(TaskInTestInstance.class,
-				getEntityManager().createQuery("""
-						select tti
-						from TaskInTestInstance tti
-							join tti.task.taskIsOfTypes tiot
-						where
-							tiot.taskType.taskTypeId=:taskTypeId
-						order by tti.testInstance.title, tti.task.title
-						""").setParameter("taskTypeId", taskType.getTaskTypeId()).getResultList());
-		return tasks;
-	}
-
-	@Override
-	public List<TaskInTestInstance> getTaskInTestInstancesByTestInstance(long testInstanceId) {
-		return UsefulMethods.castList(TaskInTestInstance.class, getEntityManager().createQuery("""
-				from TaskInTestInstance tti
-				where tti.testInstance.testInstanceId = :testInstanceId
-				order by tti.task.title
-				""").setParameter("testInstanceId", testInstanceId).getResultList());
-	}
-
-	@Override
-	public List<Task> getTasksByModel(long modelId) {
-		List<Task> tasks = UsefulMethods.castList(Task.class,
-				getEntityManager().createQuery("from Task where model.modelId=:modelId")
-						.setParameter("modelId", modelId).getResultList());
-		return tasks;
-	}
-
-	@Override
-	public List<TestCollection> getTestCollectionsWithTestInstances() {
-		try {
-			// TestCollections that have TestInstances
-			List<TestCollection> list = UsefulMethods.castList(TestCollection.class, getEntityManager().createQuery("""
-					select distinct ti.testCollection
-					from TestInstance ti
-					""").getResultList());
-			// Add to them TestCollectionts that are Parents to another, or that have
-			// subCollections
-			List<TestCollection> listAdded = UsefulMethods.castList(TestCollection.class,
-					getEntityManager().createQuery("""
-							select distinct tc.parentCollection
-							from TestCollection tc
-							""").getResultList());
-			list.addAll(listAdded);
-			return list;
-		} catch (Exception e) {
-			logger.error("Error {}", e.getMessage());
-			return null;
-		}
-	}
-
-	@Override
-	public List<Object[]> getTestInstanceResultsByStudentSortedByTaskName(Student student, TestInstance testInstance) {
-		try {
-			return getEntityManager()
-					.createNativeQuery(
-							"""
-									select
-									cast(max(sa.grade) as integer) max_grade,
-									max(case when sss.student_submit_solution_id is null then null when sss.evaluation_simple and sss.evaluation_complex
-									then 1 else 0 end)>0 should_pass,
-									max(case when sa.passed is not null and sa.passed then 1 when sa.passed is not null and not(sa.passed) then 0 else null end )>0 passed
-									from
-									task_in_test_instance titi
-									join task t on titi.task_id=t.task_id
-									left join student_started_test sst on sst.student_id=?
-									left join student_submit_solution sss on sss.task_in_test_instance_id=titi.task_in_test_instance_id and sss.student_started_test_id=sst.student_started_test_id
-									left join solution_assessment sa on sss.student_submit_solution_id=sa.student_submit_solution_id
-									where titi.test_instance_id=?
-									group by titi.task_in_test_instance_id, t.task_id, t.title, sst.student_id
-									order by t.title
-																""")
-					.setParameter(1, student.getStudentId()).setParameter(2, testInstance.getTestInstanceId())
-					.getResultList();
-		} catch (Exception e) {
-			logger.error(e.getMessage());
-			return null;
-		}
-	}
-
-	@Override
-	public List<TestInstance> getTestInstancesByTestType(long testTypeId) {
-		javax.persistence.Query query = getEntityManager().createQuery(
-				"""
-				from TestInstance t 
-				where t.testTemplate.testType.testTypeId = :testTypeId 
-				order by t.title desc
-				""")
-				.setParameter("testTypeId", testTypeId);
-		return UsefulMethods.castList(TestInstance.class, query.getResultList());
 	}
 
@@ -516,63 +95,24 @@
 
 	@Override
-	public List<TestInstance> getTestInstancesForStudentByTestTypeAndCollection(long studentId, long testTypeId,
-			long testCollectionId) {
+	public List<TestInstance> getAllTestInstancesByTestType(long testTypeId) {
 		String query = """
-				select ti
-				from TestInstance ti
-				join ti.testTemplate ttem
-				join ttem.testType tt
-				join ti.testCollection tc
+				from TestInstance t
 				where
-					tt.testTypeId = :testTypeId and
-				    tc.testCollectionId = :testCollectionId and
-					(
-						ti.openToAllStudents=true or
-						ti in (
-							select ti2
-							from GroupMember gm
-							join gm.student s
-							join s.person p
-							join gm.group g
-							join g.groupFocusOnTests gft
-							join gft.testInstance ti2
-							where
-								s.studentId=:studentId and
-								(now() between ti2.scheduledFor and ti2.scheduledUntil or
-								ti2.openForReviewByStudents=true)
-						)
-					)
-				order by ti.ordering asc, ti.title desc
+					t.testTemplate.testType.testTypeId = :testTypeId
+				order by t.title desc
 				""";
 		return UsefulMethods.castList(TestInstance.class,
-				getEntityManager().createQuery(query).setParameter("studentId", studentId)
-						.setParameter("testTypeId", testTypeId).setParameter("testCollectionId", testCollectionId)
-						.getResultList());
-	}
-
-	@Override
-	public Float getTotalPoints(long studentId, long testInstanceId) {
-		try {
-			Query q = getEntityManager().createQuery("""
-					select max(sa.grade) as maksot
-					from SolutionAssessment sa
-					join sa.studentSubmitSolution sss
-					where
-						sss.taskInTestInstance.testInstance.testInstanceId = :testInstanceId and
-						sss.studentStartedTest.student.studentId = :studentId
-					group by sss.taskInTestInstance.taskInTestInstanceId
-					""");
-			q.setParameter("studentId", studentId);
-			q.setParameter("testInstanceId", testInstanceId);
-			Float total = (float) 0;
-			for (Float sa : UsefulMethods.castList(Float.class, q.getResultList())) {
-				if (sa != null) {
-					total += sa;
-				}
-			}
-			return total;
-		} catch (Exception e) {
-			return null;
-		}
+				getEntityManager().createQuery(query).setParameter("testTypeId", testTypeId).getResultList());
+	}
+
+	@Override
+	public List<TestInstance> getAllCurrentlyAvailableTestInstancesByTestType(long testTypeId) {
+		return UsefulMethods.castList(TestInstance.class, getEntityManager().createQuery("""
+				from TestInstance t
+				where
+					(t.scheduledFor is null or t.scheduledFor<=current_timestamp()) and
+					t.testTemplate.testType.testTypeId = :testTypeId
+				order by t.title desc
+				""").setParameter("testTypeId", testTypeId).getResultList());
 	}
 
@@ -605,4 +145,84 @@
 			}
 		}
+	}
+
+	@Override
+	public Float getGradeForTaskInTestInstanceByStudent(long taskInTestInstanceId, long studentId) {
+		try {
+			return (Float) getEntityManager().createQuery("""
+					select max(sa.grade) from SolutionAssessment sa join sa.studentSubmitSolution sss
+					where
+						sss.taskInTestInstance.taskInTestInstanceId = :taskInTestInstanceId and
+						sss.studentStartedTest.student.studentId = :studentId
+					""").setParameter("taskInTestInstanceId", taskInTestInstanceId).setParameter("studentId", studentId)
+					.getSingleResult();
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	@Override
+	public Long getNumPersonsSuccessfulForTaskInTestInstance(long taskInTestInstanceId) {
+		try {
+			return (Long) getEntityManager().createQuery("""
+					select count(distinct sss.studentStartedTest.student.studentId)
+					from StudentSubmitSolution sss
+					where
+						sss.evaluationSimple=true and sss.evaluationComplex=true and
+						sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
+					""").setParameter("taskInTestInstanceId", taskInTestInstanceId).getSingleResult();
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	@Override
+	public Long getNumPersonsTriedToSolveTaskInTestInstance(long taskInTestInstanceId) {
+		try {
+			return (Long) getEntityManager().createQuery("""
+					select count(distinct sss.studentStartedTest.student.studentId)
+					from StudentSubmitSolution sss
+					where sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
+					""").setParameter("taskInTestInstanceId", taskInTestInstanceId).getSingleResult();
+		} catch (Exception e) {
+			return Long.valueOf(0);
+		}
+	}
+
+	@Override
+	public List<Object[]> getStudentsSolving() {
+		try {
+			Query query = getEntityManager().createQuery("""
+					select p, count(distinct sss.taskInTestInstance.taskInTestInstanceId)
+					from StudentSubmitSolution sss
+					join sss.studentStartedTest sst
+					join sst.student s join s.person p
+					where
+						sss.evaluationExam=true and sss.submittedOn>:datum
+					group by p
+					order by count(distinct sss.taskInTestInstance.taskInTestInstanceId) desc
+					""");
+			Calendar cal = Calendar.getInstance();
+			cal.add(Calendar.MONTH, -3);
+			Date datum = cal.getTime();
+			query.setParameter("datum", datum);
+			return query.getResultList();
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	@Override
+	public List<StudentSubmitSolution> getHistoryOfSolutions(long taskInTestInstanceId, Boolean filterNotForEvalution,
+			long studentId) {
+		return UsefulMethods.castList(StudentSubmitSolution.class, getEntityManager().createQuery("""
+				from StudentSubmitSolution sss
+				where
+					sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId and
+					sss.notForEvaluation=:filterNotForEvalution and
+					sss.studentStartedTest.student.studentId=:studentId
+				order by sss.submittedOn desc
+				""").setParameter("taskInTestInstanceId", taskInTestInstanceId).setParameter("studentId", studentId)
+				.setParameter("filterNotForEvalution", filterNotForEvalution).getResultList());
 	}
 
@@ -633,3 +253,174 @@
 	}
 
+	@Override
+	public List<StudentSubmitSolution> getSolutionsByStudent(long studentId) {
+		javax.persistence.Query q = getEntityManager().createQuery(
+				"from StudentSubmitSolution sss where sss.studentStartedTest.student.studentId = :studentId");
+		q.setParameter("studentId", studentId);
+		return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
+	}
+
+	@Override
+	public List<StudentSubmitSolution> getSolutionsOfTaskInTestInstanceByOtherStudents(long taskInTestInstanceId,
+			long studentId) {
+		javax.persistence.Query q = getEntityManager().createQuery("""
+				from StudentSubmitSolution sss
+				where sss.evaluationSimple=true and
+					sss.evaluationComplex=true and
+					sss.studentStartedTest.student.studentId!=:studentId  and
+					sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
+				order by sss.submittedOn desc
+				""");
+		q.setParameter("studentId", studentId);
+		q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
+		return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
+	}
+
+	@Override
+	public List<TestInstance> getTestInstancesByTestType(long testTypeId) {
+		javax.persistence.Query query = getEntityManager().createQuery(
+				"from TestInstance t where t.testTemplate.testType.testTypeId = :testTypeId order by t.title desc")
+				.setParameter("testTypeId", testTypeId);
+		return UsefulMethods.castList(TestInstance.class, query.getResultList());
+	}
+
+	@Override
+	public List<Task> getTasksByModel(long modelId) {
+		List<Task> tasks = UsefulMethods.castList(Task.class,
+				getEntityManager().createQuery("from Task where model.modelId=:modelId")
+						.setParameter("modelId", modelId).getResultList());
+		logger.info("model {} \n tasks {}", modelId, tasks.size());
+		return tasks;
+	}
+
+	@Override
+	public List<StudentSubmitSolution> getCorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
+			long taskInTestInstanceId) {
+		try {
+			Query q = getEntityManager().createQuery("""
+					select sss
+					from StudentSubmitSolution sss
+					left outer join sss.evaluations eval
+					where
+						((eval.solutionAssessmentId is not null) or
+						(sss.evaluationSimple=true and sss.evaluationComplex=true)) and
+						sss.studentStartedTest.student.studentId=:studentId and
+						sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
+					order by sss.submittedOn desc
+					""");
+			q.setParameter("studentId", studentId);
+			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
+			return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
+		} catch (Exception e) {
+			logger.error("getCorrectSolutionsByStudentAndTaskInTestInstance failed {}", e);
+			return null;
+		}
+	}
+
+	@Override
+	public List<StudentSubmitSolution> getIncorrectSolutionsByStudentAndTaskInTestInstance(long studentId,
+			long taskInTestInstanceId) {
+		try {
+			Query q = getEntityManager().createQuery("""
+					from StudentSubmitSolution sss
+					where
+						not(sss.evaluationSimple=true and sss.evaluationComplex=true) and
+						sss.studentStartedTest.student.studentId=:studentId and
+						sss.taskInTestInstance.taskInTestInstanceId=:taskInTestInstanceId
+					order by sss.submittedOn desc
+					""");
+			q.setParameter("studentId", studentId);
+			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
+			return UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
+		} catch (Exception e) {
+			logger.error("getIncorrectSolutionsByStudentAndTaskInTestInstance failed {}", e);
+			return null;
+		}
+	}
+
+	@Override
+	public List<TaskInTestInstance> getTasksInTestInstance(long testInstanceId) {
+		return UsefulMethods.castList(TaskInTestInstance.class, getEntityManager().createQuery("""
+				from TaskInTestInstance tti
+				where tti.testInstance.testInstanceId = :testInstanceId
+				order by tti.task.title
+				""").setParameter("testInstanceId", testInstanceId).getResultList());
+	}
+
+	@Override
+	public void recordActivityInTask(Person person, TaskInTestInstance taskInTestInstance, String type,
+			String payload) {
+		ActivityInTask activityInTask = new ActivityInTask();
+		activityInTask.setPerson(person);
+		activityInTask.setTaskInTestInstance(taskInTestInstance);
+		activityInTask.setType(type);
+		activityInTask.setWhenOccured(new Date());
+		activityInTask.setPayload(payload);
+		session.save(activityInTask);
+	}
+
+	@Override
+	public List<Student> getStudentsWhoStartedTestInstance(TestInstance testInstance) {
+		try {
+			return UsefulMethods.castList(Student.class, getEntityManager().createQuery("""
+					select s
+					from StudentStartedTest sst join sst.student s
+					where sst.testInstance.testInstanceId = :testInstanceId
+					order by s.person.lastName, s.person.firstName
+					""").setParameter("testInstanceId", testInstance.getTestInstanceId()).getResultList());
+		} catch (Exception e) {
+			logger.error("Error {}", e.getMessage());
+			return new ArrayList<Student>();
+		}
+	}
+
+	@Override
+	public List<StudentSubmitSolution> getEvaluatedSolutionsForTaskInTestInstance(long studentId,
+			long taskInTestInstanceId) {
+		try {
+			Query q = getEntityManager().createQuery("""
+					select sss
+					from StudentSubmitSolution sss
+					left outer join sss.evaluations eval
+					where
+						sss.studentStartedTest.student.studentId = :studentId and
+					    sss.taskInTestInstance.taskInTestInstanceId = :taskInTestInstanceId
+					order by eval.evaluatedOn desc, sss.submittedOn desc
+					""");
+			q.setParameter("studentId", studentId);
+			q.setParameter("taskInTestInstanceId", taskInTestInstanceId);
+			List<StudentSubmitSolution> output = UsefulMethods.castList(StudentSubmitSolution.class, q.getResultList());
+			return output;
+		} catch (Exception e) {
+			logger.error("getEvaluatedSolutionsForTaskInTestInstance failed {}", e);
+			return null;
+		}
+	}
+
+	@Override
+	public Float getTotalPoints(long studentId, long testInstanceId) {
+		try {
+			Query q = getEntityManager().createQuery("""
+					select max(sa.grade)
+					from SolutionAssessment sa
+					join sa.studentSubmitSolution sss
+					where
+						sss.taskInTestInstance.testInstance.testInstanceId = :testInstanceId and
+						sss.studentStartedTest.student.studentId = :studentId
+					group by sss.taskInTestInstance.taskInTestInstanceId
+					""");
+			q.setParameter("studentId", studentId);
+			q.setParameter("testInstanceId", testInstanceId);
+			float total = (float) 0;
+			for (Float sa : UsefulMethods.castList(Float.class, q.getResultList())) {
+				if (sa != null) {
+					total += sa;
+				}
+			}
+			return total;
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/UTF8Filter.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/UTF8Filter.java	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/UTF8Filter.java	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -23,10 +23,10 @@
 import java.io.IOException;
 
-import jakarta.servlet.Filter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.FilterConfig;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.ServletResponse;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
 
 public class UTF8Filter implements Filter {
Index: dbLearnStar-webApp/src/main/resources/AppConfig.properties
===================================================================
--- dbLearnStar-webApp/src/main/resources/AppConfig.properties	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/AppConfig.properties	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -3,6 +3,4 @@
 #that will do an automatic conversion of the string bytestream if it was written with utf-8
 #this can sometimes result with an error
-
-app.version=@version@
 
 cas.server=@cas.server@
@@ -11,17 +9,4 @@
 cas.war.context=@cas.war.context@
 logout.redirectToServer=@logout.redirectToServer@
-auth.autoCreateUser=@auth.autoCreateUser@
-
-eprms.jdbc.driver=@eprms.jdbc.driver@
-eprms.jdbc.url=@eprms.jdbc.url@
-eprms.jdbc.default_schema=@eprms.jdbc.default_schema@
-eprms.jdbc.username=@eprms.jdbc.username@
-eprms.jdbc.password=@eprms.jdbc.password@
-
-studentdbs.jdbc.driver=@studentdbs.jdbc.driver@
-studentdbs.jdbc.url=@studentdbs.jdbc.url@
-studentdbs.jdbc.default_schema=@studentdbs.jdbc.default_schema@
-studentdbs.jdbc.username=@studentdbs.jdbc.username@
-studentdbs.jdbc.password=@studentdbs.jdbc.password@
 
 date.upload.submission.format=yyyyMMdd-HHmmss
@@ -30,6 +15,4 @@
 date.gui.format=dd.MM.yyyy
 time.gui.format=HH:mm
-datetime.gui.format=dd.MM.yyyy HH:mm:ss
-date.condensed.format=yyyyMMdd
 
 additionalFiles.path=@additionalFiles.path@
@@ -39,5 +22,4 @@
 xls.sheet.password=@xls.sheet.password@
 upload.path.submissions=@upload.path.submissions@
-exceptionReports.path=@exceptionReports.path@
 
 production.mode=@production.mode@
Index: LearnStar-webApp/src/main/resources/META-INF/assets/ComplaintsAndDiscussions.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/ComplaintsAndDiscussions.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,43 +1,0 @@
-.indentation0 {
-	margin: 0rem;
-}
-
-.indentation1 {
-	margin-left: 0rem;
-}
-
-.indentation2 {
-	margin-left: 2rem;
-}
-
-.indentation3 {
-	margin-left: 4rem;
-}
-
-.indentation4 {
-	margin-left: 6rem;
-}
-
-.indentation5 {
-	margin-left: 8rem;
-}
-
-.indentation6 {
-	margin-left: 10rem;
-}
-
-.reshenieto img {
-	width: 100%;
-}
-
-.discussion {
-	font-size: 90%;
-}
-
-.discussion img {
-	width: 100%;
-}
-
-.feedback img {
-	width: 100%;	
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/ExamsAndTasksOverviewPage.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/ExamsAndTasksOverviewPage.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/ExamsAndTasksOverviewPage.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -31,5 +31,5 @@
 
 td.taskContentCell {
-	max-height: 3.7em;
+	max-height: 3em;
 	overflow: hidden;
 	display: block;
@@ -39,7 +39,2 @@
 	border: none;
 }
-
-.card-header .btn:focus {
-  outline: none;
-  box-shadow: none;
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/QueryTest.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/QueryTest.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/QueryTest.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -21,4 +21,9 @@
 }
 
+.errorpanel {
+	position: relative;
+	margin: 0.5em 0em 0em 0em;
+}
+
 .resultspanel {
 	position: relative;
@@ -40,11 +45,13 @@
 	font-size: 80%;
 	clear: both;
-	display: inline;
-	background: var(--main-bg-color-accent2);
-	padding: 0.2em;
+	display: block;
 }
 
-.tas1kname {
+.taskname {
 	margin-top: 0;
+}
+
+h3 {
+	margin-top: 0.5rem;
 }
 
@@ -54,10 +61,7 @@
 }
 
-#taskDetails img {
-	max-width: 99%;
-}
-
 .code {
 	font-family: 'Fira Code', monospace, mono;
+	font-size: 85%;
 	line-height: 95%;
 	padding: 0.0em !important;
@@ -65,5 +69,4 @@
 	padding: 0.0em !important;
 	font-size: 85%;
-	min-height:25em;
 }
 
@@ -88,10 +91,2 @@
 	margin: 1em;
 }
-
-.close {
-	color: var(--main-font-color);
-}
-
-.close:hover {
-	color: var(--main-font-color);
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/SolutionComparatorPage.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/SolutionComparatorPage.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/SolutionComparatorPage.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -2,5 +2,5 @@
 	/*
 		https://www.w3schools.com/colors/colors_british.asp - Green */
-	background: var(--color-correct);
+	background: #9dd29c;
 }
 
@@ -8,5 +8,5 @@
 	/*
 		https://www.w3schools.com/colors/colors_british.asp - Carnival red */
-	background: var(--color-incorrect);
+	background: #c71c2c;
 	color: white;
 }
@@ -34,7 +34,8 @@
 .feedback {
 	overflow-wrap: normal;
-	overflow: auto;
+	overflow: scroll;
+	white-space: pre-line;
 	hyphens: auto;
-	max-height: 20rem;
+	max-height: 25rem;
 }
 
@@ -51,8 +52,2 @@
 	size: 2;
 }
-
-.solution {
-	overflow-x: auto;
-	overflow-y: auto;
-	max-height: 25rem;
-}
Index: LearnStar-webApp/src/main/resources/META-INF/assets/StudentGroupProgress.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/StudentGroupProgress.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,63 +1,0 @@
-.sgpTable {
-	font-size: 80%;
-}
-
-.sgpHeadTestLabel {
-	padding: 0.2em !important;
-	vertical-align: middle;
-}
-
-.sgpHeadTestInstance {
-	padding: 0.5em !important;
-	vertical-align: top !important;
-}
-
-.sgpHeadFullNameLabel {
-	padding: 0.2em !important;
-}
-
-.sgpHeadUserNameLabel {
-	padding: 0.2em !important;
-}
-
-.sgpHeadTask {
-	text-orientation: sideways;
-	writing-mode: vertical-lr;
-	padding: 0.25em !important;
-	vertical-align: top !important;
-}
-
-.sgpHeadTaskPoints {
-	font-weight: 400;
-	margin-top: 0.1em;
-}
-
-.sgpHeadTotal {
-	text-orientation: sideways;
-	writing-mode: vertical-lr;
-	padding: 0.2em !important;
-	vertical-align: middle !important;
-	text-align: end !important;
-}
-
-.sgpResFullName {
-	padding: 0.2em !important;
-	white-space: nowrap;
-	vertical-align: middle;
-}
-
-.sgpResUserName {
-	padding: 0.2em !important;
-}
-
-.sgpResPoints {
-	padding: 0.2em !important;
-	width: 2rem;
-	text-align: center !important;
-}
-
-.sgpResTotal {
-	padding: 0.2em !important;
-	width: 5rem;
-	text-align: end !important;
-}
Index: LearnStar-webApp/src/main/resources/META-INF/assets/SubmissionEvaluations.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionEvaluations.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,212 +1,0 @@
-.sqlcode {
-	padding: 0.1em !important;
-	font-size: 75%;
-	/*white-space: pre-wrap;
-	break-word: all;*/
-	overflow: scroll;
-}
-
-.colSql {
-	
-}
-
-th {
-/*
-	font-size: 65% !important;
-	overflow: scroll;
-*/
-}
-
-td[data-grid-property="submission"] {
-        max-width: 40rem;
-}
-
-
-td[data-grid-property="assessment"] {
-	max-width: 20rem;
-}
-
-code p {
-	margin-top: 0px;
-	margin-bottom: 0px;
-	padding: 0px;
-}
-
-.submittedCode {
-	max-width: 60em;
-	max-height: 12em;
-	font-size: 75%;
-	line-height: 0.85em !important;
-}
-
-.submittedText {
-        max-width: 60em;
-        max-height: 14em;
-        line-height: 110% !important;
-}
-
-#zSolution {
-	min-height:30em !important;
-}
-
-.modalSubmission {
-	max-height: 10em !important;
-	background: var(--main-bg-color-accent) !important;
-	padding: 0.5em !important;
-	line-height: 100% !important;
-	min-height: 28rem;
-	font-size:90%; 
-}
-
-pre#kodot {
-	font-size: 75% !important;
-	line-height: 0.8em !important;
-	height: 25.5em !important;
-	overflow: auto;
-	white-space: pre-wrap !important;
-}
-
-pre#kodot img {
-	max-width: 200%;
-}
-
-.feedback {
-	max-height: 10em !important;
-	background: var(--main-bg-color-accent) !important;
-	padding: 0.5em;
-	/* 	max-width: 15em; */
-	z-index: 5000 !important;
-}
-
-.feedback .comment {
-	background: #dfd020;
-	color: black;
-}
-
-.feedback .inlinecomment {
-	background: #dfd020;
-	color: black;
-	padding: 0.25em;
-}
-
-.feedback img {
-	width:120%;
-}
-
-table.tblCompareData tbody {
-	background: var(  --main-bg-color);
-	font-size: 85%;
-}
-
-table tbody tr.correct {
-	background: var(--color-correct) !important;
-}
-
-table tbody tr.incorrect {
-	background: var(--color-incorrect) !important;
-}
-
-table tbody tr.noeval {
-	background: var(--color-noevaluation) !important;
-}
-
-table tbody tr.exception {
-	background: var(--color-exception) !important;
-}
-
-#solution {
-	min-height: 20em;
-}
-
-.modal #solution {
-	min-height: 50em !important;
-}
-
-.nonSqlSolution .code {
-	white-space: pre-wrap;
-	break-word: all;
-	line-height:1.2em;
-}
-
-.sqlSolution .code {
-	font-size:80%;
-	line-height:1em;
-}
-
-.correct svg {
-	stroke: black !important; 
-	stroke-width: 2px !important;
-}
-
-.incorrect svg {
-	stroke: black !important; 
-	stroke-width: 2px !important;
-}
-
-.inSubmission {
-	background: green;
-	color: white;
-	padding:0.1em;
-}
-
-.inCorrectSolution {
-	background: white;
-	color: black;
-	padding:0.1em;
-}
-
-
-/* fullscreen modal */
-.modal {
-  padding: 0 !important;
-}
-
-.modal .modal-dialog {
-  width: 100%;
-  max-width: none;
-  height: 100%;
-  margin: 0;
-}
-
-.modal .modal-content {
-  height: 100%;
-  border: 0;
-  border-radius: 0;
-}
-
-.modal .modal-body {
-  overflow-y: auto;
-}
-
-.grade-pos2 {
-	background-color: var(--color-correct-better);
-	color: white;
-}
-
-.grade-pos {
-	background-color: var(--color-correct);
-	color: white;
-}
-
-.grade-zero {
-	background-color: var(--color-incorrect);
-	color: white;
-}
-
-.grade-neg {
-	background-color: var(--color-incorrect-wrong);
-	color: yellow;
-}
-
-.actions {
-	white-space: nowrap; 
-	background:var(--main-bg-color2);
-}
-
-#zModal input[type="checkbox"] {
-  transform:scale(3, 3);
-}
-
-#zModal #type,#grade {
-  width: 12em;
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionLogViewer.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionLogViewer.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionLogViewer.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -0,0 +1,159 @@
+.sqlcode {
+	padding: 0.1em !important;
+	font-size: 75%;
+	white-space: pre-wrap;
+	break-word: all;
+	overflow: scroll;
+}
+
+.colSql {
+	
+}
+
+th {
+	font-size: 65% !important;
+	overflow: scroll;
+}
+
+td {
+	font-size: 70% !important;
+	overflow: auto;
+}
+
+td[data-grid-property="submittedOn"] {
+	/* 	width: 10em !important; */
+	
+}
+
+td[data-grid-property="evaluationExam"] {
+	width: 4em !important;
+	max-width: 5em !important;
+	word-break: break-all;
+}
+
+td[data-grid-property="evaluationSimple"] {
+	width: 4em !important;
+	max-width: 5em !important;
+	word-break: break-all;
+}
+
+td[data-grid-property="evaluationComplex"] {
+	width: 4em !important;
+	max-width: 5em !important;
+	word-break: break-all;
+}
+
+td[data-grid-property="notForEvaluation"] {
+	width: 4em !important;
+	max-width: 5em !important;
+	word-break: break-all;
+}
+
+td[data-grid-property="submittedBy"] {
+	width: 9em !important;
+}
+
+td[data-grid-property="task"] {
+	max-width: 10em;
+}
+
+td[data-grid-property="submission"] {
+	
+}
+
+td[data-grid-property="submission"] .code {
+	font-size: 75% !important;
+	line-height: 0.8em !important;
+	height: 23em !important;
+	width: 99% !important;
+	white-space: pre-wrap;
+}
+
+td[data-grid-property="submission"] .code img {
+	max-width: 80% !important;
+}
+
+td[data-grid-property="assessment"] {
+	max-width: 12em !important;
+}
+
+td[data-grid-property="assessment"] pre {
+	font-size: 75% !important;
+	line-height: 0.8em !important;
+	max-height: 10em !important;
+	white-space: pre-wrap;
+}
+
+td a.btn {
+	font-size: 65%;
+}
+
+td[data-grid-property="clientInfo"] {
+	max-width: 10%;
+}
+
+td[data-grid-property="ipAddress"] {
+	max-width: 10%;
+}
+
+code p {
+	margin-top: 0px;
+	margin-bottom: 0px;
+	padding: 0px;
+}
+
+.modalSubmission {
+	min-height: 13em;
+}
+
+pre#kodot {
+	font-size: 75% !important;
+	line-height: 0.8em !important;
+	height: 25.5em !important;
+	overflow: auto;
+	white-space: pre-wrap !important;
+}
+
+pre#kodot img {
+	max-width: 200%;
+}
+
+.feedback {
+	max-height: 10em !important;
+	background: white !important;
+	padding: 0.25em;
+	/* 	max-width: 15em; */
+	z-index: 5000 !important;
+}
+
+.feedback .comment {
+	background: yellow;
+}
+
+.feedback .inlinecomment {
+	background: yellow;
+}
+
+table tbody tr.correct {
+	background: var(- -color-correct) !important;
+}
+
+table tbody tr.incorrect {
+	background: var(- -color-incorrect) !important;
+}
+
+table tbody tr.noeval {
+	background: var(- -color-noevaluation) !important;
+}
+
+table tbody tr.exception {
+	background: var(- -color-exception) !important;
+}
+
+.modal-dialog {
+	width: 70%;
+}
+
+.card-body {
+	padding: 0.5em;
+}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/TestAdmin.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/TestAdmin.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/TestAdmin.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,5 +1,4 @@
 .resultschema {
-        color: var(--dark);
-        background: var(--light);
+	display: none;
 }
 
@@ -15,5 +14,5 @@
 	left: 5em;
 	right: 5em;
-	background: var(--main-bg-color-accent);
+	background: white;
 	border: 1px solid black;
 	border-radius: 12px;
Index: LearnStar-webApp/src/main/resources/META-INF/assets/TranslationPage.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/TranslationPage.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,4 +1,0 @@
-.translation {
-	max-height: 10em !important;
-	overflow: auto;
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/ckeditor-custom.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/ckeditor-custom.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/ckeditor-custom.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -13,5 +13,5 @@
 
 .resultschema {
-	background: #e0e0e0;
+	background: #d0d0ff;
 	margin-left: 0.5em;
 	margin-right: 0.5em;
@@ -20,6 +20,4 @@
 div.box {
 	padding: 0.5em;
-	background: #e8e8ff;
-	border-left: 3px black solid;
+	background: #e0e0e0;
 }
-
Index: LearnStar-webApp/src/main/resources/META-INF/assets/feedback-styles.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/feedback-styles.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,11 +1,0 @@
-.box {
-	padding: 0.5em;
-	background: var(--main-bg-color-box);
-	border-left: 3px black solid;
-}
-
-.box::before {
-  content: "";
-  color: black;
-  font-weight: 700;
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/site-overrides.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/site-overrides.css	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/site-overrides.css	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,66 +1,46 @@
 :root {
-	--ck-z-default: 100;
-	--ck-z-modal: calc(var(--ck-z-default)+ 999);
-	--color-incorrect-wrong: #600f16ff;
+    --ck-z-default: 100;
+    --ck-z-modal: calc( var(--ck-z-default) + 999 );
+
 	/* https://www.w3schools.com/colors/colors_british.asp - Carnival red */
-	--color-incorrect: #e1553eff;
+	--color-incorrect: #c71c2c;
+
 	/* https://www.w3schools.com/colors/colors_british.asp - Bright green / Goblin / Garland */
-	--color-correct: #74b979ff;
-	/* https://www.w3schools.com/colors/colors_british.asp - Olive green */
-	--color-correct-better: #484837ff;
+	--color-correct: #74b979;
+
 	--color-noevaluation: #white;
 	--color-exception: #404040;
-	--main-bg-color-accent: #eceef3ff;
-	--main-bg-color-accent2: #00000080;
-	--inlinecomment-bg-color: #cfef60;
 }
 
-@media ( prefers-color-scheme : dark) {
-	:root {
-		--main-bg-color: #260661ff;
-		--main-bg-color2: #260661ff;
-		--main-bg-color3: #42119cff;
-		--main-bg-color-box: #42119cff;
-		--main-bg-color-accent: #330B7Dff;
-		--main-bg-color-accent2: #00000080;
-		--main-font-color: white;
-		--main-font-color-hover: #E9FA5A;
-		--main-link-color: #A074F0;
-		--yt-font-color: #8E6600;
-		--sidebar-bg-color: #260661ff;
-		--main-border-color: rgb(0, 0, 0, 0.15);
-		--main-underline-color: rgba(255, 255, 255, 128);
-		--light: #080704;
-		--dark: #d4dac0;
-		--bs-body-bg: rgb(16, 16, 16);
-		--bs-body-color: white;
-		--bs-light-rgb: rgba(42, 42, 42, 0.5);
-		--bs-bg-opacity: rgba(42, 42, 42, 0.5);
-		/* https://www.w3schools.com/colors/colors_british.asp - Carnival red */
-		--color-incorrect: #7b000c;
-		/* https://www.w3schools.com/colors/colors_british.asp - Bright green / Goblin / Garland */
-		--color-correct: #277c2c;
-		--inlinecomment-bg-color: #8faf10;
-	}
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+    font-family: 'Fira Sans', Helvetica, Arial, sans-serif !important;
 }
 
-body, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
-	font-family: 'Fira Sans', Helvetica, Arial, sans-serif !important;
+h1,.h1 {
+	font-size:200%;
 }
 
-h1, .h1 {
-	font-size: 200%;
+h2,.h2 {
+	font-size:160%;
 }
 
-h2, .h2 {
-	font-size: 160%;
-}
-
-h3, .h3 {
-	font-size: 130%;
+h3,.h3 {
+	font-size:130%;
 }
 
 body {
-	padding-top: 4.5em;
+	padding-top: 4em;
 }
 
@@ -79,21 +59,4 @@
 }
 
-.result-queryError {
-	background: var(--color-incorrect);
-}
-
-.result-queryCorrect {
-	background: var(--color-correct);
-}
-
-.result-passed {
-	font-weight: 900;
-	color: #a0ffa0;
-}
-
-.result-notpassed {
-	color: white;
-}
-
 .centered-hv {
 	text-align: center;
@@ -106,34 +69,34 @@
 
 .inlinecomment {
-	background: var(--inlinecomment-bg-color);
-	margin-left: 5rem;
+	background: #ffffa0;
+	margin-left:5rem;
 	border-left: 1px solid black;
-	padding: 0.1rem;
-	padding-left: 0.5rem;
+	padding-left:0.5rem;
 }
 
 @keyframes slidein {
-	from { 
-		background:white; 
-	}
-	50% { 
-		background:#ffffa0; 
-	}
-	to { 
-		background: white; 
-	}
+  from { background: white; }
+  50% { background: #ffffa0; }
+  to { background: white; }
 }
 
 .pagination li {
-	margin-left: 0.5em;
+	margin-left:0.5em;
+}
+
+.maxpoints {
+	background: #c0c0c0;
+	font-weight: bold;
+	border-radius: 0.25em;
+	padding: 0.2em;
 }
 
 #mainnav {
-	background-color: #42119c !important; /* osnovna boja */
+	background-color: #42119c !important;  /* osnovna boja */
 }
 
 #mainnav .nav-link {
 	/* Paletton Shiny */
-	color: #A074F0 !important;
+	color: #A074F0 !important; 
 }
 
@@ -150,11 +113,4 @@
 }
 
-.maxpoints {
-	background: #c0c0c0;
-	font-weight: bold;
-	border-radius: 0.25em;
-	padding: 0.2em;
-}
-
 .CodeMirror {
 	border: 1px solid grey;
@@ -162,5 +118,5 @@
 	height: 25rem !important;
 	min-height: 10em;
-	font-family: 'Fira Code', monospace, mono !important;
+	font-family: 'Fira Code', monospace, mono !important; 
 }
 
@@ -169,89 +125,2 @@
 }
 
-.datefield-popup {
-	background: white;
-	color:black !important;
-	padding: 0.5em;
-	border-radius: 6px;
-	border: 1px solid black;
-}
-
-.glyphicon-calendar {
-	background-color: var(--light);
-	color: var(--dark);
-}
-
-.glyphicon-calendar::before {
-	content: "📅";
-}
-
-.datePicker .glyphicon-chevron-left::before {
-	content: "<";
-}
-
-.datePicker .glyphicon-chevron-right::before {
-	content: ">";
-}
-
-.solutionCorrect {
-	background-color: var(--color-correct) !important;
-}
-
-.solutionInCorrect {
-	background-color: var(--color-incorrect) !important;
-}
-
-@media ( prefers-color-scheme : dark) {
-	a {
-		color: #E2F72F;
-	}
-	a:hover {
-		color: #A1B400;
-	}
-	body {
-		background-color: var(--main-bg-color2);
-		color: var(--main-font-color);
-	}
-	.card {
-		background-color: var(--main-bg-color) !important;
-		border-color: var(--main-bg-color3) !important;
-	}
-	.card-header {
-		background-color: var(--main-bg-color-accent) !important;
-	}
-    .testType .card-header.bg-success {
-            background-color: var(--color-correct) !important;
-    }
-	.card-header h3 {
-		color: var(--main-font-color) !important;
-	}
-	.bg-light {
-		background-color: var(--main-bg-color3) !important;
-	}
-	.table {
-		color: var(--main-font-color);
-	}
-	.table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
-		background-color: var(--main-bg-color-accent);
-		color: var(--main-font-color-hover);
-	}
-	.dropdown-menu {
-		background-color: var(--main-bg-color2);
-	}
-	.dropdown-menu a {
-		color: var(--main-link-color) !important;
-	}
-	pre {
-		color: var(--main-font-color);
-	}
-	.modal-content {
-		background-color: var(--main-bg-color2);
-		border-color: var(--main-bg-color2);
-	}
-	.cke_wysiwyg_frame {
-		background-color: #6060ff !important;
-	}
-	p.comment {
-		background: #7C8B00;
-	}
-}
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/ModalBox.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/ModalBox.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/ModalBox.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -22,8 +22,10 @@
 
 	var activate = function(modalId, options) {
+		console.log("MODAL ACTIVATE");
 		$('#' + modalId).modal(options);
 	}
 
 	var hide = function(modalId) {
+		console.log("MODAL HIDE");
 		var $modal = $('#' + modalId);
 		if ($modal.length > 0) {
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config-admin.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config-admin.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config-admin.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -24,6 +24,6 @@
 	},
 	paths: {
-		'ckeditor-core': '../webjars/ckeditor/4.19.0/standard/ckeditor',
-		'ckeditor-jquery': '../webjars/ckeditor/4.19.0/standard/adapters/jquery'
+		'ckeditor-core': '../webjars/ckeditor/4.16.1/standard/ckeditor',
+		'ckeditor-jquery': '../webjars/ckeditor/4.16.1/standard/adapters/jquery'
 	}
 });
@@ -36,5 +36,5 @@
 				specialChars: ['σ', 'θ', 'π', '⨯', '⋈', 'ρ', '÷', '&cup;', '&cap;',
 					'←', '→', '∨', '∧', '¬', '∀', '∃', '∄', '∈', '∉', '⊂', '⊃',
-					'⊆', '⊇', '≤', '≠', '≥', '»' ],
+					'⊆', '⊇', '≤', '≠', '≥'],
 				toolbarGroups: [
 					{ "name": "basicstyles", "groups": ["basicstyles"] },
@@ -46,5 +46,5 @@
 				stylesSet: [
 					{
-						name: 'Quote',
+						name: 'Box',
 						element: 'div',
 						attributes: { 'class': 'box' }
@@ -65,6 +65,5 @@
 				removeButtons: 'Anchor,Strike,blockquote',
 				contentsCss: [spec.csspath],
-				baseFloatZIndex: 40000,
-				height: '22rem'
+				baseFloatZIndex: 40000
 			});
 	};
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -24,6 +24,6 @@
 	},
 	paths: {
-		'ckeditor-core': '../webjars/ckeditor/4.19.0/standard/ckeditor',
-		'ckeditor-jquery': '../webjars/ckeditor/4.19.0/standard/adapters/jquery'
+		'ckeditor-core': '../webjars/ckeditor/4.16.1/standard/ckeditor',
+		'ckeditor-jquery': '../webjars/ckeditor/4.16.1/standard/adapters/jquery'
 	}
 });
Index: LearnStar-webApp/src/main/resources/META-INF/modules/codemirror-error.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-error.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,37 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the dbLearnStar system (hereinafter: dbLearn*).
- *     
- * dbLearn* is free software: you can redistribute it and/or modify it under the 
- * terms of the GNU General Public License as published by the Free Software 
- * Foundation, either version 3 of the License, or (at your option) any later 
- * version.
- *     
- * dbLearn* is distributed in the hope that it will be useful, but WITHOUT ANY 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
- * details.
- *     
- * You should have received a copy of the GNU General Public License along 
- * with dbLearn*.  If not, see <https://www.gnu.org/licenses/>.
- * 
- ******************************************************************************/
-
-define(["jquery", "bootstrap/modal"], function($) {
-
-	var positionToError = function(errorPosition) {
-		line = window.editor.posFromIndex(errorPosition).line;
-		col = window.editor.posFromIndex(errorPosition).ch;
-		if (col > 1)
-			line++;
-		realposition = window.editor.posFromIndex(errorPosition - line);
-		window.editor.focus();
-		window.editor.setCursor(realposition);
-	}
-
-	return {
-		positionToError: positionToError
-	}
-
-});
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-run.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-run.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-run.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -39,101 +39,70 @@
 					hintOptions: {
 						tables: {
-							aktivnosti: ["a_id", "a_naslov", "a_opis", "a_procenka_chasovi_rabota", "a_glavna_aktivnost_id", "p_id"],
-							apteka: ["aptid", "aptime", "aptadresa"],
-							apteki: ["a_id", "aime"],
-							apteki_lokacii: ["a_id", "a_reden_br", "adresa", "tel_broj"],
-							apttelbroj: ["aptid", "telbroj"],
-							asistentiistrazhuvachi: ["br_chovek_stud", "br_chovek_prof", "br_proekt"],
-							banki: ["banka_id", "b_naziv", "b_adresa", "grad_id"],
-							banki: ["banka_id", "b_naziv", "b_adresa", "grad_id"],
-							bilshef: ["br_oddel", "datum_od", "br_chovek"],
-							chovek: ["lid", "lime"],
-							davapari: ["br_proekt", "br_sponzor"],
-							dogovor: ["fkomid", "aptid", "lid", "datumpoc", "datumkraj", "sodrzhina"],
-							dogovori: ["fk_id", "a_id", "datum_skl", "l_id", "datum_ist", "sodrzhina"],
-							doktori: ["l_id", "rab_iskustvo", "specijalnost"],
-							doktor: ["lid", "docmbr", "rabiskustvo", "specijalnost"],
-							edinici: ["eid", "eime"],
-							ekspozituri: ["banka_id", "eksp_br", "e_naziv", "e_adresa", "grad_id"],
-							ekvivalencii: ["predmet_pid", "ekvivalenten_na_pid"],
-							evaluacii: ["l_id", "z_reden_broj", "e_reden_broj", "e_naslov", "e_opis", "e_ocenka", "e_izvrshil_l_id", "datum_ocenuvanje"],
-							farmakomi_broevi: ["fk_id", "fk_reden_br", "tel_broj"],
-							farmakomi: ["fk_id", "fk_ime"],
-							fkompanija: ["fkomid", "fkomime"],
-							fkomtelbroj: ["fkomid", "telbroj"],
-							formiraniod: ["eid", "nid"],
-							gradovi: ["grad_id", "g_naziv"],
-							ima: ["kod", "oid"],
-							istrazhuvachi: ["br_chovek", "br_proekt"],
-							lek: ["lekid", "lekime", "sostav"],
-							lekovi: ["fk_id", "prod_id", "l_ime", "sostav"],
-							listaizbrani: ["sid", "semestar", "pid", "ocenka"],
-							lugje: ["identifikator", "ime", "adresa", "br_chovek", "embg", "ime_chovek", "vozrast"],
-							lugje: ["l_id", "ime", "adresa", "embg", "drzhava"],
-							lugje: ["l_id", "ime", "prezime", "email", "datum_ragjanje"],
-							lugje: ["l_id", "ime", "prezime", "embg", "datum_ragj"],
-							matichen: ["liddok", "lidpac", "mbroj"],
-							matichen_na: ["p_l_id", "m_datum_poch", "m_datum_kraj", "d_l_id"],
-							mentori: ["midentifikator"],
-							mesta: ["m_id", "m_ime"],
-							mozhe_da_se_natprevaruva: ["l_id", "o_id"],
-							nasoki: ["nid", "nime", "nmaxkrediti", "vkupnokreditidiplomiranje"],
-							nastavnici: ["l_id"],
-							nastavnici: ["nidentifikator", "uchid"],
-							natprevari: ["kod", "mesec", "opseg", "rang", "naziv"],
+							supervizor: ["lid"],
+							recept: ["recid", "datum", "doza", "liddok", "lidpac", "mbroj", "lekid"],
+							uchenici: ["uidentifikator", "uchid"],
+							studenti: ["br_chovek", "vid_studii", "br_chovek_sovetnik", "br_oddel"],
+							proekti: ["br_proekt", "ime_proekt", "br_chovek"],
 							oblasti: ["br_oblast", "ime_oblast"],
-							oblasti: ["o_id", "o_naziv"],
-							oblasti: ["oid", "onaziv"],
-							oblast_na_natprevar: ["kod", "o_id"],
-							oceneto: ["kod", "m_id", "datum", "red_broj", "l_id", "ocenuvach_l_id"],
-							ocenuvachi: ["l_id"],
-							ocenuvachi: ["oidentifikator"],
-							ocenuva: ["kod", "data", "oidentifikator"],
-							ocenuvale: ["kod", "m_id", "datum", "l_id"],
-							oddeli: ["br_oddel", "ime_oddel", "br_chovek", "br_oblast"],
-							odgovorni_lica: ["smetka_br", "trans_br", "banka_id", "vrab_br"],
-							osvoeni: ["kod", "data", "uidentifikator", "midentifikator", "oidentifikator", "mesto", "bodovi"],
-							pacienti: ["l_id", "p_adresa"],
-							pacient: ["lid", "pacmbr", "pacadresa", "datumragj"],
-							podoblasti_nadoblasti: ["o_id", "nadoblast_o_id"],
 							predmeti: ["pid", "pime", "pkrediti"],
 							prijavnilistovi: ["sid", "semestar", "status"],
-							prodava: ["fk_id", "prod_id", "a_id", "cena"],
+							nasoki: ["nid", "nime", "nmaxkrediti", "vkupnokreditidiplomiranje"],
+							realizacii: ["kod", "data", "mesto"],
+							ocenuvachi: ["oidentifikator"],
+							natprevari: ["kod", "mesec", "opseg", "rang", "naziv"],
+							apteka: ["aptid", "aptime", "aptadresa"],
+							uchilishta: ["uchid", "uchnaziv", "uchadresa"],
+							edinici: ["eid", "eime"],
+							mentori: ["midentifikator"],
+							upisi: ["sid", "redbr", "semestar_od", "semestar_do", "zapishan_na_nasoka_nid"],
+							uchestvuval: ["kod", "data", "uchid", "uidentifikator", "midentifikator"],
+							lek: ["lekid", "lekime", "sostav"],
+							nastavnici: ["nidentifikator", "uchid"],
+							bilshef: ["br_oddel", "datum_od", "br_chovek"],
+							studenti: ["sid", "sindeks", "sime", "semail", "matichna_eid"],
+							fkompanija: ["fkomid", "fkomime"],
+							znae: ["uidentifikator", "oid"],
+							profesori: ["br_chovek", "specijalnost", "titula"],
+							istrazhuvachi: ["br_chovek", "br_proekt"],
+							oblasti: ["oid", "onaziv"],
+							asistentiistrazhuvachi: ["br_chovek_stud", "br_chovek_prof", "br_proekt"],
+							matichen: ["liddok", "lidpac", "mbroj"],
+							ima: ["kod", "oid"],
 							prodavaprodukt: ["aptid", "fkomid", "prodid", "cena"],
+							ekvivalencii: ["predmet_pid", "ekvivalenten_na_pid"],
+							fkomtelbroj: ["fkomid", "telbroj"],
+							pacient: ["lid", "pacmbr", "pacadresa", "datumragj"],
+							apttelbroj: ["aptid", "telbroj"],
+							zakazhano: ["kod", "data", "uchid"],
+							chovek: ["lid", "lime"],
+							osvoeni: ["kod", "data", "uidentifikator", "midentifikator", "oidentifikator", "mesto", "bodovi"],
+							formiraniod: ["eid", "nid"],
+							sponzori: ["br_sponzor", "ime_sponzor"],
+							doktor: ["lid", "docmbr", "rabiskustvo", "specijalnost"],
+							ocenuva: ["kod", "data", "oidentifikator"],
+							raboti: ["br_chovek", "br_oddel", "procent"],
+							davapari: ["br_proekt", "br_sponzor"],
+							zadolzhitelni: ["nid", "pid"],
 							produkt: ["fkomid", "prodid", "maxcena", "lekid", "prodime"],
-							proekti: ["br_proekt", "ime_proekt", "br_chovek"],
+							dogovor: ["fkomid", "aptid", "lid", "datumpoc", "datumkraj", "sodrzhina"],
+							oddeli: ["br_oddel", "ime_oddel", "br_chovek", "br_oblast"],
+							shefovi: ["br_oddel", "datum_od", "datum_do"],
+							listaizbrani: ["sid", "semestar", "pid", "ocenka"],
+							uchestvuval_vo: ["l_id", "p_id", "uloga"],
+							aktivnosti: ["a_id", "a_naslov", "a_opis", "a_procenka_chasovi_rabota", "a_glavna_aktivnost_id", "p_id"],
+							zapisnici: ["l_id", "z_reden_broj", "z_naslov", "z_opis", "z_rabotel_chasovi", "a_id", "datum_podnesen"],
+							evaluacii: ["l_id", "z_reden_broj", "e_reden_broj", "e_naslov", "e_opis", "e_ocenka", "e_izvrshil_l_id", "datum_ocenuvanje"],
+							lugje: ["identifikator", "ime", "adresa", "br_chovek", "embg", "ime_chovek", "vozrast"],
+							lugje: ["l_id", "ime", "prezime", "email", "datum_ragjanje"],
 							proekti: ["p_id", "p_naslov", "p_opis"],
-							profesori: ["br_chovek", "specijalnost", "titula"],
-							rabotel_vo: ["l_id", "u_id"],
-							raboti: ["br_chovek", "br_oddel", "procent"],
-							raboti_kako: ["banka_id", "vrab_br", "rabmesto_id"],
-							rabotni_mesta: ["rabmesto_id", "rm_naziv"],
-							realizacii: ["kod", "data", "mesto"],
-							realizacii: ["kod", "m_id", "datum"],
-							recepti: ["p_l_id", "d_l_id", "datum_izd", "fk_id", "prod_id", "doza"],
-							recept: ["recid", "datum", "doza", "liddok", "lidpac", "mbroj", "lekid"],
-							registracii: ["kod", "m_id", "datum", "red_broj", "u_id"],
-							shefovi: ["br_oddel", "datum_od", "datum_do"],
-							sponzori: ["br_sponzor", "ime_sponzor"],
-							studenti: ["br_chovek", "vid_studii", "br_chovek_sovetnik", "br_oddel"],
-							studenti: ["sid", "sindeks", "sime", "semail", "matichna_eid"],
-							supervizori: ["l_id"],
-							supervizor: ["lid"],
-							uchenici: ["l_id"],
-							uchenici: ["uidentifikator", "uchid"],
-							uchestva_na_uchenici: ["kod", "m_id", "datum", "red_broj", "l_id", "ostvareni_bodovi", "osvoeno_mesto"],
-							uchestvuval: ["kod", "data", "uchid", "uidentifikator", "midentifikator"],
-							uchestvuval_vo: ["l_id", "p_id", "uloga"],
-							uchilishta: ["uchid", "uchnaziv", "uchadresa"],
-							uchilishta: ["u_id", "u_naziv", "l_id"],
-							upisi: ["sid", "redbr", "semestar_od", "semestar_do", "zapishan_na_nasoka_nid"],
-							vraboteni: ["banka_id", "vrab_br", "v_embg", "v_ime", "godina_vrab"],
-							zadolzhitelni: ["nid", "pid"],
-							zakazhano: ["kod", "data", "uchid"],
-							zapisnici: ["l_id", "z_reden_broj", "z_naslov", "z_opis", "z_rabotel_chasovi", "a_id", "datum_podnesen"],
-							znae: ["uidentifikator", "oid"],
 						}
 					}
 				});
+		line = window.editor.posFromIndex(queryTestErrorPosition).line;
+		col = window.editor.posFromIndex(queryTestErrorPosition).ch;
+		if (col > 1)
+			line++;
+		realposition = window.editor.posFromIndex(queryTestErrorPosition - line);
+		window.editor.setCursor(realposition);
 
 	});
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/execSelection.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/execSelection.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/execSelection.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -22,13 +22,13 @@
 
 	$(document).keydown(function(e) {
-		if (e.ctrlKey && e.which == 13) {
-			$('#RunOnlySelection').click();
-			//event.preventDefault();
-			return false;
-		}
-	}
-	);
+            if(e.ctrlKey && e.which == 13) {
+                $('#RunOnlySelection').click();
+                //event.preventDefault();
+                return false;
+            }
+        }
+    );
 
-	function getEditorText(onlySelection) {
+	$('#RunOnlySelection').click(function() {
 		tekst = "";
 		if (typeof window.editor === 'undefined') {
@@ -46,19 +46,10 @@
 		} else {
 			// CodeMirror
-			if (onlySelection) {
-				tekst = window.editor.getSelection();
-			} else {
-				tekst = window.editor.getValue();
-			}
+			tekst = window.editor.getSelection();
 		}
 
 		if (tekst == null) tekst = "NULL";
+
 		if (tekst == "") tekst = "NULL";
-
-		return tekst;
-	}
-
-	$('#RunOnlySelection').click(function() {
-		tekst = getEditorText(true);
 
 		ajax("execSelection", {
@@ -73,5 +64,25 @@
 
 	$('#RunOnly').click(function() {
-		tekst = getEditorText(false);
+		tekst = "";
+		if (typeof window.editor === 'undefined') {
+			tekst = "NOEDITOR";
+			if (typeof CKEDITOR === 'undefined') {
+				tekst = "NOCMEDNOCKED";
+			} else {
+				var editorarea = CKEDITOR.instances['editorarea'];
+				if (typeof editorarea === 'undefined') {
+					tekst = "OTHERCK";
+				} else {
+					tekst = editorarea.getData();
+				}
+			}
+		} else {
+			// CodeMirror
+			tekst = window.editor.getValue();
+		}
+
+		if (tekst == null) tekst = "NULL";
+
+		if (tekst == "") tekst = "NULL";
 
 		ajax("execAll", {
@@ -86,5 +97,25 @@
 
 	$('#Evaluate').click(function() {
-		tekst = getEditorText(false);
+		tekst = "";
+		if (typeof window.editor === 'undefined') {
+			tekst = "NOEDITOR";
+			if (typeof CKEDITOR === 'undefined') {
+				tekst = "NOCMEDNOCKED";
+			} else {
+				var editorarea = CKEDITOR.instances['editorarea'];
+				if (typeof editorarea === 'undefined') {
+					tekst = "OTHERCK";
+				} else {
+					tekst = editorarea.getData();
+				}
+			}
+		} else {
+			// CodeMirror
+			tekst = window.editor.getValue();
+		}
+
+		if (tekst == null) tekst = "NULL";
+
+		if (tekst == "") tekst = "NULL";
 
 		ajax("evalAll", {
@@ -99,5 +130,25 @@
 
 	$('#PlanOnly').click(function() {
-		tekst = getEditorText(false);
+		tekst = "";
+		if (typeof window.editor === 'undefined') {
+			tekst = "NOEDITOR";
+			if (typeof CKEDITOR === 'undefined') {
+				tekst = "NOCMEDNOCKED";
+			} else {
+				var editorarea = CKEDITOR.instances['editorarea'];
+				if (typeof editorarea === 'undefined') {
+					tekst = "OTHERCK";
+				} else {
+					tekst = editorarea.getData();
+				}
+			}
+		} else {
+			// CodeMirror
+			tekst = window.editor.getValue();
+		}
+
+		if (tekst == null) tekst = "NULL";
+
+		if (tekst == "") tekst = "NULL";
 
 		ajax("plan", {
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/stillAlive.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/stillAlive.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/stillAlive.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -33,5 +33,5 @@
 				} else {
 					tekst = editorarea.getData();
-					if (tekst.length > 1000000) {
+					if (tekst.length > 8000) {
 						tekst = "VERYLONGTEXT";
 					}
@@ -52,21 +52,7 @@
 				"issuer": "stillAlive"
 			},
-			method: "POST",
-			success: function(response) {
-				$("#serverStatus").text("");
-				$("#serverStatus").removeClass("mt-2 alert alert-danger");
-			},
-			failure: function(response) {
-				$("#serverStatus").text("Your browser is no longer able to establish a connection to the web-page at the server. Please save your work to a local file, and try to submit it later.");
-				$("#serverStatus").removeClass("mt-2 alert alert-danger");
-				$("#serverStatus").addClass("mt-2 alert alert-danger");
-			},
-			exception: function(response) {
-				$("#serverStatus").text("A problem has occurred. Please save your work to a local file, and try to submit it later.");
-				$("#serverStatus").removeClass("mt-2 alert alert-danger");
-				$("#serverStatus").addClass("mt-2 alert alert-danger");
-			}
+			method: "POST"
 		});
-	}, 30000);
+	}, 10000);
 
 });
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/zoneUpdateEffect.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/zoneUpdateEffect.js	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/zoneUpdateEffect.js	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -19,8 +19,8 @@
  ******************************************************************************/
 
-define(["jquery", "t5/core/dom", "t5/core/events"], function($, dom, events) {
+define([ "jquery", "t5/core/dom", "t5/core/events" ], function($, dom, events) {
 
 	$('*[data-container-type="zone"]').on(events.zone.didUpdate, function() {
-		$(this).css("animation", "0.5s linear slidein");
+		$(this).css("animation", "0.3s linear slidein");
 	});
 
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Code.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Code.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Code.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,8 +1,12 @@
-<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
 	xmlns:p="tapestry:parameter">
 <t:content>
 	<t:if t:test="!nullValue">
 		<t:if t:test="value">
-			<pre id="${id}" class="pre-scrollable code ${allClasses}"><code><t:outputraw t:value="escapedValue"></t:outputraw></code></pre>
+			<pre id="${id}" class="pre-scrollable code ${allClasses}">
+				<code>
+					<t:outputraw t:value="value"></t:outputraw>
+				</code>
+			</pre>
 		</t:if>
 	</t:if>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Layout.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Layout.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Layout.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -34,30 +34,7 @@
 			<ul class="navbar-nav mr-auto">
 				<t:if t:test="userInfo?.student">
-					<li class="nav-item dropdown"><a
-						class="nav-link dropdown-toggle" href="#" id="mainMenuStudent"
-						role="button" data-toggle="dropdown" aria-haspopup="true"
-						aria-expanded="false">${message:studentMenu-label}</a>
-						<div class="dropdown-menu" aria-labelledby="mainMenuStudent">
-							<t:loop t:source="studentPageNames" t:value="pageName">
-								<a class="dropdown-item ${classForPageName}" t:type="pagelink"
-									t:page="prop:pageName">${pageNameTitle}</a>
-							</t:loop>
-							<a class="dropdown-item " href="${message:materials-url}" target="_blank">${message:materials-label}
-								<t:SVGIcon t:path="external-link" t:width="16" />
-							</a>
-						</div></li>
-
-				</t:if>
-				<t:if t:test="userInfo?.instructor">
-					<li class="nav-item dropdown"><a
-						class="nav-link dropdown-toggle" href="#" id="mainMenuInstructor"
-						role="button" data-toggle="dropdown" aria-haspopup="true"
-						aria-expanded="false">${message:instructorMenu-label}</a>
-						<div class="dropdown-menu" aria-labelledby="mainMenuInstructor">
-							<t:loop t:source="instructorPageNames" t:value="pageName">
-								<a class="dropdown-item ${classForPageName}" t:type="pagelink"
-									t:page="prop:pageName">${pageNameTitle}</a>
-							</t:loop>
-						</div></li>
+					<li class="nav-item" t:type="loop" t:source="studentPageNames"
+						t:value="pageName"><a class="nav-link ${classForPageName}"
+						t:type="pagelink" t:page="prop:pageName">${pageNameTitle}</a></li>
 				</t:if>
 				<t:if t:test="userInfo?.administrator">
@@ -92,7 +69,7 @@
 					</div></li>
 			</ul>
+			<!-- /.navbar-collapse -->
 		</div>
 	</nav>
-
 	<div class="container-fluid">
 		<div class="row">
@@ -101,7 +78,5 @@
 			</div>
 		</div>
-
 		<t:body />
-
 		<hr />
 		<footer>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/ModalBox.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/ModalBox.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/ModalBox.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,5 +1,5 @@
 <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
 <t:content>
-	<div class="modal ${additionalClass}" id="${clientId}"
+	<div class="modal fade ${additionalClass}" id="${clientId}"
 		tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
 		aria-hidden="true">
@@ -7,4 +7,8 @@
 			<div class="modal-content">
 				<div class="modal-body">
+					<button type="button" class="close mb-3" data-dismiss="modal"
+						aria-label="Close">
+						<span aria-hidden="true">&times;</span>
+					</button>
 					<t:body />
 				</div>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/SVGIcon.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/SVGIcon.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/SVGIcon.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -6,5 +6,5 @@
 	width="${width}" height="${height}">
   <use
-		xlink:href="${asset:classpath:META-INF/assets/META-INF/resources/webjars/feather-icons/4.29.1/dist/feather-sprite.svg}#${path}" />
+		xlink:href="${asset:classpath:META-INF/resources/webjars/feather-icons/4.28.0/dist/feather-sprite.svg}#${path}" />
 </svg>
 
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/logback.xml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/logback.xml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/logback.xml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -0,0 +1,15 @@
+<configuration>
+	<appender name="STDOUT"
+		class="ch.qos.logback.core.ConsoleAppender">
+		<layout class="ch.qos.logback.classic.PatternLayout">
+			<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+			</Pattern>
+		</layout>
+	</appender>
+
+	<logger name="dblearnstar.webapp" level="INFO" />
+
+	<root level="info">
+		<appender-ref ref="STDOUT" />
+	</root>
+</configuration>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ComplaintsAndDiscussions.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ComplaintsAndDiscussions.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ComplaintsAndDiscussions.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -2,4 +2,49 @@
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
 	xmlns:p="tapestry:parameter">
+<style>
+.indentation1 {
+	margin: 0.5rem;
+	padding: 1rem;
+}
+
+.indentation2 {
+	margin: 0.5rem;
+	padding: 1rem;
+	margin-left: 2rem;
+}
+
+.indentation3 {
+	margin: 0.5rem;
+	padding: 1rem;
+	margin-left: 4rem;
+}
+
+.indentation4 {
+	margin: 0.5rem;
+	padding: 1rem;
+	margin-left: 6rem;
+}
+
+.indentation5 {
+	margin: 0.5rem;
+	padding: 1rem;
+	margin-left: 8rem;
+}
+
+.indentation6 {
+	margin: 0.5rem;
+	margin-left: 10rem;
+	padding: 1rem;
+	margin-left: 10rem;
+}
+
+.reshenieto img {
+	width: 100%;
+}
+
+.discussion img {
+	width: 100%;
+}
+</style>
 
 <h1>${message:ComplaintsAndDiscussionForSolution-label}</h1>
@@ -8,41 +53,28 @@
 	<p:then>
 		<h2>${solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.testInstance.title}</h2>
-
+		<p>
+			<a class="btn btn-sm btn-info" role="button" data-toggle="collapse"
+				href="#collapse${solutionAssessmentToDiscuss.solutionAssessmentId}"
+				aria-expanded="false"
+				aria-controls="collapse${solutionAssessmentToDiscuss.solutionAssessmentId}">
+				${solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.task.title}
+				- ${message:Description-label} <span class="caret"></span>
+			</a>
+		</p>
+		<div class="collapse"
+			id="collapse${solutionAssessmentToDiscuss.solutionAssessmentId}">
+			<t:outputRaw
+				t:value="solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.task.description" />
+		</div>
 
 		<div class="row">
 			<div class="col-sm-7">
-				<h3>${solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.task.title}
-					<a class="btn btn-sm btn-outline-info" role="button"
-						data-toggle="collapse"
-						href="#collapse${solutionAssessmentToDiscuss.solutionAssessmentId}"
-						aria-expanded="false"
-						aria-controls="collapse${solutionAssessmentToDiscuss.solutionAssessmentId}">
-						<img t:type="svgicon" t:path="chevrons-down" />
-					</a>
-				</h3>
-
-				<div class="collapse"
-					id="collapse${solutionAssessmentToDiscuss.solutionAssessmentId}">
-					<t:outputRaw
-						t:value="solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.task.description" />
-				</div>
-
-
 				<h4>${message:Discussed-Solution-by-label}
-					${solutionAssessmentToDiscuss.studentSubmitSolution.studentStartedTest.student.person.userName}
+					${solutionAssessmentToDiscuss.studentSubmitSolution.studentStartedTest.student.person.lastName}
+					${solutionAssessmentToDiscuss.studentSubmitSolution.studentStartedTest.student.person.firstName}
 				</h4>
 				<div class="reshenieto">
-					<p>${message:submittedOn-label}:
-						${solutionAssessmentToDiscuss.studentSubmitSolution.submittedOn}</p>
-					<t:if t:test="sql">
-						<pre>
-							<span t:type="outputRaw"
-							t:value="solutionAssessmentToDiscuss.studentSubmitSolution.submission" />
-						</pre>
-						<p:else>
-							<t:outputRaw
-								t:value="solutionAssessmentToDiscuss.studentSubmitSolution.submission" />
-						</p:else>
-					</t:if>
+					<t:outputRaw
+						t:value="solutionAssessmentToDiscuss.studentSubmitSolution.submission" />
 				</div>
 			</div>
@@ -52,104 +84,57 @@
 						<h5>${message:Evaluation-label}</h5>
 						<div class="row">
-							<div class="col-5">${message:grade-label}:
-								<span class="text-light bg-dark p-1">${solutionAssessmentToDiscuss.grade}</span>
-							</div>
-							<div class="col-7 text-right" t:type="if" t:test="administrator">${solutionAssessmentToDiscuss.evaluatedOn}
-								<a class="btn btn-sm btn-secondary" href=""
-									t:id="jumpToEvaluation" t:type="pagelink"
-									t:page="admin/SubmissionEvaluations"
-									t:context="solutionAssessmentToDiscuss">View</a>
-							</div>
-
+							<div class="col-6">${message:grade-label}:
+								${solutionAssessmentToDiscuss.grade}</div>
+							<div class="col-6">${solutionAssessmentToDiscuss.evaluatedOn}</div>
 						</div>
 					</div>
-					<div class="card-body feedback"
+					<div class="card-body"
 						style="font-size: 80% !important; line-height: 0.8em !important;">
 						<t:outputRaw t:value="solutionAssessmentToDiscuss.feedback" />
 					</div>
 				</div>
-
 				<div t:type="if" t:test="newAssessmentDiscussion">
 					<p:then>
-						<t:ModalBox t:id="assessmentModal"
-							t:additionalClassDialog="modal-lg">
-							<div class="alert alert-warning col-11" role="alert">
+						<t:ModalBox t:id="assessmentModal">
+							<div class="alert alert-warning" role="alert">
 								<t:SVGIcon t:path="alert-triangle" />
 								${message:discussionForm-description}
 							</div>
-
-							<form t:type="form" t:id="newAssessmentDiscussionForm"
-								class="form-vertical">
-								<t:beaneditor t:object="newAssessmentDiscussion"
-									t:exclude="assessmentDiscussionId, replyTo,type, postedOn, person, solutionEvaluation">
-									<p:message>
-										<t:label t:for="message" />
-										<t:textarea t:id="message"
-											t:value="newAssessmentDiscussion.message"
-											t:mixins="WebEditor" t:WebEditor.areaType="CK" />
-									</p:message>
-								</t:beaneditor>
-								<div class="col-auto">
-									<button type="submit" class="btn btn-primary" value="OK">OK</button>
-									<a href="" t:type="eventlink"
-										t:id="cancelNewAssessmentDiscussionForm"
-										class="btn btn-secondary ml-2">Cancel</a>
-								</div>
+							<form t:type="beaneditform" t:id="newAssessmentDiscussionForm"
+								t:exclude="assessmentDiscussionId, replyTo,type, postedOn, person, solutionEvaluation"
+								t:object="newAssessmentDiscussion">
+								<p:message>
+									<t:label t:for="message" />
+									<t:textarea t:id="message"
+										t:value="newAssessmentDiscussion.message" t:mixins="WebEditor"
+										t:WebEditor.areaType="CK" />
+								</p:message>
 							</form>
-
 						</t:ModalBox>
 					</p:then>
 				</div>
-
 				<div t:type="if"
 					t:test="solutionAssessmentToDiscuss.assessmentDiscussions">
 					<p:then>
-						<h3 class="mt-3">${message:discussions-label}</h3>
-						<div class="card">
-							<div class="card-body  p-1 bg-light">
-								<t:loop t:source="reorderedAssessmentDiscussions"
-									t:value="runningAssessmentDiscussion">
-									<div class=" ${indentation}">
-										<a role="button" class="btn btn-sm btn-link"
-											href="#disc${runningAssessmentDiscussion.assessmentDiscussionId}">
-											<svg t:type="svgicon" t:path="file" />
-											${runningAssessmentDiscussion.postedOn} -
-											${runningAssessmentDiscussion.person.userName}
-										</a>
-									</div>
-								</t:loop>
-							</div>
-						</div>
 						<t:loop t:source="reorderedAssessmentDiscussions"
 							t:value="runningAssessmentDiscussion">
-							<div class="card mt-3 discussion ${indentation}"
-								id="disc${runningAssessmentDiscussion.assessmentDiscussionId}">
-								<div class="card-header">${runningAssessmentDiscussion.postedOn}
-									-
-									<t:if t:test="postedByInstructor">${runningAssessmentDiscussion.person.userName}<p:else>${runningAssessmentDiscussion.person.userName}</p:else>
+							<div class="discussion card ${indentation}">
+								<p style="text-align: right">${runningAssessmentDiscussion.postedOn}
+									- ${runningAssessmentDiscussion.person.lastName}
+									${runningAssessmentDiscussion.person.firstName}</p>
+								<p>
+									<t:outputRaw t:value="runningAssessmentDiscussion.message" />
+								</p>
+								<div class="row">
+									<button href="" role="button"
+										class="btn btn-sm btn-primary  col-auto" t:type="actionlink"
+										t:id="replyTo" t:context="runningAssessmentDiscussion">${message:replyTo-label}</button>
+									<t:if t:test="administrator">
+										<button href="" role="button"
+											class="btn btn-sm btn-danger col-auto" t:type="actionlink"
+											t:id="deleteDiscussion"
+											t:context="runningAssessmentDiscussion" t:mixins="confirm"
+											t:message="brishenje">${message:delete-label}</button>
 									</t:if>
-								</div>
-								<div class="card-body"
-									id="discbody${runningAssessmentDiscussion.assessmentDiscussionId}">
-									<div>
-										<t:outputRaw t:value="runningAssessmentDiscussion.message" />
-										<p>
-											<button href="" role="button" class="btn btn-sm btn-primary"
-												t:type="actionlink" t:id="replyTo"
-												t:context="runningAssessmentDiscussion">
-												<svg t:type="svgicon" t:path="file-text" />
-												${message:replyTo-label}
-											</button>
-											<t:if t:test="administrator">
-												<button href="" role="button" class="btn btn-sm btn-danger"
-													t:type="actionlink" t:id="deleteDiscussion"
-													t:context="runningAssessmentDiscussion" t:mixins="confirm"
-													t:message="brishenje">
-													<svg t:type="svgicon" t:path="trash" />
-													${message:delete-label}
-												</button>
-											</t:if>
-										</p>
-									</div>
 								</div>
 							</div>
@@ -161,8 +146,5 @@
 							<p:then>
 								<button href="" role="button" class="btn btn-primary"
-									t:type="actionlink" t:id="fileAComplaint">
-									<img t:type="svgicon" t:path="file-text" />
-									${message:fileAComplaint-label}
-								</button>
+									t:type="actionlink" t:id="fileAComplaint">${message:fileAComplaint-label}</button>
 
 							</p:then>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -5,119 +5,65 @@
 <h1>${message:ExamsAndTasksOverview-pagelink}</h1>
 
-<div class="card bg-light p-0 mb-3">
-	<div class="card-body p-3 pb-0">
-		<form t:type="form" t:id="formCollection">
-			<div class="form-group">
-				<label t:type="label" for="selectTestCollection"></label> <select
-					class="form-control form-control-sm" t:id="selectTestCollection"
-					t:type="select" t:model="testCollectionModel"
-					t:value="testCollection" t:zone="collectionZone" t:required="true"
-					t:blankOption="NEVER"></select>
+<div t:type="loop" t:source="testTypes" t:value="testType"
+	class="testType">
+
+	<h2>${translateTestTypeTitle}</h2>
+
+	<div class="mb-3" id="accordion" role="tablist"
+		aria-multiselectable="false">
+		<div class="card p-0 mb-2" t:type="loop" t:source="testInstances"
+			t:value="testInstance" id="ti${testInstance.testInstanceId}">
+			<div class="card-header ${classTestIsNow} pt-2 pb-0" role="tab"
+				id="heading${testInstance.testInstanceId}">
+				<h3>
+					<a role="button" data-toggle="collapse" data-parent="#accordion"
+						href="#collapseTasks${testInstance.testInstanceId}"
+						aria-expanded="true"
+						aria-controls="collapseTasks${testInstance.testInstanceId}"
+						class="btn btn-default p-0 col-12 text-left">
+						${translateTestInstanceTitle}</a>
+				</h3>
 			</div>
-		</form>
-	</div>
-</div>
-
-<div t:type="zone" t:id="collectionZone" id="collectionZone">
-	<div t:type="if" t:test="testCollection">
-		<div t:type="loop" t:source="testTypes" t:value="testType"
-			class="testType">
-
-			<div t:type="if" t:test="testInstances">
-
-				<h2>${translateTestTypeTitle}</h2>
-
-				<div class="mb-3" id="accordion" role="tablist"
-					aria-multiselectable="false">
-
-					<div class="card p-0 mb-2" t:type="loop" t:source="testInstances"
-						t:value="testInstance" id="ti${hashedTestInstanceId}">
-
-						<div class="card-header ${classTestIsNow} pt-2 pb-0" role="tab"
-							id="heading${hashedTestInstanceId}">
-							<div class="float-right text-right col-3 p-0 " t:type="if"
-								t:test="userInfo.instructor">
-								<a href="" class="btn btn-sm btn-secondary mr-3"
-									t:type="eventlink" t:id="evaluate" t:context="testInstance">Evaluation</a>
-								${message:openToAllStudents-label}: <a href=""
-									class="btn btn-sm p-0 ${ClassOpenToAllStudents}"
-									t:type="eventlink" t:id="toggleOpenToAll"
-									t:context="testInstance"><span t:type="booleanindicator"
-									t:value="testInstance.openToAllStudents" t:showCheckMark="true"
-									t:showNo="true" /></a><br />
-								${message:openForReviewByStudents-label}: <a href=""
-									class="btn btn-sm p-0 ${ClassOpenForReviewByStudents}"
-									t:type="eventlink" t:id="toggleOpenForReviewByStudents"
-									t:context="testInstance"><span t:type="booleanindicator"
-									t:value="testInstance.openForReviewByStudents"
-									t:showCheckMark="true" t:showNo="true" /></a><br />
-							</div>
-							<div class="col-9">
-								<a role="button" data-toggle="collapse" data-parent="#accordion"
-									href="#collapseTasks${hashedTestInstanceId}"
-									aria-expanded="true"
-									aria-controls="collapseTasks${hashedTestInstanceId}"
-									class="btn p-0 col-12 text-left"><h3>${translateTestInstanceTitle}</h3></a>
-							</div>
-						</div>
-
-						<div id="collapseTasks${hashedTestInstanceId}"
-							class="card-body p-3 collapse" role="tabpanel"
-							aria-labelledby="heading${hashedTestInstanceId}">
-
-							<div class="float-right">
-								<t:if t:test="testInstance.openForReviewByStudents">
-									<a href="" class="btn btn-outline-info" t:type="pagelink"
-										t:page="SolutionComparator" t:context="testInstance">
-										${message:solutionComparator-pagelink}</a>
-									<a href="" class="btn btn-outline-info" t:type="pagelink"
-										t:page="OpenDiscussions" t:context="testInstance">
-										${message:OpenDiscussions-pagelink}</a>
-								</t:if>
-							</div>
-
-							<p>${message:scheduledFor-label}:
-								<span class="badge badge-pill badge-info">${testInstance.scheduledFor}</span>
-								- ${message:scheduledUntil-label}: <span
-									class="badge badge-pill badge-info">${testInstance.scheduledUntil}</span>
-							</p>
-							<p>
-								<t:outputraw t:value="translatedTestInstanceDescription" />
-							</p>
-							<table class="table table-hover table-bordered table-striped">
-								<thead>
-									<tr class="d-flex">
-										<th class="col-2">${message:task-label}</th>
-										<th class="col-1">${message:task-points-label}</th>
-										<th class="col-7">${message:description-label}</th>
-										<th class="col-2">${message:task-status-label}</th>
-									</tr>
-								</thead>
-								<tbody>
-									<tr class="d-flex taskElement" t:type="loop"
-										t:source="taskInTestInstances" t:value="taskInTestInstance">
-										<td class="col-2 taskTitleCell"><a
-											class="col-12 btn ${classBtnSolved} btn-sm" t:type="PageLink"
-											t:page="QueryTest" t:id="SolveTest"
-											t:context="taskInTestInstance">${translatedTaskInTestInstanceTaskTitle}</a>
-										</td>
-										<td class="col-1">${taskInTestInstance.points}</td>
-										<td class="col-7 taskContentCell"><p t:type="outputraw"
-												t:value="translateTaskDescription" /></td>
-										<td class="col-2">${message:numPersonsTriedToSolve-label}:
-											${numPersonsTriedToSolve} <br />
-											${message:numPersonsSuccessful-label}:
-											${numPersonsSuccessful}
-										</td>
-									</tr>
-								</tbody>
-							</table>
-						</div>
-					</div>
-				</div>
+			<div id="collapseTasks${testInstance.testInstanceId}"
+				class="card-body p-3 collapse" role="tabpanel"
+				aria-labelledby="heading${testInstance.testInstanceId}">
+				<p>${message:scheduledFor-label}:
+					<span class="badge badge-pill badge-info">${testInstance.scheduledFor}</span>
+					- ${message:scheduledUntil-label}: <span
+						class="badge badge-pill badge-info">${testInstance.scheduledUntil}</span>
+				</p>
+				<p>
+					<t:outputraw t:value="testInstance.description">Test Instance Description</t:outputraw>
+				</p>
+				<table class="table table-hover table-bordered table-striped">
+					<thead>
+						<tr class="d-flex">
+							<th class="col-2">${message:task-label}</th>
+							<th class="col-1">${message:task-points-label}</th>
+							<th class="col-7">${message:description-label}</th>
+							<th class="col-2">${message:task-status-label}</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr class="d-flex taskElement" t:type="loop"
+							t:source="taskInTestInstances" t:value="taskInTestInstance">
+							<td class="col-2 taskTitleCell"><a
+								class="col-12 btn ${classBtnSolved} btn-sm" t:type="PageLink"
+								t:page="QueryTest" t:id="SolveTest"
+								t:context="taskInTestInstance">${taskInTestInstance.task.title}</a>
+							</td>
+							<td class="col-1">${taskInTestInstance.points}</td>
+							<td class="col-7 taskContentCell"><p t:type="outputraw"
+									t:value="translateTaskDescription" /></td>
+							<td class="col-2">${message:numPersonsTriedToSolve-label}:${numPersonsTriedToSolve}
+								<br /> ${message:numPersonsSuccessful-label}:
+								${numPersonsSuccessful}
+							</td>
+						</tr>
+					</tbody>
+				</table>
 			</div>
 		</div>
 	</div>
 </div>
-
 </html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExceptionReport.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExceptionReport.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExceptionReport.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,5 +1,4 @@
 <html title="Exception"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
+	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
 
 <div class="card">
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/Index.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/Index.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/Index.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -25,4 +25,11 @@
 			</p>
 			<p>
+				<a href="" t:type="pagelink" t:page="SolutionComparator"> <img
+					src="${context:images/t_Compare.png}"
+					style="width: 160px; height: 80px;" /> <br />
+					${message:SolutionComparator-pagelink}
+				</a>
+			</p>
+			<p>
 				<a href="" t:type="pagelink" t:page="PersonalAnalytics"> <img
 					src="${context:images/t_Analytics.png}"
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/OpenDiscussions.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/OpenDiscussions.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/OpenDiscussions.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -2,8 +2,6 @@
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
 	xmlns:p="tapestry:parameter">
-
 <h1>${message:OpenDiscussions-pagelink}</h1>
-
-<div class="card bg-light mb-3">
+<div class="card bg-light p-0">
 	<div class="card-body p-3 pb-0">
 		<form t:type="form" t:id="selectTestForm">
@@ -11,5 +9,5 @@
 				<label t:type="label" for="selectTestInstance">${message:selectTestInstance-label}
 					- ${message:onlyTestInstancesWithDiscussionsAreShown-label}</label> <select
-					size="10" class="form-control form-control-sm"
+					size="4" class="form-control form-control-sm"
 					t:id="selectTestInstance" t:type="select"
 					t:model="testInstanceSelectModel" t:value="selectedTestInstance"
@@ -22,14 +20,10 @@
 <t:zone t:id="zTestInstance" id="zTestInstance">
 	<t:if t:test="selectedTestInstance">
+		<h2 class="mt-3">Discussions</h2>
 		<t:loop t:source="solutionAssessmentsWithDiscussion"
 			t:value="runningSolutionAssessment">
 			<p>
-				<a href="" class="btn btn-outline-info mr-3" t:type="pagelink"
-					t:page="complaintsanddiscussions"
-					t:context="runningSolutionAssessment">${runningSolutionAssessment.studentSubmitSolution.taskInTestInstance.task.title}
-					- ${message:solutionBy-label} -
-					${runningSolutionAssessment.studentSubmitSolution.studentStartedTest.student.person.userName}
-				</a>
-				<t:if t:test="answeredByInstructor">${message:answeredByInstructor-label}</t:if>
+				<a href="" t:type="pagelink" t:page="complaintsanddiscussions"
+					t:context="runningSolutionAssessment">${runningSolutionAssessment.studentSubmitSolution.taskInTestInstance.task.title}</a>
 			</p>
 			<p:empty>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/QueryTest.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/QueryTest.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/QueryTest.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -3,261 +3,223 @@
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
 	xmlns:p="tapestry:parameter">
-
 <h2>
 	<a href="" t:type="actionlink" t:id="BackToExamsOverview">${translateTestInstanceTitle}</a>
 </h2>
 
-<t:if t:test="accessAllowed">
-
-	<div class="row" id="taskDetails">
-		<div class="col-sm-6">
-			<h3 class="taskname">${translateTaskTitle}
-				<span class="badge badge-info">Points:
-					${taskInTestInstance.points}</span>
-			</h3>
-			<div class="taskdescription">
-				<t:outputraw t:value="translateTaskDescription"></t:outputraw>
+<div class="row" id="taskDetails">
+	<div class="col-sm-6">
+		<h3 class="taskname">${translateTaskTitle}
+			<span class="badge badge-info">Points:
+				${taskInTestInstance.points}</span>
+		</h3>
+		<div class="taskdescription">
+			<t:outputraw t:value="translateTaskDescription"></t:outputraw>
+		</div>
+		<div class="schemaimg" id="taskpane" t:type="if" t:test="SQL">
+			<t:if
+				t:test="${taskInTestInstance.testInstance.testTemplate.model.diagramSvg}">
+				<t:outputraw
+					t:value="${taskInTestInstance.testInstance.testTemplate.model.diagramSvg}"></t:outputraw>
+				<p:else>
+					<t:if
+						t:test="${taskInTestInstance.testInstance.testTemplate.model.diagramPng}">
+						<t:outputraw
+							t:value="${taskInTestInstance.testInstance.testTemplate.model.diagramPng}"></t:outputraw>
+						<p:else>
+							<img
+								src="${taskInTestInstance.testInstance.testTemplate.model.diagramUrl}" />
+						</p:else>
+					</t:if>
+				</p:else>
+			</t:if>
+		</div>
+	</div>
+	<div class="col-sm-6">
+		<form t:type="form" t:name="queryTestForm" t:id="queryTestForm"
+			t:async="${shouldBeAsync}">
+			<t:errors />
+			<t:if t:test="SQL">
+				<input t:type="submit" t:id="Evaluate"
+					t:value="${message:Evaluate-label}" class="btn btn-primary btn-sm" />
+				<input type="button" id="RunOnly"
+					value="${message:RunOnlyNoEvaluation-label}"
+					class="btn btn-secondary btn-sm"></input>
+				<input type="button" id="RunOnlySelection"
+					value="${message:RunOnlyNoEvaluationSelection-label}"
+					class="btn btn-secondary btn-sm"></input>
+				<input type="button" id="PlanOnly"
+					value="${message:RunOnlyPlan-label}" class="btn btn-light btn-sm"></input>
+				<a class="btn btn-sm btn-info float-right"
+					title="${message:help-for-codemirror}"
+					alt="${message:help-for-codemirror}">?</a>
+				<p:else>
+					<t:if t:test="TEXT">
+						<span style="float: right; font-size: 80%; margin-top: 10px;">${message:help-for-codemirror-text}</span>
+						<input t:type="submit" t:id="SubmitTextSolution"
+							value="message:submitSolution-label"
+							class="btn btn-primary btn-sm"></input>
+					</t:if>
+					<t:if t:test="UPLOAD">
+					</t:if>
+				</p:else>
+			</t:if>
+			<t:if t:test="UPLOAD">
+				<div class="form-group">
+					<label for="file">${message:chooseFile-label}</label> <input
+						t:type="upload" t:id="file" t:value="file" t:validate="required" />
+				</div>
+				<div class="form-group">
+					<label t:type="label" for="filecomment"></label>
+					<textarea id="filecomment" t:id="filecomment" name="filecomment"
+						t:type="textarea" t:value="filecomment">
+								</textarea>
+				</div>
+				<input t:type="submit" t:id="Upload" value="message:Upload-label"
+					class="btn btn-primary btn-sm"></input>
+			</t:if>
+			<t:unless t:test="UPLOAD">
+				<textarea id="editorarea" t:id="editorarea" name="editorarea"
+					t:type="textarea" t:value="queryString" t:mixins="WebEditor"
+					t:WebEditor.areaType="${editorAreaType}" />
+			</t:unless>
+		</form>
+	</div>
+</div>
+
+<div class="row" t:type="zone" t:id="errorZone" id="errorZone">
+	<div class="" t:type="if" t:test="resultsErrors">
+		<t:ModalBox t:additionalClass=""
+			t:additionalClassDialog="modal-lg bg-danger " t:id="errorModal">
+			<div class="alert alert-danger errorpanel color-queryError mt-3"
+				role="alert">
+				<h4>
+					<t:outputRaw t:value="message:errorMessages-label" />
+				</h4>
+				<ul>
+					<li t:type="loop" t:source="resultsErrors" t:value="errorLine">
+						${errorLine}</li>
+				</ul>
 			</div>
-			<div class="schemaimg" id="taskpane" t:type="if" t:test="SQL">
-				<t:if
-					t:test="${taskInTestInstance.testInstance.testTemplate.model.diagramSvg}">
-					<t:outputraw
-						t:value="${taskInTestInstance.testInstance.testTemplate.model.diagramSvg}"></t:outputraw>
-					<p:else>
-						<t:if
-							t:test="${taskInTestInstance.testInstance.testTemplate.model.diagramPng}">
-							<t:outputraw
-								t:value="${taskInTestInstance.testInstance.testTemplate.model.diagramPng}"></t:outputraw>
-							<p:else>
-								<img
-									src="${taskInTestInstance.testInstance.testTemplate.model.diagramUrl}" />
-							</p:else>
-						</t:if>
-					</p:else>
-				</t:if>
+		</t:ModalBox>
+	</div>
+</div>
+
+<div class="row" t:type="zone" t:id="evalZone" id="evalZone">
+	<div class="col-sm-12" t:type="if" t:test="resultsEvaluation">
+		<t:ModalBox t:id="evalModal" t:additionalClass=""
+			t:additionalClassDialog="modal-lg bg-danger ">
+			<div class="alert ${styleClassForEvaluation}  mt-3" role="alert">
+				<h4>
+					<t:outputRaw t:value="message:query-eval-label" />
+				</h4>
+				<ul>
+					<li t:type="loop" t:source="resultsEvaluation"
+						t:value="evaluationLine"><t:outputRaw
+							t:value="evaluationLine" /></li>
+				</ul>
 			</div>
-		</div>
-
-		<div class="col-sm-6">
-
-			<div class="text-right pt-0 pb-2 mt-0 mb-0" t:type="zone"
-				t:id="currentTimeZone">
-				<div t:type="if" t:test="testIsNow"
-					class="m-0 p-0 pr-2 ${classTestIsNow}">
-					<p class="m-0 alert-heading">
-						<strong>${testIsNow}</strong>
-					</p>
-					<p class="p-0 m-0">
-						<strong>${message:testOpenUntil-label}: <span
-							class="code">${displayEndTime}</span></strong>
-					</p>
-					<p class="p-0 m-0">${message:serverTime-label}:
-						<span class="code">${displayCurrentTime}</span>
-					</p>
-				</div>
-				<div id="serverStatus" class="p-0 m-0"></div>
-			</div>
-
-			<form t:type="form" t:name="queryTestForm" t:id="queryTestForm"
-				t:async="${shouldBeAsync}">
-				<t:errors />
-				<t:if t:test="SQL">
-					<input t:type="submit" t:id="Evaluate"
-						t:value="${message:Evaluate-label}" class="btn btn-primary btn-sm" />
-					<input type="button" id="RunOnly"
-						value="${message:RunOnlyNoEvaluation-label}"
-						class="btn btn-secondary btn-sm"></input>
-					<input type="button" id="RunOnlySelection"
-						value="${message:RunOnlyNoEvaluationSelection-label}"
-						class="btn btn-secondary btn-sm"></input>
-					<input type="button" id="PlanOnly"
-						value="${message:RunOnlyPlan-label}" class="btn btn-light btn-sm"></input>
-					<a class="btn btn-sm btn-info float-right"
-						title="${message:help-for-codemirror}"
-						alt="${message:help-for-codemirror}">?</a>
-					<p:else>
-						<t:if t:test="TEXT">
-							<span style="float: right; font-size: 80%; margin-top: 10px;">${message:help-for-codemirror-text}</span>
-							<input t:type="submit" t:id="SubmitTextSolution"
-								value="message:submitSolution-label"
-								class="btn btn-primary btn-sm"></input>
-						</t:if>
-						<t:if t:test="UPLOAD">
-						</t:if>
-					</p:else>
-				</t:if>
-				<t:if t:test="UPLOAD">
-					<div class="form-group">
-						<label for="file">${message:chooseFile-label}</label> <input
-							t:type="upload" t:id="file" t:value="file" t:validate="required" />
-					</div>
-					<div class="form-group">
-						<label t:type="label" for="filecomment"></label>
-						<textarea id="filecomment" t:id="filecomment" name="filecomment"
-							t:type="textarea" t:value="filecomment">
-								</textarea>
-					</div>
-					<input t:type="submit" t:id="Upload" value="message:Upload-label"
-						class="btn btn-primary btn-sm"></input>
-				</t:if>
-				<t:unless t:test="UPLOAD">
-					<textarea id="editorarea" t:id="editorarea" name="editorarea"
-						t:type="textarea" t:value="queryString" t:mixins="WebEditor"
-						t:WebEditor.areaType="${editorAreaType}" />
-				</t:unless>
-			</form>
-		</div>
-	</div>
-
-	<div class="row" t:type="zone" t:id="errorZone" id="errorZone">
-		<div class="p-0" t:type="if" t:test="resultsErrors">
-			<t:ModalBox t:additionalClass=""
-				t:additionalClassDialog="modal-lg bg-danger " t:id="errorModal">
-				<p class="pt-0 pb-3">
-					<a t:type="actionLink" t:id="hideModal" t:zone="errorZone"
-						class="close float-right"><t:SVGIcon t:path="x" /></a>
-				</p>
-				<div class="alert alert-danger errorpanel color-queryError"
-					role="alert">
-					<h4>
-						<t:outputRaw t:value="message:errorMessages-label" />
-					</h4>
-					<ul>
-						<li t:type="loop" t:source="resultsErrors" t:value="errorLine">
-							${errorLine}</li>
-					</ul>
-				</div>
-			</t:ModalBox>
-		</div>
-	</div>
-
-	<div class="row" t:type="zone" t:id="evalZone" id="evalZone">
-		<div class="col-sm-12" t:type="if" t:test="resultsEvaluation">
-			<t:ModalBox t:id="evalModal" t:additionalClass=""
-				t:additionalClassDialog="modal-lg bg-danger ">
-				<p class="pt-0 pb-3">
-					<a t:type="actionLink" id="hideEvalModal" t:id="hideEvalModal" t:zone="errorZone"
-						class="close float-right"><t:SVGIcon t:path="x" /></a>
-				</p>
-				<div class="alert ${styleClassForEvaluation}  mt-3" role="alert">
-					<h4>
-						<t:outputRaw t:value="message:query-eval-label" />
-					</h4>
-					<ul>
-						<li t:type="loop" t:source="resultsEvaluation"
-							t:value="evaluationLine"><t:outputRaw
-								t:value="evaluationLine" /></li>
-					</ul>
-				</div>
-			</t:ModalBox>
-		</div>
-	</div>
-
-	<div class="row" t:type="zone" t:id="resultsZone" id="resultsZone">
-		<div class="col-sm-12">
-			<div class="alert alert-success resultspanel resultspanel-colors"
-				role="alert" t:type="if" t:test="resultsSimple">
-				<h3>${message:query-results-label}</h3>
-				<table class="table table-hover table-bordered table-striped">
-					<thead>
-						<tr>
-							<th t:type="loop" t:source="resultsHeadersSimple"
-								t:value="oneHeader">${oneHeader}</th>
-						</tr>
-					</thead>
-					<tbody>
-						<tr t:type="loop" t:source="resultsSimple" t:value="oneRow">
-							<td t:type="loop" t:source="oneRow" t:value="oneColumn">${oneColumn}</td>
-						</tr>
-					</tbody>
-				</table>
-			</div>
-		</div>
-	</div>
-
-	<div class="row" id="submissionHistoryDiv">
-		<div class="col-sm-12" t:type="zone" t:id="historyZone"
-			id="historyZone">
-			<h3>${message:historyOfSubmissions-label}</h3>
-			<ul class="nav nav-tabs">
-				<li class="nav-item"><a class="nav-link ${activeEval}" href=""
-					t:type="actionlink" t:async="true" t:id="filterForEvaluation">
-						${message:list-submissions-evaluation-only-label}</a></li>
-				<li class="nav-item"><a class="nav-link ${activeNotEval}"
-					href="" t:type="actionlink" t:async="true"
-					t:id="filterNotForEvaluation">${message:list-submissions-run-only-label}</a></li>
-			</ul>
-			<div class="mt-0">
-				<table t:type="grid" t:source="historyOfSolutions" class="table table-sm table-bordered table-hover"
-					t:row="historicalSolution" t:rowsPerPage="10"
-					t:include="submittedOn,submission,evaluationSimple,evaluationComplex"
-					t:add="Action">
-					<p:evaluationSimpleCell>
-						<t:booleanindicator t:value="historicalSolution.evaluationSimple"
-							t:showCheckMark="true" t:showno="true" />
-					</p:evaluationSimpleCell>
-					<p:evaluationComplexCell>
-						<t:booleanindicator t:value="historicalSolution.evaluationComplex"
-							t:showCheckMark="true" t:showno="true" />
-					</p:evaluationComplexCell>
-					<p:submissionCell>
-						<t:if t:test="SQL">
-							<p class="code">${historicalSolution.submission}</p>
-						</t:if>
-						<t:if t:test="UPLOAD">
-							<t:outputraw t:value="FileFromSubmission"></t:outputraw>
-						</t:if>
-						<t:if t:test="TEXT">
-							<t:outputraw t:value="historicalSolution.submission"></t:outputraw>
-						</t:if>
-					</p:submissionCell>
-					<p:submittedOnCell>
-						<t:output format="literal:yyyy-MM-dd HH:mm:ss.S"
-							value="historicalSolution.submittedOn" />
+		</t:ModalBox>
+	</div>
+</div>
+
+<div class="row" t:type="zone" t:id="resultsZone" id="resultsZone">
+	<div class="col-sm-12">
+		<div class="alert alert-success resultspanel resultspanel-colors"
+			role="alert" t:type="if" t:test="resultsSimple">
+			<h3>${message:query-results-label}</h3>
+			<table class="table table-hover table-bordered table-striped">
+				<thead>
+					<tr>
+						<th t:type="loop" t:source="resultsHeadersSimple"
+							t:value="oneHeader">${oneHeader}</th>
+					</tr>
+				</thead>
+				<tbody>
+					<tr t:type="loop" t:source="resultsSimple" t:value="oneRow">
+						<td t:type="loop" t:source="oneRow" t:value="oneColumn">${oneColumn}</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>
+
+<div class="row" id="submissionHistoryDiv">
+	<div class="col-sm-12" t:type="zone" t:id="historyZone"
+		id="historyZone">
+		<h3>${message:historyOfSubmissions-label}</h3>
+		<ul class="nav nav-tabs">
+			<li class="nav-item"><a class="nav-link ${activeEval}" href=""
+				t:type="actionlink" t:async="true" t:id="filterForEvaluation">
+					${message:list-submissions-evaluation-only-label}</a></li>
+			<li class="nav-item"><a class="nav-link ${activeNotEval}"
+				href="" t:type="actionlink" t:async="true"
+				t:id="filterNotForEvaluation">${message:list-submissions-run-only-label}</a></li>
+		</ul>
+		<div class="mt-0">
+			<table t:type="grid" t:source="historyOfSolutions"
+				t:row="historicalSolution" t:rowsPerPage="10"
+				t:include="submittedOn,submission,evaluationSimple,evaluationComplex"
+				t:add="Action">
+				<p:evaluationSimpleCell>
+					<t:booleanindicator t:value="historicalSolution.evaluationSimple"
+						t:showCheckMark="true" t:showno="true" />
+				</p:evaluationSimpleCell>
+				<p:evaluationComplexCell>
+					<t:booleanindicator t:value="historicalSolution.evaluationComplex"
+						t:showCheckMark="true" t:showno="true" />
+				</p:evaluationComplexCell>
+				<p:submissionCell>
+					<t:if t:test="SQL">
+						<p class="code">${historicalSolution.submission}</p>
+					</t:if>
+					<t:if t:test="UPLOAD">
+						<t:outputraw t:value="FileFromSubmission"></t:outputraw>
+					</t:if>
+					<t:if t:test="TEXT">
+						<t:outputraw t:value="historicalSolution.submission"></t:outputraw>
+					</t:if>
+				</p:submissionCell>
+				<p:submittedOnCell>${historicalSolution.submittedOn}
 					</p:submittedOnCell>
-					<p:actionCell>
-						<t:if t:test="UPLOAD">
+				<p:actionCell>
+					<t:if t:test="UPLOAD">
+						<a class="btn btn-warning btn-sm" href="" t:type="actionlink"
+							t:context="historicalSolution" t:id="DownloadFile">${message:load-label}</a>
+						<p:else>
 							<a class="btn btn-warning btn-sm" href="" t:type="actionlink"
-								t:context="historicalSolution" t:id="DownloadFile">${message:download-label}</a>
-							<p:else>
-								<a class="btn btn-warning btn-sm" href="" t:type="actionlink"
-									t:context="historicalSolution" t:id="loadHistoricalSolution">${message:load-label}</a>
-							</p:else>
-						</t:if>
-					</p:actionCell>
-				</table>
-			</div>
-		</div>
-	</div>
-
-	<t:if t:test="TEXT">
-	</t:if>
-
-	<t:if t:test="SQL">
-		<link rel="stylesheet"
-			href="${asset:classpath:META-INF/assets/codemirror/lib/codemirror.css}" />
-		<link rel="stylesheet"
-			href="${asset:classpath:META-INF/assets/codemirror/theme/monokai.css}" />
-		<script
-			src="${asset:classpath:META-INF/assets/codemirror/lib/codemirror.js}"></script>
-		<script
-			src="${asset:classpath:META-INF/assets/codemirror/mode/sql/sql.js}"></script>
-		<script
-			src="${asset:classpath:META-INF/assets/codemirror/addon/edit/matchbrackets.js}"></script>
-		<link rel="stylesheet"
-			href="${asset:classpath:META-INF/assets/codemirror/addon/hint/show-hint.css}" />
-		<script
-			src="${asset:classpath:META-INF/assets/codemirror/addon/hint/show-hint.js}"></script>
-		<script
-			src="${asset:classpath:META-INF/assets/codemirror/addon/hint/sql-hint.js}"></script>
-		<script>
-			var queryTestErrorPosition = "${errorPosition}";
-		</script>
-	</t:if>
-
-	<p:else>
-
-	</p:else>
+								t:context="historicalSolution" t:id="loadHistoricalSolution">${message:load-label}</a>
+						</p:else>
+					</t:if>
+				</p:actionCell>
+			</table>
+		</div>
+	</div>
+</div>
+
+<t:if t:test="TEXT">
 </t:if>
 
+<t:if t:test="SQL">
+	<link rel="stylesheet"
+		href="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/lib/codemirror.css}" />
+	<link rel="stylesheet"
+		href="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/theme/monokai.css}" />
+	<script
+		src="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/lib/codemirror.js}"></script>
+	<script
+		src="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/mode/sql/sql.js}"></script>
+	<script
+		src="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/addon/edit/matchbrackets.js}"></script>
+	<link rel="stylesheet"
+		href="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/addon/hint/show-hint.css}" />
+	<script
+		src="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/addon/hint/show-hint.js}"></script>
+	<script
+		src="${asset:classpath:META-INF/resources/webjars/codemirror/5.62.2/addon/hint/sql-hint.js}"></script>
+	<script>
+		var queryTestErrorPosition = "${errorPosition}";
+	</script>
+</t:if>
+
 </html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/SolutionComparatorPage.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/SolutionComparatorPage.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/SolutionComparatorPage.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -2,86 +2,71 @@
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
 	xmlns:p="tapestry:parameter">
+<h1>${message:comparisonOfSolutions-page}</h1>
+<div class="card bg-light p-0">
+	<div class="card-body p-3 pb-0">
+		<form t:type="form" t:id="selectTestForm">
+			<div class="form-group">
+				<label t:type="label" for="selectTestInstance">${message:selectTestInstance-label}</label>
+				<select size="4" class="form-control form-control-sm"
+					t:id="selectTestInstance" t:type="select"
+					t:model="testInstanceSelectModel" t:value="selectedTestInstance"
+					t:zone="zTestInstance" t:required="true"></select>
+			</div>
+		</form>
+	</div>
+</div>
 
-<h1>${message:comparisonOfSolutions-page}</h1>
-
-<t:if t:test="selectedTestInstance">
-
-	<h2 class="mt-3">${selectedTestInstance?.title}</h2>
-
-	<t:loop t:source="taskInTestInstances" t:value="taskInTestInstance">
-		<hr />
-		<h3>${taskInTestInstance.task.title}</h3>
-		<p>
-			<a role="button" class="btn btn-sm btn-outline-info"
-				data-toggle="collapse"
-				href="#collapse${taskInTestInstance.taskInTestInstanceId}"
-				aria-expanded="false"
-				aria-controls="collapse${taskInTestInstance.taskInTestInstanceId}">
-				${message:Description-label} <img t:type="svgicon"
-				t:path="chevrons-down" />
-			</a>
-		</p>
-		<div class="collapse"
-			id="collapse${taskInTestInstance.taskInTestInstanceId}">
-			<div class="imgMaxHeight">
-				<t:outputraw t:value="taskInTestInstance.task.description" />
+<t:zone t:id="zTestInstance" id="zTestInstance">
+	<t:if t:test="selectedTestInstance">
+		<h2 class="mt-3">${selectedTestInstance?.title}</h2>
+		<t:loop t:source="taskInTestInstances" t:value="taskInTestInstance">
+			<h3>
+				<a role="button" data-toggle="collapse"
+					href="#collapse${taskInTestInstance.taskInTestInstanceId}"
+					aria-expanded="false"
+					aria-controls="collapse${taskInTestInstance.taskInTestInstanceId}">
+					${taskInTestInstance.task.title}</a>
+			</h3>
+			<div class="collapse"
+				id="collapse${taskInTestInstance.taskInTestInstanceId}">
+				<div class="card imgMaxHeight">
+					<t:outputraw t:value="taskInTestInstance.task.description" />
+				</div>
 			</div>
-		</div>
-
-		<p class="badge badge-info" t:type="if" t:test="hasManySolutions">
-			${message:youHaveManyEvaluated-label}</p>
-		<div t:type="loop"
-			t:source="listEvaluatedSolutionsForTaskInTestInstance"
-			t:value="oneOfTheEvaluatedSolutions" class="card mb-3">
-			<div t:type="if"
-				t:test="oneOfTheEvaluatedSolutions.studentSubmitSolution"
-				class="card-body p-2 ${solutionCorrectnessClass}">
-				<div class="row">
-					<div class="col-6">
-						<p>
-							<strong>${message:solution-label}:</strong>
-						</p>
-						<p>${oneOfTheEvaluatedSolutions.studentSubmitSolution.submittedOn}</p>
+			<div class="row">
+				<t:if t:test="lastEvaluatedSolutionForTaskInTestInstance">
+					<div class="col-sm-6">
+						<h4>${message:yourLastSolution-label}:</h4>
+						<p>${lastEvaluatedSolutionForTaskInTestInstance.submittedOn}</p>
 						<t:if t:test="SQL">
 							<t:code
-								t:additionalClass="${classLastSolutionForTaskInTestInstance} p-2"
-								t:value="oneOfTheEvaluatedSolutions.studentSubmitSolution.submission"></t:code>
+								t:additionalClass="${classLastSolutionForTaskInTestInstance}"
+								t:value="lastEvaluatedSolutionForTaskInTestInstance.submission"></t:code>
 						</t:if>
 						<t:if t:test="UPLOAD">
 							<t:outputraw t:value="FileFromSubmission"></t:outputraw>
 							<a class="btn btn-warning btn-sm" href="" t:type="actionlink"
-								t:context="oneOfTheEvaluatedSolutions.studentSubmitSolution"
+								t:context="lastEvaluatedSolutionForTaskInTestInstance"
 								t:id="DownloadFile">${message:load-label}</a>
 						</t:if>
 						<t:if t:test="TEXT">
-							<div class="card">
-								<div class="card-body solution">
-									<t:outputraw
-										t:additionalClass="${classLastSolutionForTaskInTestInstance} img100pct p-2 text-wrap"
-										t:value="oneOfTheEvaluatedSolutions.studentSubmitSolution.submission" />
-								</div>
-							</div>
+							<t:code
+								t:additionalClass="${classLastSolutionForTaskInTestInstance} img100pct "
+								t:value="lastEvaluatedSolutionForTaskInTestInstance.submission"></t:code>
 						</t:if>
 					</div>
-
-					<div class="col-6">
+					<div class="col-sm-6">
 						<t:if
-							t:test="oneOfTheEvaluatedSolutions.studentSubmitSolution.studentStartedTest.testInstance.openForReviewByStudents">
+							t:test="lastEvaluatedSolutionForTaskInTestInstance.studentStartedTest.testInstance.openForReviewByStudents">
 							<div t:type="if"
-								t:test="oneOfTheEvaluatedSolutions.studentSubmitSolution.evaluations">
-								<p>
-									<strong> ${message:grade-label}: </strong><span
-										class="badge badge-dark">
+								t:test="lastEvaluatedSolutionForTaskInTestInstance.evaluations">
+								<h4>
+									${message:grade-label}: <span class="badge">
 										${submissionsFirstEvaluation?.grade}</span>
-
-								</p>
-
+								</h4>
 								<p>${message:feedback-label}:</p>
-								<div class="card">
-									<div class="card-body">
-										<div class="feedback">
-											<t:outputraw t:value="submissionsFirstEvaluation?.feedback" />
-										</div>
-									</div>
+								<div class="card feedback">
+									<t:outputraw t:value="submissionsFirstEvaluation?.feedback"
+										class="card-body" />
 								</div>
 								<p>
@@ -89,17 +74,15 @@
 										t:type="pagelink" t:page="ComplaintsAndDiscussions"
 										t:context="submissionsFirstEvaluation">
-										<img t:type="svgicon" t:path="file-text" />
-										${message:ComplaintsAndDiscussions-page}
-									</button>
+										${message:ComplaintsAndDiscussions-page}</button>
 								</p>
 							</div>
 							<div t:type="if" t:test="otherSolutions">
 								<p>
-									<a class="btn btn-outline-light" role="button"
+									<a class="btn btn-secondary" role="button"
 										data-toggle="collapse"
 										href="#collapseSolutions${taskInTestInstance.taskInTestInstanceId}"
 										aria-expanded="false"
 										aria-controls="#collapseSolutions${taskInTestInstance.taskInTestInstanceId}">${message:otherSolutions-label}
-										<img t:type="svgicon" t:path="chevrons-down" />
+										<span class="caret"></span>
 									</a>
 								</p>
@@ -111,10 +94,5 @@
 											t:value="otherStudentSubmitSolution">
 											<t:if t:test="SQL">
-												<div class="card card-body p-0 m-1">
-													<div>
-														<t:code t:additionalClass="literal:p-2"
-															t:value="otherStudentSubmitSolution.submission"></t:code>
-													</div>
-												</div>
+												<t:code t:value="otherStudentSubmitSolution.submission"></t:code>
 											</t:if>
 											<t:if t:test="UPLOAD">
@@ -125,10 +103,5 @@
 											</t:if>
 											<t:if t:test="TEXT">
-												<div class="card">
-													<div class="card-body solution">
-														<t:outputraw t:additionalClass="img100pct p-2 text-wrap"
-															t:value="otherStudentSubmitSolution.submission" />
-													</div>
-												</div>
+												<t:code t:value="otherStudentSubmitSolution.submission"></t:code>
 											</t:if>
 										</t:loop>
@@ -137,11 +110,11 @@
 								<p:else>
 									<t:if t:test="lastSolutionCorrect">
-										<p class="alert alert-warning">
-											<img t:type="SVGIcon" t:path="info" />
+										<p class="bg-warning">
+											<t:SVGIcon t:path="info" />
 											${message:noCorrectSolutionsByOthers-label}
 										</p>
 										<p:else>
-											<p class="alert alert-danger">
-												<img t:type="SVGIcon" t:path="alert-triangle" />
+											<p class="bg-danger">
+												<t:SVGIcon t:path="alert-triangle" />
 												${message:youDontHaveCorrectSolution-label}
 											</p>
@@ -155,19 +128,16 @@
 						</t:if>
 					</div>
-				</div>
-				<p:else>
-					<div class="col-12">
-						<p>${message:youDontHaveASolutionOrSolutionIsNotEvaluatedAndCantBeCompared-label}</p>
-					</div>
-				</p:else>
+					<p:else>
+						<div class="col-sm-12">
+							<p>${message:youDontHaveASolutionOrSolutionIsNotEvaluatedAndCantBeCompared-label}</p>
+						</div>
+					</p:else>
+				</t:if>
 			</div>
-		</div>
-	</t:loop>
-
-	<hr />
-
-	<h3>${message:totalPoints-label}:
-		<span class="badge badge-dark">${totalPoints}</span>
-	</h3>
-</t:if>
+			<hr />
+		</t:loop>
+		<hr />
+		<h3>Вкупно поени: ${totalPoints}</h3>
+	</t:if>
+</t:zone>
 </html>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/TasksOverviewPage.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/TasksOverviewPage.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,67 +1,0 @@
-<html t:type="layout" title="message:ExamsAndTasksOverview-pagelink"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
-
-<h1>${message:TasksOverview-pagelink}</h1>
-
-<div class="row">
-	<div class="col-5">
-
-		<h3>${message:FilterTasksBasedOnModel-label}</h3>
-		<p>
-			<a
-				class="btn btn-outline btn-outline-warning p-0 pl-1 pr-1 mb-1 mr-0"
-				t:type="eventlink" t:id="unChooseModel">/</a> <span t:type="loop"
-				t:source="allModels" t:value="listedModel"> <a
-				class="btn btn-outline btn-outline-primary p-0 pl-1 pr-1 mb-1 mr-0 ${classSelectedModel}"
-				t:type="eventlink" t:id="chooseModel" t:context="listedModel">${listedModel.title}</a>
-			</span>
-
-		</p>
-
-		<h3>${message:FilterTasksBasedOnType-label}</h3>
-		<p>
-			<a
-				class="btn btn-outline btn-outline-warning p-0 pl-1 pr-1 mb-1 mr-0"
-				t:type="eventlink" t:id="unChooseTaskType">/</a> <span t:type="loop"
-				t:source="allTaskTypes" t:value="listedTaskType"> <a
-				class="btn btn-outline btn-outline-primary p-0 pl-1 pr-1 mb-1 mr-0 ${classSelectedTaskType}"
-				t:type="eventlink" t:id="chooseTaskType" t:context="listedTaskType">${listedTaskType.title}</a>
-			</span>
-		</p>
-
-	</div>
-	<div class="col-7">
-		<h2>${message:tasks-label}</h2>
-
-		<t:loop t:source="allTasks" t:value="listedTaskInTestInstance">
-			<t:if t:test="prevTestInstance">
-				<h3 class="mt-3">${listedTaskInTestInstance.testInstance.title}</h3>
-				<div style="" class="overflow-auto">
-					<p t:type="outputRaw"
-						t:value="listedTaskInTestInstance.testInstance.description" />
-				</div>
-			</t:if>
-			<div class="card ${classForSolved} mb-3">
-				<div class="card-header">
-					${listedTaskInTestInstance.task.title} <a
-						class="btn btn-sm btn-primary float-right" t:type="PageLink"
-						t:page="QueryTest" t:id="SolveTest"
-						t:context="listedTaskInTestInstance">${message:attempt-label}</a>
-					<div class="p-1 pl-3 text-muted ">
-						<span class="mr-3">${message:numPersonsTriedToSolve-label}:
-							${numPersonsTriedToSolve}</span> - <span class="ml-3">${message:numPersonsSuccessful-label}:
-							${numPersonsSuccessful}</span>
-					</div>
-
-				</div>
-				<div class="card-body">
-					<p class="card-text">
-						<t:outputRaw t:value="listedTaskInTestInstance.task.description" />
-					</p>
-				</div>
-			</div>
-		</t:loop>
-	</div>
-</div>
-</html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/GroupManagement.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/GroupManagement.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/GroupManagement.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -6,87 +6,59 @@
 	<p:then>
 		<h3>Group Info</h3>
-		<div class="row">
-			<div class="col-6">
-				<form t:id="NewGroupForm" t:type="form" class="form-horizontal">
-					<t:beaneditor t:object="editGroup" t:exclude="groupId"></t:beaneditor>
-					<div class="form-group">
-						<t:label t:for="userNamesToImport" />
-						<t:textarea t:rows="10" t:id="userNamesToImport" t:value="studentsToImport" />
-					</div>
-					<p class="incorrect">${errors}</p>
-					<t:submit t:value="OK" />
-					<a href="" t:type="eventlink" t:id="cancelEditGroup">Cancel</a>
+		<div class="col-sm-12">
+			<form t:id="NewGroupForm" t:type="BeanEditForm" t:object="editGroup"
+				class="form-horizontal" t:exclude="groupId" t:cancel="true">
+			</form>
+		</div>
+		<h3>Group members</h3>
+		<div class="col-sm-12">
+			<ol style="columns: 3;">
+				<li t:type="loop" t:id="groupMembers"
+					t:source="editGroup.groupMembers" t:value="groupMember">
+					${groupMember.student.person.lastName}
+					${groupMember.student.person.firstName}
+					[${groupMember.student.person.userName}]<a href=""
+					t:type="actionlink" t:id="DeleteGroupMember"
+					t:context="groupMember" class="btn btn-sm btn-default"><t:SVGIcon
+							t:path="user-minus" /></a>
+				</li>
+				<li><a href="" t:type="actionlink" t:id="newMember"
+					t:context="editGroup" class="btn btn-sm btn-info" role="button"><t:SVGIcon
+							t:path="user-plus" /> New member</a></li>
+			</ol>
+			<div t:type="if" t:test="editGroupMember">
+				<form t:id="NewMemberForm" t:type="beaneditform"
+					t:object="editGroupMember" t:model="modelGroupMember"
+					t:cancel="true">
+					<p:student>
+						<select t:type="select" t:model="AllStudentsModel"
+							t:value="editGroupMember.student"></select>
+					</p:student>
 				</form>
-
-				<h3 class="mt-3">Group Focus On Tests</h3>
-
-				<div class="col-sm-12">
-					<ol>
-						<li t:type="loop" t:id="groupFocusOnTests"
-							t:source="editGroup.groupFocusOnTests" t:value="groupFocusOnTest">
-							${groupFocusOnTest.testInstance.title}<a href=""
-							t:type="actionlink" t:id="DeleteGroupFocusOnTest"
-							t:context="groupFocusOnTest" class="btn btn-sm btn-default"><t:SVGIcon
-									t:path="minus-square" /></a>
-						</li>
-						<li><a href="" t:type="actionlink" t:id="newFocusOnTest"
-							t:context="editGroup" class="btn btn-sm btn-info" role="button"><span
-								class="plus-square"></span> New Focus On Test</a></li>
-					</ol>
-					
-					<div t:type="if" t:test="editGroupFocusOnTest">
-						<div t:type="modalbox">
-							<form t:id="NewFocusOnTestForm" t:type="form">
-								<t:beaneditor t:object="editGroupFocusOnTest"
-									t:model="modelGroupFocusOnTest" t:add="testInstance">
-									<p:testInstance>
-										<select t:type="select" t:model="AllTestInstancesModel"
-											t:value="editGroupFocusOnTest.testInstance"></select>
-									</p:testInstance>
-								</t:beaneditor>
-								<t:submit t:value="OK" />
-								<a href="" t:type="eventlink" t:id="cancelNewFocusOnTestForm">Cancel</a>
-							</form>
-						</div>
-					</div>
-				</div>
-
-
 			</div>
-
-			<div class="col-6">
-				<h3>Group members</h3>
-
-				<div class="col-sm-12">
-					<table class="table table-sm table-hover table-bordered table-striped" t:type="grid" t:id="groupMembers"
-						t:model="groupMemberGridModel" t:source="editGroup.groupMembers"
-						t:row="groupMember" t:rowsperpage="50">
-						<p:actionsCell>
-							<a href="" t:type="actionlink" t:id="DeleteGroupMember"
-								t:context="groupMember" class="btn btn-sm btn-default"><t:SVGIcon
-									t:path="user-minus" /></a>
-						</p:actionsCell>
-					</table>
-
-					<a href="" t:type="actionlink" t:id="newMember"
-						t:context="editGroup" class="btn btn-sm btn-info" role="button"><t:SVGIcon
-							t:path="user-plus" /> New member</a>
-					<div t:type="if" t:test="editGroupMember">
-						<div t:type="modalbox">
-							<form t:id="NewMemberForm" t:type="form">
-								<t:beaneditor t:object="editGroupMember"
-									t:model="modelGroupMember" t:add="student">
-									<p:student>
-										<select t:type="select" t:model="AllStudentsModel"
-											t:value="editGroupMember.student"></select>
-									</p:student>
-								</t:beaneditor>
-								<t:submit t:value="OK" />
-								<a href="" t:type="eventlink" t:id="cancelNewMemberForm">Cancel</a>
-							</form>
-						</div>
-					</div>
-				</div>
-
+		</div>
+		<h3>Group Focus On Tests</h3>
+		<div class="col-sm-12">
+			<ol>
+				<li t:type="loop" t:id="groupFocusOnTests"
+					t:source="editGroup.groupFocusOnTests" t:value="groupFocusOnTest">
+					${groupFocusOnTest.testInstance.title}<a href=""
+					t:type="actionlink" t:id="DeleteGroupFocusOnTest"
+					t:context="groupFocusOnTest" class="btn btn-sm btn-default"><t:SVGIcon
+							t:path="minus-square" /></a>
+				</li>
+				<li><a href="" t:type="actionlink" t:id="newFocusOnTest"
+					t:context="editGroup" class="btn btn-sm btn-info" role="button"><span
+						class="plus-square"></span> New Focus On Test</a></li>
+			</ol>
+			<div t:type="if" t:test="editGroupFocusOnTest">
+				<form t:id="NewFocusOnTestForm" t:type="beaneditform"
+					t:object="editGroupFocusOnTest" t:model="modelGroupFocusOnTest"
+					t:cancel="true">
+					<p:testInstance>
+						<select t:type="select" t:model="AllTestInstancesModel"
+							t:value="editGroupFocusOnTest.testInstance"></select>
+					</p:testInstance>
+				</form>
 			</div>
 		</div>
@@ -98,11 +70,7 @@
 	</p:else>
 </div>
-<div t:type="if" t:test="groupCopyFrom" class="bg-info p-2 mt-3 mb-3">
-	<a class="btn btn-sm btn-secondary" t:type="eventlink" t:id="forgetCopy">Remove</a>
-	Copy members from: ${groupCopyFrom?.title}
-</div>
-<table t:type="grid" t:source="allGroups" t:row="group" t:add="actions">
+<table t:type="grid" t:source="allGroups" t:row="group" t:add="edit">
 	<p:titleCell>${group.title}</p:titleCell>
-	<p:actionsCell>
+	<p:editCell>
 		<a href="" t:type="actionlink" t:context="group"
 			title="message:symbol-edit" t:id="edit"
@@ -112,16 +80,6 @@
 			title="message:symbol-delete" t:id="delete"
 			class="btn btn-sm btn-danger" role="button"><t:SVGIcon
-				t:path="minus-square" t:mixins="confirm" /> ${message:symbol-delete}</a>
-		<a href="" t:type="eventlink" t:context="group"
-			title="message:symbol-copy" t:id="copyMembers"
-			class="btn btn-sm btn-danger" role="button"><t:SVGIcon
-				t:path="copy" /> ${message:symbol-copy}</a>
-		<t:if t:test="groupCopyFrom">
-		<a href="" t:type="eventlink" t:context="group"
-			title="message:symbol-paste" t:id="pasteMembers" t:mixins="confirm" 
-			class="btn btn-sm btn-danger" role="button"><t:SVGIcon
-				t:path="list" /> ${message:symbol-paste}</a>
-		</t:if>
-	</p:actionsCell>
+				t:path="minus-square" /> ${message:symbol-delete}</a>
+	</p:editCell>
 </table>
 </html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/ManagePersons.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/ManagePersons.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/ManagePersons.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -15,14 +15,4 @@
 			${message:New-label}</a>
 	</span>
-</p>
-
-<p>
-<form t:type="form" t:id="frmSearch" class="form-inline col-12">
-	<div class="form-group">
-		<t:label t:for="searchString"  class="mr-3"/>
-		<t:textfield t:id="searchString" />
-	</div>
-	<t:submit t:value="OK" />
-</form>
 </p>
 
@@ -59,5 +49,5 @@
 			class="btn btn-sm btn-primary"><t:SVGIcon t:path="edit" />
 			${message:edit-label}</a>
-		<a href="" t:type="eventLink" t:id="togglePersonStatus"
+		<a href="" t:type="actionlink" t:id="TogglePersonStatus"
 			t:context="person" class="btn btn-sm btn-secondary"><t:SVGIcon
 				t:path="toggle-left" /> ${message:toggle-status-label}</a>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/Reevaluation.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/Reevaluation.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/Reevaluation.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -8,22 +8,9 @@
 	<div class="col-lg-12">
 		<table t:type="grid" t:source="allTestInstances" t:row="testInstance"
-			t:add="actions" t:exclude="testInstanceId, scheduledFor,description">
-			<p:actionsCell>
-				<div class="row">
-					<div class="col-12 mb-3">
-						<a href="" class="col-12 btn btn-sm btn-primary" t:type="actionLink"
-							t:id="reEvalTest" t:context="testInstance">${message:reevaluate-label}
-							ALL</a>
-					</div>
-					<div class="col-3 mb-2" t:type="loop"
-						t:source="testInstance.taskInTestInstances"
-						t:value="taskInTestInstance">
-						<a href="" class="btn btn-sm btn-secondary "
-							t:type="actionLink" t:id="reEvalTaskInTestInstance"
-							t:context="taskInTestInstance">${message:reevaluate-label}
-							${taskInTestInstance.task.title}</a>
-					</div>
-				</div>
-			</p:actionsCell>
+			t:add="select" t:exclude="testInstanceId, scheduledFor,description">
+			<p:selectCell>
+				<a href="" t:type="actionLink" t:id="reEvalTest"
+					t:context="testInstance">${message:reevaluate-label}</a>
+			</p:selectCell>
 		</table>
 		<a href="" t:type="actionLink" t:id="reEvalAll"
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/StudentGroupProgress.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/StudentGroupProgress.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/StudentGroupProgress.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -18,36 +18,39 @@
 <div t:id="groupZone" id="groupZone" t:type="zone">
 	<div t:type="if" t:test="selectedGroup" class="table-responsive">
-		<table class="sgpTable table table-condensed table-bordered">
+		<table class="table table-condensed  table-bordered">
 			<thead>
-				<th colspan="2" class="sgpHeadTestLabel">${message:Test-label}</th>
+				<th></th>
+				<th style="vertical-align: middle;"><p
+						style="text-align: right;">${message:Test-label}</p></th>
 				<th t:type="loop" t:source="selectedGroup.groupFocusOnTests"
 					t:value="groupFocusOnTest" colspan="${numTasks}"
-					class="sgpHeadTestInstance">${groupFocusTestInstanceTitleTranslated}</th>
+					style="font-size: 85%;">${groupFocusTestInstanceTitleTranslated}</th>
 				<th></th>
 			</thead>
 			<thead>
-				<th class="sgpHeadFullNameLabel">${message:Student-label}</th>
-				<th class="sgpHeadUserNameLabel">${message:userName-label}</th>
+				<th><p>${message:Student-label}</p></th>
+				<th><p>${message:userName-label}</p></th>
 				<t:loop t:source="selectedGroup.groupFocusOnTests"
 					t:value="groupFocusOnTest">
 					<th t:type="loop" t:source="taskInTestInstances"
-						t:value="taskInTestInstance" class="sgpHeadTask">${taskInTestInstanceTaskTitleTranslated}
-						<span class="sgpHeadTaskPoints">(${taskInTestInstance.points})</span>
-					</th>
+						t:value="taskInTestInstance"
+						style="text-orientation: sideways; writing-mode: vertical-lr; font-size: 80%;">${taskInTestInstanceTaskTitleTranslated}</th>
 				</t:loop>
-				<th class="sgpHeadTotal">Total</th>
+				<th
+					style="text-orientation: sideways; writing-mode: vertical-lr; font-size: 80%; width: 4em;">Total</th>
 			</thead>
-			<tr t:type="loop" t:source="selectedGroupMembersSorted"
+			<tr t:type="loop" t:source="selectedGroup.groupMembers"
 				t:value="groupMember">
-				<td class="sgpResFullName">${groupMemberFullNameWithId}</td>
-				<td class="sgpResUserName">${groupMemberUserName}</td>
+				<td
+					style="white-space: nowrap; padding: 0em 0.5em; vertical-align: middle;">${groupMemberFullNameWithId}</td>
+				<td>${groupMemberUserName}</td>
 				<t:loop t:source="selectedGroup.groupFocusOnTests"
 					t:value="groupFocusOnTest">
-					<td t:type="loop"
-						t:source="testInstanceResultsByStudentSortedByTaskName"
-						t:value="result"
-						class="sgpResPoints ${resultColorClass} centered-hv ">${resultGrade}</td>
+					<td t:type="loop" t:source="taskInTestInstances"
+						t:value="taskInTestInstance" style="width: 3em;"
+						class="${colorClass} centered-hv ">
+						${assessmentsForTaskForStudent}</td>
 				</t:loop>
-				<td class="sgpResTotal">${groupMemberTotalPoints}</td>
+				<td>${groupMemberTotalPoints}</td>
 			</tr>
 		</table>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionEvaluations.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionEvaluations.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,391 +1,0 @@
-<html t:type="layout"
-	title="message:admin/SubmissionEvaluations-pagelink"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
-
-<div t:type="zone" t:id="zModal" id="zModal">
-	<t:if t:test="editedAssessment">
-		<t:ModalBox t:id="assessmentModal" t:additionalClassDialog="">
-
-			<div class="card">
-				<div class="card-header p-1">
-					<h3 class="mt-2 p-2">
-						<a role="button" data-toggle="collapse"
-							href="#collapsedDescription" aria-expanded="false"
-							aria-controls="collapsedDescription">
-							${editedAssessment.studentSubmitSolution?.taskInTestInstance.task.title}
-							<span class="maxpoints">${editedAssessment.studentSubmitSolution?.taskInTestInstance?.points}</span>
-							<t:SVGIcon t:path="chevrons-down" />
-						</a>
-					</h3>
-				</div>
-
-			</div>
-
-
-			<div class="card mt-2" t:type="if" t:test="editedAssessmentTaskSQL">
-				<div t:id="zSQLEval" t:type="zone">
-					<div class="card-header">
-						<div class="row m-0 p-0 ">
-							<div class="col-2">
-								<a role="button" href="#" t:type="eventlink"
-									t:id="prettyFormatToggle"
-									class="btn btn-sm btn-primary ${classPrettyFormat}"
-									t:zone="zSolution">Format SQL <t:SVGIcon
-										t:path="align-left" />
-								</a>
-							</div>
-							<div class="col-10 text-right">
-								${message:evaluationSimple-label}:
-								<t:booleanindicator
-									t:value="editedAssessment.studentSubmitSolution.evaluationSimple"
-									showCheckMark="true" showNo="true" />
-								${message:evaluationComplex-label}:
-								<t:booleanindicator
-									t:value="editedAssessment.studentSubmitSolution.evaluationComplex"
-									showCheckMark="true" showNo="true" />
-								${message:evaluationExam-label}:
-								<t:booleanindicator
-									t:value="editedAssessment.studentSubmitSolution.evaluationExam"
-									showCheckMark="true" showNo="true" />
-								<a href="" t:type="eventlink" t:id="reevaluateEditedSubmission"
-									t:context="editedAssessment.studentSubmitSolution"
-									t:zone="zModal" class="btn btn-sm btn-warning">${message:reevaluate-label}
-									<t:SVGIcon t:path="repeat" />
-								</a> <a href="" class="btn btn-sm btn-info" t:type="eventlink"
-									t:id="viewEvaluationResults" t:zone="zSQLEval"
-									t:context="editedAssessment.studentSubmitSolution">${message:viewEvalResults-label}
-									<t:SVGIcon t:path="eye" />
-								</a> <a href="" t:type="eventlink"
-									t:id="assessEditedAsCorrectSubmission" t:async="true"
-									t:zone="zModal" class="btn btn-sm btn-success correct"><img
-									t:type="svgicon" t:path="check" />${message:assessmentComment-correct}</a>
-								<a href="" t:type="eventlink"
-									t:id="assessEditedAsIncorrectSubmission" t:async="true"
-									t:zone="zModal" class="btn btn-sm btn-warning incorrect"><img
-									t:type="svgicon" t:path="x" />${message:assessmentComment-incorrect}</a>
-
-							</div>
-						</div>
-					</div>
-					<div class="card-body" t:type="if" t:test="anyStatus">
-						<div class="row">
-							<div class="col-6 bg-danger" t:type="if" t:test="resultsErrors1">
-								<ul>
-									<li t:type="loop" t:source="resultsErrors1"
-										t:value="resultsError">${resultsError}</li>
-								</ul>
-							</div>
-							<div class="col-6 bg-danger" t:type="if" t:test="resultsErrors2">
-								<ul>
-									<li t:type="loop" t:source="resultsErrors2"
-										t:value="resultsError">${resultsError}</li>
-								</ul>
-							</div>
-						</div>
-						<div class="row" t:type="if" t:test="anyResults">
-							<div class="col-12">
-								<h3>${message:query-results-label}1</h3>
-								<div class="alert resultspanel resultspanel-colors" role="alert"
-									t:type="if" t:test="resultsEvaluation1">
-
-									<table
-										class="tblCompareData table table-sm table-hover table-bordered table-striped">
-										<thead>
-											<tr>
-												<th t:type="loop" t:source="resultsHeaders1"
-													t:value="oneHeader">${oneHeader}</th>
-											</tr>
-										</thead>
-										<tbody>
-											<tr t:type="loop" t:source="resultsEvaluation1"
-												t:value="oneRow" class="p-0 m-0">
-												<td class="p-0 m-0" t:type="loop" t:source="oneRow"
-													t:value="oneColumn"><tt>
-														<t:outputraw t:value="oneColumn" />
-													</tt></td>
-											</tr>
-										</tbody>
-									</table>
-									<p:else>
-										<p>/</p>
-									</p:else>
-								</div>
-								<h3>${message:query-results-label}2</h3>
-								<div class="alert resultspanel resultspanel-colors" role="alert"
-									t:type="if" t:test="resultsEvaluation2">
-									<table
-										class="tblCompareData table table-sm table-hover table-bordered table-striped">
-										<thead>
-											<tr>
-												<th t:type="loop" t:source="resultsHeaders2"
-													t:value="oneHeader">${oneHeader}</th>
-											</tr>
-										</thead>
-										<tbody>
-											<tr t:type="loop" t:source="resultsEvaluation2"
-												t:value="oneRow" class="p-0 m-0">
-												<td class="p-0 m-0" t:type="loop" t:source="oneRow"
-													t:value="oneColumn"><tt>
-														<t:outputraw t:value="oneColumn" />
-													</tt></td>
-											</tr>
-										</tbody>
-									</table>
-									<p:else>
-										<p>/</p>
-									</p:else>
-								</div>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-
-			<form t:type="form" class="form-vertical mt-1" t:id="FormEditor"
-				id="FormEditor" t:autofocus="true">
-				<div class="form-row">
-					<div class="form-group col-6  ${classSQLsolution}" t:type="zone"
-						t:id="zSolution" id="zSolution">
-						<label for="solution">${message:submittedBy-label}:
-							${editedAssessmentSubmitterName}</label> <a href="" t:type="eventlink"
-							t:id="copySolutionToFeedback"
-							class="float-right btn btn-sm btn-danger p-0 pl-1 pr-1">↦</a>
-						<div class="card-body collapse" id="collapsedDescription">
-							<t:outputraw t:value="translateTaskDescription"></t:outputraw>
-						</div>
-						<div class="pre-scrollable modalSubmission">
-							<pre><t:outputraw t:value="formattedSolution" /></pre>
-						</div>
-
-
-					</div>
-					<div class="form-group col-6 feedback">
-						<label t:type="label" t:for="feedback"></label>
-						<textarea t:type="textarea" id="feedback" t:id="feedback"
-							t:value="editedAssessment.feedback" t:mixins="WebEditor"
-							t:WebEditor.areaType="CKADMIN" />
-					</div>
-				</div>
-				<t:errors />
-				<div class="form-row form-inline">
-					<div class="form-group mr-2">
-						<label t:type="label" t:for="type"></label> <input
-							t:type="textfield" t:id="type" t:value="editedAssessment.type"
-							class="form-control ml-1"></input>
-					</div>
-					<div class="form-group mr-2">
-						<label t:type="label" t:for="grade"></label> <input
-							t:type="textfield" t:id="grade" t:value="editedAssessment.grade"
-							class="form-control ml-1"></input>
-					</div>
-					<div class="form-group mr-2">
-						<div class="form-check">
-							<label t:type="label" t:for="passed" class="form-check-label"></label>
-							<input t:type="checkbox" t:id="passed"
-								t:value="editedAssessment.passed" class="form-check-input ml-3"></input>
-						</div>
-					</div>
-					<div class="form-group col-2 ml-3">
-						<button type="submit" class="btn btn-primary" value="OK">OK</button>
-						<a type="button" role="button" href="" t:type="actionlink"
-							t:id="cancelFormEditor" class="btn btn-secondary ml-1">Cancel
-						</a>
-					</div>
-				</div>
-			</form>
-
-		</t:ModalBox>
-	</t:if>
-</div>
-
-
-<h2>${message:admin/SubmissionEvaluations-pagelink}</h2>
-
-<div class="card bg-light mb-3">
-	<div class="card-body pb-0 pt-0">
-		<form t:type="form" t:id="selectStudentForm" class="form-horizontal">
-			<div class="form-row">
-
-				<div class="form-group col-md-5">
-					<label t:type="label" for="selectTestInstance"
-						class="col-form-label"></label> <select t:id="selectTestInstance"
-						t:type="select" t:model="selectTestInstanceModel"
-						t:value="filterTestInstance" class="form-control form-control-sm"
-						t:zone="zTask"></select>
-				</div>
-
-				<div class="form-group col-md-4" t:type="zone" t:id="zTask"
-					id="zTask">
-					<label t:type="label" for="selectTaskInTestInstance"
-						class="col-form-label"></label> <select
-						t:id="selectTaskInTestInstance" t:type="select"
-						t:model="selectTaskInTestInstanceModel"
-						t:value="filterTaskInTestInstance"
-						class="form-control form-control-sm" t:zone="zSubmissions"></select>
-				</div>
-
-				<div class="form-group col-md-3" t:type="zone" t:id="zStudent"
-					id="zStudent">
-					<label t:type="label" for="selectStudent" class="col-form-label"></label>
-					<select t:id="selectStudent" t:type="select"
-						t:model="SelectStudentsModel" t:value="filterStudent"
-						t:zone="zSubmissions" class="form-control form-control-sm"></select>
-				</div>
-
-			</div>
-			<div class="form-row">
-				<div class="form-group ml-4 mr-3">
-					<t:checkbox t:id="onlyEval" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="onlyEval" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-3">
-					<t:checkbox t:id="onlyCorrect" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="onlyCorrect" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-3">
-					<t:checkbox t:id="onlyLast" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="onlyLast" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-3">
-					<t:checkbox t:id="onlyAssessed" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="onlyAssessed" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-3">
-					<t:checkbox t:id="onlyUnAssessed" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="onlyUnAssessed" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-3">
-					<t:checkbox t:id="onlyDateOfExam" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="onlyDateOfExam" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-4">
-					<t:checkbox t:id="hideClientInfo" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="hideClientInfo" class="form-check-label"></label>
-				</div>
-				<div class="form-group mr-3 ml-4">
-					<t:checkbox t:id="hideNames" onclick="this.form.submit();"
-						class="form-check-input" />
-					<label t:type="label" for="hideNames" class="form-check-label"></label>
-				</div>
-			</div>
-			<t:errors />
-		</form>
-	</div>
-</div>
-
-<div t:type="zone" t:id="zSubmissions" id="zSubmissions">
-	<div class="mb-3" t:type="if" t:test="filterTaskDDL">
-		<a href="" t:type="pagelink" class="btn btn-primary"
-			t:page="instructor/RelationSchemaEvaluation"
-			t:context="filterTaskInTestInstance">${message:eval-ddl-label}</a>
-	</div>
-	<t:if t:test="filterTestInstance">
-		<div>
-			<table t:id="recentsubmission" t:type="grid"
-				t:source="allSubmissions" t:row="submission" t:model="modelSSS"
-				t:rowsperpage="50" t:rowClass="${evaluationClass}"
-				class="table table-sm table-bordered">
-				<p:submittedByCell>
-					${submittedByNameWithId}<br />
-					<a href="" t:type="actionlink" t:id="ShowUserActivities"
-						t:context="submission" t:zone="zSelectStudents" role="button"
-						class="btn btn-sm btn-secondary">In Focus</a>
-				</p:submittedByCell>
-				<p:submissionCell>
-					<t:if t:test="SQL">
-						<t:code t:additionalClass="literal:submittedCode"
-							t:value="submission.submission"></t:code>
-					</t:if>
-					<t:if t:test="DDL">
-						<div class="pre-scrollable submittedCode">
-							<t:outputraw t:value="submission.submission"></t:outputraw>
-						</div>
-					</t:if>
-					<t:if t:test="TEXT">
-						<div class="pre-scrollable submittedText">
-							<t:outputraw t:value="submission.submission"></t:outputraw>
-						</div>
-					</t:if>
-				</p:submissionCell>
-				<p:clientInfoCell>
-					<t:code t:value="submission.clientInfo"></t:code>
-				</p:clientInfoCell>
-				<p:notForEvaluationCell>
-					<t:booleanindicator t:value="submission?.notForEvaluation"
-						showCheckMark="true" />
-				</p:notForEvaluationCell>
-				<p:evaluationSimpleCell>
-					<t:booleanindicator t:value="submission?.evaluationSimple"
-						showCheckMark="true" />
-				</p:evaluationSimpleCell>
-				<p:evaluationComplexCell>
-					<t:booleanindicator t:value="submission?.evaluationComplex"
-						showCheckMark="true" />
-				</p:evaluationComplexCell>
-				<p:evaluationExamCell>
-					<t:booleanindicator t:value="submission?.evaluationExam"
-						showCheckMark="true" />
-				</p:evaluationExamCell>
-				<p:submittedOnCell>
-					<t:output format="literal:yyyy-MM-dd HH:mm:ss"
-						value="submission?.submittedOn" />
-				</p:submittedOnCell>
-				<p:assessmentCell>
-					<div t:type="if" t:test="SQL">
-						<a href="" t:type="eventlink" t:id="reevaluateSubmission"
-							t:context="submission" t:zone="zSubmissions"
-							class="btn btn-sm btn-warning"><img t:type="svgicon"
-							t:path="repeat" />${message:reevaluate-label}</a>
-					</div>
-					<div t:type="if" t:test="UPLOAD">Upload is not supported.</div>
-					<div t:type="if" t:test="submission.evaluations">
-						${message:grade-label}: <span class="badge badge-dark">${submissionsFirstEvaluation.grade}</span>
-						<br />${message:evaluatedOn-label}:
-						<t:output format="literal:yyyy-MM-dd HH:mm:ss"
-							value="submissionsFirstEvaluation?.evaluatedOn" />
-						<pre class="feedback">
-							<t:outputraw value="submissionsFirstEvaluation.feedback" />
-						</pre> <a href="" t:type="actionlink" t:id="editAssessment"
-							t:async="true" t:context="submissionsFirstEvaluation"
-							class="btn btn-sm btn-primary"><img t:type="svgicon"
-							t:path="edit" />${message:editAssessment-label}</a>
-						<p:else>
-							<a href="" t:type="actionlink" t:id="addAssessment"
-								t:async="true" t:context="submission"
-								class="btn btn-sm btn-primary"><img t:type="svgicon"
-								t:path="edit" />${message:addAssessment-label}</a>
-							<a href="" t:type="eventlink" t:id="assessAsCorrectSubmission"
-								t:async="true" t:context="submission"
-								class="btn btn-sm btn-success correct"><img t:type="svgicon"
-								t:path="check" />${message:assessmentComment-correct}</a>
-							<a href="" t:type="eventlink" t:id="assessAsIncorrectSubmission"
-								t:async="true" t:context="submission"
-								class="btn btn-sm btn-warning incorrect"><img
-								t:type="svgicon" t:path="x" />${message:assessmentComment-incorrect}</a>
-						</p:else>
-					</div>
-					<a href="" t:type="pagelink" t:id="viewActivities"
-						t:context="[submission.studentStartedTest.student.person,submission.taskInTestInstance]"
-						t:page="instructor/ActivityMonitor" class="btn btn-sm btn-info"><img
-						t:type="svgicon" t:path="info" />${message:instructor/activityMonitor-pagelink}</a>
-				</p:assessmentCell>
-				<p:empty>
-					<div>${message:no-data-label}</div>
-				</p:empty>
-			</table>
-		</div>
-		<p:else>
-			<p>${message:please-select-test-instance-label}</p>
-		</p:else>
-	</t:if>
-</div>
-
-</html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionLogViewer.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionLogViewer.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionLogViewer.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -0,0 +1,229 @@
+<html t:type="layout" title="message:admin/SubmissionLogViewer-pagelink"
+	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+	xmlns:p="tapestry:parameter">
+
+<div t:type="zone" t:id="zModal" id="zModal">
+	<t:if t:test="editedAssessment">
+		<t:ModalBox t:id="assessmentModal" t:additionalClassDialog="modal-lg">
+
+			<div class="card">
+				<div class="card-header p-0">
+					<a class="btn btn-sm btn-default" role="button"
+						data-toggle="collapse" href="#collapsedDescription"
+						aria-expanded="false" aria-controls="collapsedDescription">
+						${editedAssessment.studentSubmitSolution?.taskInTestInstance.task.title}
+						<span class="maxpoints">${editedAssessment.studentSubmitSolution?.taskInTestInstance?.points}</span>
+						<t:SVGIcon t:path="chevrons-down" />
+					</a>
+				</div>
+				<div class="card-body collapse " id="collapsedDescription">
+					<t:outputraw t:value="translateTaskDescription"></t:outputraw>
+				</div>
+			</div>
+
+			<form t:type="form" class="form-inline" t:id="FormEditor"
+				id="FormEditor" t:autofocus="true">
+				<t:errors />
+				<div class="row">
+					<div class="form-group col-6">
+						<label for="kodot" class="col-form-label col-12">${message:solution-label}</label>
+						<t:code id="kodot" t:id="kodot"
+							t:value="editedAssessment.studentSubmitSolution.submission"
+							class="modalSubmission form-control col-12"></t:code>
+					</div>
+					<div class="feedback-editor form-group col-6">
+						<label t:type="label" class="col-form-label" t:for="feedback"></label>
+						<textarea t:type="textarea" t:id="feedback"
+							t:value="editedAssessment.feedback" t:mixins="WebEditor"
+							t:WebEditor.areaType="CKADMIN" />
+					</div>
+				</div>
+				<div class="form-row">
+					<div class="form-group col-auto">
+						<label t:type="label" t:for="passed" class="col-form-label">Passed
+							<input t:type="checkbox" t:id="passed"
+							t:value="editedAssessment.passed" class="form-control"></input>
+						</label>
+					</div>
+					<div class="form-group col-auto">
+						<label t:type="label" t:for="type" class="col-form-label"></label>
+						<input t:type="textfield" t:id="type"
+							t:value="editedAssessment.type" class="form-control"></input>
+					</div>
+					<div class="form-group col-auto">
+						<label t:type="label" t:for="grade" class="col-form-label"></label>
+						<input t:type="textfield"
+							data-translation-message="You must provide a numeric value for Оценка."
+							data-translation="numeric" data-validation="true" t:id="grade"
+							t:value="editedAssessment.grade" class="form-control numeric"></input>
+					</div>
+					<div class="form-group col-auto">
+						<button type="submit" class="btn btn-primary" value="OK">OK</button>
+						<button type="submit" class="btn btn-secondary ml-2"
+							value="Cancel">Cancel</button>
+					</div>
+				</div>
+			</form>
+
+		</t:ModalBox>
+	</t:if>
+</div>
+
+
+<h2>${message:admin/SubmissionLogViewer-pagelink}</h2>
+
+<div class="card bg-light mb-3">
+	<div class="card-body pb-0 pt-0">
+		<form t:type="form" t:id="selectStudentForm" class="form-horizontal">
+			<div class="form-row">
+
+				<div class="form-group col-md-5">
+					<label t:type="label" for="selectTestInstance"
+						class="col-form-label"></label> <select t:id="selectTestInstance"
+						t:type="select" t:model="selectTestInstanceModel"
+						t:value="filterTestInstance" class="form-control form-control-sm"
+						t:zone="zTask"></select>
+				</div>
+
+				<div class="form-group col-md-4" t:type="zone" t:id="zTask"
+					id="zTask">
+					<label t:type="label" for="selectTaskInTestInstance"
+						class="col-form-label"></label> <select
+						t:id="selectTaskInTestInstance" t:type="select"
+						t:model="selectTaskInTestInstanceModel"
+						t:value="filterTaskInTestInstance"
+						class="form-control form-control-sm" t:zone="zSubmissions"></select>
+				</div>
+
+				<div class="form-group col-md-3" t:type="zone" t:id="zStudent"
+					id="zStudent">
+					<label t:type="label" for="selectStudent" class="col-form-label"></label>
+					<select t:id="selectStudent" t:type="select"
+						t:model="SelectStudentsModel" t:value="filterStudent"
+						t:zone="zSubmissions" class="form-control form-control-sm"></select>
+				</div>
+
+			</div>
+			<div class="form-row">
+				<div class="form-group col-md-2">
+					&nbsp;&nbsp;&nbsp;
+					<t:checkbox t:id="onlyEval" onclick="this.form.submit();"
+						class="form-check-input" />
+					<label t:type="label" for="onlyEval" class="form-check-label"></label>
+				</div>
+				<div class="form-group col-md-2">
+					&nbsp;&nbsp;&nbsp;
+					<t:checkbox t:id="onlyCorrect" onclick="this.form.submit();"
+						class="form-check-input" />
+					<label t:type="label" for="onlyCorrect" class="form-check-label"></label><br />
+				</div>
+				<div class="form-group col-md-2">
+					&nbsp;&nbsp;&nbsp;
+					<t:checkbox t:id="onlyLast" onclick="this.form.submit();"
+						class="form-check-input" />
+					<label t:type="label" for="onlyLast" class="form-check-label"></label><br />
+				</div>
+				<div class="form-group col-md-2">
+					&nbsp;&nbsp;&nbsp;
+					<t:checkbox t:id="onlyAssessed" onclick="this.form.submit();"
+						class="form-check-input" />
+					<label t:type="label" for="onlyAssessed" class="form-check-label"></label><br />
+				</div>
+				<div class="form-group col-md-2">
+					&nbsp;
+					<t:checkbox t:id="onlyDateOfExam" onclick="this.form.submit();"
+						class="form-check-input" />
+					<label t:type="label" for="onlyDateOfExam" class="form-check-label"></label><br />
+				</div>
+				<div class="form-group col-md-2">
+					&nbsp;
+					<t:checkbox t:id="hideClientInfo" onclick="this.form.submit();"
+						class="form-check-input" />
+					<label t:type="label" for="hideClientInfo" class="form-check-label"></label><br />
+				</div>
+			</div>
+			<t:errors />
+		</form>
+	</div>
+</div>
+
+<div t:type="zone" t:id="zSubmissions" id="zSubmissions">
+	<t:if t:test="filterTestInstance">
+		<div>
+			<table t:id="recentsubmission" t:type="grid"
+				t:source="allSubmissions" t:row="submission" t:model="modelSSS"
+				t:rowsperpage="50" t:rowClass="${evaluationClass}"
+				class="table table-sm table-hover table-bordered table-striped">
+				<p:submissionCell>
+					<t:code t:value="submission.submission"></t:code>
+				</p:submissionCell>
+				<p:clientInfoCell>
+					<t:code t:value="submission.clientInfo"></t:code>
+				</p:clientInfoCell>
+				<p:submittedByCell>
+				${submittedByNameWithId}<br />
+					<a href="" t:type="actionlink" t:id="ShowUserActivities"
+						t:context="submission" t:zone="zSelectStudents" role="button"
+						class="btn btn-xs btn-secondary">In Focus</a>
+				</p:submittedByCell>
+				<p:notForEvaluationCell>
+					<t:booleanindicator t:value="submission?.notForEvaluation"
+						showCheckMark="true" />
+				</p:notForEvaluationCell>
+				<p:evaluationSimpleCell>
+					<t:booleanindicator t:value="submission?.evaluationSimple"
+						showCheckMark="true" />
+				</p:evaluationSimpleCell>
+				<p:evaluationComplexCell>
+					<t:booleanindicator t:value="submission?.evaluationComplex"
+						showCheckMark="true" />
+				</p:evaluationComplexCell>
+				<p:evaluationExamCell>
+					<t:booleanindicator t:value="submission?.evaluationExam"
+						showCheckMark="true" />
+				</p:evaluationExamCell>
+				<p:submittedOnCell>
+					<t:output format="literal:yyyy-MM-dd hh:mm:ss.S"
+						value="submission?.submittedOn" />
+				</p:submittedOnCell>
+				<p:assessmentCell>
+					<t:if t:test="SQL">
+						<a href="" t:type="actionlink" t:id="reevaluateSubmission"
+							t:context="submission" t:zone="zSubmissions"
+							class="btn btn-xs btn-warning">${message:reevaluate-label}</a>
+					</t:if>
+					<t:if t:test="UPLOAD">
+					</t:if>
+					<t:if t:test="submission.evaluations">
+						<p>
+							${message:grade-label}: <span class="badge">${submissionsFirstEvaluation.grade}</span>
+							<br />${message:evaluatedOn-label}:
+							${submissionsFirstEvaluation.evaluatedOn}
+						</p>
+						<pre class="well well-sm feedback">
+							<t:outputraw value="submissionsFirstEvaluation.feedback" />
+						</pre>
+						<p>
+							<a href="" t:type="actionlink" t:id="editAssessment"
+								t:async="true" t:context="submissionsFirstEvaluation"
+								class="btn btn-xs btn-primary">${message:editAssessment-label}</a>
+						</p>
+						<p:else>
+							<a href="" t:type="actionlink" t:id="addAssessment"
+								t:async="true" t:context="submission"
+								class="btn btn-xs btn-primary">${message:addAssessment-label}</a>
+						</p:else>
+					</t:if>
+				</p:assessmentCell>
+				<p:empty>
+					<div>${message:no-data-label}</div>
+				</p:empty>
+			</table>
+		</div>
+		<p:else>
+			<p>${message:please-select-test-instance-label}</p>
+		</p:else>
+	</t:if>
+</div>
+
+</html>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SystemParameters.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SystemParameters.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,30 +1,0 @@
-<html t:type="layout" title="message:admin/SystemParameters-pagelink"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
-
-<h1>${message:admin/SystemParameters-pagelink}</h1>
-
-<div t:type="if" t:test="editSystemParameter">
-	<form t:type="beaneditform" t:object="editSystemParameter"
-		t:id="editSystemParameter" t:exclude="systemParameterId" />
-</div>
-
-<p>
-	<a href="" t:type="actionlink" class="btn btn-sm btn-primary"
-		t:id="newSystemParameter"><t:svgicon
-				t:path="plus" />${message:new-label}</a>
-</p>
-
-<table class="table table-sm" t:type="grid" t:source="systemParameters"
-	t:row="systemParameter" t:exclude="systemParameterId" t:add="icons">
-	<p:iconsCell>
-		<a href="" t:type="actionlink" class="btn btn-sm btn-primary"
-			t:id="editParameter" t:context="systemParameter"><t:svgicon
-				t:path="edit" />${message:edit-label}</a>
-		<a href="" t:type="actionlink" class="btn btn-sm btn-danger"
-			t:id="deleteParameter" t:context="systemParameter"><t:svgicon
-				t:path="trash" />${message:remove-label}</a>
-	</p:iconsCell>
-</table>
-
-</html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TestAdminPage.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TestAdminPage.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TestAdminPage.tml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -3,248 +3,208 @@
 	xmlns:p="tapestry:parameter">
 
-<h1>${message:admin/TestAdmin-pagelink}</h1>
-
-<h2>${message:testType-label}</h2>
-
-<form t:type="form" t:id="chooserFormTestType" class="form-inline">
-	<select t:type="select" id="selectTestType" t:id="selectTestType"
-		t:model="modelTestTypes" t:value="testType" class="form-control"
-		t:zone="testTypeZone"></select>
-</form>
-
-<hr />
+<h1>${message:testType-label}</h1>
+
+<div class="row">
+	<div class="col-12">
+		<form t:type="form" t:id="chooserFormTestType" class="form-inline">
+			<select t:type="select" id="selectTestType" t:id="selectTestType"
+				t:model="modelTestTypes" t:value="testType" class="form-control"
+				t:zone="testTypeZone"></select>
+		</form>
+	</div>
+</div>
 
 <div t:id="testTypeZone" id="testTypeZone" t:type="zone">
 	<div t:type="if" t:test="testType">
-
-		<h2>${message:testInstance-label}</h2>
+		<p>
+			<a href="" class="btn btn-warning" t:type="actionlink"
+				t:context="testType" t:id="newTestInstance">${message:symbol-createObjectAndAddToList}</a>
+		</p>
+
+		<div class="row">
+			<div class="col-12">
+				<h2>${message:testInstance-label}</h2>
+
+				<form t:type="form" t:id="chooserFormTestInstance">
+					<div class="form-group">
+						<label for="selectTestInstance">${message:testInstance-label}</label>
+						<select t:type="select" id="selectTestInstance"
+							t:id="selectTestInstance" t:model="modelTestInstances"
+							t:value="testInstance" class="form-control"
+							t:zone="testInstanceZone"></select>
+					</div>
+				</form>
+			</div>
+		</div>
 
 		<div t:id="testInstanceZone" id="testInstanceZone" t:type="zone">
-			<div t:type="if" t:test="selectedTestInstance" class="card bg-light">
-				<p:then>
-					<div class="card-header">
-						<a t:type="eventlink" class="float-right" t:id="hideTestInstance">${message:hide-label}</a>
-						<h3>${selectedTestInstance.title}</h3>
+			<div t:type="if" t:test="testInstance">
+				<div class="row">
+					<div class="col-4">
+						<p>
+							<a href="" class="btn btn-sm btn-primary" t:type="actionlink"
+								t:context="testInstance" t:id="editTestInstance">${message:symbol-edit}</a>
+							<a href="" class="btn btn-sm btn-danger" t:type="actionlink"
+								t:context="testInstance" t:id="deleteTestInstance">${message:symbol-removeObjectFromList}</a>
+							<a href="" class="btn btn-sm btn-default" t:type="actionlink"
+								t:context="testInstance" t:id="duplicateTestInstance">${message:symbol-duplicate}</a>
+						</p>
+						<p>
+							${message:scheduledFor-label}: <span class="bg-info">${testInstance.scheduledFor}</span>
+							${message:scheduledUntil-label}: <span class="bg-info">${testInstance.scheduledUntil}</span>
+						</p>
+						<p t:type="outputraw" t:value="testInstance.description">Test
+							Instance Description PLACEHOLDER</p>
+						<p>
+							<img src="${testInstance.testTemplate.model.diagramUrl}"
+								style="width: 100%; max-width: 30em; max-height: 15em;" />
+						</p>
 					</div>
-					<div class="card-body row">
-						<div class="col-3">
-							<p>
-								<a href="" class="btn btn-sm btn-primary" t:type="actionlink"
-									t:context="selectedTestInstance" t:id="editTestInstance"><svg
-										t:type="svgicon" t:path="edit" /> ${message:symbol-edit}</a> <a
-									href="" class="btn btn-sm btn-danger" t:type="actionlink"
-									t:context="selectedTestInstance" t:id="deleteTestInstance"><svg
-										t:type="svgicon" t:path="trash" />
-									${message:symbol-removeObjectFromList}</a> <a href=""
-									class="btn btn-sm btn-secondary" t:type="actionlink"
-									t:context="selectedTestInstance" t:id="duplicateTestInstance"><svg
-										t:type="svgicon" t:path="copy" /> ${message:symbol-duplicate}</a>
-							</p>
-							<div class="row pb-3">
-								<div class="col-3">${message:scheduledFor-label}:</div>
-								<div class="col-9 bg-light">${selectedTestInstance.scheduledFor}</div>
-								<div class="col-3">${message:scheduledUntil-label}:</div>
-								<div class="col-9 bg-light">${selectedTestInstance.scheduledUntil}</div>
-							</div>
-							<p t:type="outputraw" t:value="selectedTestInstance.description">Test
-								Instance Description PLACEHOLDER</p>
-							<p>
-								<img src="${selectedTestInstance.testTemplate.model.diagramUrl}"
-									style="width: 100%; max-width: 30em; max-height: 15em;" />
-							</p>
-						</div>
-
-						<div class="col-9">
-							<table class="table table-sm table-bordered table-striped">
-								<thead class="thead-dark">
-									<tr class="d-flex">
-										<th class="col-2">${message:task-label}</th>
-										<th class="col">${message:task-short-description-label}</th>
-									</tr>
-								</thead>
-								<tbody>
-									<tr class="d-flex" t:type="loop" t:source="taskInTestInstances"
-										t:value="taskInTestInstance">
-										<td class="col-2">
-											<p>${taskInTestInstance.task.title}</p>
-											<p class="maxpoints">${message:task-points-label}:
-												${taskInTestInstance.points}</p> <a href=""
-											class="btn btn-sm btn-secondary col-12" t:type="actionlink"
-											t:context="taskInTestInstance.task"
-											title="message:symbol-edit" t:id="editTask"><svg
-													t:type="svgicon" t:path="edit" /> ${message:symbol-edit}
-												${message:task-label}</a><br /> <a href=""
-											class="btn btn-sm btn-info col-12" t:type="actionlink"
-											t:context="taskInTestInstance" title="message:symbol-edit"
-											t:id="editTaskInTestInstance"><svg t:type="svgicon"
-													t:path="edit" />
-												${message:editPointsInTaskInTestInstance-label}</a> <br /> <a
-											href="" class="btn btn-sm btn-danger col-12"
-											t:type="actionlink" t:context="taskInTestInstance"
-											title="message:symbol-removeObjectFromList"
-											t:id="deleteTaskFromTestInstance"><svg t:type="svgicon"
-													t:path="trash" /> ${message:symbol-removeObjectFromList}
-												${message:taskInTestInstance-label}</a>
-										</td>
-										<td class="col">
-											<p t:type="outputraw"
-												t:value="taskInTestInstance.task.description">Task
-												description placeholder</p>
-										</td>
-									</tr>
-								</tbody>
-							</table>
-							<a href="" class="btn btn-warning" t:type="actionlink"
-								t:context="selectedTestInstance" t:id="newTask">${message:symbol-createObjectAndAddToList}</a>
-						</div>
+
+					<div class="col-8">
+						<table class="table table-sm table-bordered table-striped">
+							<thead class="thead-dark">
+								<tr class="d-flex">
+									<th class="col-2">${message:task-label}</th>
+									<th class="col-8">${message:task-short-description-label}</th>
+									<th class="col-2">${message:task-actions-label}</th>
+								</tr>
+							</thead>
+							<tbody>
+								<tr class="d-flex" t:type="loop" t:source="taskInTestInstances"
+									t:value="taskInTestInstance">
+									<td class="col-2">
+										<p>${taskInTestInstance.task.title}</p>
+										<p class="maxpoints">${message:task-points-label}:
+											${taskInTestInstance.points}</p>
+									</td>
+									<td class="col-8">
+										<p t:type="outputraw"
+											t:value="taskInTestInstance.task.description">Task
+											description placeholder</p>
+									</td>
+									<td class="col-2"><a href=""
+										class="btn btn-sm btn-info col-12" t:type="actionlink"
+										t:context="taskInTestInstance.task"
+										title="message:symbol-edit" t:id="editTask">${message:symbol-edit}
+											Task</a><br /> <a href=""
+										class="btn btn-sm btn-secondary col-12" t:type="actionlink"
+										t:context="taskInTestInstance" title="message:symbol-edit"
+										t:id="editTaskInTestInstance">${message:symbol-edit} Task
+											in Test Instance</a><br /> <a href=""
+										class="btn btn-sm btn-danger col-12" t:type="actionlink"
+										t:context="taskInTestInstance"
+										title="message:symbol-removeObjectFromList"
+										t:id="deleteTaskFromTestInstance">${message:symbol-removeObjectFromList}</a>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+						<a href="" class="btn btn-warning" t:type="actionlink"
+							t:context="testInstance" t:id="newTask">${message:symbol-createObjectAndAddToList}</a>
+						<a href="" class="btn btn-primary" t:type="actionlink"
+							t:context="testInstance" t:id="addTask">${message:symbol-addObjectToList}</a>
 					</div>
-				</p:then>
-				<p:else>
-					<p>
-						<a href="" class="btn btn-warning" t:type="actionlink"
-							t:context="testType" t:id="newTestInstance" t:async="true"><svg
-								t:type="svgicon" t:path="plus" />
-							${message:symbol-createObjectAndAddToList}</a>
-					</p>
-					<table t:type="grid" t:source="testInstancesByTestType"
-						t:row="listedTestInstance" t:exclude="testInstanceId"
-						t:reorder="ordering,title,description" t:add="actions">
-						<p:actionsCell>
-							<a t:id="showTestInstance" t:type="eventlink"
-								t:context="listedTestInstance" class="btn btn-sm btn-primary">${message:show-label}</a>
-						</p:actionsCell>
-					</table>
-				</p:else>
-			</div>
-		</div>
-
-	</div>
-</div>
-
-<div t:id="testInstanceEditZone" id="testInstanceEditZone" t:type="zone"
-	style="background-color: yellow;">
-
-	<div t:type="if" t:test="editedTestInstance">
-		<div t:type="modalbox" t:additionalClassDialog="modal-xl">
-			<h3 class="mt-0">${message:testInstance-label}</h3>
-
-			<div t:id="testTemplateZone" id="testTemplateZone" t:type="zone">
-				<div t:type="if" t:test="editedTestTemplate" class="card">
-					<div class="card-header">
-						<b>${message:TestTemplate-label}</b>
-					</div>
-					<div class="card-body bg-light">
-						<form t:id="frmTestTemplate" t:type="form"
-							class="form form-vertical" t:async="true">
-							<t:beaneditor t:object="editedTestTemplate" t:add="testModel"
-								t:exclude="testTemplateId">
-								<p:testModel>
-									<div class="form-group">
-										<t:label for="selectModel"></t:label>
-										<select t:type="select" t:id="selectModel" t:model="allModels"
-											t:value="editedTestTemplate.model" t:blankOption="NEVER"></select>
-									</div>
-								</p:testModel>
-							</t:beaneditor>
-							<t:submit t:value="message:save-label" t:async="true" />
-							<a href="" t:type="eventlink" t:id="cancelFrmTestTemplate"
-								t:async="true" class="btn btn-secondary">${message:cancel-label}</a>
-						</form>
-					</div>
-				</div>
-
-				<form t:type="beaneditform" t:id="frmTestInstance"
-					class="form-horizontal mt-3 mb-3" t:exclude="testInstanceId"
-					t:submitlabel="message:save-label" t:add="testTemplate"
-					t:reorder="title,ordering,testTemplate,openToAllStudents,openForReviewByStudents,scheduledFor,scheduledUntil,description"
-					t:object="editedTestInstance">
-					frmTestInstance PLACEHOLDER
-					<p:testTemplate>
-						<div class="form-row">
-							<div class="form-group col-10">
-								<label t:type="label" for="testTemplates"></label> <select
-									t:type="select" t:id="testTemplates" t:model="testTemplates"
-									t:value="editedTestInstance.testTemplate"></select>
-							</div>
-							<div class="form-group col-2">
-								<label class="form-check-label"></label>
-								<div>
-									<a t:id="NewTestTemplate" href="" t:type="actionlink"
-										t:context="testType" t:async="true"
-										class="btn btn-primary col-12"><svg t:type="svgicon"
-											t:path="plus" /> ${message:testTemplate-label}</a>
-								</div>
-							</div>
-						</div>
-						<hr />
-					</p:testTemplate>
-					<p:title>
-						<div class="form-row">
-							<div class="form-group col-10">
-								<label t:type="label" t:for="title"></label> <input
-									t:type="textfield" t:id="title"
-									t:value="editedTestInstance.title"></input>
-							</div>
-							<div class="form-group col-2">
-								<label t:type="label" t:for="ordering"></label> <input
-									t:type="textfield" t:id="ordering"
-									t:value="editedTestInstance.ordering"></input>
-							</div>
-						</div>
-					</p:title>
-					<p:ordering>
-					</p:ordering>
-					<p:scheduledFor>
-						<div class="form-row">
-							<div class="form-group col-3">
-								<label t:type="label" t:for="scheduledFor"></label> <input
-									t:type="datefield" t:id="scheduledFor"
-									t:value="editedTestInstance.scheduledFor"
-									t:format="yyyy-MM-dd HH:mm"></input>
-							</div>
-							<div class="form-group col-3">
-								<label t:type="label" t:for="scheduledUntil"></label> <input
-									t:type="datefield" t:id="scheduledUntil"
-									t:value="editedTestInstance.scheduledUntil"
-									t:format="yyyy-MM-dd HH:mm"></input>
-							</div>
-						</div>
-					</p:scheduledFor>
-					<p:scheduledUntil>
-					</p:scheduledUntil>
-					<p:description>
-						<div class="form-row">
-							<div class="form-group col-12">
-								<label t:type="label" t:for="instanceDescription"></label>
-								<textarea class="descriptionEditor" t:type="textarea"
-									id="instanceDescription" t:id="instanceDescription"
-									t:value="editedTestInstance.description" t:mixins="WebEditor"
-									t:WebEditor.areaType="CKADMIN" />
-							</div>
-						</div>
-					</p:description>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<div style="background-color: yellow;" t:id="testInstanceEditZone"
+	id="testInstanceEditZone" t:type="zone">
+
+	<div t:type="if" t:test="editedTestInstance" class="popupZone">
+
+		<div class="row">
+			<div class="col-lg-10">
+				<h3 style="margin-top: 0;">${message:editTestInstance-label}</h3>
+			</div>
+			<div class="col-lg-2">
+				<a class="close" aria-label="Close" href=""
+					t:id="cancelFrmTestInstance" t:type="actionlink"><span
+					aria-hidden="true">&times;</span> ${message:cancel-label}</a>
+			</div>
+		</div>
+
+		<form t:type="beaneditform" t:id="frmTestInstance"
+			t:exclude="testInstanceId" t:submitlabel="message:save-label"
+			t:add="testTemplate"
+			t:reorder="title,openToAllStudents,openForReviewByStudents,description,scheduledFor,scheduledUntil,testTemplate"
+			t:object="editedTestInstance">
+			frmTestInstance PLACEHOLDER
+			<p:title>
+				<div class="form-group col-lg-9">
+					<label t:type="label" t:for="title"></label> <input
+						t:type="textfield" t:id="title" t:value="editedTestInstance.title"></input>
+				</div>
+			</p:title>
+			<p:description>
+				<div class="form-group col-lg-9">
+					<label t:type="label" t:for="instanceDescription"></label>
+					<textarea class="descriptionEditor" t:type="textarea"
+						id="instanceDescription" t:id="instanceDescription"
+						t:value="editedTestInstance.description" t:mixins="WebEditor"
+						t:WebEditor.areaType="CKADMIN" />
+				</div>
+			</p:description>
+			<p:scheduledFor>
+				<div class="form-group col-lg-3">
+					<label t:type="label" t:for="scheduledFor"></label> <input
+						t:type="datefield" t:id="scheduledFor"
+						t:value="editedTestInstance.scheduledFor"
+						t:format="yyyy-MM-dd HH:mm"></input>
+				</div>
+			</p:scheduledFor>
+			<p:scheduledUntil>
+				<div class="form-group col-lg-3">
+					<label t:type="label" t:for="scheduledUntil"></label> <input
+						t:type="datefield" t:id="scheduledUntil"
+						t:value="editedTestInstance.scheduledUntil"
+						t:format="yyyy-MM-dd HH:mm"></input>
+				</div>
+			</p:scheduledUntil>
+			<p:testTemplate>
+				<div class="form-group col-lg-3">
+					<label t:type="label" for="testTemplates"></label> <select
+						t:type="select" t:id="testTemplates" t:model="testTemplates"
+						t:value="editedTestInstance.testTemplate"></select> <a
+						t:id="NewTestTemplate" href="" t:type="actionlink"
+						t:context="testType" class="btn btn.primary">${message:symbol-createObjectAndAddToList}
+						${message:testTemplate-label}</a>
+				</div>
+			</p:testTemplate>
+		</form>
+
+		<div t:type="if" t:test="editedTestTemplate">
+			<p:then>
+				<form t:type="beaneditform" t:id="frmTestTemplate"
+					t:exclude="testTemplateId" t:submitlabel="message:save-label"
+					t:object="editedTestTemplate" t:add="testModel">
+					frmTestTemplate PLACEHOLDER
+					<p:testModel>
+						<t:label for="testmodel"></t:label>
+						<select t:type="select" t:id="testmodel" t:model="allModels"
+							t:value="editedTestTemplate.model" t:blankOption="NEVER"></select>
+					</p:testModel>
 				</form>
-				<a t:type="actionlink" data-bs-dismiss="modal"
-					t:id="cancelFrmTestInstance" class="btn btn-secondary">${message:cancel-label}</a>
-			</div>
-
-			<hr />
-
-			<div t:type="if" t:test="editedTestInstanceParameters">
-				<h4>${message:TestInstanceParameters-label}</h4>
-				<form t:type="beaneditform" t:id="frmTestInstanceParameters"
-					t:exclude="testInstanceParametersId"
-					t:submitlabel="message:save-label"
-					t:object="editedTestInstanceParameters">frmTestInstanceParameters
-					PLACEHOLDER</form>
-
-				<p:else>${message:testinstanceparameters-empty-message}</p:else>
-			</div>
-		</div>
-	</div>
-</div>
-
-<div t:id="taskInTestInstanceEditZone" id="taskInTestInstanceEditZone"
-	t:type="zone" style="background-color: Lime">
+			</p:then>
+			<p:else>${message:testinstanceparameters-empty-message}</p:else>
+		</div>
+
+		<div t:type="if" t:test="editedTestInstanceParameters">
+			<form t:type="beaneditform" t:id="frmTestInstanceParameters"
+				t:exclude="testInstanceParametersId"
+				t:submitlabel="message:save-label"
+				t:object="editedTestInstanceParameters">frmTestInstanceParameters
+				PLACEHOLDER</form>
+			<p:else>${message:testinstanceparameters-empty-message}</p:else>
+		</div>
+
+	</div>
+</div>
+
+<div style="background-color: Lime" t:id="taskInTestInstanceEditZone"
+	id="taskInTestInstanceEditZone" t:type="zone">
 	<div t:type="if" t:test="editedTaskInTestInstance" class="popupZone">
 		<div class="row">
@@ -260,5 +220,5 @@
 		<form t:type="beaneditform" t:id="frmTaskInTestInstance"
 			t:exclude="taskInTestInstanceId" t:submitlabel="message:save-label"
-			t:object="editedTaskInTestInstance">
+			t:add="testTemplate" t:object="editedTaskInTestInstance">
 			frmTaskInTestInstance PLACEHOLDER
 			<p:testTemplate>
@@ -277,40 +237,40 @@
 </div>
 
-<div t:id="taskZone" id="taskZone" t:type="zone"
-	style="background-color: yellow;">
-	<div t:type="if" t:test="editedTask">
-		<div t:type="modalbox" t:additionalClassDialog="modal-xl">
-			<div class="row">
-				<div class="col-lg-10">
-					<h3 style="margin-top: 0;">${message:edit-task-label}</h3>
-				</div>
-				<div class="col-lg-2 text-right"></div>
-			</div>
-
-			<form t:type="beaneditform" t:id="frmTask" t:exclude="taskId"
-				t:submitlabel="message:save-label" t:object="editedTask"
-				t:add="taskModel,taskType">
-				frmTask PLACEHOLDER
-				<p:taskModel>
-					<t:label for="model"></t:label>
-					<select t:type="select" t:id="model" t:model="allModels"
-						t:value="editedTask.model" blankOption="NEVER"></select>
-				</p:taskModel>
-				<p:taskType>
-					<t:label for="taskType"></t:label>
-					<select t:type="select" t:id="taskType" t:model="allTaskTypes"
-						t:value="chosentaskType" blankOption="NEVER"></select>
-				</p:taskType>
-				<p:description>
-					<t:label for="taskDescription"></t:label>
-					<textarea class="descriptionEditor" t:type="textarea"
-						id="taskDescription" t:id="taskDescription"
-						t:value="editedTask.description" t:mixins="WebEditor"
-						t:WebEditor.areaType="CKADMIN" />
-				</p:description>
-			</form>
-			<a t:type="actionlink" t:id="cancelFrmTask" data-bs-dismiss="modal"
-				class="btn btn-secondary">${message:cancel-label}</a>
-		</div>
+<div style="background-color: yellow;" id="taskZone" t:id="taskZone"
+	t:type="zone">
+	<div t:type="if" t:test="editedTask" class="popupZone">
+		<div class="row">
+			<div class="col-lg-10">
+				<h3 style="margin-top: 0;">${message:edit-task-label}</h3>
+			</div>
+			<div class="col-lg-2">
+				<a class="close" aria-label="Close" href="" t:id="cancelFrmTask"
+					t:type="actionlink"><span aria-hidden="true">&times;</span>
+					${message:cancel-label}</a>
+			</div>
+		</div>
+
+		<form t:type="beaneditform" t:id="frmTask" t:exclude="taskId"
+			t:submitlabel="message:save-label" t:object="editedTask"
+			t:add="taskModel,taskType">
+			frmTask PLACEHOLDER
+			<p:taskModel>
+				<t:label for="model"></t:label>
+				<select t:type="select" t:id="model" t:model="allModels"
+					t:value="editedTask.model" blankOption="NEVER"></select>
+			</p:taskModel>
+			<p:taskType>
+				<t:label for="taskType"></t:label>
+				<select t:type="select" t:id="taskType" t:model="allTaskTypes"
+					t:value="chosentaskType" blankOption="NEVER"></select>
+			</p:taskType>
+			<p:description>
+				<t:label for="taskDescription"></t:label>
+				<textarea class="descriptionEditor" t:type="textarea"
+					id="taskDescription" t:id="taskDescription"
+					t:value="editedTask.description" t:mixins="WebEditor"
+					t:WebEditor.areaType="CKADMIN" />
+			</p:description>
+		</form>
 	</div>
 </div>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TranslationPage.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TranslationPage.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,56 +1,0 @@
-<html t:type="layout" title="message:admin/TranslationPage-pagelink"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
-
-<h1>${message:admin/TranslationPage-pagelink}</h1>
-
-<div t:type="if" t:test="editedTranslation">
-	<t:modalbox t:additionalclassdialog="modal-lg">
-		<form t:type="beaneditform" t:id="frmTranslation"
-			t:object="editedTranslation" t:exclude="translationId"
-			t:add="cancelLink">
-			<p:cancelLink>
-				<a class="float-right btn btn-secondary mr-3" href=""
-					t:type="actionLink" t:id="cancelTranslation">${message:Cancel-label}</a>
-			</p:cancelLink>
-		</form>
-	</t:modalbox>
-</div>
-
-<div class="row">
-	<div class="col-9">
-		<div class="card">
-			<div class="card-header">Filter</div>
-			<div class="card-body">
-				<form t:type="form">
-					<input t:type="textfield" t:value="filter" />
-				</form>
-			</div>
-		</div>
-	</div>
-	<div class="col-3">
-		<a href="" t:type="actionlink" t:id="newTranslation"
-			class="btn btn-primary"><img t:type="svgicon" t:path="plus" />
-			${message:translation-label}</a>
-	</div>
-</div>
-
-<table class="table table-sm" t:type="grid" t:source="listTranslations"
-	t:row="translationRow" t:add="actions">
-	<p:translatedTextCell>
-		<div class="translation">
-			<t:outputraw t:value="translationRow.translatedText" />
-		</div>
-	</p:translatedTextCell>
-	<p:actionsCell>
-		<a href="" t:type="actionlink" t:id="EditTranslation"
-			t:context="translationRow" class="btn btn-sm btn-primary"><t:SVGIcon
-				t:path="edit" /> ${message:edit-label}</a>
-		<a href="" t:type="actionlink" t:id="DeleteTranslation"
-			t:context="translationRow" class="btn btn-sm btn-secondary"
-			t:mixins="confirm"><t:SVGIcon t:path="user-minus" />
-			${message:remove-label}</a>
-	</p:actionsCell>
-</table>
-
-</html>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/instructor/ActivityMonitor.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/instructor/ActivityMonitor.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,26 +1,0 @@
-<html t:type="layout"
-	t:title="message:instructor/activityMonitor-pagelink"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
-
-<h1>${message:instructor/activityMonitor-pagelink}</h1>
-
-<div class="card card-body bg-light mb-3">
-	<form class="form form-inline" t:type="form">
-		<label t:type="label" t:for="filterType"></label> <input
-			t:type="textfield" t:id="filterType" />
-	</form>
-</div>
-
-<table class="table table-sm table-striped table-bordered table-hover"
-	t:type="grid" t:source="activitiesInTaskForPerson"
-	t:row="activityInTask" t:add="hashCode" t:rowsperpage="100">
-	<p:whenOccuredCell>
-		<t:output format="literal: dd.MM.yyyy HH:mm:ss.SSS"
-			value="activityInTask.whenOccured" />
-	</p:whenOccuredCell>
-	<p:hashCodeCell>
-	${hash}
-	</p:hashCodeCell>
-</table>
-</html>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/instructor/RelationSchemaEvaluation.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/instructor/RelationSchemaEvaluation.tml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,101 +1,0 @@
-<html t:type="layout"
-	t:title="message:instructor/relationSchemaEvaluation-pagelink"
-	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
-	xmlns:p="tapestry:parameter">
-
-<h1>${message:instructor/relationSchemaEvaluation-pagelink}</h1>
-
-<h2>Filter Data</h2>
-
-
-
-<div class="card card-body bg-light mb-3">
-	<form t:type="form" class="form form-inline" t:zone="zEvaluationTable"
-		t:id="formFilter">
-		<div class="form-group">
-			<label t:type="label" t:for="filterType"></label> <select
-				t:id="filterType" t:type="select" t:model="model"
-				onchange="this.form.submit()" t:value="filterType" />
-		</div>
-		<div class="form-group ml-3">
-			<label t:type="label" t:for="filterDB" /> <input t:type="textfield"
-				t:id="filterDB" t:value="filterDB" />
-		</div>
-		<div class="ml-3 mr-3 form-group">
-			<label t:type="label" t:for="filterTableName" /> <input
-				t:type="textfield" t:id="filterTableName" t:value="filterTableName" />
-		</div>
-		<t:submit t:value="Filter" />
-		<a href="" class="ml-auto btn btn-info" t:type="eventlink"
-			t:id="loadSavedData"><img t:type="svgicon" t:path="file"
-			t:height="1.5em" /> Reload saved data</a> <a href=""
-			class="ml-auto btn btn-info" t:type="eventlink"
-			t:id="saveDataAndGenerateReports"><img t:type="svgicon"
-			t:path="database" t:height="1.5em" /> Save data &amp; generate
-			reports</a> <a href="" class="ml-auto btn btn-outline-danger"
-			t:type="eventlink" t:id="refreshData"><img t:type="svgicon"
-			t:path="alert-triangle" t:height="1.5em" /> Reconstruct the entire
-			evaluation set</a>
-	</form>
-</div>
-
-<h2>Tables</h2>
-
-<div class="mb-3">
-	<p>
-		<a href="" class="ml-auto btn grade-pos2" t:type="eventlink"
-			t:id="setUngradedPos2">Set ungraded to +2</a> <a href=""
-			class="ml-auto btn grade-pos" t:type="eventlink"
-			t:id="setUngradedPos">Set ungraded to +1</a> <a href=""
-			class="ml-auto btn grade-zero" t:type="eventlink"
-			t:id="setUngradedZero">Set ungraded to 0</a> <a href=""
-			class="ml-auto btn grade-neg" t:type="eventlink"
-			t:id="setUngradedNeg">Set ungraded to -1</a> <a href=""
-			class="ml-auto btn btn-outline-primary" t:type="eventlink" t:id="resetGraded">Reset
-			graded</a>
-	</p>
-</div>
-
-<div t:type="zone" t:id="zEvaluationTable" id="zEvaluationTable">
-	<div t:type="if" t:test="resultsErrors">
-		<a href="" class="btn btn-sm btn-default" t:type="eventlink"
-			t:id="clearErrors">Clear errors</a>
-		<ul>
-			<li t:type="loop" t:source="resultsErrors" t:value="resultError">${resultError}</li>
-		</ul>
-	</div>
-	Rows: ${filteredEvaluationData.size()}
-	<table class="table table-sm table-bordered ">
-		<thead class="table-dark">
-			<tr>
-				<th>Actions</th>
-				<th>Grade</th>
-				<th>Type</th>
-				<th>DB</th>
-				<th>Table</th>
-				<th colspan="100%">Data...</th>
-			</tr>
-		</thead>
-		<tbody>
-			<tr t:type="loop" t:source="filteredEvaluationData" t:value="oneRow"
-				class=" ${correctnessClass} ">
-				<td class="actions"><a href="" t:type="eventlink"
-					t:id="markPos2" t:zone="zEvaluationTable" t:context="oneRow"
-					class="btn btn-sm grade-pos2 p-1">+2</a> <a href=""
-					t:type="eventlink" t:id="markPos" t:zone="zEvaluationTable"
-					t:context="oneRow" class="btn btn-sm grade-pos p-1">+1</a> <a
-					href="" t:type="eventlink" t:id="markZero"
-					t:zone="zEvaluationTable" t:context="oneRow"
-					class="btn btn-sm grade-zero p-1">0</a> <a href=""
-					t:type="eventlink" t:id="markNeg" t:zone="zEvaluationTable"
-					t:context="oneRow" class="btn btn-sm grade-neg p-1">-1</a> <a
-					href="" t:type="eventlink" t:id="markReset"
-					t:zone="zEvaluationTable" t:context="oneRow"
-					class="btn btn-sm btn-outline-primary p-1">/</a></td>
-				<td t:type="loop" t:source="parsedRow" t:value="oneColumn">${oneColumn}</td>
-			</tr>
-		</tbody>
-	</table>
-</div>
-
-</html>
Index: dbLearnStar-webApp/src/main/resources/hibernate.cfg.xml
===================================================================
--- dbLearnStar-webApp/src/main/resources/hibernate.cfg.xml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/hibernate.cfg.xml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -6,23 +6,18 @@
 	<session-factory>
 		<!-- JDBC connection properties taken from maven profile -->
+		<property name="connection.url">@jdbc.url@</property>
+		<property name="default_schema">@jdbc.default_schema@</property>
+		<property name="connection.username">@jdbc.username@</property>
+		<property name="connection.password">@jdbc.password@</property>
+
 		<!-- DB schema update property is taken from maven profile -->
 		<property name="hbm2ddl.auto">@hib.hbm2ddlauto@</property>
 
 		<!-- Fixed properties for PostgreSQL database -->
+		<property name="dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
+		<property name="connection.driver_class">org.postgresql.Driver</property>
+		<property name="bytecode.use_reflection_optimizer">false</property>
+
 		<property name="hibernate.show_sql">false</property>
-
-		<!-- HikariCP -->
-		<property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</property>
-		<property name="hibernate.hikari.poolName">TapestryHibernatePool</property>
-		<property name="hibernate.hikari.registerMbeans">true</property>
-		<property name="hibernate.hikari.minimumIdle">5</property>
-		<property name="hibernate.hikari.maximumPoolSize">16</property>
-		<property name="hibernate.hikari.idleTimeout">30000</property>
-		<property name="hibernate.hikari.dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</property>
-		<property name="hibernate.hikari.dataSource.url">@jdbc.url@</property>
-		<property name="hibernate.hikari.dataSource.user">@jdbc.username@</property>
-		<property name="hibernate.hikari.dataSource.password">@jdbc.password@</property>
-		<property name="hibernate.hikari.schema">@jdbc.default_schema@</property>
-
 	</session-factory>
 </hibernate-configuration>
Index: LearnStar-webApp/src/main/resources/import.sql
===================================================================
--- dbLearnStar-webApp/src/main/resources/import.sql	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ 	(revision )
@@ -1,8 +1,0 @@
-INSERT INTO dblearnstar.task_type (codetype, title) values ('SQL','SQL'),('DDL','DDL'),('TEXT','TEXT'),('UPLOAD','UPLOAD');
-INSERT INTO dblearnstar.test_type (title) values ('Теориски'),('Практичен'),('Вежби'),('Експериментирање');
-INSERT INTO dblearnstar.roles (name) values ('ADMINISTRATOR'),('INSTRUCTOR');
-INSERT INTO dblearnstar.person (user_name, first_name, last_name) values ('admin', 'Administrator', 'Administrator');
-DELETE FROM dblearnstar.person_role WHERE person_id=(select person_id from dblearnstar.person where user_name='admin') and role_id=(select role_id from dblearnstar.roles where name='ADMINISTRATOR');
-INSERT INTO dblearnstar.person_role (person_id, role_id) values ((select person_id from dblearnstar.person where user_name='admin'), (select role_id from dblearnstar.roles where name='ADMINISTRATOR'));
-DELETE FROM dblearnstar.student WHERE person_id=(select person_id from dblearnstar.person where user_name='admin');
-INSERT INTO dblearnstar.student (person_id) values ((select person_id from dblearnstar.person where user_name='admin'));
Index: dbLearnStar-webApp/src/main/resources/log4j.properties
===================================================================
--- dbLearnStar-webApp/src/main/resources/log4j.properties	(revision 9496f79ee76bb108366f956111b076bd1b817255)
+++ dbLearnStar-webApp/src/main/resources/log4j.properties	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -0,0 +1,9 @@
+log4j.rootCategory=info, A1
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %c{2} %m%n
+log4j.category.org.apache.tapestry5.modules.TapestryModule.ComponentClassResolver=info
+log4j.category.org.apache.tapestry5.TapestryFilter=debug
+log4j.category.dblearnstar.webapp=debug
+log4j.category.dblearnstar.webapp.services.AppModule.TimingFilter=info
+
Index: dbLearnStar-webApp/src/main/resources/log4j2.yml
===================================================================
--- dbLearnStar-webApp/src/main/resources/log4j2.yml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/resources/log4j2.yml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -6,6 +6,5 @@
       name: STDOUT
       patternLayout:
-        #Pattern: "%d{DEFAULT} [%-22thread] %-5level %60.60logger %msg%n"
-        Pattern: "%d{yyyy-MM-dd - HH:mm:ss,SSS} [%p] %c{2} %m%n"
+        Pattern: "%d{DEFAULT} [%-22thread] %-5level %60.60logger %msg%n"
 
   loggers:
@@ -60,6 +59,2 @@
         name: dblearnstar.webapp
         level: info
-
-      -
-        name: org.hibernate
-        level: info
Index: dbLearnStar-webApp/src/main/webapp/WEB-INF/app.properties
===================================================================
--- dbLearnStar-webApp/src/main/webapp/WEB-INF/app.properties	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/webapp/WEB-INF/app.properties	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,37 +1,19 @@
-FilterTasksBasedOnModel-label=Find Tasks that Use a Specific Model
-FilterTasksBasedOnType-label=Find Tasks of a Specific Type
-PracticeByIncreasingComplexity-label=Specially Crafted Series of Tasks for Practicing SQL Queries of Increasing Complexity
-tasks-label=Tasks 
 about-personalanalytics-text=Personal analytics will only be available after the final evaluation.
 about-solutioncomparator-text=Comparison of your solutions to the solutions of other persons is only available in the case of submissions that were evaluated as correct in the final evaluation. They will be automatically listed at this page after the final evaluation.
 about-text=<p><b>Continuation of the usage of the system, implies agreement and acknowledgement with all of these terms. </b></p>\n\n<h3>Access to the system</h3>\n\n<p><b>Using this system during an exam term</b> is only allowed for users that are enlisted for taking the exam in that specific exam term, while the access of all other persons is strictcly forbidden. Usage of the system during an exam term is under a stricter set of rules defined and announced during the exam by the professor responsible for organisation of the exam.</p>\n\n<p><b>The usage of this system in period when there are no scheduled exam terms</b> is not mandatory, and it is left to the free will of each student. The records about the type of usage in such periods will not be taken into account in the calculation of the final course grade. </p>\n\n<h3>General terms</h3>\n\n<p>This system is used for educational and scientific-research purpose with the aim of advancement of the teaching in the area of Databases. The system contains a dataset of exam questions and solutions for the course in Databases, and is available to students of the course as an additional help in learning SQL and formulating correct questions. </p>\n\n<p>The system executes your queries in at least two database instances of each test schema. The results of the execution in the first instance are made available to you immediately upon execution, while the execution in the second and other instances are intentionally hidden (in order to simulate the execution of the query and evaluate it's correctness as future modifications that are unknown to you will occur in the database). The final goal is to test each query in multiple test situations and evaluate it's correctness in all such situations.</p>\n\n<p>The system is currently under development and many new database schemas will be added and new exam tasks will be constructed, with new test instances. After each addition of new test instances, all your queries will be automatically reevaluated. All your submissions will be kept so that you can compare if some query was correct in one moment and become incorrect in a later reevaluation.\n</p>\n
 action-label=Action
-actions-label=Actions
 addAssessment-label=Add assessment
 addToList-label=Add
 admin/activeUsers-pagelink=Active Users
-admin/GroupManagement-pagelink=Groups Management
+admin/GroupManagement-pagelink=Groups
 admin/Index-pagelink=Admin
 admin-label=Administrator
-attempt-label=Attempt to solve
-instructor-label=Instructor
-instructorMenu-label=Instructor
 admin/ManageModels-pagelink=Model management
 admin/ManagePersons-pagelink=User management
 admin/Reevaluation-pagelink=Reevaluation
 admin/StudentGroupProgress-pagelink=Progress
-admin/SubmissionEvaluations-pagelink=Evaluation of Submissions
-admin/SystemParameters-pagelink=System Parameters
+admin/SubmissionLogViewer-pagelink=Submissions
 admin/TestAdmin-pagelink=Tests
 admin/TestCollectionManagement-pagelink=Test Collections
-instructor/relationSchemaEvaluation-pagelink=Relation Schema Evaluation
-instructor/activityMonitor-pagelink=Activity Monitoring
-answeredByInstructor-label=Answered by an instructor
-serverTime-label=Server time
-testOpenUntil-label=Test open until
-unlimited-label=Deadline not set
-timeIsRunningOut-label=The time is running out...
-timehasRunOut-label=The time has run out!
-timeTestIsActive-label=Active test
 app-title=dbLearn*
 application-logout=Application Logout
@@ -43,7 +25,5 @@
 chooseFile-label=Create the solution according to the requirements in an external file, and then upload the file here.
 clientInfo-label=ClientInfo
-close-label=Close
 comparisonOfSolutions-page=Comparison of Solutions
-complaint-label=Complaint
 ComplaintsAndDiscussionForSolution-label=Complaints and Discussions for a Solution Assessment
 ComplaintsAndDiscussions-page=Complaints and Discussions
@@ -53,6 +33,4 @@
 correctEvaluatedSolutionsFromOthers-label=Solutions by other persons that were evaluated as correct
 correctEvaluatedSolutions-label=Your solutions that were evaluated as correct
-assessmentComment-correct=Correct
-assessmentComment-incorrect=Incorrect
 count-label=Count
 edit-label=Edit
@@ -66,5 +44,4 @@
 edit-task-label=Edit task
 editTestInstance-label=Edit a test instance
-editPointsInTaskInTestInstance-label=Edit points
 errorMessages-label=Error messages
 error-unknown-user=The system is only available for registered students of selected courses. Contact your teacher or instructor to gain access to the system\t.
@@ -76,7 +53,5 @@
 Evaluation-label=Evaluation
 evaluationSimple-label=Evaluation DB 1
-eval-ddl-label=Evaluate DDL
-ExamsAndTasksOverview-pagelink=Overview of Exams and Tasks per Exam
-TasksOverview-pagelink=All Tasks
+ExamsAndTasksOverview-pagelink=Tasks
 feedback-label=Feedback
 fileAComplaint-label=File a complaint
@@ -100,5 +75,4 @@
 list-submissions-run-only-label=List saved solutions not for evaluation
 load-label=Load
-download-label=Download
 LoggedAs-label=Logged-in as
 logout-desc-total-cont=In the end, it is recommended to quit your internet browser and close all it's tabs and windows.
@@ -111,8 +85,5 @@
 main-developer-address=https\://ajanovski.info
 main-developer-label=Lead Researcher and Developer
-main-developer-name=Vangel V. Ajanovski - Professor at FCSE
-materials-label=Additonal Resources, Software, Slides, Lecture Recordings 
-materials-url=https\://bazi.finki.ukim.mk/materijali
-message-label=Message
+main-developer-name=Vangel V. Ajanovski - Associate Professor at FCSE
 new-label=New
 no-available-options-label=No available options 
@@ -120,12 +91,10 @@
 noCorrectSolutionsByOthers-label=There are no correct solutions by others
 numPersonsSuccessful-label=Num. of persons with correct solutions
-numPersonsTriedToSolve-label=Num. of persons that attempted the task
+numPersonsTriedToSolve-label=Num. of persons that tried to solve
 onlyCorrect-label=Only correct
 onlyEval-label=Only for eval
 onlyLast-label=Only last
 onlyTestInstancesWithDiscussionsAreShown-label=Only the test instances having discussions are listed
-OpenDiscussions-pagelink=Complaints and Discussions
-openToAllStudents-label=Open to all students
-openForReviewByStudents-label=Open for review by students
+OpenDiscussions-pagelink=Open Discussions
 otherSolutions-label=Solutions by other persons
 passed-label=Passed
@@ -148,11 +117,8 @@
 RunOnlyPlan-label=Execution plan
 save-label=Save
-show-label=Open
-hide-label=Close
 scheduledFor-label=Start
 scheduledUntil-label=End
 selectStudent-label=Select a student
 selectTaskInTestInstance-label=Select a task in the test instance
-selectTestCollection-label=Select a test collection
 selectTestInstance-label=Select a test instance
 similar-queries-label=Similar queries
@@ -166,9 +132,6 @@
 sql-outputSchemaFormatError=Your query resulted with data that are not in the expected format. Therefore, it's correctness can not be avaluated\!
 sql-resultIncorrect=Your query resulted with data in the correct form, but not corresponding to what is expected from a correct query. Therefore it is certainly not correct\!
-sqlEvaluation-label=Evaluation of SQL submission
-solutionBy-label=Solution by
 studenthomepage-page=Exams and Tasks
 student-label=student
-studentMenu-label=Student
 submission-label=Submitted solution
 submissions-label=Submissions
@@ -178,10 +141,8 @@
 symbol-addObjectToList=⊞ Add to list
 symbol-cancel=Cancel
-symbol-createObjectAndAddToList=Create
+symbol-createObjectAndAddToList=⊡ Create
 symbol-delete=Delete
 symbol-duplicate=Duplicate
 symbol-edit=Edit
-symbol-copy=Copy
-symbol-paste=Paste
 symbol-removeObjectFromListAndDeleteObject=Remove from list
 symbol-removeObjectFromList=Delete
@@ -190,20 +151,14 @@
 task-actions-label=Task Actions
 task-label=Task
-taskInTestInstance-label=Task in a test
 task-points-label=Task points
 task-short-description-label=Task short description
 task-status-label=Status
 testInstance-label=Test instance
-testInstanceParameters-label=Тest Instance Parameters
 testinstanceparameters-empty-message=Keep in mind to also enter the parameters defining the evaluation environment, just after creating the Test instance.
 test-label=Test
 TestTemplate-label=Test template
-TestTemplates-label=Test templates
 testType-label=Test type
 toggleNavigation-label=Toggle navigation
 toggle-status-label=Toggle status
-totalPoints-label=Total points
-translation-label=Translation
-admin/TranslationPage-pagelink=Translations
 upload-label=Upload
 userName-label=User name
@@ -215,4 +170,2 @@
 yourSolutionIsNotEvaluatedAndCantBeCompared-label=Your solution is not officially evaluated, and it can't be compared to others.
 yourSolution-label=Your solution
-youHaveManyEvaluated-label=You have more than one evaluated submitted solution
-viewEvalResults-label=Evaluation result
Index: dbLearnStar-webApp/src/main/webapp/WEB-INF/app_mk.properties
===================================================================
--- dbLearnStar-webApp/src/main/webapp/WEB-INF/app_mk.properties	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/main/webapp/WEB-INF/app_mk.properties	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,11 +1,6 @@
-FilterTasksBasedOnModel-label=Пребарај задачи кои користат определен модел
-FilterTasksBasedOnType-label=Пребарај задачи од определен тип
-PracticeByIncreasingComplexity-label=Специјално формулирани серии задачи за вежбање SQL прашалници со растечка комлексност
-tasks-label=Задачи 
 about-personalanalytics-text=Личните аналитики ќе бидат достапни по спроведената евалуација.
 about-solutioncomparator-text=Споредбата на вашите решенија со решенија на колеги на задачите од збирката е возможна само во случај на целосно успешна евалуација на вашето решение и на решенијата на вашите колеги на едни исти задачи и исти пример бази податоци.  Таквите задачи ќе се појават автоматски на оваа страница.
 about-text=<p><b>Продолжувањето со употребата на системот значи согласност со наведеното во продолжение\:</b></p>\n\n<h3>Пристап до системот</h3>\n\n<p><b>Користењето на системот за време на испитен термин</b> е дозволено само за корисници кои се пријавени за полагање во тој испитен термин, додека приклучувањето од било кои други лица е забрането. Користењето за време на испит е со посебни правила индицирани од наставникот кој го организира испитот.</p>\n\n<p><b>Користењето на системот надвор од испитен термин</b> е необврзувачко и целосно оставено на вашата слободна волја, а записите за употребата или неупотребата на системот нема да бидат користени како основа за формирањето на оценката на предметот.\n\n<h3>Општи услови</h3>\n\n\n<p>Овој систем ќе се користи во наставни и научно-истражувачки цели за унапредување на наставата од областа Бази на податоци. Системот содржи база на испитни прашања и решенија по предметот Бази на податоци достапна за студентите  на предметот како дополнителна помош во учењето SQL и формулирањето коректни прашања. </p>\n\n<p>Системот ги извршува вашите прашалници во две или повеќе инстанци од секоја база. Резултатите од извршувањето во првата инстанца можете да ги гледате, додека резултатите од извршувањето на другите инстанци намерно се скриени (за да симулираат ситуација на измени во базата). Целта е да се тестира прашалникот во неколку тест ситуации и да се евалуира врз основа на коректност во сите тест ситуации.\n</p>\n\n<p>Системот е во развој и постојано ќе се додаваат нови дизајни на бази и нови комбинации задачи за решавање, како и нови тест инстанци на постојните бази. По секое додавање на нови тест инстанци ќе бидат реевалуирани вашите испратени решенија за коректност во сите нови тест инстанци. Историјатот на вашите испраќања секогаш ќе се чува, па секогаш може да споредите дали некој прашалник што порано функционирал сега веќе не функционира (најчесто поради некој специјален случај во новите тест податоци).\n</p>\n
 action-label=Акција
-actions-label=Акции
 addAssessment-label=Додади проценка
 addToList-label=Додади
@@ -14,24 +9,11 @@
 admin/Index-pagelink=Администратор
 admin-label=Администратор
-attempt-label=Обидете се да ја решите
-instructor-label=Инструктор
-instructorMenu-label=Инструктор
-admin/ManageModels-pagelink=Модели
-admin/ManagePersons-pagelink=Корисници
+admin/ManageModels-pagelink=Управување со модели
+admin/ManagePersons-pagelink=Управување со корисници
 admin/Reevaluation-pagelink=Ревалуација
 admin/StudentGroupProgress-pagelink=Прогрес
-admin/SubmissionEvaluations-pagelink=Прегледување поднесоци
-admin/SystemParameters-pagelink=Системски параметри
-admin/TestAdmin-pagelink=Администрација на тестови
-admin/TestCollectionManagement-pagelink=Колекции тестови
-instructor/relationSchemaEvaluation-pagelink=Евалуација на релациска шема
-instructor/activityMonitor-pagelink=Мониторинг на активности
-answeredByInstructor-label=Одговорено од наставник
-serverTime-label=Време на серверот
-testOpenUntil-label=Тестот е отворен до
-unlimited-label=Не е даден рок
-timeIsRunningOut-label=Времето за работа истекува...
-timehasRunOut-label=Времето за работа истече!
-timeTestIsActive-label=Активно тестирање
+admin/SubmissionLogViewer-pagelink=Поднесоци
+admin/TestAdmin-pagelink=Тестови
+admin/TestCollectionManagement-pagelink=Колекции од тестови
 app-title=dbLearn*
 application-logout=Апликациска одјава
@@ -43,7 +25,5 @@
 chooseFile-label=Задачата треба да ја решите во софтверот што го препорачува наставникот и потоа да го испратите решението тука како датотека. 
 clientInfo-label=Клиент
-close-label=Затвори
 comparisonOfSolutions-page=Споредба на решенија
-complaint-label=Приговор
 ComplaintsAndDiscussionForSolution-label=Приговори и дискусии по оценување на задача
 ComplaintsAndDiscussions-page=Приговори и дискусии
@@ -53,6 +33,4 @@
 correctEvaluatedSolutionsFromOthers-label=Решенија од други студенти кои се исто така проценети за точни
 correctEvaluatedSolutions-label=Ваши решенија кои се проценети за точни
-assessmentComment-correct=Во ред
-assessmentComment-incorrect=Не е во ред
 count-label=Број
 delete-label=Отстрани
@@ -66,9 +44,8 @@
 edit-task-label=Измени ја задачата
 editTestInstance-label=Измени на тест инстанца
-editPointsInTaskInTestInstance-label=Измени поени
 errorMessages-label=Настана грешка
 error-unknown-user=Системот е достапен само за регистрирани студенти на одреден курс. Контактирајте го задолжениот наставник на курсот за кој сакате да добиете пристап.
-evalDBNA-label=Евалуациската база нe е достапна
-evaluatedOn-label=Проценето
+evalDBNA-label=Евалуациската база на е достапна
+evaluatedOn-label=Проценето на
 evaluate-label=Евалуација
 evaluationComplex-label=Евалуација Шема 2
@@ -76,7 +53,5 @@
 Evaluation-label=Евалуација
 evaluationSimple-label=Евалуација Шема 1
-eval-ddl-label=Евалуирај DDL
-ExamsAndTasksOverview-pagelink=Испити и задачи по испит
-TasksOverview-pagelink=Збирка Задачи
+ExamsAndTasksOverview-pagelink=Задачи
 feedback-label=Забелешки
 fileAComplaint-label=Поднеси приговор
@@ -88,5 +63,4 @@
 greeting=dbLearn*
 group-label=Група
-groupId-label=Бр. група
 help-for-codemirror=CTRL+SPACE за автоматско дополнување\nCTRL+ENTER Извршување на селекцијата\nCTRL+V пастира слика копирана од друг програм
 help-for-codemirror-text=CTRL+V пастира слика копирана од друг програм
@@ -101,5 +75,4 @@
 list-submissions-run-only-label=Листа прашалници кои се извршувани без евалуација
 load-label=Вчитај
-download-label=Преземи
 LoggedAs-label=Најавен корисник
 logout-desc-total-cont=На крај, препорачано е да го затворите вашиот интернет прелистувач, сите негови прозорци и сите негови таб листови.
@@ -112,8 +85,5 @@
 main-developer-address=https\://ajanovski.info
 main-developer-label=Главен истражувач и развивач
-main-developer-name=Вангел В. Ајановски, професор на ФИНКИ
-materials-label=Дополнителни ресурси, софтвер, слајдови, снимки од предавање 
-materials-url=https\://bazi.finki.ukim.mk/resources 
-message-label=Порака
+main-developer-name=Вангел В. Ајановски
 new-label=Ново
 no-available-options-label=Нема достапни опции за избор
@@ -126,8 +96,5 @@
 onlyLast-label=Само последните
 onlyTestInstancesWithDiscussionsAreShown-label=Прикажани се само тест инстанците на кои има дискусии
-OpenDiscussions-pagelink=Приговори и дискусии
-openToAllStudents-label=Отворено за сите студенти
-openForReviewByStudents-label=Отворено за увид за студенти
-ordering-label=Редослед
+OpenDiscussions-pagelink=Отворени дискусии
 otherSolutions-label=Решенија од други студенти за истата задача
 passed-label=Положено
@@ -146,14 +113,11 @@
 reviewNotAllowed-label=Прегледување туѓи решенија не е дозволено во овој момент.
 RunOnlyNoEvaluation-label=Изврши без евалуација
-RunOnlyNoEvaluationSelection-label=Изврши само обележаното
+RunOnlyNoEvaluationSelection-label=Изврши селекција
 RunOnlyPlan-label=План на извршување
 save-label=Зачувај
-show-label=Отвори
-hide-label=Затвори
 scheduledFor-label=Почеток
-scheduledUntil-label=Крај
+scheduledUntil-label=крај
 selectStudent-label=Изберете студент
 selectTaskInTestInstance-label=Изберете задача во тест инстанцата
-selectTestCollection-label=Изберете колекција тестови
 selectTestInstance-label=Изберете тест инстанца
 similar-queries-label=Слични прашалници
@@ -168,9 +132,6 @@
 sql-outputSchemaFormatError=Прашалникот врати податоци кои не се во очекуваниот облик и формат, па не може да се евалуира коректноста\!
 sql-resultIncorrect=Прашалникот резултираше со поинакви податоци од очекуваните. Сигурно не е коректен.
-sqlEvaluation-label=Евалуација на SQL поднесок
-solutionBy-label=Решение од
 studenthomepage-page=Тестови и задачи
 student-label=студент
-studentMenu-label=Студент
 submission-label=Испратено решение
 submissions-label=Поднесоци
@@ -178,12 +139,10 @@
 submittedBy-label=Испратено од
 submittedOn-label=Поднесено на
-symbol-addObjectToList=Додади
+symbol-addObjectToList=⊞ Додади
 symbol-cancel=Откажи
-symbol-createObjectAndAddToList=Креирај
+symbol-createObjectAndAddToList=⊡ Креирај
 symbol-delete=Бриши
 symbol-duplicate=Дуплирај
 symbol-edit=Измени
-symbol-copy=Копирај
-symbol-paste=Пастирај
 symbol-removeObjectFromListAndDeleteObject=Извади
 symbol-removeObjectFromList=Избриши
@@ -192,21 +151,14 @@
 task-actions-label=Акции
 task-label=Задача
-taskInTestInstance-label=Задача во тест
 task-points-label=Поени
 task-short-description-label=Опис на задачата
 task-status-label=Статус
 testInstance-label=Тест инстанца
-testInstanceParameters-label=Параметри за тест инстанца
 testinstanceparameters-empty-message=Потребно е да ги внесете и параметрите за евалуација на тестот, откако ќе го внесете тестот.
 test-label=Тест
 TestTemplate-label=Тест шаблон
-TestTemplates-label=Тест шаблони
 testType-label=Тип тест
-title-label=Назив
 toggleNavigation-label=Смени навигација
 toggle-status-label=Смени статус
-totalPoints-label=Вкупно поени
-translation-label=Превод
-admin/TranslationPage-pagelink=Преводи
 upload-label=Испрати
 userName-label=Корисничко име
@@ -218,4 +170,2 @@
 yourSolutionIsNotEvaluatedAndCantBeCompared-label=Вашето решение сеуште не е официјално оценето, па не може да се споредува со другите.
 yourSolution-label=Ваше решение
-youHaveManyEvaluated-label=Имате повеќе од едно оценето решение
-viewEvalResults-label=Евалуациски резултат
Index: dbLearnStar-webApp/src/test/conf/webdefault.xml
===================================================================
--- dbLearnStar-webApp/src/test/conf/webdefault.xml	(revision 52641d04e432dbc9048e77086bb4b2df67187395)
+++ dbLearnStar-webApp/src/test/conf/webdefault.xml	(revision 9496f79ee76bb108366f956111b076bd1b817255)
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <web-app
-        xmlns = "http://Java.sun.com/xml/ns/j2ee" 
+        xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
 
-<!--     <description>
+    <description>
         Default web.xml file.
         This file is applied to a Web application before it's own WEB_INF/web.xml file
     </description>
- -->
+
 
     <!-- ==================================================================== -->
