Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Layout.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Layout.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/components/Layout.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -44,8 +44,8 @@
 import dblearnstar.webapp.services.PersonManager;
 
-@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",
+@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",
 		"site-overrides.css" }, module = { "bootstrap/dropdown", "bootstrap/collapse", "zoneUpdateEffect" })
 @PublicPage
@@ -92,12 +92,12 @@
 
 	public String[] getStudentPageNames() {
-		return new String[] { "ExamsAndTasksOverview", "SolutionComparator", "OpenDiscussions", "PersonalAnalytics" };
+		return new String[] { "ExamsAndTasksOverview", "OpenDiscussions", "PersonalAnalytics" };
 	}
 
 	public String[] getAdminPageNames() {
 		if (userInfo.isAdministrator()) {
-			return new String[] { "admin/ManagePersons", "admin/GroupManagement", "admin/StudentGroupProgress",
-					"admin/ManageModels", "admin/TestAdmin", "admin/Reevaluation", "admin/SubmissionLogViewer",
-					"admin/TestCollectionManagement", "admin/ActiveUsers" };
+			return new String[] { "admin/ManagePersons", "admin/GroupManagement", "admin/ManageModels",
+					"admin/TestAdmin", "admin/TestCollectionManagement", "admin/StudentGroupProgress",
+					"admin/SubmissionEvaluations", "admin/Reevaluation", "admin/ActiveUsers" };
 		} else {
 			return null;
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/TaskInTestInstanceSelectModel.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/TaskInTestInstanceSelectModel.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/model/TaskInTestInstanceSelectModel.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,37 @@
+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: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ComplaintsAndDiscussions.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ComplaintsAndDiscussions.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ComplaintsAndDiscussions.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -43,5 +43,5 @@
 @StudentPage
 @AdministratorPage
-@Import(module = { "bootstrap/collapse" })
+@Import(module = { "bootstrap/collapse" }, stylesheet = { "ComplaintsAndDiscussions.css", "feedback-styles.css" })
 public class ComplaintsAndDiscussions {
 
@@ -55,10 +55,11 @@
 	@Property
 	SolutionAssessment solutionAssessmentToDiscuss;
-	@Property
-	private AssessmentDiscussion runningAssessmentDiscussion;
 
 	@Persist
 	@Property
 	AssessmentDiscussion newAssessmentDiscussion;
+
+	@Property
+	private AssessmentDiscussion runningAssessmentDiscussion;
 
 	public void onActivate() {
@@ -110,4 +111,8 @@
 	}
 
+	void onActionFromCancelNewAssessmentDiscussionForm() {
+		newAssessmentDiscussion = null;
+	}
+
 	public String getCoding(AssessmentDiscussion i) {
 		if (i.getReplyTo() == null) {
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -21,4 +21,5 @@
 package dblearnstar.webapp.pages;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -51,6 +52,6 @@
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.annotations.StudentPage;
-import dblearnstar.webapp.model.StudentSelectModel;
 import dblearnstar.webapp.model.TestCollectionSelectModel;
+import dblearnstar.webapp.services.DigestService;
 import dblearnstar.webapp.services.GenericService;
 import dblearnstar.webapp.services.PersonManager;
@@ -121,16 +122,23 @@
 	}
 
+	@Inject
+	private DigestService digestService;
+
+	public String getHashedTestInstanceId() {
+		return digestService.obfuscate(Long.toString(testInstance.getTestInstanceId()));
+	}
+
+	/* selectTestCollection Form */
+
 	public List<TestCollection> getTestCollections() {
-		List<TestCollection> list = ((List<TestCollection>) genericService.getAll(TestCollection.class)).stream()
-				.filter(p -> (p.getTestInstances() != null && p.getTestInstances().size() > 0)
-						|| (p.getSubCollections() != null && p.getSubCollections().size() > 0))
-				.collect(Collectors.toList());
+		List<TestCollection> list = (UsefulMethods.castList(TestCollection.class,
+				genericService.getAll(TestCollection.class)))
+						.stream()
+						.filter(p -> (p.getTestInstances() != null && p.getTestInstances().size() > 0)
+								|| (p.getSubCollections() != null && p.getSubCollections().size() > 0))
+						.collect(Collectors.toList());
 		ComparatorTestCollection c = new ComparatorTestCollection();
 		Collections.sort(list, c);
 		return list;
-	}
-
-	public SelectModel getTestCollectionModel2() {
-		return selectModelFactory.create(getTestCollections(), "title");
 	}
 
@@ -153,22 +161,19 @@
 
 	public List<TestInstance> getTestInstances() {
+		List<TestInstance> list;
 		if (userInfo.isAdministrator()) {
-			if (testCollection == null) {
-				return testManager.getAllTestInstancesByTestType(testType.getTestTypeId());
-			} else {
-				return testCollection.getTestInstances().stream()
-						.filter(p -> p.getTestTemplate().getTestType().getTestTypeId() == testType.getTestTypeId())
-						.collect(Collectors.toList());
-			}
+			list = testManager.getAllTestInstancesByTestType(testType.getTestTypeId());
 		} else if (userInfo.isStudent()) {
-			if (testCollection == null) {
-				return testManager.getTestInstancesForStudentByTestType(studentId, testType.getTestTypeId());
-			} else {
-				return testCollection.getTestInstances().stream()
-						.filter(p -> p.getTestTemplate().getTestType().getTestTypeId() == testType.getTestTypeId())
-						.collect(Collectors.toList());
-			}
-		} else {
-			return null;
+			list = testManager.getTestInstancesForStudentByTestType(studentId, testType.getTestTypeId());
+		} else {
+			list = new ArrayList<TestInstance>();
+		}
+		if (testCollection == null) {
+			return list;
+		} else {
+			return list.stream()
+					.filter(ti -> ti.getTestCollection() != null
+							&& ti.getTestCollection().getTestCollectionId() == testCollection.getTestCollectionId())
+					.collect(Collectors.toList());
 		}
 	}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/Logout.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/Logout.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/Logout.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -37,5 +37,5 @@
 
 @PublicPage
-@Import(stylesheet = { "classpath:META-INF/resources/webjars/fontsource-fira-sans/3.0.5/index.css",
+@Import(stylesheet = { "classpath:META-INF/assets/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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/OpenDiscussions.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -77,4 +77,14 @@
 	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 ((List<SolutionAssessment>) UsefulMethods.castList(SolutionAssessment.class,
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/QueryTest.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/QueryTest.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/QueryTest.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -38,4 +38,5 @@
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -47,5 +48,4 @@
 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;
@@ -63,4 +63,5 @@
 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;
@@ -78,4 +79,5 @@
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.annotations.StudentPage;
+import dblearnstar.webapp.components.ModalBox;
 import dblearnstar.webapp.services.EvaluationService;
 import dblearnstar.webapp.services.GenericService;
@@ -95,4 +97,7 @@
 	private UserInfo userInfo;
 
+	@Property
+	private Boolean accessAllowed;
+
 	@Inject
 	private Logger logger;
@@ -123,6 +128,4 @@
 	private PersonManager pm;
 
-	@InjectPage
-	private ExamsAndTasksOverviewPage examsAndTasksOverviewPage;
 	@InjectComponent
 	private Zone historyZone;
@@ -133,4 +136,6 @@
 	@InjectComponent
 	private Zone evalZone;
+	@InjectComponent
+	private Zone currentTimeZone;
 
 	@Property
@@ -152,4 +157,8 @@
 	@Persist(PersistenceConstants.FLASH)
 	private String queryString;
+
+	@Property
+	@Persist
+	private String errorPosition;
 
 	@Property
@@ -198,4 +207,7 @@
 		toSubmitText = false;
 		recordActivity(ModelConstants.ActivityStillViewing, payload, issuer);
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(currentTimeZone);
+		}
 	}
 
@@ -247,6 +259,27 @@
 	}
 
-	public Date getCurrentTime() {
-		return new Date();
+	@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());
+		}
 	}
 
@@ -256,13 +289,11 @@
 	}
 
-	public void onActivate(TaskInTestInstance tti) {
+	public Object onActivate(TaskInTestInstance tti) {
 		logger.debug("onActivate: {}", tti.getTaskInTestInstanceId());
+		taskInTestInstance = genericService.getByPK(TaskInTestInstance.class, 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())) {
+
+		if (userInfo.isAdministrator() || testManager.accessToTaskInTestInstanceAllowed(student, tti)) {
 			studentId = student.getStudentId();
-			taskInTestInstance = genericService.getByPK(TaskInTestInstance.class, tti.getTaskInTestInstanceId());
 			codeType = taskInTestInstance.getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype();
 
@@ -277,12 +308,15 @@
 				filterNotForEvalution = false;
 			}
+			recordActivity(ModelConstants.ActivityViewTask, "", "onActivity");
 			toUpload = false;
-		} else {
+			logger.debug("access allowed");
+			accessAllowed = true;
+			return null;
+		} else {
+			accessAllowed = false;
 			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");
+			return ExamsAndTasksOverviewPage.class;
+		}
 	}
 
@@ -295,4 +329,5 @@
 			if (isSQL()) {
 				javaScriptSupport.require("codemirror-run");
+				javaScriptSupport.require("codemirror-error");
 			}
 		}
@@ -306,5 +341,5 @@
 	}
 
-	public String getErrorPosition() {
+	public String getQueryErrorPosition() {
 		if (resultsErrors != null && resultsErrors.size() > 0) {
 			try {
@@ -325,93 +360,4 @@
 	}
 
-	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,
@@ -419,8 +365,8 @@
 	}
 
-	private StudentSubmitSolution recordQueryInLog(Boolean notForEvaluation, String query) {
+	private StudentSubmitSolution recordQueryAsStudentSubmitSolution(Boolean notForEvaluation, String query) {
 		if (query != null) {
 			StudentSubmitSolution solution = new StudentSubmitSolution();
-			solution.setSubmittedOn(new Date());
+			solution.setSubmittedOn(getCurrentTime());
 			solution.setStudentStartedTest(studentStartedTest);
 			solution.setSubmission(query);
@@ -473,5 +419,12 @@
 
 		// For printing purposes
-		getResultsFrom(queryToRun, testInstanceParameters, testInstanceParameters.getSchemaSimple(), "simple");
+		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();
 
 		// For evaluation
@@ -493,5 +446,5 @@
 		}
 		startTestIfNotStarted();
-		recordQueryInLog(notForEvaluation, queryToRun);
+		recordQueryAsStudentSubmitSolution(notForEvaluation, queryToRun);
 	}
 
@@ -551,5 +504,5 @@
 	}
 
-	private StreamResponse onActionFromDownloadFile(StudentSubmitSolution sss) {
+	public StreamResponse onActionFromDownloadFile(StudentSubmitSolution sss) {
 		logger.info("Start Download of {}", sss.getStudentSubmitSolutionId());
 		if (sss.getStudentStartedTest().getStudent().getPerson().getPersonId() == userInfo.getPersonId()) {
@@ -604,5 +557,5 @@
 
 	Object onActionFromBackToExamsOverview() {
-		return examsAndTasksOverviewPage;
+		return ExamsAndTasksOverviewPage.class;
 	}
 
@@ -687,6 +640,7 @@
 			evalResultsExam = false;
 			queryString = "FILE:" + file.getFileName();
-			StudentSubmitSolution solution = recordQueryInLog(false, queryString);
-			SimpleDateFormat sdf = new SimpleDateFormat(AppConfig.getString("date.upload.submission.format"));
+			StudentSubmitSolution solution = recordQueryAsStudentSubmitSolution(false, queryString);
+			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
+					AppConfig.getString("date.upload.submission.format"));
 			String emde5 = "";
 			try {
@@ -707,5 +661,5 @@
 								+ "/STUDENT_" + solution.getStudentStartedTest().getStudent().getPerson().getUserName()
 								+ "_SUBMISSION_" + solution.getStudentSubmitSolutionId() + "_"
-								+ sdf.format(solution.getSubmittedOn()) + "_MD5_" + emde5);
+								+ simpleDateFormat.format(solution.getSubmittedOn()) + "_MD5_" + emde5);
 				file.write(copied);
 
@@ -715,5 +669,6 @@
 				genericService.saveOrUpdate(solution);
 			} catch (Exception e) {
-				logger.error("Error uploading: {} {} {}", userInfo.getUserName(), file.getFileName(), e.getMessage());
+				logger.error("Error uploading: {} {} {}", userInfo.getUserName(), file.getFileName(), e);
+				e.printStackTrace();
 			}
 			toUpload = false;
@@ -724,5 +679,5 @@
 			evalResultsComplex = false;
 			evalResultsExam = false;
-			recordQueryInLog(false, queryString);
+			recordQueryAsStudentSubmitSolution(false, queryString);
 		}
 		if (request.isXHR()) {
@@ -799,3 +754,79 @@
 	}
 
+	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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/SolutionComparatorPage.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -28,5 +28,4 @@
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -34,12 +33,9 @@
 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;
@@ -50,4 +46,5 @@
 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;
@@ -81,11 +78,14 @@
 	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;
@@ -97,36 +97,7 @@
 	private float totalPoints;
 	@Property
-	Map<TaskInTestInstance, SolutionAssessment> mapTTItoSA;
+	Map<TaskInTestInstance, List<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() {
@@ -139,31 +110,38 @@
 	}
 
-	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 void onActivate(TestInstance ti) {
+		selectedTestInstance = ti;
+	}
+
+	public void prepareMapOfEvaluationsAndTotal() {
+		totalPoints = 0;
+		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() > 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	public List<SolutionAssessment> getListEvaluatedSolutionsForTaskInTestInstance() {
+		List<SolutionAssessment> sa = mapTTItoSA.get(taskInTestInstance);
+		return sa;
 	}
 
 	public boolean isLastSolutionCorrect() {
-		StudentSubmitSolution sss = getLastEvaluatedSolutionForTaskInTestInstance();
+		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
 		if (sss.getTaskInTestInstance().getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
 				.equals(ModelConstants.TaskCodeSQL)) {
@@ -175,5 +153,5 @@
 
 	public String getClassLastSolutionForTaskInTestInstance() {
-		StudentSubmitSolution sss = getLastEvaluatedSolutionForTaskInTestInstance();
+		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
 		if (sss != null) {
 			if (isLastSolutionCorrect()) {
@@ -188,5 +166,5 @@
 
 	public List<StudentSubmitSolution> getOtherSolutions() {
-		StudentSubmitSolution sss = getLastEvaluatedSolutionForTaskInTestInstance();
+		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
 		if (sss.getTaskInTestInstance().getTask().getTaskIsOfTypes().get(0).getTaskType().getCodetype()
 				.equals(ModelConstants.TaskCodeSQL)) {
@@ -206,30 +184,4 @@
 	}
 
-	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);
-	}
-
 	private StreamResponse onActionFromDownloadFile(StudentSubmitSolution sss) throws FileNotFoundException {
 		return downloadFile(sss);
@@ -294,5 +246,5 @@
 
 	public String getFileFromSubmission() {
-		return processFileNameFromSubmission(getLastEvaluatedSolutionForTaskInTestInstance());
+		return processFileNameFromSubmission(oneOfTheEvaluatedSolutions.getStudentSubmitSolution());
 	}
 
@@ -322,7 +274,7 @@
 
 	public SolutionAssessment getSubmissionsFirstEvaluation() {
-		StudentSubmitSolution ssa = getLastEvaluatedSolutionForTaskInTestInstance();
-		if (ssa != null && ssa.getEvaluations() != null && ssa.getEvaluations().size() > 0) {
-			return ssa.getEvaluations().get(0);
+		StudentSubmitSolution sss = oneOfTheEvaluatedSolutions.getStudentSubmitSolution();
+		if (sss != null && sss.getEvaluations() != null && sss.getEvaluations().size() > 0) {
+			return sss.getEvaluations().get(0);
 		} else {
 			return 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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/ManageModels.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -11,4 +11,5 @@
 import dblearnstar.webapp.annotations.AdministratorPage;
 import dblearnstar.webapp.services.GenericService;
+import dblearnstar.webapp.services.UsefulMethods;
 
 @AdministratorPage
@@ -26,5 +27,5 @@
 
 	public List<Model> getAllModels() {
-		return (List<Model>) genericService.getAll(Model.class);
+		return UsefulMethods.castList(Model.class, genericService.getAll(Model.class));
 	}
 
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionEvaluations.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionEvaluations.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionEvaluations.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,492 @@
+/*******************************************************************************
+ * 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.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 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.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", "PrettyPrint" })
+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;
+
+	@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;
+
+	@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
+	private String resultsError;
+	@Property
+	@Persist
+	private List<String> resultsErrors2;
+
+	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 (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() {
+		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() {
+		return personManager.getPersonFullNameWithId(submission.getStudentStartedTest().getStudent().getPerson());
+	}
+
+	@CommitAfter
+	public void onActionFromReevaluateSubmission(StudentSubmitSolution s) {
+		evaluationService.processSolution(userInfo.getUserName(), s);
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zSubmissions);
+		}
+	}
+
+	@CommitAfter
+	public void onActionFromReevaluateEditedSubmission(StudentSubmitSolution s) {
+		evaluationService.processSolution(userInfo.getUserName(), s);
+		if (request.isXHR()) {
+			ajaxResponseRenderer.addRender(zModal);
+		}
+	}
+
+	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 "/";
+		}
+	}
+
+	public boolean isEditedAssessmentTaskSQL() {
+		if (editedAssessment != null) {
+			StudentSubmitSolution sss = genericService.getByPK(StudentSubmitSolution.class,
+					editedAssessment.getStudentSubmitSolution().getStudentSubmitSolutionId());
+			return TaskTypeChecker.isSQL(getCodeType(sss));
+		} else {
+			return false;
+		}
+	}
+
+	public boolean isSQL() {
+		return TaskTypeChecker.isSQL(getCodeType(submission));
+	}
+
+	public boolean isTEXT() {
+		return TaskTypeChecker.isTEXT(getCodeType(submission));
+	}
+
+	public boolean isDDL() {
+		return TaskTypeChecker.isDDL(getCodeType(submission));
+	}
+
+	public boolean isUPLOAD() {
+		return TaskTypeChecker.isUPLOAD(getCodeType(submission));
+	}
+
+	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);
+		}
+	}
+
+	@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() {
+		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;
+		}
+	}
+
+	@Property
+	private String oneHeader;
+	@Property
+	private Object[] oneRow;
+	@Property
+	private Object oneColumn;
+
+	void onActionFromViewEvaluationResults(StudentSubmitSolution s) {
+		if (resultsEvaluation1 != null) {
+			resultsEvaluation1 = null;
+		} 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";
+		}
+	}
+
+}
Index: LearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionLogViewer.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/SubmissionLogViewer.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ 	(revision )
@@ -1,439 +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.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: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestAdminPage.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestAdminPage.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/pages/admin/TestAdminPage.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -22,4 +22,5 @@
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -49,4 +50,5 @@
 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;
@@ -58,5 +60,5 @@
 
 @AdministratorPage
-@Import(stylesheet = { "TestAdmin.css" })
+@Import(stylesheet = { "TestAdmin.css" }, module = { "zoneUpdateEffect", "bootstrap/modal", "bootstrap/collapse" })
 public class TestAdminPage {
 
@@ -95,45 +97,51 @@
 	private QueryTest queryTest;
 
-	@Property
-	@Persist
+	@Persist
+	@Property
 	private TestTemplate editedTestTemplate;
-	@Property
-	@Persist
+	@Persist
+	@Property
 	private TaskType chosentaskType;
-	@Property
-	@Persist
+	@Persist
+	@Property
 	private TestType testType;
-	@Property
-	@Persist
-	private TestInstance testInstance;
+	@Persist
+	@Property
+	private TestInstance editedTestInstance;
+	@Persist
+	@Property
+	private TestInstanceParameters editedTestInstanceParameters;
+	@Persist
+	@Property
+	private Boolean creatingANewTask;
+	@Persist
+	@Property
+	private TaskInTestInstance editedTaskInTestInstance;
+	@Persist
+	@Property
+	private Boolean isNewTaskInTestInstance;
+	@Persist
+	@Property
+	private Task editedTask;
+	@Persist
+	@Property
+	private TestInstance whereToPutNewTask;
+	@Persist
+	@Property
+	private TestInstance selectedTestInstance;
 	@Property
 	private TaskInTestInstance taskInTestInstance;
 	@Property
 	private TaskIsOfType taskIsOfType;
-	@Property
-	@Persist
-	private TestInstance editedTestInstance;
-	@Property
-	@Persist
-	private TestInstanceParameters editedTestInstanceParameters;
-	@Property
-	@Persist
-	private Boolean creatingANewTask;
-	@Property
-	@Persist
-	private TaskInTestInstance editedTaskInTestInstance;
-	@Property
-	@Persist
-	private Boolean isNewTaskInTestInstance;
-	@Property
-	@Persist
-	private Task editedTask;
-	@Property
-	@Persist
-	private TestInstance whereToPutNewTask;
 
 	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());
+		}
 	}
 
@@ -156,26 +164,32 @@
 	}
 
-	public Object onValueChangedFromSelectTestInstance(TestInstance selectedTestInstance) {
-		testInstance = selectedTestInstance;
+	public Object onValueChangedFromSelectTestInstance(TestInstance ti) {
+		selectedTestInstance = ti;
 		return testInstanceZone.getBody();
 	}
 
 	public List<TaskInTestInstance> getTaskInTestInstances() {
-		return testInstance.getTaskInTestInstances();
-	}
-
-	void onActionFromEditTestInstance(TestInstance testInstance) {
-		editedTestInstance = testInstance;
-		if (testInstance.getTestInstanceParameters().isEmpty()) {
+		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()) {
 			editedTestInstanceParameters = new TestInstanceParameters();
 			editedTestInstanceParameters.setTestInstance(editedTestInstance);
 		} else {
-			editedTestInstanceParameters = testInstance.getTestInstanceParameters().get(0);
+			editedTestInstanceParameters = ti.getTestInstanceParameters().get(0);
 		}
 		ajaxResponseRenderer.addRender(testInstanceEditZone);
 	}
 
-	void onActionFromNewTestInstance(TestType testType) {
+	void onActionFromNewTestInstance(TestType tt) {
 		editedTestInstance = new TestInstance();
+		if (editedTestTemplate != null) {
+			editedTestInstance.setTestTemplate(editedTestTemplate);
+		}
 		editedTestInstanceParameters = null;
 		ajaxResponseRenderer.addRender(testInstanceEditZone);
@@ -195,4 +209,5 @@
 			editedTestInstance = null;
 			editedTestInstanceParameters = null;
+			editedTestTemplate = null;
 		} else {
 			editedTestInstanceParameters = new TestInstanceParameters();
@@ -207,4 +222,5 @@
 		editedTestInstance = null;
 		editedTestInstanceParameters = null;
+		editedTestTemplate = null;
 	}
 
@@ -318,4 +334,5 @@
 	void onActionFromCancelFrmTask() {
 		editedTask = null;
+		ajaxResponseRenderer.addRender(testInstanceZone);
 	}
 
@@ -341,4 +358,5 @@
 
 		editedTask = null;
+		ajaxResponseRenderer.addRender(testInstanceZone);
 	}
 
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/AppModule.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/AppModule.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/AppModule.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -54,4 +54,5 @@
 import dblearnstar.model.model.UserInfo;
 import dblearnstar.model.model.UserInfo.UserRole;
+import dblearnstar.webapp.util.AppConfig;
 
 @ImportModule(Bootstrap4Module.class)
@@ -59,4 +60,5 @@
 	public static void bind(ServiceBinder binder) {
 		binder.bind(AccessControllerRequestFilter.class);
+		binder.bind(DigestService.class);
 		binder.bind(GenericDao.class);
 		binder.bind(GenericService.class);
@@ -72,5 +74,5 @@
 
 	public static void contributeFactoryDefaults(MappedConfiguration<String, Object> configuration) {
-		configuration.override(SymbolConstants.APPLICATION_VERSION, "0.8-T5.7.2");
+		configuration.override(SymbolConstants.APPLICATION_VERSION, "0.8.6");
 		configuration.override(SymbolConstants.PRODUCTION_MODE, false);
 	}
@@ -78,5 +80,6 @@
 	public static void contributeApplicationDefaults(MappedConfiguration<String, Object> configuration) {
 		configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en,mk");
-		configuration.add(SymbolConstants.HMAC_PASSPHRASE, "JxIJa1SIjasihd08as09!W!" + UUID.randomUUID());
+		configuration.add(SymbolConstants.HMAC_PASSPHRASE,
+				AppConfig.getString("tapestry.hmac-passphrase") + UUID.randomUUID());
 		configuration.add(SymbolConstants.ENABLE_HTML5_SUPPORT, true);
 		configuration.add(SymbolConstants.COMPRESS_WHITESPACE, false);
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestService.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestService.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestService.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,7 @@
+package dblearnstar.webapp.services;
+
+public interface DigestService {
+
+	public String obfuscate(String shortText);
+
+}
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestServiceImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestServiceImpl.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/DigestServiceImpl.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,15 @@
+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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationService.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -51,3 +51,12 @@
 	public void processSolution(String issuedByUserName, StudentSubmitSolution s);
 
+	public Triplet<List<Object[]>, List<String>, List<String>> getResultsForPrintingPurposes(String userName,
+			String queryToRun, TestInstanceParameters tip, String schema, String type);
+
+	/**
+	 * @return <resultsSimple, resultsHeadersSimple, resultsErrors>
+	 */
+	Triplet<List<Object[]>, List<String>, List<String>> getEvalResultsForViewing(String userName, String queryToRun,
+			TaskInTestInstance taskInTestInstance, TestInstanceParameters tip, String schema);
+
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationServiceImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationServiceImpl.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/EvaluationServiceImpl.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -28,4 +28,5 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 
 import javax.persistence.TypedQuery;
@@ -63,16 +64,17 @@
 	}
 
-	@Override
-	public Triplet<List<String>, List<String>, Boolean> evalResultsIn(String userName, String queryString,
+	/**
+	 * @return < resultsEval, resultsErrors, evaluation result >
+	 */
+	@Override
+	public Triplet<List<String>, List<String>, Boolean> evalResultsIn(String userName, String queryToRun,
 			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));
-		// 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 (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("drop") || qtlc.contains("alter") || qtlc.contains("information_schema")) {
 			} else {
 				Connection connection = null;
@@ -89,5 +91,5 @@
 					connection.setSchema(schema);
 
-					String queryStringManip = queryString.replace("now()", schema + ".now()");
+					String queryStringManip = queryToRun.replace("now()", schema + ".now()");
 					queryStringManip = queryStringManip.replace("current_date", schema + ".now()");
 
@@ -98,5 +100,5 @@
 
 					PreparedStatement pstmt = connection.prepareStatement(evalQueryString);
-					pstmt.setQueryTimeout(30);
+					pstmt.setQueryTimeout(120);
 					ResultSet rs = pstmt.executeQuery();
 					if (rs.next()) {
@@ -109,4 +111,5 @@
 					}
 					rs.close();
+					pstmt.close();
 					SQLWarning w = connection.getWarnings();
 					if (w != null) {
@@ -115,5 +118,5 @@
 					connection.rollback();
 				} catch (Exception e) {
-					logger.error("Error occured {}", e.getMessage());
+					logger.error("Error occured {}", e);
 					if (e.getMessage().contains("ERROR: each EXCEPT query must have the same number of columns")) {
 						rslts.getFirstItem().add(messages.get("sql-outputSchemaFormatError"));
@@ -124,4 +127,6 @@
 								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());
@@ -296,12 +301,14 @@
 
 	public void processSolution(String issuedByUserName, StudentSubmitSolution s) {
+		TaskInTestInstance tti = s.getTaskInTestInstance();
+		/*
+		 * TODO: Only supports TestInstances with a single TestInstanceParameter line
+		 */
+		TestInstanceParameters tip = tti.getTestInstance().getTestInstanceParameters().get(0);
+
 		Triplet<List<String>, List<String>, Boolean> rsltsSimple = evalResultsIn(issuedByUserName, s.getSubmission(),
-				s.getTaskInTestInstance(),
-				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0),
-				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0).getSchemaSimple());
+				tti, tip, tip.getSchemaSimple());
 		Triplet<List<String>, List<String>, Boolean> rsltsComplex = evalResultsIn(issuedByUserName, s.getSubmission(),
-				s.getTaskInTestInstance(),
-				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0),
-				s.getTaskInTestInstance().getTestInstance().getTestInstanceParameters().get(0).getSchemaComplex());
+				tti, tip, tip.getSchemaComplex());
 		logger.info("Reevaluation studentSubmitSolutionId Simple: {} reevaluated as {}", s.getStudentSubmitSolutionId(),
 				rsltsSimple.getThirdItem());
@@ -322,3 +329,226 @@
 	}
 
+	/**
+	 * @return <resultsSimple, 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 <resultsSimple, 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 queryStringManip = queryToRun.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(120);
+					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>();
+		}
+
+		Triplet<List<Object[]>, List<String>, List<String>> results = new Triplet<List<Object[]>, List<String>, List<String>>(
+				resultsSimple, resultsHeadersSimple, resultsErrors);
+		return results;
+	}
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManager.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManager.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManager.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -24,4 +24,5 @@
 
 import dblearnstar.model.entities.Person;
+import dblearnstar.model.entities.SolutionAssessment;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentStartedTest;
@@ -82,5 +83,10 @@
 			long taskInTestInstanceId);
 
+	public List<SolutionAssessment> getAllEvaluationsOfSolutionsForTaskInTestInstance(long studentId,
+			long taskInTestInstanceId);
+
 	public Float getTotalPoints(long studentId, long testInstanceId);
 
+	public boolean accessToTaskInTestInstanceAllowed(Student student, TaskInTestInstance tti);
+
 }
Index: dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManagerImpl.java
===================================================================
--- dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManagerImpl.java	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/java/dblearnstar/webapp/services/TestManagerImpl.java	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -27,5 +27,4 @@
 import java.util.List;
 
-import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
@@ -36,4 +35,5 @@
 import dblearnstar.model.entities.ActivityInTask;
 import dblearnstar.model.entities.Person;
+import dblearnstar.model.entities.SolutionAssessment;
 import dblearnstar.model.entities.Student;
 import dblearnstar.model.entities.StudentStartedTest;
@@ -399,4 +399,26 @@
 
 	@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 Float getTotalPoints(long studentId, long testInstanceId) {
 		try {
@@ -424,3 +446,10 @@
 	}
 
+	@Override
+	public boolean accessToTaskInTestInstanceAllowed(Student student, TaskInTestInstance tti) {
+		return getTestInstancesForStudentByTestType(student.getStudentId(),
+				tti.getTestInstance().getTestTemplate().getTestType().getTestTypeId()).stream()
+						.anyMatch(ti -> ti.getTestInstanceId() == tti.getTestInstance().getTestInstanceId());
+	}
+
 }
Index: dbLearnStar-webApp/src/main/resources/AppConfig.properties
===================================================================
--- dbLearnStar-webApp/src/main/resources/AppConfig.properties	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/AppConfig.properties	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -15,4 +15,5 @@
 date.gui.format=dd.MM.yyyy
 time.gui.format=HH:mm
+datetime.gui.format=dd.MM.yyyy HH:mm:ss
 
 additionalFiles.path=@additionalFiles.path@
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/ComplaintsAndDiscussions.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/ComplaintsAndDiscussions.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/ComplaintsAndDiscussions.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,44 @@
+.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%;
+}
+
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/ExamsAndTasksOverviewPage.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/ExamsAndTasksOverviewPage.css	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/ExamsAndTasksOverviewPage.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -39,2 +39,7 @@
 	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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/QueryTest.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -21,9 +21,4 @@
 }
 
-.errorpanel {
-	position: relative;
-	margin: 0.5em 0em 0em 0em;
-}
-
 .resultspanel {
 	position: relative;
@@ -45,13 +40,11 @@
 	font-size: 80%;
 	clear: both;
-	display: block;
+	display: inline;
+	background: #e0e0e0;
+	padding: 0.2em;
 }
 
-.taskname {
+.tas1kname {
 	margin-top: 0;
-}
-
-h3 {
-	margin-top: 0.5rem;
 }
 
@@ -63,5 +56,4 @@
 .code {
 	font-family: 'Fira Code', monospace, mono;
-	font-size: 85%;
 	line-height: 95%;
 	padding: 0.0em !important;
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/SolutionComparatorPage.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/SolutionComparatorPage.css	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/SolutionComparatorPage.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -2,5 +2,5 @@
 	/*
 		https://www.w3schools.com/colors/colors_british.asp - Green */
-	background: #9dd29c;
+	background: var(--color-correct);
 }
 
@@ -8,5 +8,5 @@
 	/*
 		https://www.w3schools.com/colors/colors_british.asp - Carnival red */
-	background: #c71c2c;
+	background: var(--color-incorrect);
 	color: white;
 }
@@ -34,8 +34,7 @@
 .feedback {
 	overflow-wrap: normal;
-	overflow: scroll;
-	white-space: pre-line;
+	overflow: auto;
 	hyphens: auto;
-	max-height: 25rem;
+	max-height: 20rem;
 }
 
@@ -52,2 +51,8 @@
 	size: 2;
 }
+
+.solution {
+	overflow-x: auto;
+	overflow-y: auto;
+	max-height: 25rem;
+}
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionEvaluations.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionEvaluations.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionEvaluations.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,176 @@
+.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: 19em !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: 23em !important;
+	min-width: 15em !important;
+}
+
+td[data-grid-property="assessment"] pre {
+	font-size: 75% !important;
+	line-height: 0.8em !important;
+	max-height: 12em !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;
+}
+
+.feedback img {
+	width:120%;
+}
+
+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: 95%;
+	max-width: 95%;
+}
+
+#solution {
+	min-height: 20em;
+}
+
+.nonSqlSolution .code {
+	white-space: pre-wrap;
+	break-word: all;
+	line-height:1.2em;
+}
+
+.sqlSolution .code {
+	font-size:80%;
+	line-height:1em;
+}
Index: LearnStar-webApp/src/main/resources/META-INF/assets/SubmissionLogViewer.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/SubmissionLogViewer.css	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ 	(revision )
@@ -1,159 +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 {
-	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/ckeditor-custom.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/ckeditor-custom.css	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/ckeditor-custom.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -13,5 +13,5 @@
 
 .resultschema {
-	background: #d0d0ff;
+	background: #e0e0e0;
 	margin-left: 0.5em;
 	margin-right: 0.5em;
@@ -20,4 +20,6 @@
 div.box {
 	padding: 0.5em;
-	background: #e0e0e0;
+	background: #e8e8ff;
+	border-left: 3px black solid;
 }
+
Index: dbLearnStar-webApp/src/main/resources/META-INF/assets/feedback-styles.css
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/assets/feedback-styles.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/feedback-styles.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,11 @@
+.box {
+	padding: 0.5em;
+	background: #e8e8ff;
+	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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/assets/site-overrides.css	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -42,5 +42,5 @@
 
 body {
-	padding-top: 4em;
+	padding-top: 4.5em;
 }
 
@@ -125,2 +125,17 @@
 }
 
+.datefield-popup {
+	background: white;
+	padding:0.5em;
+	border-radius:6px;
+	border: 1px solid black;
+}
+
+.glyphicon-calendar {
+	background-color: var(--light);
+	color: var(--dark);
+}
+
+.glyphicon-calendar::before {
+  content: "📅";
+}
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/ModalBox.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/ModalBox.js	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/ModalBox.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -22,10 +22,8 @@
 
 	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/PrettyPrint.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/PrettyPrint.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/PrettyPrint.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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"], function($) {
+
+	var originalCode = null;
+
+	$("#reformat").click(function() {
+		newsql = '';
+		if (originalCode != null) {
+			newsql = originalCode;
+			originalCode = null;
+		} else {
+			originalCode = $("#solution > code").text();
+			newsql = window.sqlFormatter.format(originalCode);
+		}
+		$("#solution > code").text(newsql);
+	});
+
+});
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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config-admin.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -24,6 +24,6 @@
 	},
 	paths: {
-		'ckeditor-core': '../webjars/ckeditor/4.16.1/standard/ckeditor',
-		'ckeditor-jquery': '../webjars/ckeditor/4.16.1/standard/adapters/jquery'
+		'ckeditor-core': '../webjars/ckeditor/4.17.1/standard/ckeditor',
+		'ckeditor-jquery': '../webjars/ckeditor/4.17.1/standard/adapters/jquery'
 	}
 });
