Index: eprms-model/pom.xml
===================================================================
--- eprms-model/pom.xml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/pom.xml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -6,5 +6,5 @@
 	<groupId>info.ajanovski.eprms</groupId>
 	<artifactId>model</artifactId>
-	<version>0.0.4-SNAPSHOT</version>
+	<version>0.0.5-SNAPSHOT</version>
 
 	<name>EPRMS - Educational Project and Resource Management System - Model</name>
@@ -40,4 +40,9 @@
 			<version>2.2</version>
 		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-validator</artifactId>
+			<version>5.4.3.Final</version>
+		</dependency>
 	</dependencies>
 </project>
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Activity.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Activity.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Activity.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -44,4 +45,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "activity_id", unique = true, nullable = false)
 	public long getActivityId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/ActivityType.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/ActivityType.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/ActivityType.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -41,4 +42,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "activity_type_id", unique = true, nullable = false)
 	public long getActivityTypeId() {
@@ -68,4 +70,5 @@
 	}
 
+	@NotNull
 	@Column(name = "code", unique = true, nullable = false)
 	public String getCode() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Course.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Course.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Course.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,9 +24,10 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
 */
 @Entity
-@Table (schema="epm_main", name="course")
+@Table(schema = "epm_main", name = "course")
 public class Course implements java.io.Serializable {
 	private long courseId;
@@ -34,9 +35,10 @@
 	private String code;
 	private List<CourseActivityType> courseActivityTypes = new ArrayList<CourseActivityType>();
-
+	private List<CourseProject> courseProjects = new ArrayList<CourseProject>();
 
 	@Id
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "course_id", unique = true, nullable = false)
 	public long getCourseId() {
@@ -45,7 +47,8 @@
 
 	public void setCourseId(long courseId) {
-		this.courseId=courseId;
+		this.courseId = courseId;
 	}
 
+	@NotNull
 	@Column(name = "title", unique = true, nullable = false)
 	public String getTitle() {
@@ -54,7 +57,8 @@
 
 	public void setTitle(String title) {
-		this.title=title;
+		this.title = title;
 	}
 
+	@NotNull
 	@Column(name = "code", unique = true, nullable = false)
 	public String getCode() {
@@ -63,5 +67,5 @@
 
 	public void setCode(String code) {
-		this.code=code;
+		this.code = code;
 	}
 
@@ -72,5 +76,14 @@
 
 	public void setCourseActivityTypes(List<CourseActivityType> courseActivityTypes) {
-		this.courseActivityTypes=courseActivityTypes;
+		this.courseActivityTypes = courseActivityTypes;
+	}
+
+	@OneToMany(fetch = FetchType.LAZY, mappedBy = "course")
+	public List<CourseProject> getCourseProjects() {
+		return this.courseProjects;
+	}
+
+	public void setCourseProjects(List<CourseProject> courseProjects) {
+		this.courseProjects=courseProjects;
 	}
 
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/CourseActivityType.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/CourseActivityType.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/CourseActivityType.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -39,4 +40,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "course_activity_type_id", unique = true, nullable = false)
 	public long getCourseActivityTypeId() {
@@ -48,4 +50,5 @@
 	}
 
+	@NotNull
 	@Column(name = "position_number", nullable = false)
 	public int getPositionNumber() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/CourseProject.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/CourseProject.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/CourseProject.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -38,4 +39,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "course_project_id", unique = true, nullable = false)
 	public long getCourseProjectId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Database.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Database.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Database.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -47,4 +48,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "database_id", unique = true, nullable = false)
 	public long getDatabaseId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Person.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Person.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Person.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -22,15 +22,7 @@
 package info.ajanovski.eprms.model.entities;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
+import java.util.*;
+import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -49,4 +41,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "person_id", unique = true, nullable = false)
 	public long getPersonId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/PersonRole.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/PersonRole.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/PersonRole.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -38,4 +39,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "person_role_id", unique = true, nullable = false)
 	public long getPersonRoleId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Project.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Project.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Project.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -47,4 +48,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "project_id", unique = true, nullable = false)
 	public long getProjectId() {
@@ -56,4 +58,5 @@
 	}
 
+	@NotNull
 	@Column(name = "title", unique = true, nullable = false, length = 4000)
 	public String getTitle() {
@@ -92,5 +95,6 @@
 	}
 
-	@Column(name = "code")
+	@NotNull
+	@Column(name = "code", nullable = false)
 	public String getCode() {
 		return this.code;
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Repository.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Repository.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Repository.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -43,4 +44,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "repository_id", unique = true, nullable = false)
 	public long getRepositoryId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Responsibility.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Responsibility.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Responsibility.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -38,4 +39,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "responsibility_id", unique = true, nullable = false)
 	public long getResponsibilityId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Role.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Role.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Role.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -37,4 +38,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "role_id", unique = true, nullable = false)
 	public long getRoleId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/SystemParameter.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/SystemParameter.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/SystemParameter.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the EPRMS - Educational Project and Resource Management 
+ * System (hereinafter: EPRMS).
+ *     
+ * EPRMS is free software: you can redistribute it and/or modify it under the 
+ * terms of the GNU General Public License as published by the Free Software 
+ * Foundation, either version 3 of the License, or (at your option) any later 
+ * version.
+ *     
+ * EPRMS is distributed in the hope that it will be useful, but WITHOUT ANY 
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
+ * details.
+ *     
+ * You should have received a copy of the GNU General Public License along 
+ * with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
+ * 
+ ******************************************************************************/
+
+package info.ajanovski.eprms.model.entities;
+
+import java.util.*;
+import javax.persistence.*;
+import javax.validation.constraints.*;
+
+/*
+*/
+@Entity
+@Table (schema="epm_util", name="system_parameters")
+public class SystemParameter implements java.io.Serializable {
+	private long systemParameterId;
+	private String code;
+	private String value;
+	private String type;
+
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+
+	@NotNull
+	@Column(name = "system_parameter_id", unique = true, nullable = false)
+	public long getSystemParameterId() {
+		return this.systemParameterId;
+	}
+
+	public void setSystemParameterId(long systemParameterId) {
+		this.systemParameterId=systemParameterId;
+	}
+
+	@NotNull
+	@Column(name = "code", unique = true, nullable = false)
+	public String getCode() {
+		return this.code;
+	}
+
+	public void setCode(String code) {
+		this.code=code;
+	}
+
+	@NotNull
+	@Column(name = "value", nullable = false)
+	public String getValue() {
+		return this.value;
+	}
+
+	public void setValue(String value) {
+		this.value=value;
+	}
+
+	@NotNull
+	@Column(name = "type", nullable = false)
+	public String getType() {
+		return this.type;
+	}
+
+	public void setType(String type) {
+		this.type=type;
+	}
+
+}
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Team.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Team.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Team.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -38,4 +39,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "team_id", unique = true, nullable = false)
 	public long getTeamId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/TeamMember.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/TeamMember.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/TeamMember.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -40,4 +41,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "team_member_id", unique = true, nullable = false)
 	public long getTeamMemberId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Translation.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Translation.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/Translation.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -1,6 +1,28 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the EPRMS - Educational Project and Resource Management 
