diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
index b0fe84f10c4ddedc281fab50d3bde5d298791901..98202978a899dcd4850fdf3afc9d2d25d8dce9b2 100644
--- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
+++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
@@ -1,14 +1,11 @@
 package com.example.demo.controller;
 
 import com.example.demo.dto.BaseLevelDto;
-import com.example.demo.dto.InfoLevelUpdateDto;
-import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionChoiceUpdateDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.QuestionUpdateDto;
 import com.example.demo.dto.QuestionnaireUpdateDto;
-import com.example.demo.dto.TaskUpdateDto;
 import com.example.demo.enums.QuestionType;
 import com.example.demo.service.LevelOperationsService;
 import io.swagger.annotations.Api;
@@ -46,22 +43,22 @@ public class AdaptiveTrainingDefinitionsRestController {
         this.levelOperationsService = levelOperationsService;
     }
 
-    @ApiOperation(httpMethod = "PUT",
-            value = "Move level to specified order",
-            nickname = "moveLevelToSpecifiedOrder",
-            produces = MediaType.APPLICATION_JSON_VALUE
-    )
-    @ApiResponses(value = {
-            @ApiResponse(code = 200, message = "Level moved to specified order"),
-            @ApiResponse(code = 500, message = "Unexpected application error")
-    })
-    @PutMapping(value = "/levels/{levelIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public void moveLevelToSpecifiedOrder(
-            @ApiParam(value = "Level ID - from", required = true) @PathVariable(name = "levelIdFrom") Long levelIdFrom,
-            @ApiParam(value = "Position (order) to which the level should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) {
-
-        levelOperationsService.moveLevelToSpecifiedOrder(levelIdFrom, newPosition);
-    }
+//    @ApiOperation(httpMethod = "PUT",
+//            value = "Move level to specified order",
+//            nickname = "moveLevelToSpecifiedOrder",
+//            produces = MediaType.APPLICATION_JSON_VALUE
+//    )
+//    @ApiResponses(value = {
+//            @ApiResponse(code = 200, message = "Level moved to specified order"),
+//            @ApiResponse(code = 500, message = "Unexpected application error")
+//    })
+//    @PutMapping(value = "/levels/{levelIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE)
+//    public void moveLevelToSpecifiedOrder(
+//            @ApiParam(value = "Level ID - from", required = true) @PathVariable(name = "levelIdFrom") Long levelIdFrom,
+//            @ApiParam(value = "Position (order) to which the level should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) {
+//
+//        levelOperationsService.moveLevelToSpecifiedOrder(levelIdFrom, newPosition);
+//    }
 
 //    @ApiOperation(httpMethod = "DELETE",
 //            value = "Delete a specified level",
@@ -115,37 +112,37 @@ public class AdaptiveTrainingDefinitionsRestController {
 //        return levelOperationsService.getLevel(levelId);
 //    }
 
-    @ApiOperation(httpMethod = "PUT",
-            value = "Update info level",
-            nickname = "updateInfoLevel",
-            consumes = MediaType.APPLICATION_JSON_VALUE
-    )
-    @ApiResponses(value = {
-            @ApiResponse(code = 200, message = "Info level updated"),
-            @ApiResponse(code = 500, message = "Unexpected application error")
-    })
-    @PutMapping(path = "/info-levels")
-    public void updateInfoLevel(
-            @ApiParam(value = "Info level to be updated") @RequestBody InfoLevelUpdateDto infoLevelUpdateDto) {
-
-        levelOperationsService.updateInfoLevel(infoLevelUpdateDto);
-    }
-
-    @ApiOperation(httpMethod = "PUT",
-            value = "Update phase",
-            nickname = "updatePhaseLevel",
-            consumes = MediaType.APPLICATION_JSON_VALUE
-    )
-    @ApiResponses(value = {
-            @ApiResponse(code = 200, message = "Phase level"),
-            @ApiResponse(code = 500, message = "Unexpected application error")
-    })
-    @PutMapping(path = "/phases")
-    public void updatePhaseLevel(
-            @ApiParam(value = "Info level to be updated") @RequestBody PhaseLevelUpdateDto phaseLevelUpdateDto) {
+//    @ApiOperation(httpMethod = "PUT",
+//            value = "Update info level",
+//            nickname = "updateInfoLevel",
+//            consumes = MediaType.APPLICATION_JSON_VALUE
+//    )
+//    @ApiResponses(value = {
+//            @ApiResponse(code = 200, message = "Info level updated"),
+//            @ApiResponse(code = 500, message = "Unexpected application error")
+//    })
+//    @PutMapping(path = "/info-levels")
+//    public void updateInfoLevel(
+//            @ApiParam(value = "Info level to be updated") @RequestBody InfoLevelUpdateDto infoLevelUpdateDto) {
+//
+//        levelOperationsService.updateInfoLevel(infoLevelUpdateDto);
+//    }
 
-        levelOperationsService.updatePhaseLevel(phaseLevelUpdateDto);
-    }
+//    @ApiOperation(httpMethod = "PUT",
+//            value = "Update phase",
+//            nickname = "updatePhaseLevel",
+//            consumes = MediaType.APPLICATION_JSON_VALUE
+//    )
+//    @ApiResponses(value = {
+//            @ApiResponse(code = 200, message = "Phase level"),
+//            @ApiResponse(code = 500, message = "Unexpected application error")
+//    })
+//    @PutMapping(path = "/phases")
+//    public void updatePhaseLevel(
+//            @ApiParam(value = "Info level to be updated") @RequestBody PhaseLevelUpdateDto phaseLevelUpdateDto) {
+//
+//        levelOperationsService.updatePhaseLevel(phaseLevelUpdateDto);
+//    }
 
 //    @ApiOperation(httpMethod = "PUT",
 //            value = "Update task",
diff --git a/src/main/java/com/example/demo/controller/PhasesController.java b/src/main/java/com/example/demo/controller/PhasesController.java
index 7b8f336b0fff1558a68e757ebf5cb4532bade5e3..ac3ce30b428c84e46c9f4549915329df6e0e5883 100644
--- a/src/main/java/com/example/demo/controller/PhasesController.java
+++ b/src/main/java/com/example/demo/controller/PhasesController.java
@@ -1,7 +1,11 @@
 package com.example.demo.controller;
 
 import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.dto.InfoLevelDto;
+import com.example.demo.dto.InfoLevelUpdateDto;
 import com.example.demo.dto.PhaseCreateDTO;
+import com.example.demo.dto.PhaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.facade.TrainingPhaseFacade;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -13,12 +17,15 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
@@ -26,6 +33,8 @@ import java.util.List;
 
 @RestController
 @RequestMapping(value = "/training-definitions/{definitionId}/phases", produces = MediaType.APPLICATION_JSON_VALUE)
+@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*",
+        methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT})
 @Api(value = "/training-definitions/{definitionId}/phases",
         tags = "Phases",
         consumes = MediaType.APPLICATION_JSON_VALUE,
@@ -123,4 +132,70 @@ public class PhasesController {
         return new ResponseEntity<>(remainingPhases, HttpStatus.OK);
     }
 
+    @ApiOperation(httpMethod = "PUT",
+            value = "Update info phase",
+            nickname = "updateInfoPhase",
+            response = InfoLevelDto.class,
+            consumes = MediaType.APPLICATION_JSON_VALUE
+    )
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Info phase updated"),
+            @ApiResponse(code = 500, message = "Unexpected application error")
+    })
+    @PutMapping(path = "/{phaseId}/info")
+    public ResponseEntity<InfoLevelDto> updateInfoPhase(
+            @ApiParam(value = "Training definition ID", required = true)
+            @PathVariable(name = "definitionId") Long definitionId,
+            @ApiParam(value = "Level ID", required = true)
+            @PathVariable("phaseId") Long phaseId,
+            @ApiParam(value = "Info phase to be updated")
+            @RequestBody @Valid InfoLevelUpdateDto infoLevelUpdateDto) {
+
+        InfoLevelDto updatedInfoPhase = trainingPhaseFacade.updateInfoPhase(definitionId, phaseId, infoLevelUpdateDto);
+
+        return new ResponseEntity<>(updatedInfoPhase, HttpStatus.OK);
+    }
+
+    @ApiOperation(httpMethod = "PUT",
+            value = "Update training phase",
+            nickname = "updateTrainingPhase",
+            response = PhaseLevelDto.class,
+            consumes = MediaType.APPLICATION_JSON_VALUE
+    )
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Training phase updated"),
+            @ApiResponse(code = 500, message = "Unexpected application error")
+    })
+    @PutMapping(path = "/{phaseId}/training")
+    public ResponseEntity<PhaseLevelDto> updateTrainingPhase(
+            @ApiParam(value = "Training definition ID", required = true)
+            @PathVariable(name = "definitionId") Long definitionId,
+            @ApiParam(value = "Phase ID", required = true)
+            @PathVariable("phaseId") Long phaseId,
+            @ApiParam(value = "Training phase to be updated")
+            @RequestBody @Valid PhaseLevelUpdateDto phaseLevelUpdateDto) {
+
+        PhaseLevelDto updatedTrainingPhase = trainingPhaseFacade.updateTrainingPhase(definitionId, phaseId, phaseLevelUpdateDto);
+
+        return new ResponseEntity<>(updatedTrainingPhase, HttpStatus.OK);
+    }
+
+    @ApiOperation(httpMethod = "PUT",
+            value = "Move phase to specified order",
+            nickname = "movePhaseToSpecifiedOrder",
+            produces = MediaType.APPLICATION_JSON_VALUE
+    )
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Phase moved to specified order"),
+            @ApiResponse(code = 500, message = "Unexpected application error")
+    })
+    @PutMapping(value = "/{phaseIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<Void> movePhaseToSpecifiedOrder(
+            @ApiParam(value = "Phase ID - from", required = true) @PathVariable(name = "phaseIdFrom") Long phaseIdFrom,
+            @ApiParam(value = "Position (order) to which the phase should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) {
+
+        trainingPhaseFacade.movePhaseToSpecifiedOrder(phaseIdFrom, newPosition);
+
+        return ResponseEntity.ok().build();
+    }
 }