@@ -36,5 +36,5 @@
 				specialChars: ['σ', 'θ', 'π', '⨯', '⋈', 'ρ', '÷', '&cup;', '&cap;',
 					'←', '→', '∨', '∧', '¬', '∀', '∃', '∄', '∈', '∉', '⊂', '⊃',
-					'⊆', '⊇', '≤', '≠', '≥'],
+					'⊆', '⊇', '≤', '≠', '≥', '»' ],
 				toolbarGroups: [
 					{ "name": "basicstyles", "groups": ["basicstyles"] },
@@ -46,5 +46,5 @@
 				stylesSet: [
 					{
-						name: 'Box',
+						name: 'Quote',
 						element: 'div',
 						attributes: { 'class': 'box' }
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config.js	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/ckeditor-config.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -24,6 +24,6 @@
 	},
 	paths: {
-		'ckeditor-core': '../webjars/ckeditor/4.16.1/standard/ckeditor',
-		'ckeditor-jquery': '../webjars/ckeditor/4.16.1/standard/adapters/jquery'
+		'ckeditor-core': '../webjars/ckeditor/4.17.1/standard/ckeditor',
+		'ckeditor-jquery': '../webjars/ckeditor/4.17.1/standard/adapters/jquery'
 	}
 });
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-error.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-error.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-error.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/codemirror-run.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -39,4 +39,12 @@
 					hintOptions: {
 						tables: {
+							banki: ["banka_id","b_naziv","b_adresa","grad_id"],
+							gradovi: ["grad_id","g_naziv"],
+							vraboteni: ["banka_id","vrab_br","v_embg","v_ime","godina_vrab"],
+							banki: ["banka_id","b_naziv","b_adresa","grad_id"],
+							ekspozituri: ["banka_id","eksp_br","e_naziv","e_adresa","grad_id"],
+							rabotni_mesta: ["rabmesto_id","rm_naziv"],
+							raboti_kako: ["banka_id","vrab_br","rabmesto_id"],
+							odgovorni_lica: ["smetka_br","trans_br","banka_id","vrab_br"],
 							supervizor: ["lid"],
 							recept: ["recid", "datum", "doza", "liddok", "lidpac", "mbroj", "lekid"],
@@ -99,10 +107,4 @@
 					}
 				});