+ * System (hereinafter: EPRMS).
+ *     
+ * EPRMS is free software: you can redistribute it and/or modify it under the 
+ * terms of the GNU General Public License as published by the Free Software 
+ * Foundation, either version 3 of the License, or (at your option) any later 
+ * version.
+ *     
+ * EPRMS is distributed in the hope that it will be useful, but WITHOUT ANY 
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
+ * details.
+ *     
+ * You should have received a copy of the GNU General Public License along 
+ * with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
+ * 
+ ******************************************************************************/
+
 package info.ajanovski.eprms.model.entities;
 
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -9,14 +31,16 @@
 @Table (schema="epm_util", name="translations")
 public class Translation implements java.io.Serializable {
+	private long translationId;
+	private String className;
+	private long originalObjectId;
+	private String locale;
+	private String attributeCode;
+	private String translatedText;
 
-	private long	translationId;
-	private String className;
-	private long	originalObjectId;
-	private String	locale;
-	private String	attributeCode;
-	private String	translatedText;
 
 	@Id
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
+
+	@NotNull
 	@Column(name = "translation_id", unique = true, nullable = false)
 	public long getTranslationId() {
@@ -25,7 +49,8 @@
 
 	public void setTranslationId(long translationId) {
-		this.translationId = translationId;
+		this.translationId=translationId;
 	}
 
+	@NotNull
 	@Column(name = "class_name", nullable = false)
 	public String getClassName() {
@@ -37,4 +62,5 @@
 	}
 
+	@NotNull
 	@Column(name = "original_object_id", nullable = false)
 	public long getOriginalObjectId() {
@@ -43,7 +69,8 @@
 
 	public void setOriginalObjectId(long originalObjectId) {
-		this.originalObjectId = originalObjectId;
+		this.originalObjectId=originalObjectId;
 	}
 
+	@NotNull
 	@Column(name = "locale", nullable = false)
 	public String getLocale() {
@@ -52,7 +79,8 @@
 
 	public void setLocale(String locale) {
-		this.locale = locale;
+		this.locale=locale;
 	}
 
+	@NotNull
 	@Column(name = "attribute_code", nullable = false)
 	public String getAttributeCode() {
@@ -61,7 +89,8 @@
 
 	public void setAttributeCode(String attributeCode) {
-		this.attributeCode = attributeCode;
+		this.attributeCode=attributeCode;
 	}
 
+	@NotNull
 	@Column(name = "translated_text", nullable = false)
 	public String getTranslatedText() {
@@ -70,5 +99,6 @@
 
 	public void setTranslatedText(String translatedText) {
-		this.translatedText = translatedText;
+		this.translatedText=translatedText;
 	}
+
 }
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/WorkEvaluation.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/WorkEvaluation.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/WorkEvaluation.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,6 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
-
-import info.ajanovski.eprms.model.util.ModelConstants;
+import javax.validation.constraints.*;
 
 /*
@@ -38,7 +37,7 @@
 	private Float points;
 	private Date evaluationDate;
+	private String status;
 	private WorkReport workReport;
 	private Person person;
-	private String status = ModelConstants.EvaluationStatusCreated;
 
 
@@ -46,4 +45,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "work_evaluation_id", unique = true, nullable = false)
 	public long getWorkEvaluationId() {
@@ -100,7 +100,8 @@
 	}
 
-	@Column(name = "status", nullable = false, columnDefinition = "default 'CREATED'")
+	@NotNull
+	@Column(name = "status", nullable = false)
 	public String getStatus() {
-		return status;
+		return this.status;
 	}
 
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/entities/WorkReport.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/entities/WorkReport.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/entities/WorkReport.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -24,4 +24,5 @@
 import java.util.*;
 import javax.persistence.*;
+import javax.validation.constraints.*;
 
 /*
@@ -45,4 +46,5 @@
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 
+	@NotNull
 	@Column(name = "work_report_id", unique = true, nullable = false)
 	public long getWorkReportId() {
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/util/CourseActivityTypeHierarchicalComparator.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/util/CourseActivityTypeHierarchicalComparator.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/util/CourseActivityTypeHierarchicalComparator.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,20 @@
+package info.ajanovski.eprms.model.util;
+
+import java.util.Comparator;
+
+import info.ajanovski.eprms.model.entities.ActivityType;
+import info.ajanovski.eprms.model.entities.CourseActivityType;
+
+public class CourseActivityTypeHierarchicalComparator implements Comparator<CourseActivityType> {
+	public String getPath(ActivityType at) {
+		if (at.getSuperActivityType() != null) {
+			return getPath(at.getSuperActivityType()) + "." + at.getCode();
+		} else {
+			return at.getCode();
+		}
+	}
+
+	public int compare(CourseActivityType a1, CourseActivityType a2) {
+		return getPath(a1.getActivityType()).compareTo(getPath(a2.getActivityType()));
+	}
+}
Index: eprms-model/src/main/java/info/ajanovski/eprms/model/util/ModelConstants.java
===================================================================
--- eprms-model/src/main/java/info/ajanovski/eprms/model/util/ModelConstants.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-model/src/main/java/info/ajanovski/eprms/model/util/ModelConstants.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -33,11 +33,21 @@
 
 	public static final String ProjectStatusProposed = "PROPOSED";
+	public static final String ProjectStatusCreation = "CREATION";
 	public static final String ProjectStatusStarted = "STARTED";
 	public static final String ProjectStatusActive = "ACTIVE";
 	public static final String ProjectStatusPaused = "PAUSED";
+	public static final String ProjectStatusStopped = "STOPPED";
 	public static final String ProjectStatusFinished = "FINISHED";
-	public static final String ProjectStatusStopped = "STOPPED";
-	
+	public static final String ProjectStatusFailed = "FAILED";
+
+	public static final String[] AllProjectStatuses = { ProjectStatusProposed, ProjectStatusCreation,
+			ProjectStatusStarted, ProjectStatusActive, ProjectStatusPaused, ProjectStatusStopped, ProjectStatusFinished,
+			ProjectStatusFailed };
+
 	public static final String EvaluationStatusCreated = "CREATED";
 	public static final String EvaluationStatusPublished = "PUBLISHED";
+
+	public static final String[] AllEvaluationStatuses = { EvaluationStatusCreated, EvaluationStatusPublished };
+
+	public static final String CourseUnknown = "CourseNA";
 }
Index: eprms-tap/pom.xml
===================================================================
--- eprms-tap/pom.xml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/pom.xml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -14,5 +14,5 @@
 	<groupId>info.ajanovski.eprms</groupId>
 	<artifactId>eprms-tap</artifactId>
-	<version>0.0.4-T5.7.3</version>
+	<version>0.0.6-SNAPSHOT</version>
 	<name>EPRMS - Educational Project and Resource Management System</name>
 
@@ -71,5 +71,5 @@
 			<groupId>info.ajanovski.eprms</groupId>
 			<artifactId>model</artifactId>
-			<version>0.0.4-SNAPSHOT</version>
+			<version>0.0.5-SNAPSHOT</version>
 		</dependency>
 
@@ -125,4 +125,10 @@
 			<scope>compile</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.tapestry</groupId>
+			<artifactId>tapestry-beanvalidator</artifactId>
+			<version>${tapestry-version}</version>
+		</dependency>
+
 		<!-- CoffeeScript & Less support, plus resource minification -->
 		<dependency>
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/components/Layout.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/components/Layout.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/components/Layout.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -87,7 +87,8 @@
 	public String[] getAdminPageNames() {
 		if (userInfo.isAdministrator()) {
-			return new String[] { "admin/ProjectAutomation", "admin/OverallCourseReport", "admin/ManageActivityTypes",
-					"admin/ManageProjects", "admin/ManageTeams", "admin/ManageDatabases", "admin/ManageRepositories",
-					"admin/ManagePersons" };
+			return new String[] { "admin/ManageCourses", "admin/ManageProjects", "admin/ProjectAutomation",
+					"admin/OverallCourseReport", "admin/ManageActivityTypes", "admin/ManageTeams",
+					"admin/ManageDatabases", "admin/ManageRepositories", "admin/ManagePersons", "admin/Translations",
+					"admin/SystemParameters" };
 		} else {
 			return null;
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/components/SVGIcon.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/components/SVGIcon.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/components/SVGIcon.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -48,8 +48,4 @@
 	private AssetSource assetSource;
 
-	public String getImageURL() {
-		return assetSource.getClasspathAsset("org/freedesktop/tango/" + path).toClientURL();
-	}
-
 	public void setupRender() {
 		if (title == null) {
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/data/GenericDaoImpl.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/data/GenericDaoImpl.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/data/GenericDaoImpl.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -100,5 +100,5 @@
 	@Override
 	public Object getByCode(Class<?> classToLoad, String code) {
-		List<?> l = getEntityManager().createQuery("from " + classToLoad.getName() + "where code=:code")
+		List<?> l = getEntityManager().createQuery("from " + classToLoad.getName() + " where code=:code")
 				.setParameter("code", code).getResultList();
 		if (l.size() > 0) {
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ManageCourses.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ManageCourses.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ManageCourses.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,60 @@
+package info.ajanovski.eprms.tap.pages.admin;
+
+import java.util.List;
+
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.SessionState;
+import org.apache.tapestry5.hibernate.annotations.CommitAfter;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.slf4j.Logger;
+
+import info.ajanovski.eprms.model.entities.Course;
+import info.ajanovski.eprms.tap.annotations.AdministratorPage;
+import info.ajanovski.eprms.tap.services.GenericService;
+import info.ajanovski.eprms.tap.util.UserInfo;
+
+@AdministratorPage
+public class ManageCourses {
+	@SessionState
+	@Property
+	private UserInfo userInfo;
+
+	@Inject
+	private Logger logger;
+
+	@Inject
+	private GenericService genericService;
+
+	@Property
+	private Course course;
+
+	@Persist
+	@Property
+	private Course editCourse;
+
+	public List<Course> getAllCourses() {
+		return (List<Course>) genericService.getAll(Course.class);
+	}
+
+	void onActionFromEditCourse(Course c) {
+		editCourse = c;
+	}
+
+	@CommitAfter
+	void onActionFromDeleteCourse(Course c) {
+		genericService.delete(c);
+	}
+
+	public boolean isAllowDeleteCourse() {
+		return (course.getCourseActivityTypes() == null || course.getCourseActivityTypes().size() == 0)
+				&& (course.getCourseProjects() == null || course.getCourseProjects().size() == 0);
+	}
+
+	@CommitAfter
+	void onSuccessFromFrmEditCourse() {
+		genericService.saveOrUpdate(editCourse);
+		editCourse = null;
+	}
+
+}
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ManageProjects.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ManageProjects.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ManageProjects.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -21,4 +21,6 @@
 package info.ajanovski.eprms.tap.pages.admin;
 
+import java.math.BigInteger;
+import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.List;
@@ -35,4 +37,5 @@
 import org.apache.tapestry5.services.PersistentLocale;
 import org.apache.tapestry5.services.SelectModelFactory;
+import org.slf4j.Logger;
 
 import info.ajanovski.eprms.model.entities.Activity;
@@ -45,4 +48,5 @@
 import info.ajanovski.eprms.model.entities.Team;
 import info.ajanovski.eprms.model.entities.TeamMember;
+import info.ajanovski.eprms.model.util.ModelConstants;
 import info.ajanovski.eprms.mq.MessagingService;
 import info.ajanovski.eprms.tap.annotations.AdministratorPage;
@@ -50,6 +54,8 @@
 import info.ajanovski.eprms.tap.services.GenericService;
 import info.ajanovski.eprms.tap.services.ProjectManager;
+import info.ajanovski.eprms.tap.services.SystemConfigService;
 import info.ajanovski.eprms.tap.services.TranslationService;
 import info.ajanovski.eprms.tap.util.AppConfig;
+import info.ajanovski.eprms.tap.util.AppConstants;
 import info.ajanovski.eprms.tap.util.UserInfo;
 
@@ -62,7 +68,13 @@
 
 	@Inject
+	private Logger logger;
+
+	@Inject
 	private ProjectManager projectManager;
 
 	@Inject
+	private SystemConfigService systemConfigService;
+
+	@Inject
 	private MessagingService messagingService;
 
@@ -107,4 +119,8 @@
 	@Persist
 	@Property
+	private Course newCourse;
+
+	@Persist
+	@Property
 	private Project newProject;
 
@@ -133,9 +149,21 @@
 	private Project copyActivitiesFromProject;
 
+	@Persist
+	@Property
+	private Course selectedCourse;
+
 	void onActivate() {
 	}
 
 	public List<Project> getAllProjects() {
-		return (List<Project>) projectManager.getAllProjectsOrderByTitle();
+		List<Project> list = (List<Project>) projectManager.getAllProjectsOrderByTitle();
+		if (selectedCourse == null) {
+			return list;
+		} else {
+			return list.stream()
+					.filter(p -> (p.getCourseProjects().stream()
+							.anyMatch(cp -> cp.getCourse().getCourseId() == selectedCourse.getCourseId())))
+					.collect(Collectors.toList());
+		}
 	}
 
@@ -160,4 +188,8 @@
 	}
 
+	public void onActionFromNewCourse() {
+		newCourse = new Course();
+	}
+
 	public void onActionFromEditProject(Project p) {
 		newProject = p;
@@ -176,4 +208,24 @@
 		newDb = new Database();
 		newDb.setProject(p);
+		String dbPrefix = systemConfigService.getString(AppConstants.SystemParameterDBCreationPrefix);
+		String tunnelPrefix = systemConfigService.getString(AppConstants.SystemParameterDBTunnelPrefix);
+		String ownerSuffix = systemConfigService.getString(AppConstants.SystemParameterDBCreationOwnerSuffix);
+		String prjcode = p.getCode().toLowerCase();
+		newDb.setType(systemConfigService.getString(AppConstants.SystemParameterDBServerType));
+		newDb.setServer(systemConfigService.getString(AppConstants.SystemParameterDBServerName));
+		newDb.setPort(systemConfigService.getString(AppConstants.SystemParameterDBServerPort));
+		newDb.setName(dbPrefix + prjcode);
+		newDb.setOwner(dbPrefix + prjcode + ownerSuffix);
+		newDb.setPassword(generateRandomHexToken(6));
+		newDb.setTunnelServer(systemConfigService.getString(AppConstants.SystemParameterDBTunnelServerName));
+		newDb.setTunnelUser(tunnelPrefix + prjcode);
+		newDb.setTunnelPassword(generateRandomHexToken(4));
+	}
+
+	public static String generateRandomHexToken(int byteLength) {
+		SecureRandom secureRandom = new SecureRandom();
+		byte[] token = new byte[byteLength];
+		secureRandom.nextBytes(token);
+		return new BigInteger(1, token).toString(16);
 	}
 
@@ -216,4 +268,12 @@
 
 	@CommitAfter
+	public void onSuccessFromNewCourseForm() {
+		genericService.saveOrUpdate(newCourse);
+		selectedCourse = newCourse;
+		selectedProject = null;
+		newCourse = null;
+	}
+
+	@CommitAfter
 	public void onSuccessFromNewProjectForm() {
 		genericService.saveOrUpdate(newProject);
@@ -234,6 +294,10 @@
 	public void onSuccessFromNewDatabaseForm() {
 		genericService.save(newDb);
-		messagingService.setupMQHost(AppConfig.getString("MQHost"));
-		messagingService.sendDatabaseNotification(newDb);
+		try {
+			messagingService.setupMQHost(AppConfig.getString("MQHost"));
+			messagingService.sendDatabaseNotification(newDb);
+		} catch (Exception e) {
+			logger.error("DB creation message not sent");
+		}
 		newDb = null;
 	}
@@ -242,6 +306,10 @@
 	public void onSuccessFromNewRepositoryForm() {
 		genericService.save(newRp);
-		messagingService.setupMQHost(AppConfig.getString("MQHost"));
-		messagingService.sendRepositoryNotification(newRp);
+		try {
+			messagingService.setupMQHost(AppConfig.getString("MQHost"));
+			messagingService.sendRepositoryNotification(newRp);
+		} catch (Exception e) {
+			logger.error("REPO creation message not sent");
+		}
 		newRp = null;
 	}
@@ -313,3 +381,12 @@
 		newTeam = t;
 	}
+
+	@CommitAfter
+	void onActionFromChangeStatus(Project p) {
+		projectManager.cycleStatus(p);
+	}
+
+	public String[] getModelProjectStatuses() {
+		return ModelConstants.AllProjectStatuses;
+	}
 }
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/OverallCourseReport.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/OverallCourseReport.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/OverallCourseReport.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -26,4 +26,5 @@
 import info.ajanovski.eprms.model.entities.WorkEvaluation;
 import info.ajanovski.eprms.model.entities.WorkReport;
+import info.ajanovski.eprms.model.util.CourseActivityTypeHierarchicalComparator;
 import info.ajanovski.eprms.model.util.ModelConstants;
 import info.ajanovski.eprms.mq.MessagingService;
@@ -67,8 +68,10 @@
 		if (selectedCourse == null) {
 			return ((List<Project>) projectManager.getAllProjectsOrderByTitle()).stream()
-					.filter(c -> c.getStatus() != null && c.getStatus().equals("Active")).collect(Collectors.toList());
+					.filter(c -> c.getStatus() != null && c.getStatus().equals(ModelConstants.ProjectStatusActive))
+					.collect(Collectors.toList());
 		} else {
 			return ((List<Project>) projectManager.getCourseProjectsOrderByTitle(selectedCourse)).stream()
-					.filter(c -> c.getStatus() != null && c.getStatus().equals("Active")).collect(Collectors.toList());
+					.filter(c -> c.getStatus() != null && c.getStatus().equals(ModelConstants.ProjectStatusActive))
+					.collect(Collectors.toList());
 		}
 	}
@@ -81,4 +84,13 @@
 				.getActivityTypeId() == courseActivityType.getActivityType().getActivityTypeId()).findFirst()
 				.orElse(null);
+	}
+
+	public List<CourseActivityType> getSelectedCourseCourseActivityTypes() {
+		List<CourseActivityType> list = selectedCourse.getCourseActivityTypes();
+
+		CourseActivityTypeHierarchicalComparator comparator = new CourseActivityTypeHierarchicalComparator();
+		list.sort(comparator);
+
+		return list;
 	}
 
@@ -121,4 +133,5 @@
 		newWorkEvaluation.setEvaluationDate(new Date());
 		newWorkEvaluation.setPerson(genericService.getByPK(Person.class, userInfo.getPersonId()));
+		newWorkEvaluation.setStatus(ModelConstants.EvaluationStatusCreated);
 		newWorkEvaluation.setWorkReport(wr);
 		if (request.isXHR()) {
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ProjectAutomation.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ProjectAutomation.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/ProjectAutomation.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -9,7 +9,9 @@
 import org.apache.tapestry5.ioc.annotations.Inject;
 
+import info.ajanovski.eprms.model.entities.CourseProject;
 import info.ajanovski.eprms.model.entities.Project;
 import info.ajanovski.eprms.model.entities.Responsibility;
 import info.ajanovski.eprms.model.entities.TeamMember;
+import info.ajanovski.eprms.model.util.ModelConstants;
 import info.ajanovski.eprms.tap.annotations.AdministratorPage;
 import info.ajanovski.eprms.tap.annotations.InstructorPage;
@@ -38,5 +40,6 @@
 	public List<Project> getProjects() {
 		return ((List<Project>) genericService.getAll(Project.class)).stream()
-				.filter(p -> p.getStatus() != null && p.getStatus().equals("Creation")).collect(Collectors.toList());
+				.filter(p -> p.getStatus() != null && p.getStatus().equals(ModelConstants.ProjectStatusCreation))
+				.collect(Collectors.toList());
 	}
 
@@ -44,5 +47,14 @@
 	public void onActionFromActivateAllListed() {
 		for (Project p : getProjects()) {
-			p.setStatus("Active");
+			p.setStatus(ModelConstants.ProjectStatusActive);
+		}
+	}
+
+	public String getCourseCode() {
+		List<CourseProject> list = responsibility.getProject().getCourseProjects();
+		if (list != null && list.size() > 0) {
+			return (list.get(0).getCourse().getCode());
+		} else {
+			return ModelConstants.CourseUnknown;
 		}
 	}
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/SystemParameters.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/SystemParameters.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/SystemParameters.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the EPRMS - Educational Project and Resource 
+ * Management System (hereinafter: EPRMS).
+ *     
+ * EPRMS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *     
+ * EPRMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *     
+ * You should have received a copy of the GNU General Public License
+ * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
+ ******************************************************************************/
+
+package info.ajanovski.eprms.tap.pages.admin;
+
+import java.util.List;
+
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.SessionState;
+import org.apache.tapestry5.hibernate.annotations.CommitAfter;
+import org.apache.tapestry5.ioc.annotations.Inject;
+
+import info.ajanovski.eprms.model.entities.SystemParameter;
+import info.ajanovski.eprms.tap.annotations.AdministratorPage;
+import info.ajanovski.eprms.tap.annotations.InstructorPage;
+import info.ajanovski.eprms.tap.services.GenericService;
+import info.ajanovski.eprms.tap.util.UserInfo;
+
+@InstructorPage
+@AdministratorPage
+public class SystemParameters {
+	@SessionState
+	@Property
+	private UserInfo userInfo;
+
+	@Inject
+	private GenericService genericService;
+
+	@Property
+	private SystemParameter systemParameter;
+
+	@Persist
+	@Property
+	private SystemParameter editSystemParameter;
+
+	public List<SystemParameter> getSystemParameters() {
+		return (List<SystemParameter>) genericService.getAll(SystemParameter.class);
+	}
+
+	void onActionFromNewSystemParameter() {
+		editSystemParameter = new SystemParameter();
+	}
+
+	void onActionFromEditParameter(SystemParameter sp) {
+		editSystemParameter = sp;
+	}
+
+	@CommitAfter
+	void onActionFromDeleteParameter(SystemParameter sp) {
+		genericService.delete(sp);
+	}
+
+	@CommitAfter
+	void onSuccessFromEditSystemParameter() {
+		genericService.saveOrUpdate(editSystemParameter);
+		editSystemParameter = null;
+	}
+}
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/Translations.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/Translations.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/pages/admin/Translations.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the EPRMS - Educational Project and Resource 
+ * Management System (hereinafter: EPRMS).
+ *     
+ * EPRMS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *     
+ * EPRMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *     
+ * You should have received a copy of the GNU General Public License
+ * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
+ ******************************************************************************/
+
+package info.ajanovski.eprms.tap.pages.admin;
+
+import java.util.List;
+
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.SessionState;
+import org.apache.tapestry5.ioc.annotations.Inject;
+
+import info.ajanovski.eprms.model.entities.Translation;
+import info.ajanovski.eprms.tap.annotations.AdministratorPage;
+import info.ajanovski.eprms.tap.annotations.InstructorPage;
+import info.ajanovski.eprms.tap.services.GenericService;
+import info.ajanovski.eprms.tap.util.UserInfo;
+
+@InstructorPage
+@AdministratorPage
+public class Translations {
+	@SessionState
+	@Property
+	private UserInfo userInfo;
+
+	@Inject
+	private GenericService genericService;
+
+	public List<Translation> getTranslations() {
+		return (List<Translation>) genericService.getAll(Translation.class);
+	}
+}
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/AppModule.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/AppModule.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/AppModule.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -27,4 +27,6 @@
 
 import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.beanvalidator.BeanValidatorConfigurer;
+import org.apache.tapestry5.beanvalidator.BeanValidatorSource;
 import org.apache.tapestry5.commons.Configuration;
 import org.apache.tapestry5.commons.MappedConfiguration;
@@ -77,4 +79,5 @@
 		binder.bind(MessagingService.class);
 		binder.bind(TranslationService.class);
+		binder.bind(SystemConfigService.class);
 	}
 
@@ -209,4 +212,13 @@
 	}
 
+	@Contribute(BeanValidatorSource.class)
+	public static void provideBeanValidatorConfigurer(OrderedConfiguration<BeanValidatorConfigurer> configuration) {
+		configuration.add("noXMLBeanValidatorConfigurer", new BeanValidatorConfigurer() {
+			public void configure(javax.validation.Configuration<?> configuration) {
+				configuration.ignoreXmlConfiguration();
+			}
+		});
+	}
+
 	public Logger buildLogger(final Logger logger) {
 		return logger;
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/ProjectManager.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/ProjectManager.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/ProjectManager.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -40,4 +40,6 @@
 
 	public List<Project> getProjectByPerson(Long personId);
+	
+	public void cycleStatus(Project p);
 
 }
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/ProjectManagerImpl.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/ProjectManagerImpl.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/ProjectManagerImpl.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -21,4 +21,5 @@
 package info.ajanovski.eprms.tap.services;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -29,4 +30,5 @@
 import info.ajanovski.eprms.model.entities.CourseProject;
 import info.ajanovski.eprms.model.entities.Project;
+import info.ajanovski.eprms.model.util.ModelConstants;
 import info.ajanovski.eprms.tap.data.ProjectDao;
 
@@ -84,3 +86,21 @@
 	}
 
+	@Override
+	public void cycleStatus(Project p) {
+		if (p.getStatus() != null) {
+			String s = p.getStatus();
+			int index = Arrays.asList(ModelConstants.AllProjectStatuses).indexOf(s);
+			if (index < 0) {
+				index = 0;
+			} else if (index > ModelConstants.AllProjectStatuses.length) {
+				index = 0;
+			} else {
+				index++;
+			}
+			p.setStatus(Arrays.asList(ModelConstants.AllProjectStatuses).get(index));
+		} else {
+			p.setStatus(ModelConstants.AllProjectStatuses[0]);
+		}
+	}
+
 }
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/SystemConfigService.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/SystemConfigService.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/SystemConfigService.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,5 @@
+package info.ajanovski.eprms.tap.services;
+
+public interface SystemConfigService {
+	public String getString(String key);
+}
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/SystemConfigServiceImpl.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/SystemConfigServiceImpl.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/services/SystemConfigServiceImpl.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,21 @@
+package info.ajanovski.eprms.tap.services;
+
+import org.apache.tapestry5.ioc.annotations.Inject;
+
+import info.ajanovski.eprms.model.entities.SystemParameter;
+
+public class SystemConfigServiceImpl implements SystemConfigService {
+
+	@Inject
+	private GenericService genericService;
+
+	@Override
+	public String getString(String key) {
+		SystemParameter sp = genericService.getByCode(SystemParameter.class, key);
+		if (sp != null) {
+			return sp.getValue();
+		} else {
+			return null;
+		}
+	}
+}
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/util/AppConfig.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/util/AppConfig.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/util/AppConfig.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -1,22 +1,2 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the EPRMS - Educational Project and Resource 
- * Management System (hereinafter: EPRMS).
- *     
- * EPRMS is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *     
- * EPRMS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *     
- * You should have received a copy of the GNU General Public License
- * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
- ******************************************************************************/
-
 package info.ajanovski.eprms.tap.util;
 
@@ -25,6 +5,9 @@
 import java.util.ResourceBundle;
 
-import org.apache.tapestry5.ioc.annotations.Inject;
+import javax.inject.Inject;
+
 import org.slf4j.Logger;
+
+import info.ajanovski.eprms.model.entities.SystemParameter;
 
 public class AppConfig {
@@ -35,7 +18,4 @@
 
 	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private AppConfig() {
-	}
 
 	public static String getString(String key) {
@@ -61,3 +41,4 @@
 		return Integer.parseInt(getString(key));
 	}
+
 }
Index: eprms-tap/src/main/java/info/ajanovski/eprms/tap/util/AppConstants.java
===================================================================
--- eprms-tap/src/main/java/info/ajanovski/eprms/tap/util/AppConstants.java	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/java/info/ajanovski/eprms/tap/util/AppConstants.java	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -28,3 +28,14 @@
 	public final static String PageIndex = "Index";
 
+	public static final String SystemParameterDBServerType = "DBServerType";
+	public static final String SystemParameterDBServerName = "DBServerName";
+	public static final String SystemParameterDBServerPort = "DBServerPort";
+	public final static String SystemParameterDBCreationPrefix = "DBCreationPrefix";
+	public final static String SystemParameterDBCreationOwnerSuffix = "DBCreationOwnerSuffix";
+	public static final String SystemParameterDBTunnelServerName = "DBTunnelServer";
+	public final static String SystemParameterDBTunnelPrefix = "DBTunnelPrefix";
+	public final static String[] AllSystemParameters = { SystemParameterDBServerType, SystemParameterDBServerName,
+			SystemParameterDBServerPort, SystemParameterDBCreationPrefix, SystemParameterDBCreationOwnerSuffix,
+			SystemParameterDBTunnelPrefix };
+
 }