diff --git a/src/main/java/com/example/demo/controller/TasksController.java b/src/main/java/com/example/demo/controller/TasksController.java
index ca50097adf8f119a1a697060b972f01510dd5d56..eb252c4c4defbcf50f84cf025b26a0fcf0849eb3 100644
--- a/src/main/java/com/example/demo/controller/TasksController.java
+++ b/src/main/java/com/example/demo/controller/TasksController.java
@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -20,12 +21,15 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 
 @RestController
 @RequestMapping(value = "/training-definitions/{definitionId}/phases/{phaseId}/tasks", produces = MediaType.APPLICATION_JSON_VALUE)
+@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*",
+        methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT})
 @Api(value = "/training-definitions/{definitionId}/phases",
         tags = "Tasks",
         consumes = MediaType.APPLICATION_JSON_VALUE,
diff --git a/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java b/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java
index 98519fb2bc26a8d5567c3d9aa7a8dc9e132a7ba9..9d871d47ee42165415d15d1be1ba2da5f39c1475 100644
--- a/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java
+++ b/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java
@@ -1,18 +1,18 @@
 package com.example.demo.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotEmpty;
+
 public class InfoLevelUpdateDto {
 
-    private Long id;
+    @ApiModelProperty(value = "Short description of info phase", required = true, example = "Info phase title")
+    @NotEmpty(message = "Info phase title must not be blank")
     private String title;
-    private String content;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
+    @ApiModelProperty(value = "The information of info phase that is displayed to a player", required = true, example = "Read the info")
+    @NotEmpty(message = "Info phase content must not be blank")
+    private String content;
 
     public String getTitle() {
         return title;
@@ -33,8 +33,7 @@ public class InfoLevelUpdateDto {
     @Override
     public String toString() {
         return "InfoLevelUpdateDto{" +
-                "id=" + id +
-                ", title='" + title + '\'' +
+                "title='" + title + '\'' +
                 ", content='" + content + '\'' +
                 '}';
     }
diff --git a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
index 199653042cfcc0522d9a8af220c47e34cf8c82f8..3777a3bd68a3c2e221748e9490310381c3ecf80f 100644
--- a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
+++ b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
@@ -1,25 +1,35 @@
 package com.example.demo.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.PositiveOrZero;
 import java.util.List;
 
 public class PhaseLevelUpdateDto {
 
-    private Long id;
+    @ApiModelProperty(value = "Short description of training phase", required = true, example = "Training phase title")
+    @NotEmpty(message = "Training phase title must not be blank")
     private String title;
-    private Integer order;
+
+    @ApiModelProperty(value = "Maximal number of allowed wrong flags provided by played", required = true, example = "10")
+    @NotNull(message = "Maximal number of allowed wrong flags must be set")
     private Integer allowedWrongFlags;
+
+    @ApiModelProperty(value = "Maximal number of allowed commands provided by played", required = true, example = "10")
+    @NotNull(message = "Maximal number of allowed commands must be set")
     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")
     private Integer estimatedDuration;
-    private Long maxScore;
-    private List<DecisionMatrixRowDto> decisionMatrix;
 
-    public Long getId() {
-        return id;
-    }
+    @ApiModelProperty(value = "Maximal score player can achieve in the training phase", example = "200")
+    @PositiveOrZero
+    private Long maxScore;
 
-    public void setId(Long id) {
-        this.id = id;
-    }
+    private List<DecisionMatrixRowDto> decisionMatrix;
 
     public String getTitle() {
         return title;
@@ -29,14 +39,6 @@ public class PhaseLevelUpdateDto {
         this.title = title;
     }
 
-    public Integer getOrder() {
-        return order;
-    }
-
-    public void setOrder(Integer order) {
-        this.order = order;
-    }
-
     public Integer getAllowedWrongFlags() {
         return allowedWrongFlags;
     }
diff --git a/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..de568cb7ce783ecc365ae2074df3b0183ae81f0c
--- /dev/null
+++ b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java
@@ -0,0 +1,81 @@
+package com.example.demo.facade;
+
+import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.dto.InfoLevelDto;
+import com.example.demo.dto.InfoLevelUpdateDto;
+import com.example.demo.dto.PhaseCreateDTO;
+import com.example.demo.dto.PhaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
+import com.example.demo.enums.PhaseType;
+import com.example.demo.service.InfoLevelService;
+import com.example.demo.service.PhaseLevelService;
+import com.example.demo.service.PhaseService;
+import com.example.demo.service.QuestionnaireLevelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class TrainingPhaseFacade {
+
+    @Autowired
+    private PhaseService phaseService;
+
+    @Autowired
+    private InfoLevelService infoLevelService;
+
+    @Autowired
+    private QuestionnaireLevelService questionnaireLevelService;
+
+    @Autowired
+    private PhaseLevelService phaseLevelService;
+
+    public BaseLevelDto createPhase(Long trainingDefinitionId, PhaseCreateDTO phaseCreateDTO) {
+        BaseLevelDto baseLevelDto;
+        if (PhaseType.INFO.equals(phaseCreateDTO.getPhaseType())) {
+            baseLevelDto = infoLevelService.createDefaultInfoLevel(trainingDefinitionId);
+        } else if (PhaseType.QUESTIONNAIRE.equals(phaseCreateDTO.getPhaseType())) {
+            baseLevelDto = questionnaireLevelService.createDefaultQuestionnaireLevel(trainingDefinitionId);
+        } else {
+            baseLevelDto = phaseLevelService.createDefaultPhaseLevel(trainingDefinitionId);
+        }
+
+        baseLevelDto.setPhaseType(phaseCreateDTO.getPhaseType());
+
+        return baseLevelDto;
+    }
+
+
+    @Transactional
+    public List<BaseLevelDto> deletePhase(Long definitionId, Long phaseId) {
+
+        phaseService.deletePhase(definitionId, phaseId);
+
+        return getPhases(definitionId);
+    }
+
+    public BaseLevelDto getPhase(Long definitionId, Long phaseId) {
+        return phaseService.getPhase(definitionId, phaseId);
+    }
+
+    public List<BaseLevelDto> getPhases(Long definitionId) {
+
+        return phaseService.getPhases(definitionId);
+    }
+
+    public InfoLevelDto updateInfoPhase(Long definitionId, Long phaseId, InfoLevelUpdateDto infoLevelUpdateDto) {
+        return infoLevelService.updateInfoLevel(definitionId, phaseId, infoLevelUpdateDto);
+    }
+
+    public PhaseLevelDto updateTrainingPhase(Long definitionId, Long phaseId, PhaseLevelUpdateDto trainingPhaseUpdate) {
+        return phaseLevelService.updatePhaseLevel(definitionId, phaseId, trainingPhaseUpdate);
+    }
+
+    public void movePhaseToSpecifiedOrder(Long phaseIdFrom, int newPosition) {
+        phaseService.moveLevelToSpecifiedOrder(phaseIdFrom, newPosition);
+    }
+
+
+}
diff --git a/src/main/java/com/example/demo/service/InfoLevelService.java b/src/main/java/com/example/demo/service/InfoLevelService.java
index 41e961a4d8d61531b0ffd0b1d2dabdc3a98988a7..0725c71786d0c548c0eb60d89e67b2733e8ddf6c 100644
--- a/src/main/java/com/example/demo/service/InfoLevelService.java
+++ b/src/main/java/com/example/demo/service/InfoLevelService.java
@@ -3,6 +3,7 @@ package com.example.demo.service;
 import com.example.demo.domain.InfoLevel;
 import com.example.demo.dto.InfoLevelCreateDto;
 import com.example.demo.dto.InfoLevelDto;
+import com.example.demo.dto.InfoLevelUpdateDto;
 import com.example.demo.mapper.BeanMapper;
 import com.example.demo.repository.BaseLevelRepository;
 import com.example.demo.repository.InfoLevelRepository;
@@ -24,8 +25,6 @@ public class InfoLevelService {
     private final InfoLevelRepository infoLevelRepository;
     private final BaseLevelRepository baseLevelRepository;
 
-
-
     @Autowired
     public InfoLevelService(InfoLevelRepository infoLevelRepository, BaseLevelRepository baseLevelRepository) {
         this.infoLevelRepository = infoLevelRepository;
@@ -78,17 +77,18 @@ public class InfoLevelService {
         return BeanMapper.INSTANCE.toDto(infoLevel.get());
     }
 
-    public InfoLevelDto updateInfoLevel(InfoLevel infoLevelUpdate) {
-        Optional<InfoLevel> persistedInfoLevel = infoLevelRepository.findById(infoLevelUpdate.getId());
+    public InfoLevelDto updateInfoLevel(Long definitionId, Long phaseId, InfoLevelUpdateDto infoLevelUpdateDto) {
+        InfoLevel infoLevelUpdate = BeanMapper.INSTANCE.toEntity(infoLevelUpdateDto);
+        infoLevelUpdate.setId(phaseId);
 
-        if (persistedInfoLevel.isEmpty()) {
-            // TODO return 404
-            LOG.error("No info level found with ID {}.", infoLevelUpdate.getId());
-            return new InfoLevelDto();
-        }
+        InfoLevel persistedInfoLevel = infoLevelRepository.findById(infoLevelUpdate.getId())
+                .orElseThrow(() -> new RuntimeException("Info phase was not found"));
+        // TODO throw proper exception once kypo2-training is migrated
+
+        // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed)
 
-        infoLevelUpdate.setTrainingDefinitionId(persistedInfoLevel.get().getTrainingDefinitionId());
-        infoLevelUpdate.setOrder(persistedInfoLevel.get().getOrder());
+        infoLevelUpdate.setTrainingDefinitionId(persistedInfoLevel.getTrainingDefinitionId());
+        infoLevelUpdate.setOrder(persistedInfoLevel.getOrder());
 
         InfoLevel savedEntity = infoLevelRepository.save(infoLevelUpdate);
 
diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java
index ebccb11366234940f1be03fe7a72b956ecd58891..bba817c4be28896ff43a0666388c932f3022fb56 100644
--- a/src/main/java/com/example/demo/service/LevelOperationsService.java
+++ b/src/main/java/com/example/demo/service/LevelOperationsService.java
@@ -50,31 +50,31 @@ public class LevelOperationsService {
     @Autowired
     private QuestionChoiceService questionChoiceService;
 
-    @Transactional
-    public void moveLevelToSpecifiedOrder(Long levelIdFrom, int newPosition) {
-        Optional<BaseLevel> levelFrom = baseLevelRepository.findById(levelIdFrom);
-
-        if (levelFrom.isEmpty()) {
-            // TODO throw a proper exception
-            return;
-        }
-
-        int fromOrder = levelFrom.get().getOrder();
-
-        if (fromOrder < newPosition) {
-            baseLevelRepository.decreaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), fromOrder, newPosition);
-        } else if (fromOrder > newPosition) {
-            baseLevelRepository.increaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), newPosition, fromOrder);
-        } else {
-            // nothing should be changed, no further actions needed
-            return;
-        }
-
-        levelFrom.get().setOrder(newPosition);
-        baseLevelRepository.save(levelFrom.get());
-
-        phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.get().getTrainingDefinitionId());
-    }
+//    @Transactional
+//    public void moveLevelToSpecifiedOrder(Long levelIdFrom, int newPosition) {
+//        Optional<BaseLevel> levelFrom = baseLevelRepository.findById(levelIdFrom);
+//
+//        if (levelFrom.isEmpty()) {
+//            // TODO throw a proper exception
+//            return;
+//        }
+//
+//        int fromOrder = levelFrom.get().getOrder();
+//
+//        if (fromOrder < newPosition) {
+//            baseLevelRepository.decreaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), fromOrder, newPosition);
+//        } else if (fromOrder > newPosition) {
+//            baseLevelRepository.increaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), newPosition, fromOrder);
+//        } else {
+//            // nothing should be changed, no further actions needed
+//            return;
+//        }
+//
+//        levelFrom.get().setOrder(newPosition);
+//        baseLevelRepository.save(levelFrom.get());
+//
+//        phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.get().getTrainingDefinitionId());
+//    }
 
 //    @Transactional
 //    public void deleteLevel(Long levelId) {
@@ -141,15 +141,15 @@ public class LevelOperationsService {
         return BeanMapper.INSTANCE.toDto(level.get());
     }
 
-    public void updateInfoLevel(InfoLevelUpdateDto infoLevelUpdateDto) {
-        InfoLevel infoLevel = BeanMapper.INSTANCE.toEntity(infoLevelUpdateDto);
-        infoLevelService.updateInfoLevel(infoLevel);
-    }
+//    public void updateInfoLevel(InfoLevelUpdateDto infoLevelUpdateDto) {
+//        InfoLevel infoLevel = BeanMapper.INSTANCE.toEntity(infoLevelUpdateDto);
+//        infoLevelService.updateInfoLevel(infoLevel);
+//    }
 
-    public void updatePhaseLevel(PhaseLevelUpdateDto phaseLevelUpdateDto) {
-        PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(phaseLevelUpdateDto);
-        phaseLevelService.updatePhaseLevel(phaseLevel);
-    }
+//    public void updatePhaseLevel(PhaseLevelUpdateDto phaseLevelUpdateDto) {
+//        PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(phaseLevelUpdateDto);
+//        phaseLevelService.updatePhaseLevel(phaseLevel);
+//    }
 
     public QuestionDto createQuestion(Long questionnaireId, QuestionType questionType) {
         QuestionDto createdQuestion = questionService.createDefaultQuestion(questionnaireId, questionType);
diff --git a/src/main/java/com/example/demo/service/PhaseLevelService.java b/src/main/java/com/example/demo/service/PhaseLevelService.java
index 981b391983db2d3bbb810d32d92df034e0800d70..9b19e0db88a26dc771060f001e501b9b1df25817 100644
--- a/src/main/java/com/example/demo/service/PhaseLevelService.java
+++ b/src/main/java/com/example/demo/service/PhaseLevelService.java
@@ -1,8 +1,10 @@
 package com.example.demo.service;
 
+import com.example.demo.domain.BaseLevel;
 import com.example.demo.domain.DecisionMatrixRow;
 import com.example.demo.domain.PhaseLevel;
 import com.example.demo.dto.PhaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.mapper.BeanMapper;
 import com.example.demo.repository.BaseLevelRepository;
 import com.example.demo.repository.PhaseLevelRepository;
@@ -10,6 +12,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
@@ -44,18 +47,19 @@ public class PhaseLevelService {
         return BeanMapper.INSTANCE.toDto(persistedEntity);
     }
 
-    public PhaseLevelDto updatePhaseLevel(PhaseLevel phaseLevel) {
-        Optional<PhaseLevel> persistedPhaseLevel = phaseLevelRepository.findById(phaseLevel.getId());
+    public PhaseLevelDto updatePhaseLevel(Long definitionId, Long phaseId, PhaseLevelUpdateDto trainingPhaseUpdate) {
+        PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(trainingPhaseUpdate);
+        phaseLevel.setId(phaseId);
 
-        if (persistedPhaseLevel.isEmpty()) {
-            // TODO return 404
-            LOG.error("No phase level found with ID {}.", phaseLevel.getId());
-            return new PhaseLevelDto();
-        }
+        PhaseLevel persistedPhaseLevel = phaseLevelRepository.findById(phaseLevel.getId())
+                .orElseThrow(() -> new RuntimeException("Training phase was not found"));
+        // TODO throw proper exception once kypo2-training is migrated
+
+        // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed);
 
-        phaseLevel.setTrainingDefinitionId(persistedPhaseLevel.get().getTrainingDefinitionId());
-        phaseLevel.setOrder(persistedPhaseLevel.get().getOrder());
-        phaseLevel.setSubLevels(persistedPhaseLevel.get().getSubLevels());
+        phaseLevel.setTrainingDefinitionId(persistedPhaseLevel.getTrainingDefinitionId());
+        phaseLevel.setOrder(persistedPhaseLevel.getOrder());
+        phaseLevel.setSubLevels(persistedPhaseLevel.getSubLevels());
 
         if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) {
             phaseLevel.getDecisionMatrix().forEach(x -> x.setPhaseLevel(phaseLevel));
diff --git a/src/main/java/com/example/demo/service/PhaseService.java b/src/main/java/com/example/demo/service/PhaseService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d575252771a06dcd02b66ddc061d42f3459e9919
--- /dev/null
+++ b/src/main/java/com/example/demo/service/PhaseService.java
@@ -0,0 +1,79 @@
+package com.example.demo.service;
+
+import com.example.demo.domain.BaseLevel;
+import com.example.demo.domain.PhaseLevel;
+import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.mapper.BeanMapper;
+import com.example.demo.repository.BaseLevelRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class PhaseService {
+
+    @Autowired
+    private BaseLevelRepository baseLevelRepository;
+
+    @Autowired
+    private PhaseLevelService phaseLevelService;
+
+    @Transactional
+    public void deletePhase(Long definitionId, Long phaseId) {
+        BaseLevel phase = baseLevelRepository.findById(phaseId)
+                .orElseThrow(() -> new RuntimeException("Phase was not found"));
+        // TODO throw proper exception once kypo2-training is migrated
+
+        // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed)
+
+
+        int levelOrder = phase.getOrder();
+        baseLevelRepository.decreaseOrderAfterLevelWasDeleted(definitionId, levelOrder);
+
+        baseLevelRepository.delete(phase);
+    }
+
+    public BaseLevelDto getPhase(Long definitionId, Long phaseId) {
+        BaseLevel phase = baseLevelRepository.findById(phaseId)
+                .orElseThrow(() -> new RuntimeException("Phase was not found"));
+        // TODO throw proper exception once kypo2-training is migrated
+
+        // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed)
+
+        return BeanMapper.INSTANCE.toDto(phase);
+    }
+
+
+    public List<BaseLevelDto> getPhases(Long trainingDefinitionId) {
+        List<BaseLevel> phases = baseLevelRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId);
+
+        return BeanMapper.INSTANCE.toDtoList(phases);
+    }
+
+    @Transactional
+    public void moveLevelToSpecifiedOrder(Long phaseIdFrom, int newPosition) {
+        BaseLevel levelFrom = baseLevelRepository.findById(phaseIdFrom)
+                .orElseThrow(() -> new RuntimeException("Phase was not found"));
+        // TODO throw proper exception once kypo2-training is migrated
+
+
+        int fromOrder = levelFrom.getOrder();
+
+        if (fromOrder < newPosition) {
+            baseLevelRepository.decreaseOrderOfLevelsOnInterval(levelFrom.getTrainingDefinitionId(), fromOrder, newPosition);
+        } else if (fromOrder > newPosition) {
+            baseLevelRepository.increaseOrderOfLevelsOnInterval(levelFrom.getTrainingDefinitionId(), newPosition, fromOrder);
+        } else {
+            // nothing should be changed, no further actions needed
+            return;
+        }
+
+        levelFrom.setOrder(newPosition);
+        baseLevelRepository.save(levelFrom);
+
+        phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.getTrainingDefinitionId());
+    }
+
+}