diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfd9d86ee3dd2261bcf64376637b560f3edddd4c
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java
@@ -0,0 +1,40 @@
+package id.ac.ui.cs.advprog.tutorial0.controller;
+
+import id.ac.ui.cs.advprog.tutorial0.model.Course;
+import id.ac.ui.cs.advprog.tutorial0.service.course.CourseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+@Controller
+@RequestMapping("/course")
+public class CourseController {
+    @Autowired
+    private CourseService service;
+
+    @GetMapping("/list")
+    public String courseListPage(Model model) {
+        List<Course> allCourses = service.findAll();
+        model.addAttribute("courses", allCourses);
+        return "courseList";
+    }
+
+    @GetMapping("/create")
+    public String createCoursePage(Model model) {
+        Course course = new Course();
+        model.addAttribute("course", course);
+        return "createCourse";
+    }
+
+    @PostMapping("/create")
+    public String createCoursePost(@ModelAttribute Course course, Model model) {
+        service.create(course);
+        return "redirect:list";
+    }
+}
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java
index 1cf06575df766e412e82adfbd0f06e0e09b7d51b..9d4295bb2e87ebbddfa872bddd05c9de35bd0c1c 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java
@@ -2,7 +2,7 @@ package id.ac.ui.cs.advprog.tutorial0.controller;
 
 import id.ac.ui.cs.advprog.tutorial0.exception.DuplicateStudentNameException;
 import id.ac.ui.cs.advprog.tutorial0.model.Student;
-import id.ac.ui.cs.advprog.tutorial0.service.StudentService;
+import id.ac.ui.cs.advprog.tutorial0.service.student.StudentService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/model/Course.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/model/Course.java
new file mode 100644
index 0000000000000000000000000000000000000000..21d0aae7f4dd1d99103704eb945731b08611d97e
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/model/Course.java
@@ -0,0 +1,11 @@
+package id.ac.ui.cs.advprog.tutorial0.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter @Setter
+public class Course {
+    private String courseId;
+    private String courseName;
+    private boolean vacancyStatus;
+}
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..05011c5f4eff7511502f1d34ce071107d778e8be
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java
@@ -0,0 +1,22 @@
+package id.ac.ui.cs.advprog.tutorial0.repository;
+
+import id.ac.ui.cs.advprog.tutorial0.model.Course;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+@Repository
+public class CourseRepository {
+    private List<Course> coursesInMemory = new ArrayList<>();
+
+    public Course create(Course course) {
+        coursesInMemory.add(course);
+        return course;
+    }
+
+    public Iterator<Course> findAll() {
+        return coursesInMemory.iterator();
+    }
+}
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseService.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseService.java
new file mode 100644
index 0000000000000000000000000000000000000000..878627ffe6ee99b86317ce622baeb7309c37ba30
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseService.java
@@ -0,0 +1,10 @@
+package id.ac.ui.cs.advprog.tutorial0.service.course;
+
+import id.ac.ui.cs.advprog.tutorial0.model.Course;
+
+import java.util.List;
+
+public interface CourseService {
+    public Course create(Course course);
+    public List<Course> findAll();
+}
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..b40567a829b3cf324b2042f8388dedb9bd469c98
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseServiceImpl.java
@@ -0,0 +1,41 @@
+package id.ac.ui.cs.advprog.tutorial0.service.course;
+
+import id.ac.ui.cs.advprog.tutorial0.model.Course;
+import id.ac.ui.cs.advprog.tutorial0.repository.CourseRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+@Service
+public class CourseServiceImpl implements CourseService {
+    @Autowired
+    private CourseRepository courseRepository;
+
+    @Override
+    public Course create(Course course) {
+        generateCourseId(course);
+        course.setVacancyStatus(true);
+        courseRepository.create((course));
+        return course;
+    }
+
+    private void generateCourseId(Course course) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (char letter: course.getCourseName().toCharArray()) {
+            stringBuilder.append((int)letter);
+        }
+        String courseId = stringBuilder.toString();
+        course.setCourseId(courseId);
+    }
+
+    @Override
+    public List<Course> findAll() {
+        Iterator<Course> courseIterator = courseRepository.findAll();
+        List<Course> allCourses = new ArrayList<>();
+        courseIterator.forEachRemaining(allCourses::add);
+        return allCourses;
+    }
+}
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentService.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentService.java
similarity index 77%
rename from src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentService.java
rename to src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentService.java
index e6d77e0d11ff3d379a93613d3bb2d784494bdde9..bfae24b7f6b54ab60e476d84e39fd40adcba9e78 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentService.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentService.java
@@ -1,4 +1,4 @@
-package id.ac.ui.cs.advprog.tutorial0.service;
+package id.ac.ui.cs.advprog.tutorial0.service.student;
 
 import id.ac.ui.cs.advprog.tutorial0.model.Student;
 
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentServiceImpl.java
similarity index 96%
rename from src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentServiceImpl.java
rename to src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentServiceImpl.java
index 741d86e1e596d77ca975b269704881a720260c75..be1d653bc3fea2eb07953387e834aceb6d261896 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentServiceImpl.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentServiceImpl.java
@@ -1,4 +1,4 @@
-package id.ac.ui.cs.advprog.tutorial0.service;
+package id.ac.ui.cs.advprog.tutorial0.service.student;
 
 import id.ac.ui.cs.advprog.tutorial0.exception.DuplicateStudentNameException;
 import id.ac.ui.cs.advprog.tutorial0.model.Student;
diff --git a/src/main/resources/templates/courseList.html b/src/main/resources/templates/courseList.html
new file mode 100644
index 0000000000000000000000000000000000000000..79523fbc4bbe184eb7413d7267f7aa305980622b
--- /dev/null
+++ b/src/main/resources/templates/courseList.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Course List</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
+</head>
+<body>
+<h2>Course' List</h2>
+<a th:href="@{/course/create}" class="btn btn-primary btn-sm mb-3" >Create course</a>
+
+<table class="table">
+    <thead>
+    <tr>
+        <th scope="col">Course Id</th>
+        <th scope="col">Course Name</th>
+        <th scope="col">Vacancy Status</th>
+    </tr>
+    </thead>
+    <tbody th:each="course: ${courses}">
+    <tr>
+        <td th:text="${course.courseId}"></td>
+        <td th:text="${course.courseName}"></td>
+        <td th:text="${course.vacancyStatus}"></td>
+    </tr>
+
+    </tbody>
+</table>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/createCourse.html b/src/main/resources/templates/createCourse.html
new file mode 100644
index 0000000000000000000000000000000000000000..1236fced4530cc928e99570e73deaec96cdd5b43
--- /dev/null
+++ b/src/main/resources/templates/createCourse.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Create new Course</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
+</head>
+<body>
+<h3>Create new Course</h3>
+<form th:action="@{/course/create}" th:object="${course}" method="post">
+    <div class="form-group">
+        <label for="nameInput">Name</label>
+        <input th:field="*{courseName}" type="text" class="form-control" id="nameInput" aria-describedby="nameHelp" placeholder="Enter course' name">
+<!--        <small id="nameHelp" class="form-text text-muted">Please enter unique name.</small>-->
+    </div>
+    <button type="submit" class="btn btn-primary">Submit</button>
+</form>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
+</body>
+</html>
\ No newline at end of file