Index: eprms-tap/src/main/resources/META-INF/assets/site-overrides.css
===================================================================
--- eprms-tap/src/main/resources/META-INF/assets/site-overrides.css	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/META-INF/assets/site-overrides.css	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -12,4 +12,5 @@
 	--color-exception: #404040;
 }
+
 
 body,
@@ -83,2 +84,21 @@
 	background-color: #050D58 !important;
 }
+
+.help-block {
+	background-color: #fff8f0;
+	padding: 0.1em 0.25em;
+	color: red;
+}
+
+.glyphicon-calendar {
+	background-color: var(--light);
+	color: var(--dark);
+}
+
+.glyphicon-calendar::before {
+  content: "📅";
+}
+
+.datefield-popup {
+	position:relative !important;
+}
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ManageCourses.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ManageCourses.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ManageCourses.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,28 @@
+<html t:type="layout" title="message:admin/ManageCourses-pagelink"
+	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+	xmlns:p="tapestry:parameter">
+
+<h1>${message:admin/ManageCourses-pagelink}</h1>
+
+<div t:type="if" t:test="editCourse" class="card">
+	<div class="card-body">
+		<form t:type="beaneditform" t:id="frmEditCourse" t:object="editCourse"
+			t:exclude="courseId"></form>
+	</div>
+</div>
+
+<table class="table table-sm" t:type="grid" t:source="allCourses"
+	t:row="course" t:exclude="courseId" t:add="edit">
+	<p:editCell>
+		<a href="" t:type="actionlink" t:id="editCourse" t:context="course"
+			class="btn btn-sm btn-primary"><svg t:type="svgicon"
+				t:path="edit" />${message:edit-label}</a>
+		<t:if t:test="allowDeleteCourse">
+			<a href="" t:type="actionlink" t:id="deleteCourse" t:context="course"
+				class="btn btn-sm btn-danger"><svg t:type="svgicon"
+					t:path="minus" />${message:remove-label}</a>
+		</t:if>
+	</p:editCell>
+</table>
+
+</html>
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ManageProjects.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ManageProjects.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ManageProjects.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -6,12 +6,13 @@
 
 <div class="row">
