diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/questionnaire/QuestionExportDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/questionnaire/QuestionExportDTO.java
index 9884462a240af31a698bd49e448ed0eea3916e78..b54f857d211bc116463c76f4700a4f645ce3ad3e 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/questionnaire/QuestionExportDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/questionnaire/QuestionExportDTO.java
@@ -3,11 +3,9 @@ package cz.muni.ics.kypo.training.adaptive.dto.export.phases.questionnaire;
 import cz.muni.ics.kypo.training.adaptive.enums.QuestionType;
 import io.swagger.annotations.ApiModelProperty;
 
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
 import java.util.List;
 
-public abstract class QuestionExportDTO {
+public class QuestionExportDTO {
 
     @ApiModelProperty(value = "Order of question", required = true, example = "0")
     private int order;
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/DecisionMatrixRowExportDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/DecisionMatrixRowExportDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..da536f9513781d26728d36ad816ba71d96d16faa
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/DecisionMatrixRowExportDTO.java
@@ -0,0 +1,80 @@
+package cz.muni.ics.kypo.training.adaptive.dto.export.phases.training;
+
+public class DecisionMatrixRowExportDTO {
+    private long id;
+    private int order;
+    private double assessmentAnswered;
+    private double keywordUsed;
+    private double completedInTime;
+    private double solutionDisplayed;
+    private double wrongAnswers;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public int getOrder() {
+        return order;
+    }
+
+    public void setOrder(int order) {
+        this.order = order;
+    }
+
+    public double getAssessmentAnswered() {
+        return assessmentAnswered;
+    }
+
+    public void setAssessmentAnswered(double assessmentAnswered) {
+        this.assessmentAnswered = assessmentAnswered;
+    }
+
+    public double getKeywordUsed() {
+        return keywordUsed;
+    }
+
+    public void setKeywordUsed(double keywordUsed) {
+        this.keywordUsed = keywordUsed;
+    }
+
+    public double getCompletedInTime() {
+        return completedInTime;
+    }
+
+    public void setCompletedInTime(double completedInTime) {
+        this.completedInTime = completedInTime;
+    }
+
+    public double getSolutionDisplayed() {
+        return solutionDisplayed;
+    }
+
+    public void setSolutionDisplayed(double solutionDisplayed) {
+        this.solutionDisplayed = solutionDisplayed;
+    }
+
+    public double getWrongAnswers() {
+        return wrongAnswers;
+    }
+
+    public void setWrongAnswers(double wrongAnswers) {
+        this.wrongAnswers = wrongAnswers;
+    }
+
+    @Override
+    public String toString() {
+        return "DecisionMatrixRow{" +
+                "id=" + id +
+                ", order=" + order +
+                ", assessmentAnswered=" + assessmentAnswered +
+                ", keywordUsed=" + keywordUsed +
+                ", completedInTime=" + completedInTime +
+                ", solutionDisplayed=" + solutionDisplayed +
+                ", wrongAnswers=" + wrongAnswers +
+                '}';
+    }
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TaskExportDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TaskExportDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..e91d3adde8c55a8075c0611a312e5c31da9d3cf3
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TaskExportDTO.java
@@ -0,0 +1,101 @@
+package cz.muni.ics.kypo.training.adaptive.dto.export.phases.training;
+
+public class TaskExportDTO {
+
+    private Long id;
+    private String title;
+    private Integer order;
+    private String content;
+    private String answer;
+    private String solution;
+    private int incorrectAnswerLimit;
+    private boolean modifySandbox;
+    private int sandboxChangeExpectedDuration;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getOrder() {
+        return order;
+    }
+
+    public void setOrder(Integer order) {
+        this.order = order;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public String getSolution() {
+        return solution;
+    }
+
+    public void setSolution(String solution) {
+        this.solution = solution;
+    }
+
+    public int getIncorrectAnswerLimit() {
+        return incorrectAnswerLimit;
+    }
+
+    public void setIncorrectAnswerLimit(int incorrectAnswerLimit) {
+        this.incorrectAnswerLimit = incorrectAnswerLimit;
+    }
+
+    public boolean isModifySandbox() {
+        return modifySandbox;
+    }
+
+    public void setModifySandbox(boolean modifySandbox) {
+        this.modifySandbox = modifySandbox;
+    }
+
+    public int getSandboxChangeExpectedDuration() {
+        return sandboxChangeExpectedDuration;
+    }
+
+    public void setSandboxChangeExpectedDuration(int sandboxChangeExpectedDuration) {
+        this.sandboxChangeExpectedDuration = sandboxChangeExpectedDuration;
+    }
+
+    @Override
+    public String toString() {
+        return "TaskDTO{" +
+                "id=" + id +
+                ", title='" + title + '\'' +
+                ", order=" + order +
+                ", content='" + content + '\'' +
+                ", answer='" + answer + '\'' +
+                ", solution='" + solution + '\'' +
+                ", incorrectAnswerLimit=" + incorrectAnswerLimit +
+                ", modifySandbox=" + modifySandbox +
+                ", sandboxChangeExpectedDuration=" + sandboxChangeExpectedDuration +
+                '}';
+    }
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TrainingPhaseExportDTO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TrainingPhaseExportDTO.java
index a19e7a94cd21e947efc33647309e7043c5b4e6da..629dcedc0d90ba00551bb1542d03be16324d2902 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TrainingPhaseExportDTO.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/dto/export/phases/training/TrainingPhaseExportDTO.java
@@ -2,7 +2,10 @@ package cz.muni.ics.kypo.training.adaptive.dto.export.phases.training;
 
 import cz.muni.ics.kypo.training.adaptive.dto.export.phases.AbstractPhaseExportDTO;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * Encapsulates information about training phase. Inherits from {@link AbstractPhaseExportDTO}
@@ -11,103 +14,77 @@ import io.swagger.annotations.ApiModelProperty;
 @ApiModel(value = "TrainingPhaseExportDTO", description = "Exported game level.", parent = AbstractPhaseExportDTO.class)
 public class TrainingPhaseExportDTO extends AbstractPhaseExportDTO {
 
-    @ApiModelProperty(value = "Keyword found in game, used for access next level.", example = "secretFlag")
-    private String flag;
-    @ApiModelProperty(value = "The information and experiences that are directed towards a participant.", example = "Play me")
-    private String content;
-    @ApiModelProperty(value = "Instruction how to get flag in game.", example = "This is how you do it")
-    private String solution;
-    @ApiModelProperty(value = "How many times player can submit incorrect flag before displaying solution.", example = "5")
-    private int incorrectFlagLimit;
+    private int estimatedDuration;
+    private int allowedCommands;
+    private int allowedWrongAnswers;
+    private List<TaskExportDTO> tasks = new ArrayList<>();
+    private List<DecisionMatrixRowExportDTO> decisionMatrix;
+
+    public int getEstimatedDuration() {
+        return estimatedDuration;
+    }
+
+    public void setEstimatedDuration(int estimatedDuration) {
+        this.estimatedDuration = estimatedDuration;
+    }
 
+    public int getAllowedCommands() {
+        return allowedCommands;
+    }
 
-    /**
-     * Instantiates a new Game level export dto.
-     */
-    public TrainingPhaseExportDTO() {
+    public void setAllowedCommands(int allowedCommands) {
+        this.allowedCommands = allowedCommands;
     }
 
-    /**
-     * Gets flag.
-     *
-     * @return the flag
-     */
-    public String getFlag() {
-        return flag;
+    public int getAllowedWrongAnswers() {
+        return allowedWrongAnswers;
     }
 
-    /**
-     * Sets flag.
-     *
-     * @param flag the flag
-     */
-    public void setFlag(String flag) {
-        this.flag = flag;
+    public void setAllowedWrongAnswers(int allowedWrongAnswers) {
+        this.allowedWrongAnswers = allowedWrongAnswers;
     }
 
-    /**
-     * Gets content.
-     *
-     * @return the content
-     */
-    public String getContent() {
-        return content;
+    public List<TaskExportDTO> getTasks() {
+        return tasks;
     }
 
-    /**
-     * Sets content.
-     *
-     * @param content the content
-     */
-    public void setContent(String content) {
-        this.content = content;
+    public void setTasks(List<TaskExportDTO> tasks) {
+        this.tasks = tasks;
     }
 
-    /**
-     * Gets solution.
-     *
-     * @return the solution
-     */
-    public String getSolution() {
-        return solution;
+    public List<DecisionMatrixRowExportDTO> getDecisionMatrix() {
+        return decisionMatrix;
     }
 
-    /**
-     * Sets solution.
-     *
-     * @param solution the solution
-     */
-    public void setSolution(String solution) {
-        this.solution = solution;
+    public void setDecisionMatrix(List<DecisionMatrixRowExportDTO> decisionMatrix) {
+        this.decisionMatrix = decisionMatrix;
     }
 
-    /**
-     * Gets incorrect flag limit.
-     *
-     * @return the incorrect flag limit
-     */
-    public int getIncorrectFlagLimit() {
-        return incorrectFlagLimit;
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof TrainingPhaseExportDTO)) return false;
+        if (!super.equals(o)) return false;
+        TrainingPhaseExportDTO that = (TrainingPhaseExportDTO) o;
+        return getEstimatedDuration() == that.getEstimatedDuration() &&
+                getAllowedCommands() == that.getAllowedCommands() &&
+                getAllowedWrongAnswers() == that.getAllowedWrongAnswers();
     }
 
-    /**
-     * Sets incorrect flag limit.
-     *
-     * @param incorrectFlagLimit the incorrect flag limit
-     */
-    public void setIncorrectFlagLimit(int incorrectFlagLimit) {
-        this.incorrectFlagLimit = incorrectFlagLimit;
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), getEstimatedDuration(), getAllowedCommands(), getAllowedWrongAnswers());
     }
 
     @Override
     public String toString() {
-        return "GameLevelExportDTO{" +
-                "flag='" + flag + '\'' +
-                ", content='" + content + '\'' +
-                ", solution='" + solution + '\'' +
-                ", incorrectFlagLimit=" + incorrectFlagLimit +
+        return "TrainingPhaseExportDTO{" +
+                "estimatedDuration=" + estimatedDuration +
+                ", allowedCommands=" + allowedCommands +
+                ", allowedWrongAnswers=" + allowedWrongAnswers +
                 ", title='" + title + '\'' +
-                ", levelType=" + phaseType +
+                ", phaseType=" + phaseType +
+                ", order=" + order +
                 '}';
     }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/DecisionMatrixMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/DecisionMatrixMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf7f2db1d9620c6fe5b026d8cb9fcb24c2128217
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/DecisionMatrixMapper.java
@@ -0,0 +1,58 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.phases.*;
+import cz.muni.ics.kypo.training.adaptive.domain.phases.questions.Question;
+import cz.muni.ics.kypo.training.adaptive.dto.BasicPhaseInfoDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.AbstractPhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.info.InfoPhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.questionnaire.QuestionnairePhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.training.DecisionMatrixRowArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.training.TrainingPhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.AbstractPhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.info.InfoPhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.questionnaire.QuestionnairePhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.training.DecisionMatrixRowExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.training.TrainingPhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.info.InfoPhaseImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.questionnaire.QuestionnairePhaseImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.training.DecisionMatrixRowImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.training.TrainingPhaseImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.info.InfoPhaseDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.info.InfoPhaseUpdateDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.questionnaire.QuestionDTO;
+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;
+import cz.muni.ics.kypo.training.adaptive.dto.training.TrainingPhaseDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.training.TrainingPhaseUpdateDTO;
+import cz.muni.ics.kypo.training.adaptive.enums.PhaseType;
+import cz.muni.ics.kypo.training.adaptive.exceptions.InternalServerErrorException;
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * The InfoLevelMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type InfoLevelMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
+        unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface DecisionMatrixMapper extends ParentMapper {
+    // INFO PHASE
+    DecisionMatrixRow mapToEntity(DecisionMatrixRowDTO dto);
+    DecisionMatrixRow mapToEntity(DecisionMatrixRowImportDTO dto);
+
+    DecisionMatrixRowDTO mapToDecisionMatrixRowDTO(DecisionMatrixRow entity);
+    DecisionMatrixRowExportDTO mapToDecisionMatrixRowExportDTO(DecisionMatrixRow entity);
+    DecisionMatrixRowArchiveDTO mapToDecisionMatrixRowArchiveDTO(DecisionMatrixRow entity);
+
+    List<DecisionMatrixRow> mapToList(Collection<DecisionMatrixRowDTO> dtos);
+    List<DecisionMatrixRowDTO> mapToListDTO(Collection<DecisionMatrixRow> entities);
+    Set<DecisionMatrixRow> mapToSet(Collection<DecisionMatrixRowDTO> dtos);
+    Set<DecisionMatrixRowDTO> mapToSetDTO(Collection<DecisionMatrixRow> entities);
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/ExportImportMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/ExportImportMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a4bb3dba6f82b84409bd7f6b1a7f5208f1d9884
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/ExportImportMapper.java
@@ -0,0 +1,30 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
+import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingInstance;
+import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingRun;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.training.TrainingDefinitionArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.training.TrainingInstanceArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.training.TrainingRunArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.training.TrainingDefinitionWithPhasesExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.training.TrainingRunExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.ImportTrainingDefinitionDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * The ExportImportMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type ExportImportMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring",
+        uses = {UserRefMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface ExportImportMapper extends ParentMapper {
+
+    TrainingDefinitionWithPhasesExportDTO mapToDTO(TrainingDefinition entity);
+    TrainingDefinition mapToEntity(ImportTrainingDefinitionDTO dto);
+    TrainingInstanceArchiveDTO mapToDTO(TrainingInstance entity);
+    TrainingRunExportDTO mapToDTO(TrainingRun entity);
+    TrainingDefinitionArchiveDTO mapToArchiveDTO(TrainingDefinition entity);
+    TrainingRunArchiveDTO mapToArchiveDTO(TrainingRun entity);
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/ParentMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/ParentMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..4217f9449e1ef6c1f69db7736927418058f9a597
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/ParentMapper.java
@@ -0,0 +1,22 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.dto.responses.PageResultResource;
+import org.springframework.data.domain.Page;
+
+/**
+ * ParentMapper is parent class for mappers which contains only one method for creating pagination.
+ *
+ */
+
+public interface ParentMapper {
+
+    default PageResultResource.Pagination createPagination(Page<?> objects) {
+        PageResultResource.Pagination pageMetadata = new PageResultResource.Pagination();
+        pageMetadata.setNumber(objects.getNumber());
+        pageMetadata.setNumberOfElements(objects.getNumberOfElements());
+        pageMetadata.setSize(objects.getSize());
+        pageMetadata.setTotalElements(objects.getTotalElements());
+        pageMetadata.setTotalPages(objects.getTotalPages());
+        return pageMetadata;
+    }
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/PhaseMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/PhaseMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..566f376b81b861ce4e34a24d21f5884f1505e76b
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/PhaseMapper.java
@@ -0,0 +1,103 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.phases.AbstractPhase;
+import cz.muni.ics.kypo.training.adaptive.domain.phases.InfoPhase;
+import cz.muni.ics.kypo.training.adaptive.domain.phases.QuestionnairePhase;
+import cz.muni.ics.kypo.training.adaptive.domain.phases.TrainingPhase;
+import cz.muni.ics.kypo.training.adaptive.dto.BasicPhaseInfoDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.AbstractPhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.info.InfoPhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.questionnaire.QuestionnairePhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.training.TrainingPhaseArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.AbstractPhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.info.InfoPhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.questionnaire.QuestionnairePhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.training.TrainingPhaseExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.info.InfoPhaseImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.questionnaire.QuestionnairePhaseImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.training.TrainingPhaseImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.info.InfoPhaseDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.info.InfoPhaseUpdateDTO;
+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.TrainingPhaseDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.training.TrainingPhaseUpdateDTO;
+import cz.muni.ics.kypo.training.adaptive.enums.PhaseType;
+import cz.muni.ics.kypo.training.adaptive.exceptions.InternalServerErrorException;
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * The InfoLevelMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type InfoLevelMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", uses = {QuestionMapper.class, TaskMapper.class, DecisionMatrixMapper.class},
+        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface PhaseMapper extends ParentMapper {
+    // INFO PHASE
+    InfoPhase mapToEntity(InfoPhaseDTO dto);
+    InfoPhase mapToEntity(InfoPhaseUpdateDTO dto);
+    InfoPhase mapToEntity(InfoPhaseImportDTO dto);
+
+    BasicPhaseInfoDTO mapToBasicPhaseInfoDTO(InfoPhase infoLevel);
+    InfoPhaseDTO mapToInfoPhaseDTO(InfoPhase entity);
+    InfoPhaseExportDTO mapToInfoPhaseExportDTO(InfoPhase entity);
+    InfoPhaseArchiveDTO mapToInfoPhaseArchiveDTO(InfoPhase entity);
+
+    // ASSESSMENT LEVEL
+    QuestionnairePhase mapToEntity(QuestionnairePhaseDTO dto);
+    QuestionnairePhase mapToEntity(QuestionnairePhaseImportDTO dto);
+    QuestionnairePhase mapToEntity(QuestionnaireUpdateDTO dto);
+
+    BasicPhaseInfoDTO mapToBasicPhaseInfoDTO(QuestionnairePhase entity);
+    QuestionnairePhaseDTO mapToQuestionnairePhaseDTO(QuestionnairePhase entity);
+    QuestionnairePhaseArchiveDTO mapToQuestionnairePhaseArchiveDTO(QuestionnairePhase entity);
+    QuestionnairePhaseExportDTO mapToQuestionnairePhaseExportDTO(QuestionnairePhase entity);
+
+    // GAME LEVEL
+    TrainingPhase mapToEntity(TrainingPhaseDTO dto);
+    TrainingPhase mapUpdateToEntity(TrainingPhaseUpdateDTO dto);
+    TrainingPhase mapImportToEntity(TrainingPhaseImportDTO dto);
+
+    BasicPhaseInfoDTO mapTo(TrainingPhase entity);
+    TrainingPhaseDTO mapToTrainingPhaseDTO(TrainingPhase entity);
+    TrainingPhaseExportDTO mapToTrainingPhaseExportDTO(TrainingPhase entity);
+    TrainingPhaseArchiveDTO mapToTrainingPhaseArchiveDTO(TrainingPhase entity);
+
+    // ABSTRACT
+    default AbstractPhaseArchiveDTO mapToArchiveDTO(AbstractPhase entity) {
+        AbstractPhaseArchiveDTO abstractPhaseArchiveDTO;
+        if (entity instanceof TrainingPhase) {
+            abstractPhaseArchiveDTO = mapToTrainingPhaseArchiveDTO((TrainingPhase) entity);
+            abstractPhaseArchiveDTO.setPhaseType(PhaseType.TRAINING);
+        } else if (entity instanceof InfoPhase) {
+            abstractPhaseArchiveDTO = mapToInfoPhaseArchiveDTO((InfoPhase) entity);
+            abstractPhaseArchiveDTO.setPhaseType(PhaseType.INFO);
+        } else if (entity instanceof QuestionnairePhase) {
+            abstractPhaseArchiveDTO = mapToQuestionnairePhaseArchiveDTO((QuestionnairePhase) entity);
+            abstractPhaseArchiveDTO.setPhaseType(PhaseType.QUESTIONNAIRE);
+        } else {
+            throw new InternalServerErrorException("Phase with id: " + entity.getId() + " is not instance of questionnaire, training or info phase.");
+        }
+        return abstractPhaseArchiveDTO;
+    }
+
+    default AbstractPhaseExportDTO mapToExportDTO(AbstractPhase entity) {
+        AbstractPhaseExportDTO abstractPhaseExportDTO;
+        if (entity instanceof TrainingPhase) {
+            abstractPhaseExportDTO = mapToTrainingPhaseExportDTO((TrainingPhase) entity);
+            abstractPhaseExportDTO.setPhaseType(PhaseType.TRAINING);
+        } else if (entity instanceof InfoPhase) {
+            abstractPhaseExportDTO = mapToInfoPhaseExportDTO((InfoPhase) entity);
+            abstractPhaseExportDTO.setPhaseType(PhaseType.INFO);
+        } else if (entity instanceof QuestionnairePhase) {
+            abstractPhaseExportDTO = mapToQuestionnairePhaseExportDTO((QuestionnairePhase) entity);
+            abstractPhaseExportDTO.setPhaseType(PhaseType.QUESTIONNAIRE);
+        } else {
+            throw new InternalServerErrorException("Phase with id: " + entity.getId() + " is not instance of questionnaire, training or info phase.");
+        }
+        return abstractPhaseExportDTO;
+    }
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/QuestionMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/QuestionMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..116b26e4cdd08650e3da07ac2a4ce7ab99c5492b
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/QuestionMapper.java
@@ -0,0 +1,55 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.phases.questions.Question;
+import cz.muni.ics.kypo.training.adaptive.domain.phases.questions.QuestionChoice;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.questionnaire.QuestionArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.questionnaire.QuestionChoiceArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.questionnaire.QuestionChoiceExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.questionnaire.QuestionExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.questionnaire.QuestionChoiceImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.questionnaire.QuestionImportDTO;
+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.QuestionUpdateDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.responses.PageResultResource;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+
+import java.util.*;
+
+/**
+ * The HintMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type HintMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface QuestionMapper extends ParentMapper {
+//    QUESTIONS
+    Question mapToEntity(QuestionDTO dto);
+    Question mapToEntity(QuestionUpdateDTO dto);
+    Question mapToEntity(QuestionImportDTO dto);
+
+    QuestionArchiveDTO mapToQuestionArchiveDTO(Question entity);
+    QuestionExportDTO mapToQuestionExportDTO(Question entity);
+    QuestionDTO mapToQuestionDTO(Question entity);
+
+    List<Question> mapToList(Collection<QuestionDTO> dtos);
+    List<QuestionDTO> mapToListDTO(Collection<Question> entities);
+    Set<Question> mapToSet(Collection<QuestionDTO> dtos);
+    Set<QuestionDTO> mapToSetDTO(Collection<Question> entities);
+
+//    QUESTION CHOICES
+    QuestionChoice mapToEntity(QuestionChoiceDTO dto);
+    QuestionChoice mapToEntity(QuestionChoiceImportDTO dto);
+
+    QuestionChoiceArchiveDTO mapToQuestionArchiveDTO(QuestionChoice entity);
+    QuestionChoiceExportDTO mapToQuestionExportDTO(QuestionChoice entity);
+    QuestionChoiceDTO mapToQuestionDTO(QuestionChoice entity);
+
+    List<QuestionChoice> mapChoicesToList(Collection<QuestionChoiceDTO> dtos);
+    List<QuestionDTO> mapToChoicesListDTO(Collection<QuestionChoice> entities);
+    Set<QuestionChoice> mapChoicesToSet(Collection<QuestionChoiceDTO> dtos);
+    Set<QuestionDTO> mapToChoicesSetDTO(Collection<QuestionChoice> entities);
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TaskMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TaskMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..3980601e8eda2a5c748f0456110116ad2de42cd9
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TaskMapper.java
@@ -0,0 +1,36 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.phases.Task;
+import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.training.TaskArchiveDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.phases.training.TaskExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.training.TaskImportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.training.TaskDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.training.TaskUpdateDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * The HintMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type HintMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface TaskMapper extends ParentMapper {
+    Task mapToEntity(TaskDTO dto);
+    Task mapToEntity(TaskUpdateDTO dto);
+    Task mapToEntity(TaskImportDTO dto);
+
+    TaskArchiveDTO mapToQuestionArchiveDTO(Task entity);
+    TaskExportDTO mapToQuestionExportDTO(Task entity);
+    TaskDTO mapToQuestionDTO(Task entity);
+
+    List<Task> mapToList(Collection<TaskDTO> dtos);
+    List<TaskDTO> mapToListDTO(Collection<Task> entities);
+    Set<Task> mapToSet(Collection<TaskDTO> dtos);
+    Set<TaskDTO> mapToSetDTO(Collection<Task> entities);
+
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingDefinitionMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingDefinitionMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..43c4a824eb9d0216573871865f39fbb630831fb5
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingDefinitionMapper.java
@@ -0,0 +1,73 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
+import cz.muni.ics.kypo.training.adaptive.dto.responses.PageResultResource;
+import cz.muni.ics.kypo.training.adaptive.dto.trainingdefinition.*;
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+
+import java.util.*;
+
+/**
+ * The TrainingDefinitionMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type TrainingDefinitionMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring",
+        uses = {UserRefMapper.class},
+        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface TrainingDefinitionMapper extends ParentMapper {
+
+    TrainingDefinition mapToEntity(TrainingDefinitionByIdDTO dto);
+
+    TrainingDefinitionByIdDTO mapToDTOById(TrainingDefinition entity);
+
+    TrainingDefinitionDTO mapToDTO(TrainingDefinition entity);
+
+    TrainingDefinitionInfoDTO mapToInfoDTO(TrainingDefinition entity);
+
+    TrainingDefinition mapCreateToEntity(TrainingDefinitionCreateDTO dto);
+
+    TrainingDefinition mapUpdateToEntity(TrainingDefinitionUpdateDTO dto);
+
+    List<TrainingDefinition> mapToList(Collection<TrainingDefinitionByIdDTO> dtos);
+
+    List<TrainingDefinitionByIdDTO> mapToListDTO(Collection<TrainingDefinition> entities);
+
+    Set<TrainingDefinition> mapToSet(Collection<TrainingDefinitionByIdDTO> dtos);
+
+    Set<TrainingDefinitionByIdDTO> mapToSetDTO(Collection<TrainingDefinition> entities);
+
+    default Optional<TrainingDefinition> mapToOptional(TrainingDefinitionByIdDTO dto) {
+        return Optional.ofNullable(mapToEntity(dto));
+    }
+
+    default Optional<TrainingDefinitionByIdDTO> mapToOptional(TrainingDefinition entity) {
+        return Optional.ofNullable(mapToDTOById(entity));
+    }
+
+    default Page<TrainingDefinitionByIdDTO> mapToPageDTO(Page<TrainingDefinition> objects) {
+        List<TrainingDefinitionByIdDTO> mapped = mapToListDTO(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default Page<TrainingDefinition> mapToPage(Page<TrainingDefinitionByIdDTO> objects) {
+        List<TrainingDefinition> mapped = mapToList(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default PageResultResource<TrainingDefinitionDTO> mapToPageResultResource(Page<TrainingDefinition> objects) {
+        List<TrainingDefinitionDTO> mapped = new ArrayList<>();
+        objects.forEach(object -> mapped.add(mapToDTO(object)));
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+
+    default PageResultResource<TrainingDefinitionInfoDTO> mapToPageResultResourceInfoDTO(Page<TrainingDefinition> objects) {
+        List<TrainingDefinitionInfoDTO> mapped = new ArrayList<>();
+        objects.forEach(object -> mapped.add(mapToInfoDTO(object)));
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingInstanceMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingInstanceMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b1849c211ff62d48587f0faa5883afee606abeb
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingInstanceMapper.java
@@ -0,0 +1,72 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingInstance;
+import cz.muni.ics.kypo.training.adaptive.dto.responses.PageResultResource;
+import cz.muni.ics.kypo.training.adaptive.dto.traininginstance.*;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+
+import java.util.*;
+
+/**
+ * The TrainingInstanceMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type TrainingInstanceMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", uses = {TrainingDefinitionMapper.class, UserRefMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface TrainingInstanceMapper extends ParentMapper{
+    TrainingInstance mapToEntity(TrainingInstanceDTO dto);
+
+    TrainingInstance mapUpdateToEntity(TrainingInstanceUpdateDTO dto);
+
+    TrainingInstance mapCreateToEntity(TrainingInstanceCreateDTO dto);
+
+    TrainingInstance mapPartialUpdateToEntity(TrainingInstanceAssignPoolIdDTO dto);
+
+    TrainingInstanceBasicInfoDTO mapEntityToTIBasicInfo(TrainingInstance dto);
+
+    TrainingInstanceDTO mapToDTO(TrainingInstance entity);
+
+    TrainingInstanceFindAllResponseDTO mapToFindAllViewDTO(TrainingInstance entity);
+
+    List<TrainingInstance> mapToList(Collection<TrainingInstanceDTO> dtos);
+
+    List<TrainingInstanceDTO> mapToListDTO(Collection<TrainingInstance> entities);
+
+    Set<TrainingInstance> mapToSet(Collection<TrainingInstanceDTO> dtos);
+
+    Set<TrainingInstanceDTO> mapToSetDTO(Collection<TrainingInstance> entities);
+
+    default Optional<TrainingInstance> mapToOptional(TrainingInstanceDTO dto){
+        return Optional.ofNullable(mapToEntity(dto));
+    }
+
+    default Optional<TrainingInstanceDTO> mapToOptional(TrainingInstance entity){
+        return Optional.ofNullable(mapToDTO(entity));
+    }
+
+    default Page<TrainingInstanceDTO> mapToPageDTO(Page<TrainingInstance> objects){
+        List<TrainingInstanceDTO> mapped = mapToListDTO(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default Page<TrainingInstance> mapToPage(Page<TrainingInstanceDTO> objects){
+        List<TrainingInstance> mapped = mapToList(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default PageResultResource<TrainingInstanceDTO> mapToPageResultResource(Page<TrainingInstance> objects){
+        List<TrainingInstanceDTO> mapped = new ArrayList<>();
+        objects.forEach(object -> mapped.add(mapToDTO(object)));
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+
+    default PageResultResource<TrainingInstanceFindAllResponseDTO> mapToPageResultResourceBasicView(Page<TrainingInstance> objects){
+        List<TrainingInstanceFindAllResponseDTO> mapped = new ArrayList<>();
+        objects.forEach(object -> mapped.add(mapToFindAllViewDTO(object)));
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingRunMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingRunMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f58a3a31f276b88cbd35587c7d4edc6b80638b6
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/TrainingRunMapper.java
@@ -0,0 +1,65 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingRun;
+import cz.muni.ics.kypo.training.adaptive.dto.responses.PageResultResource;
+import cz.muni.ics.kypo.training.adaptive.dto.trainingrun.AccessedTrainingRunDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.trainingrun.TrainingRunByIdDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.trainingrun.TrainingRunDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+
+import java.util.*;
+
+/**
+ * The TrainingRunMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type TrainingRunMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface TrainingRunMapper extends ParentMapper {
+    TrainingRun mapToEntity(TrainingRunDTO dto);
+
+    TrainingRunDTO mapToDTO(TrainingRun entity);
+
+    TrainingRunByIdDTO mapToFindByIdDTO(TrainingRun entity);
+
+    List<TrainingRun> mapToList(Collection<TrainingRunDTO> dtos);
+
+    List<TrainingRunDTO> mapToListDTO(Collection<TrainingRun> entities);
+
+    Set<TrainingRun> mapToSet(Collection<TrainingRunDTO> dtos);
+
+    Set<TrainingRunDTO> mapToSetDTO(Collection<TrainingRun> entities);
+
+    default Optional<TrainingRun> mapToOptional(TrainingRunDTO dto){
+        return Optional.ofNullable(mapToEntity(dto));
+    }
+
+    default Optional<TrainingRunDTO> mapToOptional(TrainingRun entity){
+        return Optional.ofNullable(mapToDTO(entity));
+    }
+
+    default Page<TrainingRunDTO> mapToPageDTO(Page<TrainingRun> objects){
+        List<TrainingRunDTO> mapped = mapToListDTO(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default Page<TrainingRun> mapToPage(Page<TrainingRunDTO> objects){
+        List<TrainingRun> mapped = mapToList(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default PageResultResource<TrainingRunDTO> mapToPageResultResource(Page<TrainingRun> objects){
+        List<TrainingRunDTO> mapped = new ArrayList<>();
+        objects.forEach(object -> mapped.add(mapToDTO(object)));
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+
+    default PageResultResource<AccessedTrainingRunDTO> mapToPageResultResourceAccessed(Page<AccessedTrainingRunDTO> objects){
+        List<AccessedTrainingRunDTO> mapped = new ArrayList<>();
+        objects.forEach(mapped::add);
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/UserRefMapper.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/UserRefMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..9dcbec2485807821a1e181f0ab5ecac820fc1d5e
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/mapper/mapstruct/UserRefMapper.java
@@ -0,0 +1,59 @@
+package cz.muni.ics.kypo.training.adaptive.mapper.mapstruct;
+
+import cz.muni.ics.kypo.training.adaptive.domain.UserRef;
+import cz.muni.ics.kypo.training.adaptive.dto.UserRefDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.export.UserRefExportDTO;
+import cz.muni.ics.kypo.training.adaptive.dto.responses.PageResultResource;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+
+import java.util.*;
+
+/**
+ * The UserRefMapper is an utility class to map items into data transfer objects. It provides the implementation of mappings between Java bean type UserRefMapper and
+ * DTOs classes. Code is generated during compile time.
+ *
+ */
+@Mapper(componentModel = "spring", uses = {TrainingInstanceMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface UserRefMapper extends ParentMapper {
+
+    UserRef mapToEntity(UserRefDTO dto);
+
+    UserRefDTO mapToDTO(UserRef entity);
+
+    List<UserRef> mapToList(Collection<UserRefDTO> dtos);
+
+    List<UserRefDTO> mapToListDTO(Collection<UserRef> entities);
+
+    Set<UserRef> mapToSet(Collection<UserRefDTO> dtos);
+
+    Set<UserRefDTO> mapToSetDTO(Collection<UserRef> entities);
+
+    List<UserRefExportDTO> mapUserRefExportDTOToUserRefDTO(Collection<UserRefDTO> userRefDTOs);
+
+    default Optional<UserRef> mapToOptional(UserRefDTO dto) {
+        return Optional.ofNullable(mapToEntity(dto));
+    }
+
+    default Optional<UserRefDTO> mapToOptional(UserRef entity) {
+        return Optional.ofNullable(mapToDTO(entity));
+    }
+
+    default Page<UserRefDTO> mapToPageDTO(Page<UserRef> objects) {
+        List<UserRefDTO> mapped = mapToListDTO(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default Page<UserRef> mapToPage(Page<UserRefDTO> objects) {
+        List<UserRef> mapped = mapToList(objects.getContent());
+        return new PageImpl<>(mapped, objects.getPageable(), mapped.size());
+    }
+
+    default PageResultResource<UserRefDTO> mapToPageResultResource(Page<UserRef> objects) {
+        List<UserRefDTO> mapped = new ArrayList<>();
+        objects.forEach(object -> mapped.add(mapToDTO(object)));
+        return new PageResultResource<>(mapped, createPagination(objects));
+    }
+}