diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/AbstractPhaseDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/AbstractPhaseDTO.java
index 22ac132489334a00036d5f4f9186d891106ac6bd..b43a9a01a12badc37d9d0c0cf60260521c3f40db 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/AbstractPhaseDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/AbstractPhaseDTO.java
@@ -1,12 +1,22 @@
 package cz.muni.ics.kypo.training.adaptive.dto;
 
 import cz.muni.ics.kypo.training.adaptive.enums.PhaseType;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Objects;
 
 public abstract class AbstractPhaseDTO {
 
+    @ApiModelProperty(value = "ID of task", required = true, example = "1")
     private Long id;
+
+    @ApiModelProperty(value = "Short description of phase", required = true, example = "Training Phase 1")
     private String title;
+
+    @ApiModelProperty(value = "Order of phase in a training definition", required = true, example = "1")
     private Integer order;
+
+    @ApiModelProperty(value = "Type of phase", required = true, allowableValues = "QUESTIONNAIRE,INFO,TRAINING", example = "TRAINING")
     private PhaseType phaseType;
 
     public Long getId() {
@@ -41,6 +51,22 @@ public abstract class AbstractPhaseDTO {
         this.phaseType = phaseType;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        AbstractPhaseDTO that = (AbstractPhaseDTO) o;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(title, that.title) &&
+                Objects.equals(order, that.order) &&
+                phaseType == that.phaseType;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, title, order, phaseType);
+    }
+
     @Override
     public String toString() {
         return "AbstractPhaseDto{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/PhaseCreateDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/PhaseCreateDTO.java
index be9eb771a319075f6c01ed07b5fa82a338b0b15d..f994fa3bd63d279a0120887362082827ea66dac4 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/PhaseCreateDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/PhaseCreateDTO.java
@@ -4,6 +4,7 @@ import cz.muni.ics.kypo.training.adaptive.enums.PhaseTypeCreate;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
+import java.util.Objects;
 
 public class PhaseCreateDTO {
 
@@ -19,6 +20,19 @@ public class PhaseCreateDTO {
         this.phaseType = phaseType;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PhaseCreateDTO that = (PhaseCreateDTO) o;
+        return phaseType == that.phaseType;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(phaseType);
+    }
+
     @Override
     public String toString() {
         return "PhaseCreateDTO{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseDTO.java
index 9acc05a382836d3b9cd174bef6c125ca98b7be82..021142627aa951077cd5c531e05e6aea957ab56e 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseDTO.java
@@ -1,9 +1,13 @@
 package cz.muni.ics.kypo.training.adaptive.dto.info;
 
 import cz.muni.ics.kypo.training.adaptive.dto.AbstractPhaseDTO;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Objects;
 
 public class InfoPhaseDTO extends AbstractPhaseDTO {
 
+    @ApiModelProperty(value = "Short description of info phase", required = true, example = "Info phase title")
     private String content;
 
     public String getContent() {
@@ -14,6 +18,18 @@ public class InfoPhaseDTO extends AbstractPhaseDTO {
         this.content = content;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        InfoPhaseDTO that = (InfoPhaseDTO) o;
+        return Objects.equals(content, that.content);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(content);
+    }
 
     @Override
     public String toString() {
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseUpdateDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseUpdateDTO.java
index 96f30a521fac8cb7c32b851e2ef638eb12b74dcf..3daeb4bdb65ef938c600ee5a71f362d10686854b 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseUpdateDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/info/InfoPhaseUpdateDTO.java
@@ -3,6 +3,7 @@ package cz.muni.ics.kypo.training.adaptive.dto.info;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotEmpty;
+import java.util.Objects;
 
 public class InfoPhaseUpdateDTO {
 
@@ -30,6 +31,20 @@ public class InfoPhaseUpdateDTO {
         this.content = content;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        InfoPhaseUpdateDTO that = (InfoPhaseUpdateDTO) o;
+        return Objects.equals(title, that.title) &&
+                Objects.equals(content, that.content);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(title, content);
+    }
+
     @Override
     public String toString() {
         return "InfoPhaseUpdateDto{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/AbstractQuestionDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/AbstractQuestionDTO.java
index 23aebe36b8fbd4658283aac8c5cb1b26fc362ecf..4e9fdbfb972e945b03312cd50c754b634cde4f4a 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/AbstractQuestionDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/AbstractQuestionDTO.java
@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.List;
+import java.util.Objects;
 
 public abstract class AbstractQuestionDTO {
 
@@ -55,4 +56,30 @@ public abstract class AbstractQuestionDTO {
     public void setChoices(List<QuestionChoiceDTO> choices) {
         this.choices = choices;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        AbstractQuestionDTO that = (AbstractQuestionDTO) o;
+        return order == that.order &&
+                Objects.equals(text, that.text) &&
+                questionType == that.questionType &&
+                Objects.equals(choices, that.choices);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(order, text, questionType, choices);
+    }
+
+    @Override
+    public String toString() {
+        return "AbstractQuestionDTO{" +
+                "order=" + order +
+                ", text='" + text + '\'' +
+                ", questionType=" + questionType +
+                ", choices=" + choices +
+                '}';
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionChoiceDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionChoiceDTO.java
index a9b2326b97b4a694932e138a3a0dfd247e44b8af..a6b5f5c8b2801c67ca34b167f804e086496da2aa 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionChoiceDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionChoiceDTO.java
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.util.Objects;
 
 public class QuestionChoiceDTO {
 
@@ -53,4 +54,30 @@ public class QuestionChoiceDTO {
     public void setOrder(Integer order) {
         this.order = order;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QuestionChoiceDTO that = (QuestionChoiceDTO) o;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(text, that.text) &&
+                Objects.equals(correct, that.correct) &&
+                Objects.equals(order, that.order);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, text, correct, order);
+    }
+
+    @Override
+    public String toString() {
+        return "QuestionChoiceDTO{" +
+                "id=" + id +
+                ", text='" + text + '\'' +
+                ", correct=" + correct +
+                ", order=" + order +
+                '}';
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionDTO.java
index 89827a0364daaed94fe0206fec5126be1e755aa3..4cec7eda79a28fe013f4a6a5ef73df5c5894f2ec 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionDTO.java
@@ -2,6 +2,8 @@ package cz.muni.ics.kypo.training.adaptive.dto.questionnaire;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Objects;
+
 public class QuestionDTO extends AbstractQuestionDTO {
 
     @ApiModelProperty(value = "Question ID. Leave blank if a new question is added", required = true, example = "1")
@@ -14,4 +16,25 @@ public class QuestionDTO extends AbstractQuestionDTO {
     public void setId(Long id) {
         this.id = id;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        if (!super.equals(o)) return false;
+        QuestionDTO that = (QuestionDTO) o;
+        return Objects.equals(id, that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), id);
+    }
+
+    @Override
+    public String toString() {
+        return "QuestionDTO{" +
+                "id=" + id +
+                "} " + super.toString();
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionPhaseRelationDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionPhaseRelationDTO.java
index a8f647c2984f9b94e397b8a7db0d5fc3335b9c1f..50b17db9fcfca9f8f146c87638b5b5cec981e1fc 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionPhaseRelationDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionPhaseRelationDTO.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import java.util.Objects;
 import java.util.Set;
 
 public class QuestionPhaseRelationDTO {
@@ -67,4 +68,32 @@ public class QuestionPhaseRelationDTO {
     public void setSuccessRate(int successRate) {
         this.successRate = successRate;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QuestionPhaseRelationDTO that = (QuestionPhaseRelationDTO) o;
+        return successRate == that.successRate &&
+                Objects.equals(id, that.id) &&
+                Objects.equals(order, that.order) &&
+                Objects.equals(questionIds, that.questionIds) &&
+                Objects.equals(phaseId, that.phaseId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, order, questionIds, phaseId, successRate);
+    }
+
+    @Override
+    public String toString() {
+        return "QuestionPhaseRelationDTO{" +
+                "id=" + id +
+                ", order=" + order +
+                ", questionIds=" + questionIds +
+                ", phaseId=" + phaseId +
+                ", successRate=" + successRate +
+                '}';
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionRequiredIdDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionRequiredIdDTO.java
deleted file mode 100644
index 2f156eeb13b6ac95870c04897bfb12e5a467bc53..0000000000000000000000000000000000000000
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionRequiredIdDTO.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cz.muni.ics.kypo.training.adaptive.dto.questionnaire;
-
-import io.swagger.annotations.ApiModelProperty;
-
-import javax.validation.constraints.NotNull;
-
-public class QuestionRequiredIdDTO extends AbstractQuestionDTO {
-
-    @ApiModelProperty(value = "Question ID. Leave blank if a new question is added", required = true, example = "1")
-    @NotNull(message = "Question ID must be specified")
-    private Long id;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionUpdateDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionUpdateDTO.java
deleted file mode 100644
index a535715bbe1045bbd126228209edd2c47180fe18..0000000000000000000000000000000000000000
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionUpdateDTO.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package cz.muni.ics.kypo.training.adaptive.dto.questionnaire;
-
-import cz.muni.ics.kypo.training.adaptive.enums.QuestionType;
-
-import java.util.List;
-
-public class QuestionUpdateDTO {
-
-    private Long id;
-    private QuestionType questionType;
-    private String text;
-    private Integer points;
-    private Integer penalty;
-    private boolean required;
-    private List<Long> relatedPhasesId;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public QuestionType getQuestionType() {
-        return questionType;
-    }
-
-    public void setQuestionType(QuestionType questionType) {
-        this.questionType = questionType;
-    }
-
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
-    public Integer getPoints() {
-        return points;
-    }
-
-    public void setPoints(Integer points) {
-        this.points = points;
-    }
-
-    public Integer getPenalty() {
-        return penalty;
-    }
-
-    public void setPenalty(Integer penalty) {
-        this.penalty = penalty;
-    }
-
-    public boolean isRequired() {
-        return required;
-    }
-
-    public void setRequired(boolean required) {
-        this.required = required;
-    }
-
-    public List<Long> getRelatedPhasesId() {
-        return relatedPhasesId;
-    }
-
-    public void setRelatedPhasesId(List<Long> relatedPhasesId) {
-        this.relatedPhasesId = relatedPhasesId;
-    }
-
-    @Override
-    public String toString() {
-        return "QuestionUpdateDto{" +
-                "id=" + id +
-                ", questionType=" + questionType +
-                ", text='" + text + '\'' +
-                ", points=" + points +
-                ", penalty=" + penalty +
-                ", required=" + required +
-                ", relatedPhasesId=" + relatedPhasesId +
-                '}';
-    }
-}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnairePhaseDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnairePhaseDTO.java
index 9d41ff5a9e4d8cc35aff2a6f24a3dbb656487b55..d2d8722e2075d7f1bf0e1d0166d37c74f6062ccc 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnairePhaseDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnairePhaseDTO.java
@@ -2,13 +2,20 @@ package cz.muni.ics.kypo.training.adaptive.dto.questionnaire;
 
 import cz.muni.ics.kypo.training.adaptive.dto.AbstractPhaseDTO;
 import cz.muni.ics.kypo.training.adaptive.enums.QuestionnaireType;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
+import java.util.Objects;
 
 public class QuestionnairePhaseDTO extends AbstractPhaseDTO {
 
+    @ApiModelProperty(value = "List of questions associated with the questionnaire phase")
     private List<QuestionDTO> questions;
+
+    @ApiModelProperty(value = "Type of questionnaire phase", allowableValues = "ADAPTIVE,GENERAL", example = "ADAPTIVE")
     private QuestionnaireType questionnaireType;
+
+    @ApiModelProperty(value = "List of relations between questions and a training phase")
     private List<QuestionPhaseRelationDTO> phaseRelations;
 
     public List<QuestionDTO> getQuestions() {
@@ -34,4 +41,28 @@ public class QuestionnairePhaseDTO extends AbstractPhaseDTO {
     public void setPhaseRelations(List<QuestionPhaseRelationDTO> phaseRelations) {
         this.phaseRelations = phaseRelations;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QuestionnairePhaseDTO that = (QuestionnairePhaseDTO) o;
+        return Objects.equals(questions, that.questions) &&
+                questionnaireType == that.questionnaireType &&
+                Objects.equals(phaseRelations, that.phaseRelations);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(questions, questionnaireType, phaseRelations);
+    }
+
+    @Override
+    public String toString() {
+        return "QuestionnairePhaseDTO{" +
+                "questions=" + questions +
+                ", questionnaireType=" + questionnaireType +
+                ", phaseRelations=" + phaseRelations +
+                "} " + super.toString();
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnaireUpdateDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnaireUpdateDTO.java
index 6d7c6c5509e9028117f8d2b100cd01070df12d60..4d1b34fa286897f06a1595922231b59b3f43d663 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnaireUpdateDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/questionnaire/QuestionnaireUpdateDTO.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
 import java.util.List;
+import java.util.Objects;
 
 public class QuestionnaireUpdateDTO {
 
@@ -44,6 +45,21 @@ public class QuestionnaireUpdateDTO {
         this.phaseRelations = phaseRelations;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QuestionnaireUpdateDTO that = (QuestionnaireUpdateDTO) o;
+        return Objects.equals(title, that.title) &&
+                Objects.equals(questions, that.questions) &&
+                Objects.equals(phaseRelations, that.phaseRelations);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(title, questions, phaseRelations);
+    }
+
     @Override
     public String toString() {
         return "QuestionnaireUpdateDto{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/DecisionMatrixRowDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/DecisionMatrixRowDTO.java
index ad3e6999350ac014a0f391906cf176e7409aeed5..73bff497613b0616331c3460a8989e55ab9eac29 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/DecisionMatrixRowDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/DecisionMatrixRowDTO.java
@@ -1,12 +1,30 @@
 package cz.muni.ics.kypo.training.adaptive.dto.training;
 
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Objects;
+
 public class DecisionMatrixRowDTO {
+
+    @ApiModelProperty(value = "ID of decision matrix row", required = true, example = "1")
     private long id;
+
+    @ApiModelProperty(value = "Order of row in a decision matrix", required = true, example = "1")
     private int order;
+
+    @ApiModelProperty(value = "It determines how important the answers of the questions in questionnaires are", required = true, example = "0.5")
     private double assessmentAnswered;
+
+    @ApiModelProperty(value = "It determines how important it is whether the player used the keyword", required = true, example = "0.5")
     private double keywordUsed;
+
+    @ApiModelProperty(value = "It determines how important it is whether the player completed the task in time", required = true, example = "0.5")
     private double completedInTime;
+
+    @ApiModelProperty(value = "It determines how important it is whether the player displayed the solution of the task they were solving", required = true, example = "0.5")
     private double solutionDisplayed;
+
+    @ApiModelProperty(value = "It determines how important the number of wrong answers are", required = true, example = "0.5")
     private double wrongAnswers;
 
     public long getId() {
@@ -65,6 +83,25 @@ public class DecisionMatrixRowDTO {
         this.wrongAnswers = wrongAnswers;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        DecisionMatrixRowDTO that = (DecisionMatrixRowDTO) o;
+        return id == that.id &&
+                order == that.order &&
+                Double.compare(that.assessmentAnswered, assessmentAnswered) == 0 &&
+                Double.compare(that.keywordUsed, keywordUsed) == 0 &&
+                Double.compare(that.completedInTime, completedInTime) == 0 &&
+                Double.compare(that.solutionDisplayed, solutionDisplayed) == 0 &&
+                Double.compare(that.wrongAnswers, wrongAnswers) == 0;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, order, assessmentAnswered, keywordUsed, completedInTime, solutionDisplayed, wrongAnswers);
+    }
+
     @Override
     public String toString() {
         return "DecisionMatrixRow{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskCopyDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskCopyDTO.java
index c4704b9f0d6d73434535c54151997d0edfb90251..a27dd18ea55fa5b65bcaba171b826a23a930ea8b 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskCopyDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskCopyDTO.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.PositiveOrZero;
+import java.util.Objects;
 
 public class TaskCopyDTO {
 
@@ -92,6 +93,25 @@ public class TaskCopyDTO {
         this.sandboxChangeExpectedDuration = sandboxChangeExpectedDuration;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TaskCopyDTO that = (TaskCopyDTO) o;
+        return modifySandbox == that.modifySandbox &&
+                sandboxChangeExpectedDuration == that.sandboxChangeExpectedDuration &&
+                Objects.equals(title, that.title) &&
+                Objects.equals(content, that.content) &&
+                Objects.equals(answer, that.answer) &&
+                Objects.equals(solution, that.solution) &&
+                Objects.equals(incorrectAnswerLimit, that.incorrectAnswerLimit);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(title, content, answer, solution, incorrectAnswerLimit, modifySandbox, sandboxChangeExpectedDuration);
+    }
+
     @Override
     public String toString() {
         return "TaskCopyDTO{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskDTO.java
index cc10eee13c9dac1082781152888d885a5d197061..9a8561b110b78af3ec2121a8cc82a6d4b7a0ce61 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskDTO.java
@@ -1,15 +1,36 @@
 package cz.muni.ics.kypo.training.adaptive.dto.training;
 
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Objects;
+
 public class TaskDTO {
 
+    @ApiModelProperty(value = "ID of task", required = true, example = "1")
     private Long id;
+
+    @ApiModelProperty(value = "Short description of task", required = true, example = "Task title")
     private String title;
+
+    @ApiModelProperty(value = "Order of task in the training phase", required = true, example = "1")
     private Integer order;
+
+    @ApiModelProperty(value = "The information that are displayed to a player", required = true, example = "Capture the flag")
     private String content;
+
+    @ApiModelProperty(value = "Keyword that must be found in the task. Necessary in order to get to the next phase", required = true, example = "secretFlag")
     private String answer;
+
+    @ApiModelProperty(value = "Description how to get the answer", required = true, example = "Open secret.txt")
     private String solution;
+
+    @ApiModelProperty(value = "It defines the allowed number of incorrect answers submitted by the player", required = true, example = "5")
     private int incorrectAnswerLimit;
+
+    @ApiModelProperty(value = "It defines whether the sandbox can be modified", example = "true")
     private boolean modifySandbox;
+
+    @ApiModelProperty(value = "It defines the expected duration of sandbox change defined in seconds", example = "15")
     private int sandboxChangeExpectedDuration;
 
     public Long getId() {
@@ -84,6 +105,27 @@ public class TaskDTO {
         this.sandboxChangeExpectedDuration = sandboxChangeExpectedDuration;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TaskDTO taskDTO = (TaskDTO) o;
+        return incorrectAnswerLimit == taskDTO.incorrectAnswerLimit &&
+                modifySandbox == taskDTO.modifySandbox &&
+                sandboxChangeExpectedDuration == taskDTO.sandboxChangeExpectedDuration &&
+                Objects.equals(id, taskDTO.id) &&
+                Objects.equals(title, taskDTO.title) &&
+                Objects.equals(order, taskDTO.order) &&
+                Objects.equals(content, taskDTO.content) &&
+                Objects.equals(answer, taskDTO.answer) &&
+                Objects.equals(solution, taskDTO.solution);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, title, order, content, answer, solution, incorrectAnswerLimit, modifySandbox, sandboxChangeExpectedDuration);
+    }
+
     @Override
     public String toString() {
         return "TaskDTO{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskUpdateDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskUpdateDTO.java
index e53f7379c7095438df2b341dbf1f9fd2542f36d0..b7ede0b1a415056b624efec5a5ed76d9455632e6 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskUpdateDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TaskUpdateDTO.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.PositiveOrZero;
+import java.util.Objects;
 
 public class TaskUpdateDTO {
 
@@ -92,6 +93,25 @@ public class TaskUpdateDTO {
         this.sandboxChangeExpectedDuration = sandboxChangeExpectedDuration;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TaskUpdateDTO that = (TaskUpdateDTO) o;
+        return modifySandbox == that.modifySandbox &&
+                sandboxChangeExpectedDuration == that.sandboxChangeExpectedDuration &&
+                Objects.equals(title, that.title) &&
+                Objects.equals(content, that.content) &&
+                Objects.equals(answer, that.answer) &&
+                Objects.equals(solution, that.solution) &&
+                Objects.equals(incorrectAnswerLimit, that.incorrectAnswerLimit);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(title, content, answer, solution, incorrectAnswerLimit, modifySandbox, sandboxChangeExpectedDuration);
+    }
+
     @Override
     public String toString() {
         return "TaskUpdateDTO{" +
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseDTO.java
index 3cf60665a609c43a61696b35194f2641f49dadd4..65320f1904554a63b0a393fad14514fefbb4e110 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseDTO.java
@@ -1,17 +1,27 @@
 package cz.muni.ics.kypo.training.adaptive.dto.training;
 
 import cz.muni.ics.kypo.training.adaptive.dto.AbstractPhaseDTO;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 public class TrainingPhaseDTO extends AbstractPhaseDTO {
 
+    @ApiModelProperty(value = "Estimated time (minutes) taken by the player to solve the training phase", example = "20")
     private int estimatedDuration;
+
+    @ApiModelProperty(value = "Maximal number of allowed commands provided by played", required = true, example = "10")
     private int allowedCommands;
+
+    @ApiModelProperty(value = "Maximal number of allowed wrong answers provided by played", required = true, example = "10")
     private int allowedWrongAnswers;
+
+    @ApiModelProperty(value = "Tasks associated with the training phase", required = true)
     private List<TaskDTO> tasks = new ArrayList<>();
 
+    @ApiModelProperty(value = "Decision matrix associated with the training phase", required = true)
     private List<DecisionMatrixRowDTO> decisionMatrix;
 
     public int getEstimatedDuration() {
@@ -53,4 +63,32 @@ public class TrainingPhaseDTO extends AbstractPhaseDTO {
     public void setDecisionMatrix(List<DecisionMatrixRowDTO> decisionMatrix) {
         this.decisionMatrix = decisionMatrix;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TrainingPhaseDTO that = (TrainingPhaseDTO) o;
+        return estimatedDuration == that.estimatedDuration &&
+                allowedCommands == that.allowedCommands &&
+                allowedWrongAnswers == that.allowedWrongAnswers &&
+                Objects.equals(tasks, that.tasks) &&
+                Objects.equals(decisionMatrix, that.decisionMatrix);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(estimatedDuration, allowedCommands, allowedWrongAnswers, tasks, decisionMatrix);
+    }
+
+    @Override
+    public String toString() {
+        return "TrainingPhaseDTO{" +
+                "estimatedDuration=" + estimatedDuration +
+                ", allowedCommands=" + allowedCommands +
+                ", allowedWrongAnswers=" + allowedWrongAnswers +
+                ", tasks=" + tasks +
+                ", decisionMatrix=" + decisionMatrix +
+                "} " + super.toString();
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseUpdateDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseUpdateDTO.java
index c1ca1f611818484ca8d0b12e266bb29997987a2b..392dd0be17438f371e50ff41db3bccfddbbbdfe2 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseUpdateDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/training/TrainingPhaseUpdateDTO.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.List;
+import java.util.Objects;
 
 public class TrainingPhaseUpdateDTO {
 
@@ -21,9 +22,11 @@ public class TrainingPhaseUpdateDTO {
     private Integer allowedCommands;
 
     @ApiModelProperty(value = "Estimated time (minutes) taken by the player to solve the training phase", example = "20")
-    @NotNull(message = "Estimated duration of phase task must be set")
+    @NotNull(message = "Estimated duration of training phase must be set")
     private Integer estimatedDuration;
 
+    @ApiModelProperty(value = "Decision matrix associated with the training phase", required = true)
+    @NotNull(message = "Decision matrix of training phase must be set")
     private List<DecisionMatrixRowDTO> decisionMatrix;
 
     public String getTitle() {
@@ -65,4 +68,32 @@ public class TrainingPhaseUpdateDTO {
     public void setDecisionMatrix(List<DecisionMatrixRowDTO> decisionMatrix) {
         this.decisionMatrix = decisionMatrix;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TrainingPhaseUpdateDTO that = (TrainingPhaseUpdateDTO) o;
+        return Objects.equals(title, that.title) &&
+                Objects.equals(allowedWrongAnswers, that.allowedWrongAnswers) &&
+                Objects.equals(allowedCommands, that.allowedCommands) &&
+                Objects.equals(estimatedDuration, that.estimatedDuration) &&
+                Objects.equals(decisionMatrix, that.decisionMatrix);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(title, allowedWrongAnswers, allowedCommands, estimatedDuration, decisionMatrix);
+    }
+
+    @Override
+    public String toString() {
+        return "TrainingPhaseUpdateDTO{" +
+                "title='" + title + '\'' +
+                ", allowedWrongAnswers=" + allowedWrongAnswers +
+                ", allowedCommands=" + allowedCommands +
+                ", estimatedDuration=" + estimatedDuration +
+                ", decisionMatrix=" + decisionMatrix +
+                '}';
+    }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/BeanMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/BeanMapper.java
index e8fe737f1ed450435fa7dba5ce8cf72ae686a2dc..caa15c2aa8b4b135c0ecc813f3521ed5887bf463 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/BeanMapper.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/BeanMapper.java
@@ -15,8 +15,6 @@ import cz.muni.ics.kypo.training.adaptive.dto.info.InfoPhaseUpdateDTO;
 import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionChoiceDTO;
 import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionDTO;
 import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionPhaseRelationDTO;
-import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionRequiredIdDTO;
-import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionUpdateDTO;
 import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionnairePhaseDTO;
 import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionnaireUpdateDTO;
 import cz.muni.ics.kypo.training.adaptive.dto.training.DecisionMatrixRowDTO;
@@ -84,10 +82,6 @@ public interface BeanMapper {
 
     Question toEntity(QuestionDTO questionDto);
 
-    Question toEntity(QuestionRequiredIdDTO questionDto);
-
-    Question toEntity(QuestionUpdateDTO questionUpdateDto);
-
     QuestionDTO toDto(Question question);
 
     @Mapping(target = "questionPhaseRelations", source = "phaseRelations")