+
 	<div class="col-6">
-		<div class="card">
+		<div class="card mb-3">
 			<div class="card-body">
-				<form t:type="form" id="selectProject" class="form-inline">
+				<form t:type="form" id="selectCourse" class="form-inline">
 					<div class="form-group">
-						<label t:type="label" t:for="selectProject"></label><select
-							t:id="selectProject" t:type="select" t:model="projectModel"
-							t:value="selectedProject" t:zone="projectZone"
+						<label t:type="label" t:for="selectCourse"></label><select
+							t:id="selectCourse" t:type="select" t:model="coursesModel"
+							t:value="selectedCourse" t:zone="courseZone"
 							onchange="this.form.submit(); "></select>
 					</div>
@@ -23,184 +24,245 @@
 
 	<div class="col-6">
-		<div t:type="if" t:test="copyActivitiesFromProject"
-			class="p-3 mb-2 bg-info text-white float-right">
-			${message:copy-label} ${message:activities-label}:
-			${copyActivitiesFromProject.title} <a class="btn btn-info"
-				t:type="actionLink" t:id="resetClipboard"><img t:type="SVGIcon"
-				t:path="delete" /> ${message:reset-label}</a>
-		</div>
-
-		<div class="card mb-3" t:type="if" t:test="newProject">
+		<div class="card mb-3" t:type="if" t:test="newCourse">
 			<div class="card-body">
