diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java
index 40f90e063d814cc94143246ef855a32e0bdb59a1..2e997bd03a9ce9056bbe77917bb21a62273237ae 100644
--- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java
+++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java
@@ -1,22 +1,12 @@
 package org.fuseri.moduleexercise.question;
 
-import jakarta.persistence.EntityNotFoundException;
 import org.fuseri.model.dto.common.Result;
 import org.fuseri.model.dto.exercise.QuestionCreateDto;
 import org.fuseri.model.dto.exercise.QuestionDto;
-import org.fuseri.moduleexercise.answer.Answer;
-import org.fuseri.moduleexercise.answer.AnswerMapper;
-import org.fuseri.moduleexercise.answer.AnswerService;
-import org.fuseri.moduleexercise.exercise.Exercise;
-import org.fuseri.moduleexercise.exercise.ExerciseService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.server.ResponseStatusException;
 
-import java.util.HashSet;
-
 /**
  * Represent a REST API controller for questions
  * Handle HTTP requests related to questions
@@ -25,29 +15,16 @@ import java.util.HashSet;
 @RequestMapping("/questions")
 public class QuestionController {
 
-    private final QuestionService questionService;
-    private final ExerciseService exerciseService;
-    private final AnswerService answerService;
-    private final QuestionMapper questionMapper;
-    private final AnswerMapper answerMapper;
+    private final QuestionFacade questionFacade;
 
     /**
      * Constructor for QuestionController
      *
-     * @param questionService the service responsible for handling question-related logic
-     * @param exerciseService the service responsible for handling exercise-related logic
-     * @param answerService   the service responsible for handling answer-related logic
-     * @param answerMapper    the mapper responsible for converting between Answer DTOs and entities
-     * @param questionMapper  the mapper responsible for converting between Question DTOs and entities
+     * @param questionFacade the service responsible for handling question-related logic
      */
     @Autowired
-    public QuestionController(QuestionService questionService, ExerciseService exerciseService, AnswerService answerService,
-                              QuestionMapper questionMapper, AnswerMapper answerMapper) {
-        this.questionService = questionService;
-        this.exerciseService = exerciseService;
-        this.answerService = answerService;
-        this.questionMapper = questionMapper;
-        this.answerMapper = answerMapper;
+    public QuestionController(QuestionFacade questionFacade) {
+        this.questionFacade = questionFacade;
     }
 
     /**
@@ -58,8 +35,7 @@ public class QuestionController {
      */
     @GetMapping("/{id}")
     public QuestionDto find(@PathVariable String id) {
-        var a = questionService.find(id);
-        return questionMapper.toDto(a);
+        return questionFacade.find(id);
     }
 
     /**
@@ -71,8 +47,7 @@ public class QuestionController {
      */
     @GetMapping("/exercise/{exerciseId}")
     public Result<QuestionDto> findByExerciseId(@PathVariable String exerciseId, @RequestParam int page) {
-        Page<Question> questions = questionService.findByExerciseId(exerciseId, page);
-        return questionMapper.toResult(questions);
+        return questionFacade.findByExerciseId(exerciseId, page);
     }
 
     /**
@@ -84,33 +59,6 @@ public class QuestionController {
      */
     @PostMapping
     public QuestionDto addQuestion(@RequestBody QuestionCreateDto dto) {
-        Exercise exercise;
-        try {
-            exercise = exerciseService.find(dto.getExerciseId());
-        } catch (EntityNotFoundException e) {
-            throw new ResponseStatusException(HttpStatus.NOT_FOUND,
-                    "Exercise not found with id: " + dto.getExerciseId());
-        }
-
-        Question question = questionMapper.fromCreateDto(dto);
-        exercise.getQuestions().add(question);
-        question.setExerciseId(exercise.getId());
-
-        var answerDtos = dto.getAnswers();
-        var answers = new HashSet<Answer>();
-        for (var answerDto : answerDtos) {
-            Answer answer = answerMapper.fromCreateDto(answerDto);
-            answer = answerService.create(answer);
-            answers.add(answer);
-        }
-
-        question.setAnswers(answers);
-        var createdQuestion = questionService.create(question);
-
-        for (var answer : answers) {
-            answer.setQuestionId(createdQuestion.getId());
-        }
-
-        return questionMapper.toDto(createdQuestion);
+        return questionFacade.addQuestion(dto);
     }
 }