-		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/stillAlive.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/stillAlive.js	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/stillAlive.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -52,5 +52,19 @@
 				"issuer": "stillAlive"
 			},
-			method: "POST"
+			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");
+			}
 		});
 	}, 10000);
Index: dbLearnStar-webApp/src/main/resources/META-INF/modules/zoneUpdateEffect.js
===================================================================
--- dbLearnStar-webApp/src/main/resources/META-INF/modules/zoneUpdateEffect.js	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/META-INF/modules/zoneUpdateEffect.js	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -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.3s linear slidein");
+		$(this).css("animation", "0.5s linear slidein");
 	});
 
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Code.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Code.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/Code.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -4,9 +4,5 @@
 	<t:if t:test="!nullValue">
 		<t:if t:test="value">
-			<pre id="${id}" class="pre-scrollable code ${allClasses}">
-				<code>
-					<t:outputraw t:value="value"></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/ModalBox.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/ModalBox.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/ModalBox.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -7,8 +7,4 @@
 			<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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/components/SVGIcon.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -6,5 +6,5 @@
 	width="${width}" height="${height}">
   <use
-		xlink:href="${asset:classpath:META-INF/resources/webjars/feather-icons/4.28.0/dist/feather-sprite.svg}#${path}" />
+		xlink:href="${asset:classpath:META-INF/assets/META-INF/resources/webjars/feather-icons/4.28.0/dist/feather-sprite.svg}#${path}" />
 </svg>
 
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ComplaintsAndDiscussions.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ComplaintsAndDiscussions.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ComplaintsAndDiscussions.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -2,49 +2,4 @@
 	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>