-				<h3>${message:Project-label}</h3>
-				<form t:id="NewProjectForm" t:type="beaneditform"
-					t:object="newProject" t:exclude="projectId" t:add="courses"
-					t:submitLabel="OK">
-					<p:courses>
+				<h3>${message:Course-label}</h3>
+				<form t:id="NewCourseForm" t:type="beaneditform"
+					t:object="newCourse" t:exclude="courseId" t:submitLabel="OK">
+				</form>
+			</div>
+		</div>
+		<div>
+			<a t:type="actionlink" t:id="NewCourse" class="btn btn-primary"><img
+				t:type="SVGIcon" t:path="plus-square" /> ${message:new-label}
+				${message:Course-label}</a>
+		</div>
+
+	</div>
+</div>
+
+<div t:type="zone" t:id="courseZone">
+
+	<div class="row">
+
+		<div class="col-6" t:type="unless" t:test="newProject">
+			<div class="card">
+				<div class="card-body">
+					<form t:type="form" id="selectProject" class="form-inline">
 						<div class="form-group">
-							<label t:type="label" t:for="inCourses"></label>
-							<div t:type="palette" t:id="inCourses" t:encoder="courseEncoder"
-								t:model="coursesModel" t:selected="inCourses" t:size="4"></div>
+							<label t:type="label" t:for="selectProject"></label><select
+								t:id="selectProject" t:type="select" t:model="projectModel"
+								t:value="selectedProject" t:zone="projectZone"
+								onchange="this.form.submit(); "></select>
 						</div>