\ No newline at end of file
diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionFacade.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a7e712fb3e60ac36e915428e724602c8cbbeda6
--- /dev/null
+++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionFacade.java
@@ -0,0 +1,100 @@
+package org.fuseri.moduleexercise.question;
+
+import jakarta.persistence.EntityNotFoundException;
+import org.fuseri.model.dto.common.Result;
+import org.fuseri.model.dto.exercise.QuestionCreateDto;
+import org.fuseri.model.dto.exercise.QuestionDto;
+import org.fuseri.moduleexercise.answer.Answer;
+import org.fuseri.moduleexercise.answer.AnswerMapper;
+import org.fuseri.moduleexercise.answer.AnswerService;
+import org.fuseri.moduleexercise.exercise.Exercise;
+import org.fuseri.moduleexercise.exercise.ExerciseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.HashSet;
+
+@Service
+public class QuestionFacade {
+    private final QuestionService questionService;
+    private final ExerciseService exerciseService;
+    private final AnswerService answerService;
+    private final QuestionMapper questionMapper;
+    private final AnswerMapper answerMapper;
+
+    @Autowired
+    public QuestionFacade(
+            QuestionService questionService, ExerciseService exerciseService,
+            AnswerService answerService, QuestionMapper questionMapper,
+            AnswerMapper answerMapper) {
+        this.questionService = questionService;
+        this.exerciseService = exerciseService;
+        this.answerService = answerService;
+        this.questionMapper = questionMapper;
+        this.answerMapper = answerMapper;
+    }
+
+    /**
+     * Find a question by ID.
+     *
+     * @param id the ID of the question to find
+     * @return a QuestionDto object representing the found question
+     */
+    public QuestionDto find(String id) {
+        var a = questionService.find(id);
+        return questionMapper.toDto(a);
+    }
+
+    /**
+     * Find questions by exercise ID and return them in a paginated format
+     *
+     * @param exerciseId the ID of the exercise to find questions for
+     * @param page       the page number of the questions to retrieve
+     * @return a Result object containing a list of QuestionDto objects and pagination information
+     */
+    public Result<QuestionDto> findByExerciseId(String exerciseId, int page) {
+        Page<Question> questions = questionService.findByExerciseId(exerciseId, page);
+        return questionMapper.toResult(questions);
+    }
+
+    /**
+     * Add a new question to an exercise
+     *
+     * @param dto a QuestionCreateDto object representing the new question to add
+     * @return a QuestionDto object representing the added question
+     * @throws ResponseStatusException if the exercise with exerciseId from QuestionCreateDto does not exist
+     */
+    public QuestionDto addQuestion(QuestionCreateDto dto) {
+        Exercise exercise;
+        try {
+            exercise = exerciseService.find(dto.getExerciseId());
+        } catch (EntityNotFoundException e) {
+            throw new ResponseStatusException(HttpStatus.NOT_FOUND,
+                    "Exercise not found with id: " + dto.getExerciseId());
+        }
+
+        Question question = questionMapper.fromCreateDto(dto);
+        exercise.getQuestions().add(question);
+        question.setExerciseId(exercise.getId());
+
+        var answerDtos = dto.getAnswers();
+        var answers = new HashSet<Answer>();
+        for (var answerDto : answerDtos) {
+            Answer answer = answerMapper.fromCreateDto(answerDto);
+            answer = answerService.create(answer);
+            answers.add(answer);
+        }
+
+        question.setAnswers(answers);
+        var createdQuestion = questionService.create(question);
+
+        for (var answer : answers) {
+            answer.setQuestionId(createdQuestion.getId());
+        }
+
+        return questionMapper.toDto(createdQuestion);
+    }
+}