@@ -53,13 +8,19 @@
 	<p:then>
 		<h2>${solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.testInstance.title}</h2>
-		<p>
-			<a class="btn btn-sm btn-info" role="button" data-toggle="collapse"
+		<h3>${solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.task.title}
+
+		</h3>
+		
+		<P>
+			<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}">
-				${solutionAssessmentToDiscuss.studentSubmitSolution.taskInTestInstance.task.title}
-				- ${message:Description-label} <span class="caret"></span>
+				${message:Description-label} <img t:type="svgicon"
+				t:path="chevrons-down" />
 			</a>
-		</p>
+		</P>
+		
 		<div class="collapse"
 			id="collapse${solutionAssessmentToDiscuss.solutionAssessmentId}">
@@ -75,6 +36,6 @@
 				</h4>
 				<div class="reshenieto">
-					<t:outputRaw
-						t:value="solutionAssessmentToDiscuss.studentSubmitSolution.submission" />
+					<pre><t:outputRaw
+							t:value="solutionAssessmentToDiscuss.studentSubmitSolution.submission" /></pre>
 				</div>
 			</div>
@@ -94,8 +55,10 @@
 					</div>
 				</div>
+
 				<div t:type="if" t:test="newAssessmentDiscussion">
 					<p:then>
-						<t:ModalBox t:id="assessmentModal">
-							<div class="alert alert-warning" role="alert">
+						<t:ModalBox t:id="assessmentModal"
+							t:additionalClassDialog="modal-lg">
+							<div class="alert alert-warning col-11" role="alert">
 								<t:SVGIcon t:path="alert-triangle" />
 								${message:discussionForm-description}