-					</p:courses>
-					<p:description>
-						<div class="form-group">
-							<label t:type="label" t:for="description"></label>
-							<textarea t:id="description" t:type="textarea"
-								t:value="newProject.description" t:mixins="webeditor"
-								t:WebEditor.areaType="" />
+						<t:submit t:value="OK" />
+					</form>
+				</div>
+			</div>
+		</div>
+
+		<div class="col-6">
+
+			<div t:type="if" t:test="copyActivitiesFromProject"
+				class="p-3 mb-2 bg-info text-white float-right">
+				${message:copy-label} ${message:activities-label}:
+				${copyActivitiesFromProject.title} <a class="btn btn-info"
+					t:type="actionLink" t:id="resetClipboard"><img t:type="SVGIcon"
+					t:path="delete" /> ${message:reset-label}</a>
+			</div>
+
+			<div class="card mb-3" t:type="if" t:test="newProject">
+				<div class="card-header">
+					<h3>${message:Project-label}</h3>
+				</div>
+				<div class="card-body">
+					<form t:id="NewProjectForm" t:type="beaneditform"
+						t:object="newProject" t:exclude="projectId" t:add="courses"
+						t:submitLabel="OK" class="form-horizontal">
+						<p:description>
+							<div class="form-group">
+								<label t:type="label" t:for="description"></label>
+								<textarea t:id="description" t:type="textarea"
+									t:value="newProject.description" t:mixins="webeditor"
+									t:WebEditor.areaType="" />
+							</div>
+						</p:description>
+						<p:status>
+							<div class="form-group">
+								<label t:type="label" t:for="status"></label> <select
+									t:id="status" t:type="select" t:model="modelProjectStatuses"
+									t:value="newProject.status" />
+							</div>
+						</p:status>
+						<p:courses>
+							<div class="form-group col-12">
+								<label t:type="label" t:for="inCourses"></label>
+								<div t:type="palette" t:id="inCourses" t:encoder="courseEncoder"
+									t:model="coursesModel" t:selected="inCourses" t:size="4"></div>
+							</div>
+						</p:courses>
+
+					</form>
+				</div>
+			</div>
+
+			<div class="card mb-3" t:type="if" t:test="newTeam">
+				<div class="card-body">
+					<h3>${message:Team-label}</h3>
+					<form t:id="NewTeamForm" t:type="beaneditform" t:object="newTeam"
+						t:exclude="teamId"></form>
+				</div>
+			</div>
+
+			<div class="card mb-3" t:type="if" t:test="newTm">
+				<div class="card-body">
+					<h3>${message:TeamMember-label}</h3>
+					<form class="form-horizontal" t:id="teamMemberForm"
+						t:type="beaneditform" t:object="newTm" t:exclude="teamMemberId"
+						t:add="person" t:reorder="person, positionNumber, role"
+						t:submitLabel="OK">
+						<p:person>
+							<label t:type="label" t:for="selectPerson"></label>
+							<select t:id="selectPerson" t:type="select" t:source="persons"
+								t:value="newTm.person" t:model="personModel"></select>
+						</p:person>
+					</form>
+				</div>
+			</div>
+
+			<div class="card mb-3" t:type="if" t:test="newDb">
+				<div class="card-body">
+					<h3>${message:Database-label}</h3>
+					<form class="form-horizontal" t:id="newDatabaseForm"
+						t:type="beaneditform" t:object="newDb"
+						t:exclude="databaseId,dateCreated" t:submitLabel="OK"></form>
+				</div>
+			</div>
+
+			<div class="card mb-3" t:type="if" t:test="newRp">
+				<div class="card-body">
+					<h3>${message:Repository-label}</h3>
+					<form class="form-horizontal" t:id="newRepositoryForm"
+						t:type="beaneditform" t:object="newRp"
+						t:exclude="repositoryId,dateCreated" t:submitLabel="OK"></form>
+				</div>
+			</div>
+
+			<div>
+				<a t:type="actionlink" t:id="NewProject" class="btn btn-primary"><img
+					t:type="SVGIcon" t:path="plus-square" /> ${message:new-label}
+					${message:Project-label}</a>
+			</div>
+		</div>
+	</div>
+
+	<div t:type="zone" t:id="projectZone">
+
+		<div class="card mt-3" t:type="loop" t:source="projects"
+			t:value="project">
+
+			<div class="card-header">
+				<p class="float-right">
+					<a t:type="actionLink" t:context="project" t:id="editProject"
+						class="btn btn-sm btn-primary"> <img t:type="SVGIcon"
+						t:path="edit" /> ${message:Edit-label} ${message:Project-label}
+					</a> <a t:type="pagelink" t:page="admin/ManageActivities"
+						t:context="project" t:id="projectActivities"
+						class="btn btn-sm btn-info"> <img t:type="SVGIcon"
+						t:path="list" /> ${message:Edit-label}
+						${message:Activities-label}
+					</a> <a t:type="actionlink" t:page="admin/ManageActivities"
+						t:context="project" t:id="copyActivities"
+						class="btn btn-sm btn-info"> <img t:type="SVGIcon"
+						t:path="copy" /> ${message:Copy-label}
+						${message:Activities-label}
+					</a> <span t:type="if" t:test="copyActivitiesFromProject"> <a
+						t:type="actionlink" t:page="admin/ManageActivities"
+						t:context="project" t:id="pasteActivities"
+						class="btn btn-sm btn-info"> <img t:type="SVGIcon"
+							t:path="clipboard" /> ${message:Paste-label}
+							${message:Activities-label}
+					</a>
+					</span>
+				</p>
+
+				<h3>${project.title}
+					<small class="text-muted">Status: ${project.status} <a
+						t:type="actionlink" t:context="project" t:id="changeStatus"
+						class="btn btn-sm btn-efault"> <img t:type="SVGIcon"
+							t:path="repeat" /></a></small>
+				</h3>
+				<p t:type="if" t:test="projectCourses">
+					<span t:type="loop" t:source="projectCourses" t:value="course">${courseTitle}</span>
+				</p>
+			</div>
+
+			<div class="card-body">
+				<div class="row">
+					<div class="col-4">
+						<p class="" t:type="loop" t:source="project.repositories"
+							t:value="repository">
+							<b>${message:repository-label}</b><br />${repository.url}
+						</p>
+						<p>
+							<a t:type="actionlink" t:context="project" t:id="NewRepository"
+								class="btn btn-sm btn-secondary"> <img t:type="SVGIcon"
+								t:path="plus-square" /> ${message:repository-label}
+							</a>
+						</p>
+						<p class="" t:type="loop" t:source="project.databases"
+							t:value="database">
+							<b>${message:database-label}</b><br />${database.name}
+						</p>
+						<p>
+							<a t:type="actionlink" t:context="project" t:id="NewDatabase"
+								class="btn btn-sm btn-secondary"> <img t:type="SVGIcon"
+								t:path="plus-square" /> ${message:database-label}
+							</a>
+						</p>
+					</div>
+
+					<div class="col-8">
+						<div class="card mb-3 p-3" t:type="loop"
+							t:source="project.responsibilities" t:value="responsibility">
+							<t:TeamMembersGrid t:team="responsibility.team" />
+							<p>
+								<a t:type="actionlink" t:context="responsibility.team"
+									t:id="addTeamMember" role="button"
+									class="btn btn-sm btn-secondary "><img t:type="SVGIcon"
+									t:path="user-plus" /> ${message:add-label}
+									${message:TeamMember-label}</a> <a t:type="actionlink"
+									t:context="responsibility.team" t:id="editTeam" role="button"
+									class="btn btn-sm btn-primary "><img t:type="SVGIcon"
+									t:path="edit" /> ${message:edit-label} ${message:team-label}</a>
+								<t:unless t:test="responsibility.team.teamMembers">
+									<a t:type="actionlink" t:context="responsibility"
+										t:id="deleteResponsibility" role="button"
+										class="btn btn-danger btn-sm "><img t:type="SVGIcon"
+										t:path="user-minus" /> ${message:remove-label}
+										${message:team-label}</a>
+								</t:unless>
+							</p>
 						</div>
-					</p:description>
-				</form>
-			</div>
-		</div>
-
-		<div class="card mb-3" t:type="if" t:test="newTeam">
-			<div class="card-body">
-				<h3>${message:Team-label}</h3>
-				<form t:id="NewTeamForm" t:type="beaneditform" t:object="newTeam"
-					t:exclude="teamId"></form>
-			</div>
-		</div>
-
-		<div class="card mb-3" t:type="if" t:test="newTm">
-			<div class="card-body">
-				<h3>${message:TeamMember-label}</h3>
-				<form class="form-horizontal" t:id="teamMemberForm"
-					t:type="beaneditform" t:object="newTm" t:exclude="teamMemberId"
-					t:add="person" t:reorder="person, positionNumber, role"
-					t:submitLabel="OK">
-					<p:person>
-						<label t:type="label" t:for="selectPerson"></label>
-						<select t:id="selectPerson" t:type="select" t:source="persons"
-							t:value="newTm.person" t:model="personModel"></select>
-					</p:person>
-				</form>
-			</div>
-		</div>
-
-		<div class="card mb-3" t:type="if" t:test="newDb">
-			<div class="card-body">
-				<h3>${message:Database-label}</h3>
-				<form class="form-horizontal" t:id="newDatabaseForm"
-					t:type="beaneditform" t:object="newDb"
-					t:exclude="databaseId,dateCreated" t:submitLabel="OK"></form>
-			</div>
-		</div>
-
-		<div class="card mb-3" t:type="if" t:test="newRp">
-			<div class="card-body">
-				<h3>${message:Repository-label}</h3>
-				<form class="form-horizontal" t:id="newRepositoryForm"
-					t:type="beaneditform" t:object="newRp"
-					t:exclude="repositoryId,dateCreated" t:submitLabel="OK"></form>
-			</div>
-		</div>
-
-		<div>
-			<a t:type="actionlink" t:id="NewProject" class="btn btn-primary"><img
-				t:type="SVGIcon" t:path="plus-square" /> ${message:new-label}
-				${message:Project-label}</a>
-		</div>
-	</div>
+						<p>
+							<a t:type="actionlink" t:context="project" t:id="NewTeam"
+								class="btn btn-secondary"><img t:type="SVGIcon"
+								t:path="plus-square" /> ${message:Team-label}</a>
+						</p>
+						<div class="card mt-3 p-3" t:type="if" t:test="project.activities">
+							<h3 class="mt-3">${message:Activities-label}</h3>
+							<table class="table table-sm" t:type="grid"
+								t:source="project.activities"
+								t:exclude="description,dueDate,startDate"></table>
+						</div>
+					</div>
+
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+
 </div>
 
