diff --git a/src/main/java/id/ac/ui/cs/advprog/turorial0/controller/StudentController.java b/src/main/java/id/ac/ui/cs/advprog/turorial0/controller/StudentController.java
new file mode 100644
index 0000000000000000000000000000000000000000..62a2ff552c3a8665d0a652d06fcfb5d21c8c2965
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/turorial0/controller/StudentController.java
@@ -0,0 +1,46 @@
+package id.ac.ui.cs.advprog.turorial0.controller;
+
+import id.ac.ui.cs.advprog.turorial0.exception.DuplicateStudentNameException;
+import id.ac.ui.cs.advprog.turorial0.model.Student;
+import id.ac.ui.cs.advprog.turorial0.service.StudentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+@RequestMapping("/student")
+public class StudentController {
+
+    @Autowired
+    private StudentService service;
+
+    @GetMapping("/list")
+    public String studentListPage(Model model) {
+        List<Student> allStudents = service.findAll();
+        model.addAttribute("students", allStudents);
+        return "studentList";
+    }
+
+    @GetMapping("/create")
+    public String createStudentPage(Model model) {
+        Student student = new Student();
+        model.addAttribute("student", student);
+        return "createStudent";
+    }
+
+    @PostMapping("/create")
+    public String createStudentPost(@ModelAttribute Student student, Model model) {
+        try {
+            service.create(student);
+        } catch (DuplicateStudentNameException e) {
+            model.addAttribute("error", e);
+            model.addAttribute("student", student);
+            return "createStudent";
+        }
+        return "redirect:list";
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/id/ac/ui/cs/advprog/turorial0/exception/DuplicateStudentNameException.java b/src/main/java/id/ac/ui/cs/advprog/turorial0/exception/DuplicateStudentNameException.java
new file mode 100644
index 0000000000000000000000000000000000000000..59153f3469b66350a17efb9b60c7e9371406c805
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/turorial0/exception/DuplicateStudentNameException.java
@@ -0,0 +1,7 @@
+package id.ac.ui.cs.advprog.turorial0.exception;
+
+public class DuplicateStudentNameException extends RuntimeException {
+    public DuplicateStudentNameException(String studentName) {
+        super(String.format("The student name %s is a duplicate!", studentName));
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/id/ac/ui/cs/advprog/turorial0/model/Student.java b/src/main/java/id/ac/ui/cs/advprog/turorial0/model/Student.java
new file mode 100644
index 0000000000000000000000000000000000000000..389718300534580d763e49262089512b5b58b310
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/turorial0/model/Student.java
@@ -0,0 +1,12 @@
+package id.ac.ui.cs.advprog.turorial0.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Student {
+    private String name;
+    private String npm;
+    private String address;
+}