diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
index e9f925b5b68a3bdb2ed892643cd89e0726354113..fad0589eda40f74e103bbc22a020b3d6144ee12b 100644
--- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
+++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
@@ -1,6 +1,7 @@
 package com.example.demo.controller;
 
 import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.TaskUpdateDto;
@@ -129,6 +130,22 @@ public class AdaptiveTrainingDefinitionsRestController {
         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) {
+
+        levelOperationsService.updatePhaseLevel(phaseLevelUpdateDto);
+    }
+
     @ApiOperation(httpMethod = "PUT",
             value = "Update task",
             nickname = "updateTask",
diff --git a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..199653042cfcc0522d9a8af220c47e34cf8c82f8
--- /dev/null
+++ b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
@@ -0,0 +1,79 @@
+package com.example.demo.dto;
+
+import java.util.List;
+
+public class PhaseLevelUpdateDto {
+
+    private Long id;
+    private String title;
+    private Integer order;
+    private Integer allowedWrongFlags;
+    private Integer allowedCommands;
+    private Integer estimatedDuration;
+    private Long maxScore;
+    private List<DecisionMatrixRowDto> decisionMatrix;
+
+    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 Integer getAllowedWrongFlags() {
+        return allowedWrongFlags;
+    }
+
+    public void setAllowedWrongFlags(Integer allowedWrongFlags) {
+        this.allowedWrongFlags = allowedWrongFlags;
+    }
+
+    public Integer getAllowedCommands() {
+        return allowedCommands;
+    }
+
+    public void setAllowedCommands(Integer allowedCommands) {
+        this.allowedCommands = allowedCommands;
+    }
+
+    public Integer getEstimatedDuration() {
+        return estimatedDuration;
+    }
+
+    public void setEstimatedDuration(Integer estimatedDuration) {
+        this.estimatedDuration = estimatedDuration;
+    }
+
+    public Long getMaxScore() {
+        return maxScore;
+    }
+
+    public void setMaxScore(Long maxScore) {
+        this.maxScore = maxScore;
+    }
+
+    public List<DecisionMatrixRowDto> getDecisionMatrix() {
+        return decisionMatrix;
+    }
+
+    public void setDecisionMatrix(List<DecisionMatrixRowDto> decisionMatrix) {
+        this.decisionMatrix = decisionMatrix;
+    }
+}
diff --git a/src/main/java/com/example/demo/mapper/BeanMapper.java b/src/main/java/com/example/demo/mapper/BeanMapper.java
index 4d886e173fbc34495d07703d66a9d3cb66ebecaa..1f380c16fec1c36dfa0b6c4a10f14e00c1c2de10 100644
--- a/src/main/java/com/example/demo/mapper/BeanMapper.java
+++ b/src/main/java/com/example/demo/mapper/BeanMapper.java
@@ -18,6 +18,7 @@ import com.example.demo.dto.InfoLevelCreateDto;
 import com.example.demo.dto.InfoLevelDto;
 import com.example.demo.dto.InfoLevelUpdateDto;
 import com.example.demo.dto.PhaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.QuestionnaireLevelDto;
@@ -87,6 +88,8 @@ public interface BeanMapper {
 
     PhaseLevel toEntity(PhaseLevelDto phaseLevel);
 
+    PhaseLevel toEntity(PhaseLevelUpdateDto phaseLevelUpdateDto);
+
     AssessmentLevel toAssessmentLevel(GameDefinitionCreateDto gameDefinitionCreateDto);
 
     InfoLevel toInfoLevel(GameDefinitionCreateDto gameDefinitionCreateDto);
diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java
index 1b61e2b14d53fd02f51c4bd91b1e90918933da24..a450ccee98d30a33b7e1cc2b569026a7682b1783 100644
--- a/src/main/java/com/example/demo/service/LevelOperationsService.java
+++ b/src/main/java/com/example/demo/service/LevelOperationsService.java
@@ -1,9 +1,11 @@
 package com.example.demo.service;
 
 import com.example.demo.domain.BaseLevel;
+import com.example.demo.domain.PhaseLevel;
 import com.example.demo.domain.Task;
 import com.example.demo.domain.InfoLevel;
 import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.TaskDto;
@@ -128,6 +130,11 @@ public class LevelOperationsService {
         infoLevelService.updateInfoLevel(infoLevel);
     }
 
+    public void updatePhaseLevel(PhaseLevelUpdateDto phaseLevelUpdateDto) {
+        PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(phaseLevelUpdateDto);
+        phaseLevelService.updatePhaseLevel(phaseLevel);
+    }
+
     public void updateTask(TaskUpdateDto taskUpdateDto) {
         Task task = BeanMapper.INSTANCE.toEntity(taskUpdateDto);
         taskService.updateTask(task);
diff --git a/src/main/java/com/example/demo/service/PhaseLevelService.java b/src/main/java/com/example/demo/service/PhaseLevelService.java
index b4a2ceccab94eddfb4c3123e0d3656bb6a2546d3..e118b5607e6b9420073b1056ddf2dabac2a403a8 100644
--- a/src/main/java/com/example/demo/service/PhaseLevelService.java
+++ b/src/main/java/com/example/demo/service/PhaseLevelService.java
@@ -6,14 +6,20 @@ import com.example.demo.dto.PhaseLevelDto;
 import com.example.demo.mapper.BeanMapper;
 import com.example.demo.repository.BaseLevelRepository;
 import com.example.demo.repository.PhaseLevelRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.Collections;
+import java.util.Optional;
 
 @Service
 public class PhaseLevelService {
 
+    private static final Logger LOG = LoggerFactory.getLogger(PhaseLevelService.class);
+
     @Autowired
     private PhaseLevelRepository phaseLevelRepository;
 
@@ -42,4 +48,26 @@ public class PhaseLevelService {
 
         return BeanMapper.INSTANCE.toDto(persistedEntity);
     }
+
+    public PhaseLevelDto updatePhaseLevel(PhaseLevel phaseLevel) {
+        Optional<PhaseLevel> persistedPhaseLevel = phaseLevelRepository.findById(phaseLevel.getId());
+
+        if (persistedPhaseLevel.isEmpty()) {
+            // TODO return 404
+            LOG.error("No phase level found with ID {}.", phaseLevel.getId());
+            return new PhaseLevelDto();
+        }
+
+        phaseLevel.setTrainingDefinitionId(persistedPhaseLevel.get().getTrainingDefinitionId());
+        phaseLevel.setOrder(persistedPhaseLevel.get().getOrder());
+        phaseLevel.setSubLevels(persistedPhaseLevel.get().getSubLevels());
+
+        if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) {
+            phaseLevel.getDecisionMatrix().forEach(x -> x.setPhaseLevel(phaseLevel));
+        }
+
+        PhaseLevel savedEntity = phaseLevelRepository.save(phaseLevel);
+
+        return BeanMapper.INSTANCE.toDto(savedEntity);
+    }
 }