-<div t:type="zone" t:id="projectZone">
-	<div class="card mt-3" t:type="loop" t:source="projects"
-		t:value="project">
-		<div class="card-header">
-			<p class="float-right">
-				<a t:type="actionLink" t:context="project" t:id="editProject"
-					class="btn btn-sm btn-primary"> <img t:type="SVGIcon"
-					t:path="edit" /> ${message:Edit-label} ${message:Project-label}
-				</a> <a t:type="pagelink" t:page="admin/ManageActivities"
-					t:context="project" t:id="projectActivities"
-					class="btn btn-sm btn-info"> <img t:type="SVGIcon"
-					t:path="list" /> ${message:Edit-label} ${message:Activities-label}
-				</a> <a t:type="actionlink" t:page="admin/ManageActivities"
-					t:context="project" t:id="copyActivities"
-					class="btn btn-sm btn-info"> <img t:type="SVGIcon"
-					t:path="copy" /> ${message:Copy-label} ${message:Activities-label}
-				</a> <span t:type="if" t:test="copyActivitiesFromProject"> <a
-					t:type="actionlink" t:page="admin/ManageActivities"
-					t:context="project" t:id="pasteActivities"
-					class="btn btn-sm btn-info"> <img t:type="SVGIcon"
-						t:path="clipboard" /> ${message:Paste-label}
-						${message:Activities-label}
-				</a>
-				</span>
-			</p>
-
-			<h3>${project.title}
-				<small class="text-muted">Status: ${project.status}</small>
-			</h3>
-			<p t:type="if" t:test="projectCourses">
-				<span t:type="loop" t:source="projectCourses" t:value="course">${courseTitle}</span>
-			</p>
-		</div>
-
-		<div class="card-body">
-			<div class="row">
-				<div class="col-4">
-					<p class="" t:type="loop" t:source="project.repositories"
-						t:value="repository">
-						<b>${message:repository-label}</b><br />${repository.url}
-					</p>
-					<p>
-						<a t:type="actionlink" t:context="project" t:id="NewRepository"
-							class="btn btn-sm btn-secondary"> <img t:type="SVGIcon"
-							t:path="plus-square" /> ${message:repository-label}
-						</a>
-					</p>
-
-					<p class="" t:type="loop" t:source="project.databases"
-						t:value="database">
-						<b>${message:database-label}</b><br />${database.name}
-					</p>
-					<p>
-						<a t:type="actionlink" t:context="project" t:id="NewDatabase"
-							class="btn btn-sm btn-secondary"> <img t:type="SVGIcon"
-							t:path="plus-square" /> ${message:database-label}
-						</a>
-					</p>
-
-				</div>
-				<div class="col-8">
-					<div class="card mb-3 p-3" t:type="loop"
-						t:source="project.responsibilities" t:value="responsibility">
-						<t:TeamMembersGrid t:team="responsibility.team" />
-						<p>
-							<a t:type="actionlink" t:context="responsibility.team"
-								t:id="addTeamMember" role="button"
-								class="btn btn-sm btn-secondary "><img t:type="SVGIcon"
-								t:path="user-plus" /> ${message:add-label}
-								${message:TeamMember-label}</a> <a t:type="actionlink"
-								t:context="responsibility.team" t:id="editTeam" role="button"
-								class="btn btn-sm btn-primary "><img t:type="SVGIcon"
-								t:path="edit" /> ${message:edit-label}
-								${message:team-label}</a>
-							<t:unless t:test="responsibility.team.teamMembers">
-								<a t:type="actionlink" t:context="responsibility"
-									t:id="deleteResponsibility" role="button"
-									class="btn btn-danger btn-sm "><img t:type="SVGIcon"
-									t:path="user-minus" /> ${message:remove-label}
-									${message:team-label}</a>
-							</t:unless>
-						</p>
-					</div>
-					<a t:type="actionlink" t:context="project" t:id="NewTeam"
-						class="btn btn-secondary"><img t:type="SVGIcon"
-						t:path="plus-square" /> ${message:Team-label}</a>
-					<div class="card mt-3  p-3" t:type="if" t:test="project.activities">
-						<h3 class="mt-3">${message:Activities-label}</h3>
-						<table class="table table-sm" t:type="grid"
-							t:source="project.activities"></table>
-					</div>
-				</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-
 </html>
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/OverallCourseReport.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/OverallCourseReport.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/OverallCourseReport.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -53,5 +53,5 @@
 		</div>
 		<div class="col-2 p-1 bg-light" t:type="loop"
-			t:source="selectedCourse.courseActivityTypes"
+			t:source="selectedCourseCourseActivityTypes"
 			t:value="courseActivityType">
 			<small>${courseActivityType.activityType.title}</small>
@@ -62,9 +62,10 @@
 		<div class="col-2 p-1 bg-dark text-light">
 			<p>${project.title}</p>
-			<p>${projectTotal}</p>
+			<p>Total: ${projectTotal}</p>
 		</div>
 		<div class="col-2 p-1 bg-light" t:type="loop"
-			t:source="selectedCourse.courseActivityTypes"
+			t:source="selectedCourseCourseActivityTypes"
 			t:value="courseActivityType">
+
 			<div class="card p-1 font-small" t:type="loop"
 				t:source="activity?.workReports" t:value="workReport">
@@ -87,4 +88,5 @@
 					t:path="check-square" /></a>
 			</div>
+
 			<p>
 				<a href="" t:type="actionlink" t:id="addWorkReport"
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ProjectAutomation.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ProjectAutomation.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/ProjectAutomation.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -6,10 +6,10 @@
 
 <ul>
-	<li t:type="loop" t:source="projects" t:value="project">
-		# ${project.title}
+	<li t:type="loop" t:source="projects" t:value="project">#
+		${project.title}
 		<ul t:type="if" t:test="project.responsibilities">
 			<li t:type="loop" t:source="project.responsibilities"
 				t:value="responsibility">../create_trac_repo_with_db.sh
-				${responsibility?.team.name} <span t:type="loop"
+				${responsibility?.team.name} ${courseCode} <span t:type="loop"
 				t:source="responsibility?.team?.teamMembers" t:value="member">&nbsp;${member.person.userName}</span>
 			</li>
@@ -18,5 +18,8 @@
 </ul>
 
-<p><a href="" t:type="actionlink" t:id="activateAllListed">Activate all listed</a></p>
+<p>
+	<a href="" t:type="actionlink" t:id="activateAllListed">Activate
+		all listed</a>
+</p>
 
 </html>
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/SystemParameters.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/SystemParameters.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/SystemParameters.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,30 @@
+<html t:type="layout" title="message:admin/SystemParameters-pagelink"
+	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+	xmlns:p="tapestry:parameter">
+
+<h1>${message:admin/SystemParameters-pagelink}</h1>
+
+<div t:type="if" t:test="editSystemParameter">
+	<form t:type="beaneditform" t:object="editSystemParameter"
+		t:id="editSystemParameter" t:exclude="systemParameterId" />
+</div>
+
+<p>
+	<a href="" t:type="actionlink" class="btn btn-sm btn-primary"
+		t:id="newSystemParameter"><t:svgicon
+				t:path="plus" />${message:new-label}</a>
+</p>
+
+<table class="table table-sm" t:type="grid" t:source="systemParameters"
+	t:row="systemParameter" t:exclude="systemParameterId" t:add="icons">
+	<p:iconsCell>
+		<a href="" t:type="actionlink" class="btn btn-sm btn-primary"
+			t:id="editParameter" t:context="systemParameter"><t:svgicon
+				t:path="edit" />${message:edit-label}</a>
+		<a href="" t:type="actionlink" class="btn btn-sm btn-danger"
+			t:id="deleteParameter" t:context="systemParameter"><t:svgicon
+				t:path="trash" />${message:remove-label}</a>
+	</p:iconsCell>
+</table>
+
+</html>
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/Translations.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/Translations.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/admin/Translations.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -0,0 +1,10 @@
+<html t:type="layout" title="message:admin/SystemParameters-pagelink"
+	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+	xmlns:p="tapestry:parameter">
+
+<h1>${message:admin/SystemParameters-pagelink}</h1>
+
+<table class="table table-sm" t:type="grid" t:source="translations"
+	t:exclude="translationId"></table>
+
+</html>
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyDatabases.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyDatabases.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyDatabases.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -1,3 +1,3 @@
-<html t:type="layout" title="Index | epm"
+<html t:type="layout" title="${message:user/MyDatabases-pagelink}"
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
 