@@ -103,5 +66,5 @@
 							<form t:type="beaneditform" t:id="newAssessmentDiscussionForm"
 								t:exclude="assessmentDiscussionId, replyTo,type, postedOn, person, solutionEvaluation"
-								t:object="newAssessmentDiscussion">
+								t:object="newAssessmentDiscussion" class="form-vertical">
 								<p:message>
 									<t:label t:for="message" />
@@ -111,7 +74,11 @@
 								</p:message>
 							</form>
+							<a href="" t:type="actionlink"
+								t:id="cancelNewAssessmentDiscussionForm"
+								class="btn btn-secondary ml-2">Cancel</a>
 						</t:ModalBox>
 					</p:then>
 				</div>
+
 				<div t:type="if"
 					t:test="solutionAssessmentToDiscuss.assessmentDiscussions">
@@ -146,5 +113,8 @@
 							<p:then>
 								<button href="" role="button" class="btn btn-primary"
-									t:type="actionlink" t:id="fileAComplaint">${message:fileAComplaint-label}</button>
+									t:type="actionlink" t:id="fileAComplaint">
+									<img t:type="svgicon" t:path="file-text" />
+									${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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/ExamsAndTasksOverviewPage.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -9,4 +9,5 @@
 		<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"
@@ -14,4 +15,5 @@
 					t:value="testCollection" t:zone="collectionZone" t:required="true"
 					t:blankOption="NEVER"></select>
+
 			</div>
 		</form>
@@ -20,27 +22,41 @@
 
 <div t:type="zone" t:id="collectionZone" id="collectionZone">
+
 	<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${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>
-					<div id="collapseTasks${testInstance.testInstanceId}"
+					t:value="testInstance" id="ti${hashedTestInstanceId}">
+					<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">
+						<div class="card-header ${classTestIsNow} pt-2 pb-0" role="tab"
+							id="heading${hashedTestInstanceId}">
+							<h3>${translateTestInstanceTitle}</h3>
+						</div>
+					</a>
+					<div id="collapseTasks${hashedTestInstanceId}"
 						class="card-body p-3 collapse" role="tabpanel"
-						aria-labelledby="heading${testInstance.testInstanceId}">
+						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>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/Index.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/Index.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/Index.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -25,11 +25,4 @@
 			</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/QueryTest.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/QueryTest.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/QueryTest.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -3,223 +3,261 @@
 	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>
 
-<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" />
+<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>
+			<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">
+
+			<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 class="form-group">
-					<label t:type="label" for="filecomment"></label>
-					<textarea id="filecomment" t:id="filecomment" name="filecomment"
-						t:type="textarea" t:value="filecomment">
+				<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>
-				<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>
-		</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>
-		</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}
+			</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" 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"
+					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" />
 					</p:submittedOnCell>
-				<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>
+					<p:actionCell>
+						<t:if t:test="UPLOAD">
 							<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: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: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 c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/SolutionComparatorPage.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -2,71 +2,86 @@
 	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>
+
+<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" />
 			</div>
-		</form>
-	</div>
-</div>
+		</div>
 
-<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 class="row">
-				<t:if t:test="lastEvaluatedSolutionForTaskInTestInstance">
-					<div class="col-sm-6">
-						<h4>${message:yourLastSolution-label}:</h4>
-						<p>${lastEvaluatedSolutionForTaskInTestInstance.submittedOn}</p>
+		<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 bg-light p-2">
+				<div class="row">
+					<div class="col-6">
+						<p>
+							<strong>${message:solution-label}:</strong>
+						</p>
+						<p>${oneOfTheEvaluatedSolutions.studentSubmitSolution.submittedOn}</p>
 						<t:if t:test="SQL">
 							<t:code
-								t:additionalClass="${classLastSolutionForTaskInTestInstance}"
-								t:value="lastEvaluatedSolutionForTaskInTestInstance.submission"></t:code>
+								t:additionalClass="${classLastSolutionForTaskInTestInstance} p-2"
+								t:value="oneOfTheEvaluatedSolutions.studentSubmitSolution.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="lastEvaluatedSolutionForTaskInTestInstance"
+								t:context="oneOfTheEvaluatedSolutions.studentSubmitSolution"
 								t:id="DownloadFile">${message:load-label}</a>
 						</t:if>
 						<t:if t:test="TEXT">
-							<t:code
-								t:additionalClass="${classLastSolutionForTaskInTestInstance} img100pct "
-								t:value="lastEvaluatedSolutionForTaskInTestInstance.submission"></t:code>
+							<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:if>
 					</div>
-					<div class="col-sm-6">
+
+					<div class="col-6">
 						<t:if
-							t:test="lastEvaluatedSolutionForTaskInTestInstance.studentStartedTest.testInstance.openForReviewByStudents">
+							t:test="oneOfTheEvaluatedSolutions.studentSubmitSolution.studentStartedTest.testInstance.openForReviewByStudents">
 							<div t:type="if"
-								t:test="lastEvaluatedSolutionForTaskInTestInstance.evaluations">
-								<h4>
-									${message:grade-label}: <span class="badge">
+								t:test="oneOfTheEvaluatedSolutions.studentSubmitSolution.evaluations">
+								<p>
+									<strong> ${message:grade-label}: </strong><span
+										class="badge badge-dark">
 										${submissionsFirstEvaluation?.grade}</span>
-								</h4>
+
+								</p>
+
 								<p>${message:feedback-label}:</p>
-								<div class="card feedback">
-									<t:outputraw t:value="submissionsFirstEvaluation?.feedback"
-										class="card-body" />
+								<div class="card">
+									<div class="card-body">
+										<div class="feedback">
+											<t:outputraw t:value="submissionsFirstEvaluation?.feedback" />
+										</div>
+									</div>
 								</div>
 								<p>
@@ -74,15 +89,17 @@
 										t:type="pagelink" t:page="ComplaintsAndDiscussions"
 										t:context="submissionsFirstEvaluation">
-										${message:ComplaintsAndDiscussions-page}</button>
+										<img t:type="svgicon" t:path="file-text" />
+										${message:ComplaintsAndDiscussions-page}
+									</button>
 								</p>
 							</div>
 							<div t:type="if" t:test="otherSolutions">
 								<p>
-									<a class="btn btn-secondary" role="button"
+									<a class="btn btn-outline-info" role="button"
 										data-toggle="collapse"
 										href="#collapseSolutions${taskInTestInstance.taskInTestInstanceId}"
 										aria-expanded="false"
 										aria-controls="#collapseSolutions${taskInTestInstance.taskInTestInstanceId}">${message:otherSolutions-label}
-										<span class="caret"></span>
+										<img t:type="svgicon" t:path="chevrons-down" />
 									</a>
 								</p>
@@ -94,5 +111,10 @@
 											t:value="otherStudentSubmitSolution">
 											<t:if t:test="SQL">
-												<t:code t:value="otherStudentSubmitSolution.submission"></t:code>
+												<div class="card">
+													<div class="card-body">
+														<t:code t:additionalClass="literal:p-2"
+															t:value="otherStudentSubmitSolution.submission"></t:code>
+													</div>
+												</div>
 											</t:if>
 											<t:if t:test="UPLOAD">
@@ -103,5 +125,10 @@
 											</t:if>
 											<t:if t:test="TEXT">
-												<t:code t:value="otherStudentSubmitSolution.submission"></t:code>
+												<div class="card">
+													<div class="card-body solution">
+														<t:outputraw t:additionalClass="img100pct p-2 text-wrap"
+															t:value="otherStudentSubmitSolution.submission" />
+													</div>
+												</div>
 											</t:if>
 										</t:loop>
@@ -110,11 +137,11 @@
 								<p:else>
 									<t:if t:test="lastSolutionCorrect">
-										<p class="bg-warning">
-											<t:SVGIcon t:path="info" />
+										<p class="alert alert-warning">
+											<img t:type="SVGIcon" t:path="info" />
 											${message:noCorrectSolutionsByOthers-label}
 										</p>
 										<p:else>
-											<p class="bg-danger">
-												<t:SVGIcon t:path="alert-triangle" />
+											<p class="alert alert-danger">
+												<img t:type="SVGIcon" t:path="alert-triangle" />
 												${message:youDontHaveCorrectSolution-label}
 											</p>
@@ -128,16 +155,19 @@
 						</t:if>
 					</div>
-					<p:else>
-						<div class="col-sm-12">
-							<p>${message:youDontHaveASolutionOrSolutionIsNotEvaluatedAndCantBeCompared-label}</p>
-						</div>
-					</p:else>
-				</t:if>
+				</div>
+				<p:else>
+					<div class="col-12">
+						<p>${message:youDontHaveASolutionOrSolutionIsNotEvaluatedAndCantBeCompared-label}</p>
+					</div>
+				</p:else>
 			</div>
-			<hr />
-		</t:loop>
-		<hr />
-		<h3>Вкупно поени: ${totalPoints}</h3>
-	</t:if>
-</t:zone>
+		</div>
+	</t:loop>
+
+	<hr />
+
+	<h3>${message:totalPoints-label}:
+		<span class="badge badge-dark">${totalPoints}</span>
+	</h3>
+</t:if>
 </html>
Index: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionEvaluations.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionEvaluations.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionEvaluations.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -0,0 +1,322 @@
+<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 class="card-body collapse" id="collapsedDescription">
+					<t:outputraw t:value="translateTaskDescription"></t:outputraw>
+				</div>
+			</div>
+
+			<div class="card  mt-2" t:type="if" t:test="editedAssessmentTaskSQL">
+				<div class="card-header">
+					<div class="row m-0 p-0 ">
+						<div class="col-3">
+							<a role="button" href="#" id="reformat"
+								class="btn btn-sm btn-primary">Beautify <t:SVGIcon
+									t:path="align-left" /></a>
+						</div>
+						<div class="col-9 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="actionlink" t:id="reevaluateEditedSubmission"
+								t:context="editedAssessment.studentSubmitSolution"
+								t:zone="zModal" class="btn btn-sm btn-warning">${message:reevaluate-label}
+								<t:SVGIcon t:path="check-square" />
+							</a> <a href="" class="btn btn-sm btn-info" t:type="actionlink"
+								t:id="viewEvaluationResults" t:zone="zSQLEval"
+								t:context="editedAssessment.studentSubmitSolution">${message:sqlEvaluation-label}
+								<t:SVGIcon t:path="eye" />
+							</a>
+						</div>
+					</div>
+				</div>
+				<div class="card-body" t:id="zSQLEval" t:type="zone">
+					<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="resultsEvaluation1">
+						<div class="col-sm-12">
+							<div class="alert alert-success resultspanel resultspanel-colors"
+								role="alert" t:type="if" t:test="resultsEvaluation1">
+								<h3>${message:query-results-label}</h3>
+								<table class="table 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">
+											<td t:type="loop" t:source="oneRow" t:value="oneColumn">${oneColumn}</td>
+										</tr>
+									</tbody>
+								</table>
+							</div>
+							<div class="alert alert-success resultspanel resultspanel-colors"
+								role="alert" t:type="if" t:test="resultsEvaluation2">
+								<h3>${message:query-results-label}</h3>
+								<table class="table 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">
+											<td t:type="loop" t:source="oneRow" t:value="oneColumn">${oneColumn}</td>
+										</tr>
+									</tbody>
+								</table>
+							</div>
+						</div>
+					</div>
+
+				</div>
+
+			</div>
+
+			<form t:type="form" class="form-vertical" t:id="FormEditor"
+				id="FormEditor" t:autofocus="true">
+				<div class="form-row">
+					<div class="form-group col-6  ${classSQLsolution}">
+						<label for="solution">${message:solution-label}</label>
+						<t:code id="solution" t:id="solution"
+							t:value="editedAssessment.studentSubmitSolution.submission"
+							class="modalSubmission form-control col-12"></t:code>
+					</div>
+					<div class="form-group col-6 feedback">
+						<label t:type="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>
+				<t:errors />
+				<div class="form-row   align-items-center">
+					<div class="form-group col-3">
+						<label t:type="label" t:for="passed">Passed <input
+							t:type="checkbox" t:id="passed" t:value="editedAssessment.passed"
+							class="form-control"></input>
+						</label>
+					</div>
+					<div class="form-group col-3">
+						<label t:type="label" t:for="type"></label> <input
+							t:type="textfield" t:id="type" t:value="editedAssessment.type"
+							class="form-control"></input>
+					</div>
+					<div class="form-group col-3">
+						<label t:type="label" t:for="grade"></label> <input
+							t:type="textfield"
+							data-translation-message="You must provide a numeric value for the Grade."
+							data-translation="numeric" data-validation="true" t:id="grade"
+							t:value="editedAssessment.grade" class="form-control numeric"></input>
+					</div>
+					<div class="col-auto">
+						<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">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 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"
+						value="submission?.submittedOn" />
+				</p:submittedOnCell>
+				<p:assessmentCell>
+					<div t:type="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>
+					</div>
+					<div t:type="if" t:test="UPLOAD"></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-xs btn-primary">${message:editAssessment-label}</a>
+						<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>
+					</div>
+				</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>
+<script
+	src="${asset:classpath:META-INF/assets/sql-formatter/sql-formatter.min.js}"></script>
+</html>
Index: LearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionLogViewer.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/SubmissionLogViewer.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ 	(revision )
@@ -1,229 +1,0 @@
-<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: dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TestAdminPage.tml
===================================================================
--- dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TestAdminPage.tml	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/dblearnstar/webapp/pages/admin/TestAdminPage.tml	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -31,5 +31,5 @@
 						<select t:type="select" id="selectTestInstance"
 							t:id="selectTestInstance" t:model="modelTestInstances"
-							t:value="testInstance" class="form-control"
+							t:value="selectedTestInstance" class="form-control"
 							t:zone="testInstanceZone"></select>
 					</div>
@@ -39,23 +39,23 @@
 
 		<div t:id="testInstanceZone" id="testInstanceZone" t:type="zone">
-			<div t:type="if" t:test="testInstance">
+			<div t:type="if" t:test="selectedTestInstance">
 				<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>
+								t:context="selectedTestInstance" 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>
+								t:context="selectedTestInstance" 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>
+								t:context="selectedTestInstance" 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>
+							${message:scheduledFor-label}: <span class="bg-info">${selectedTestInstance.scheduledFor}</span>
+							${message:scheduledUntil-label}: <span class="bg-info">${selectedTestInstance.scheduledUntil}</span>
 						</p>
-						<p t:type="outputraw" t:value="testInstance.description">Test
+						<p t:type="outputraw" t:value="selectedTestInstance.description">Test
 							Instance Description PLACEHOLDER</p>
 						<p>
-							<img src="${testInstance.testTemplate.model.diagramUrl}"
+							<img src="${selectedTestInstance.testTemplate.model.diagramUrl}"
 								style="width: 100%; max-width: 30em; max-height: 15em;" />
 						</p>
@@ -102,7 +102,7 @@
 						</table>
 						<a href="" class="btn btn-warning" t:type="actionlink"
-							t:context="testInstance" t:id="newTask">${message:symbol-createObjectAndAddToList}</a>
+							t:context="selectedTestInstance" 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>
+							t:context="selectedTestInstance" t:id="addTask">${message:symbol-addObjectToList}</a>
 					</div>
 				</div>
@@ -118,8 +118,8 @@
 
 		<div class="row">
-			<div class="col-lg-10">
-				<h3 style="margin-top: 0;">${message:editTestInstance-label}</h3>
-			</div>
-			<div class="col-lg-2">
+			<div class="col-10">
+				<h3 class="mt-0">${message:editTestInstance-label}</h3>
+			</div>
+			<div class="col-2">
 				<a class="close" aria-label="Close" href=""
 					t:id="cancelFrmTestInstance" t:type="actionlink"><span
@@ -127,53 +127,4 @@
 			</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">
@@ -193,5 +144,77 @@
 		</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="testTemplate, title,ordering,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 align-bottom">
+						<label>&nbsp;</label> <a t:id="NewTestTemplate" href=""
+							t:type="actionlink" t:context="testType"
+							class="col-12 btn btn-primary"><t:svgicon
+								t:path="plus-square" /> ${message:testTemplate-label}</a>
+					</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>
+		</form>
+
+		<hr />
+
 		<div t:type="if" t:test="editedTestInstanceParameters">
+			<h4>${message:TestInstanceParameters-label}</h4>
 			<form t:type="beaneditform" t:id="frmTestInstanceParameters"
 				t:exclude="testInstanceParametersId"
@@ -199,4 +222,5 @@
 				t:object="editedTestInstanceParameters">frmTestInstanceParameters
 				PLACEHOLDER</form>
+
 			<p:else>${message:testinstanceparameters-empty-message}</p:else>
 		</div>
Index: dbLearnStar-webApp/src/main/resources/log4j.properties
===================================================================
--- dbLearnStar-webApp/src/main/resources/log4j.properties	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/resources/log4j.properties	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -4,6 +4,6 @@
 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.org.apache.tapestry5.TapestryFilter=info
+log4j.category.dblearnstar.webapp=info
 log4j.category.dblearnstar.webapp.services.AppModule.TimingFilter=info
 
Index: dbLearnStar-webApp/src/main/webapp/WEB-INF/app.properties
===================================================================
--- dbLearnStar-webApp/src/main/webapp/WEB-INF/app.properties	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/webapp/WEB-INF/app.properties	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -6,5 +6,5 @@
 addToList-label=Add
 admin/activeUsers-pagelink=Active Users
-admin/GroupManagement-pagelink=Groups
+admin/GroupManagement-pagelink=Groups Management
 admin/Index-pagelink=Admin
 admin-label=Administrator
@@ -13,7 +13,13 @@
 admin/Reevaluation-pagelink=Reevaluation
 admin/StudentGroupProgress-pagelink=Progress
-admin/SubmissionLogViewer-pagelink=Submissions
+admin/SubmissionEvaluations-pagelink=Evaluation of Submissions
 admin/TestAdmin-pagelink=Tests
 admin/TestCollectionManagement-pagelink=Test Collections
+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
@@ -25,4 +31,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
 ComplaintsAndDiscussionForSolution-label=Complaints and Discussions for a Solution Assessment
@@ -75,4 +82,5 @@
 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.
@@ -121,4 +129,5 @@
 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
@@ -132,4 +141,5 @@
 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
 studenthomepage-page=Exams and Tasks
 student-label=student
@@ -155,4 +165,5 @@
 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
@@ -161,4 +172,5 @@
 toggleNavigation-label=Toggle navigation
 toggle-status-label=Toggle status
+totalPoints-label=Total points
 upload-label=Upload
 userName-label=User name
@@ -170,2 +182,3 @@
 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
Index: dbLearnStar-webApp/src/main/webapp/WEB-INF/app_mk.properties
===================================================================
--- dbLearnStar-webApp/src/main/webapp/WEB-INF/app_mk.properties	(revision c974abcea9e4dc8d70b982dbc7876554a361dd9e)
+++ dbLearnStar-webApp/src/main/webapp/WEB-INF/app_mk.properties	(revision 4038425784cad36a91a54fd08cba109d6be923b8)
@@ -9,11 +9,17 @@
 admin/Index-pagelink=Администратор
 admin-label=Администратор
-admin/ManageModels-pagelink=Управување со модели
-admin/ManagePersons-pagelink=Управување со корисници
+admin/ManageModels-pagelink=Модели
+admin/ManagePersons-pagelink=Корисници
 admin/Reevaluation-pagelink=Ревалуација
 admin/StudentGroupProgress-pagelink=Прогрес
-admin/SubmissionLogViewer-pagelink=Поднесоци
+admin/SubmissionEvaluations-pagelink=Прегледување поднесоци
 admin/TestAdmin-pagelink=Тестови
-admin/TestCollectionManagement-pagelink=Колекции од тестови
+admin/TestCollectionManagement-pagelink=Колекции тестови
+serverTime-label=Време на серверот
+testOpenUntil-label=Тестот е отворен до
+unlimited-label=Не е даден рок
+timeIsRunningOut-label=Времето за работа истекува...
+timehasRunOut-label=Времето за работа истече!
+timeTestIsActive-label=Активно тестирање
 app-title=dbLearn*
 application-logout=Апликациска одјава
@@ -25,4 +31,5 @@
 chooseFile-label=Задачата треба да ја решите во софтверот што го препорачува наставникот и потоа да го испратите решението тука како датотека. 
 clientInfo-label=Клиент
+close-label=Затвори
 comparisonOfSolutions-page=Споредба на решенија
 ComplaintsAndDiscussionForSolution-label=Приговори и дискусии по оценување на задача
@@ -47,5 +54,5 @@
 error-unknown-user=Системот е достапен само за регистрирани студенти на одреден курс. Контактирајте го задолжениот наставник на курсот за кој сакате да добиете пристап.
 evalDBNA-label=Евалуациската база на е достапна
-evaluatedOn-label=Проценето на
+evaluatedOn-label=Проценето
 evaluate-label=Евалуација
 evaluationComplex-label=Евалуација Шема 2
@@ -75,4 +82,5 @@
 list-submissions-run-only-label=Листа прашалници кои се извршувани без евалуација
 load-label=Вчитај
+download-label=Преземи
 LoggedAs-label=Најавен корисник
 logout-desc-total-cont=На крај, препорачано е да го затворите вашиот интернет прелистувач, сите негови прозорци и сите негови таб листови.
@@ -113,5 +121,5 @@
 reviewNotAllowed-label=Прегледување туѓи решенија не е дозволено во овој момент.
 RunOnlyNoEvaluation-label=Изврши без евалуација
-RunOnlyNoEvaluationSelection-label=Изврши селекција
+RunOnlyNoEvaluationSelection-label=Изврши само обележаното
 RunOnlyPlan-label=План на извршување
 save-label=Зачувај
@@ -120,4 +128,5 @@
 selectStudent-label=Изберете студент
 selectTaskInTestInstance-label=Изберете задача во тест инстанцата
+selectTestCollection-label=Изберете колекција тестови
 selectTestInstance-label=Изберете тест инстанца
 similar-queries-label=Слични прашалници
@@ -132,4 +141,5 @@
 sql-outputSchemaFormatError=Прашалникот врати податоци кои не се во очекуваниот облик и формат, па не може да се евалуира коректноста\!
 sql-resultIncorrect=Прашалникот резултираше со поинакви податоци од очекуваните. Сигурно не е коректен.
+sqlEvaluation-label=Евалуација на SQL поднесок
 studenthomepage-page=Тестови и задачи
 student-label=студент
@@ -155,4 +165,5 @@
 task-status-label=Статус
 testInstance-label=Тест инстанца
+testInstanceParameters-label=Параметри за тест инстанца
 testinstanceparameters-empty-message=Потребно е да ги внесете и параметрите за евалуација на тестот, откако ќе го внесете тестот.
 test-label=Тест
@@ -161,4 +172,5 @@
 toggleNavigation-label=Смени навигација
 toggle-status-label=Смени статус
+totalPoints-label=Вкупно поени
 upload-label=Испрати
 userName-label=Корисничко име
@@ -170,2 +182,3 @@
 yourSolutionIsNotEvaluatedAndCantBeCompared-label=Вашето решение сеуште не е официјално оценето, па не може да се споредува со другите.
 yourSolution-label=Ваше решение
+youHaveManyEvaluated-label=Имате повеќе од едно оценето решение