@@ -11,40 +11,59 @@
 			<h3>Database: ${database.name}</h3>
 		</div>
-                <p>The professor recommends using the DBEAVER software (opensource and free), that he can support via a ready-m
-ade package (tested at the premises of the Faculty, available for Windows and Linux). You need to download the 7Z package, unpa
-ck it to a folder of your choice and start the script for starting DBEAVER, otherwise it will not work correctly. The package i
-ncludes an example connection configuration. The packages are available here: <a href="https://bazi.finki.ukim.mk/materijali/So
-ftware/">https://bazi.finki.ukim.mk/materijali/Software/</a></p>                                                               
-                <p>Note that the server will block your IP address immediately if you attempt a connection before setting up th
-e correct connection parameters. So, before attempting a connection make sure that you have setup SSH tunnel parameters (in the
- respective configuration section) and database connection parameters (in the respective configuration section) in DBEAVER acco
-rding to the information below. Detailed instructions are included as a PDF file in the package.</p>                           
+		<p>
+			The professor recommends using the DBEAVER software (opensource and
+			free), that he can support via a ready-made package (tested at the
+			premises of the Faculty, available for Windows and Linux). You need
+			to download the 7Z package, unpack it to a folder of choice and start
+			the script START_DBEAVER, otherwise it will not work correctly. The
+			packages are available here: <a
+				href="https://bazi.finki.ukim.mk/materijali/Software/">https://bazi.finki.ukim.mk/materijali/Software/</a>
+		</p>
+		<p>The package includes a sample connection configuration, that
+			will be visible if correctly starting via the START_DBEAVER script,
+			and you will have to edit the connection line before attempting a
+			connection.</p>
+		<p>
+			<span class="bg-danger text-light">Note: do not double click
+				the connection line before you have configured it, as the server
+				will block your IP address immediately! </span>
+		</p>
+		<p>So, before attempting a connection make sure that you have
+			correctly configured the SSH tunnel parameters, by right-clicking the
+			connection configuration line and choosing the Edit option and use
+			the parameters shown below. You need to carefully configure two sets
+			of parameters in the DBEAVER connection configuration: SSH tunnel
+			parameters and database connection parameters. The two sets are in
+			two separate tabs of the connection configuration window, and you
+			need two separate passwords (for the tunnel and for the database).</p>
+		<p>Detailed instructions are included as a PDF file in the
+			software package.</p>
 		<table class="table table-sm">
 			<tr class="table-primary">
-				<td>SSH tunnel server:</td>
+				<td>SSH - Settings - Host/IP (Tunneling server)</td>
 				<td>${database.tunnelServer}</td>
 			</tr>
 			<tr class="table-primary">
-				<td>SSH tunnel user:</td>
+				<td>SSH - Settings - User Name:</td>
 				<td>${database.tunnelUser}</td>
 			</tr>
 			<tr class="table-primary">
-				<td>SSH tunnel password:</td>
+				<td>SSH - Settings - Password:</td>
 				<td>${database.tunnelPassword}</td>
 			</tr>
 			<tr class="table-secondary">
-				<td>Database Server:</td>
+				<td>Main - Server - Host (Database server)</td>
 				<td>${database.server}</td>
 			</tr>
 			<tr class="table-secondary">
-				<td>Database Name:</td>
+				<td>Main - Server - Database (Database Name):</td>
 				<td>${database.name}</td>
 			</tr>
 			<tr class="table-secondary">
-				<td>Database User:</td>
+				<td>Main - Authentication - Username (Database User):</td>
 				<td>${database.owner}</td>
 			</tr>
 			<tr class="table-secondary">
-				<td>Database Password:</td>
+				<td>Main - Authentication - Password (Database User Password):</td>
 				<td>${database.password}</td>
 			</tr>
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyProjectReports.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyProjectReports.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyProjectReports.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -1,3 +1,3 @@
-<html t:type="layout" title="Index | epm"
+<html t:type="layout" title="${message:Report-label}"
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
 	xmlns:p="tapestry:parameter">
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyRepositories.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyRepositories.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyRepositories.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -1,3 +1,3 @@
-<html t:type="layout" title="Index | epm"
+<html t:type="layout" title="${message:user/MyRepositories-pagelink}"
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
 
Index: eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyRepositoryAuth.tml
===================================================================
--- eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyRepositoryAuth.tml	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/resources/info/ajanovski/eprms/tap/pages/user/MyRepositoryAuth.tml	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -1,3 +1,3 @@
-<html t:type="layout" title="Index | epm"
+<html t:type="layout" title="Repository Authentication"
 	xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
 
Index: eprms-tap/src/main/webapp/WEB-INF/app.properties
===================================================================
--- eprms-tap/src/main/webapp/WEB-INF/app.properties	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/webapp/WEB-INF/app.properties	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -7,12 +7,15 @@
 admin-label=Admin
 admin/ManageActivityTypes-pagelink=Manage Activity Types
-admin/ManageDatabases-pagelink=Manage Databases
-admin/ManagePersons-pagelink=Manage Persons
+admin/ManageCourses-pagelink=Courses
+admin/ManageDatabases-pagelink=Databases
+admin/ManagePersons-pagelink=Persons
 admin/ManageProjects-pagelink=Projects
-admin/ManageRepositories-pagelink=Manage Repositories
+admin/ManageRepositories-pagelink=Repositories
 admin/ManageTeams-pagelink=Teams
 admin/OverallCourseReport-pagelink=Overall Course Report
-admin/ProjectActivities-pagelink=Manage Project Activities
+admin/ProjectActivities-pagelink=Project Activities
 admin/ProjectAutomation-pagelink=Automatation of Projects
+admin/SystemParameters-pagelink=System Parameters
+admin/Translations-pagelink=Translation
 application-logout=Application Logout
 app-title-short=EPRMS
@@ -21,4 +24,5 @@
 copyrightHolder=Vangel V. Ajanovski
 copyrightYear=2021
+course-label=course
 database-label=Database
 description-label=Description
Index: eprms-tap/src/main/webapp/WEB-INF/app_mk.properties
===================================================================
--- eprms-tap/src/main/webapp/WEB-INF/app_mk.properties	(revision 7769f78aae132efd0c95cac4858305cf4f3bbde3)
+++ eprms-tap/src/main/webapp/WEB-INF/app_mk.properties	(revision 43db73ef9286392b1a1eb93b03cfc4b7bb38fc2a)
@@ -7,16 +7,20 @@
 admin-label=Админ
 admin/ManageActivityTypes-pagelink=Управување со типови активности
-admin/ManageDatabases-pagelink=Управување со бази на податоци
-admin/ManagePersons-pagelink=Управување со лица
-admin/ManageProjects-pagelink=Управување со проекти
-admin/ManageRepositories-pagelink=Управување со репозиториуми
-admin/ManageTeams-pagelink=Управување со тимови
+admin/ManageCourses-pagelink=Курсеви
+admin/ManageDatabases-pagelink=Бази на податоци
+admin/ManagePersons-pagelink=Лица
+admin/ManageProjects-pagelink=Проекти
+admin/ManageRepositories-pagelink=Репозиториуми
+admin/ManageTeams-pagelink=Тимови
 admin/OverallCourseReport-pagelink=Преглед на извештаи на курс
-admin/ProjectActivities-pagelink=Управување со проектни активности
+admin/ProjectActivities-pagelink=Проектни активности
 admin/ProjectAutomation-pagelink=Автоматизација на проекти
+admin/SystemParameters-pagelink=Системски параметри
+admin/Translations-pagelink=Преведување
 application-logout=Апликациска одјава
 app-title=ЕПРМС
 back-label=назад
 copy-label=Копирај
+course-label=курс
 copyrightHolder=Вангел В. Ајановски
 copyrightYear=2021
