diff --git a/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Grade.java b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Grade.java
new file mode 100644
index 0000000000000000000000000000000000000000..3557cea7740396303db6492c38946f0933e7f3a9
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Grade.java
@@ -0,0 +1,34 @@
+package uk.ac.rhul.cs2800.model;
+
+/**
+ * This class represents a grade with both a numeric score and a module it belongs to.
+ */
+public class Grade {
+
+  private int score;
+  private Module module;
+
+  /**
+   * Constructs a Grade with the score and module.
+   * score of the grade module associated with the grade
+   */
+
+  public Grade(int score, Module module) {
+    this.score = score;
+    this.module = module;
+  }
+
+  public int getScore() {
+    return score;
+  }
+
+  public Module getModule() {
+    return module;
+  }
+
+
+  public void setScore(int score) {
+    this.score = score;
+  }
+
+}
diff --git a/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Module.java b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Module.java
new file mode 100644
index 0000000000000000000000000000000000000000..beed78715240b78c550473a11f9c049ee50a2713
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Module.java
@@ -0,0 +1,32 @@
+package uk.ac.rhul.cs2800.model;
+
+/**
+ * Represents a module with its code, name, and mandatory status.
+ */
+
+public class Module {
+  private String code;
+  private String name;
+  private boolean nmc;
+
+  /**
+   * Defines a module, including its code, name, and whether it's a mandatory module.
+   */
+  public Module(String code, String name, boolean nmc) {
+    this.code = code;
+    this.name = name;
+    this.nmc = nmc;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public boolean isNmc() {
+    return nmc;
+  }
+}
diff --git a/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Registration.java b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Registration.java
new file mode 100644
index 0000000000000000000000000000000000000000..7fb54ff44fefd64a22b532ac8762f618c97716d7
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Registration.java
@@ -0,0 +1,27 @@
+package uk.ac.rhul.cs2800.model;
+
+/**
+ * Registers a student to a specified module.
+ */
+
+public class Registration {
+  private Student student;
+  private Module module;
+
+  /**
+   * Registers a student to a specified module.
+   */
+
+  public Registration(Student student, Module module) {
+    this.student = student;
+    this.module = module;
+  }
+
+  public Student getStudent() {
+    return student;
+  }
+
+  public Module getModule() {
+    return module;
+  }
+}
diff --git a/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Student.java b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Student.java
new file mode 100644
index 0000000000000000000000000000000000000000..f50c16d080761ad4bbe7325341373fa3f492d5e5
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/main/java/uk/ac/rhul/cs2800/model/Student.java
@@ -0,0 +1,89 @@
+package uk.ac.rhul.cs2800.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import uk.ac.rhul.cs2800.model.exception.NoGradeAvailableException;
+
+/**
+ * Represents a student with personal and academic information.
+ */
+public class Student {
+
+  private Long id;
+  private String grade;
+  private String firstName;
+  private String lastName;
+  private String username;
+  private String email;
+  private List<Grade> grades = new ArrayList<>();
+  private List<Module> modules = new ArrayList<>();
+
+  /**
+   * Represents a student with basic identifying information. Each student has a unique ID, personal
+   * details, and contact information.
+   */
+
+  public Student(Long id, String firstName, String lastName, String username, String email) {
+    this.id = id;
+    this.firstName = firstName;
+    this.lastName = lastName;
+    this.username = username;
+    this.email = email;
+  }
+
+  /**
+   * Adds a grade to the student's list of grades.
+   *
+   * @param g the grade to add
+   */
+
+  public void addGrade(Grade g) {
+    grades.add(g);
+  }
+
+  /**
+   * Adds a grade to the student's list of grades.
+   *
+   * 
+   */
+
+  public Grade getGrade(Module m) throws NoGradeAvailableException {
+    for (Grade grade : grades) {
+      if (grade.getModule().equals(m)) {
+        return grade;
+      }
+    }
+    throw new NoGradeAvailableException("No grade available for module: " + m.getName());
+  }
+
+  /**
+   * Adds a grade to the student's list of grades.
+   *
+   * @param m the grade to add
+   */
+  public void registerModule(Module m) {
+    modules.add(m);
+  }
+
+  /**
+   * 0 if grade is empty.
+   */
+
+  public float computeAverage() {
+    if (grades.isEmpty()) {
+      return 0;
+    }
+    int total = 0;
+    for (Grade grade : grades) {
+      total += grade.getScore();
+    }
+    return (float) total / grades.size();
+  }
+
+
+
+  public List<Module> getModules() {
+    return modules;
+  }
+
+}
diff --git a/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/GradeTest.java b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/GradeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b16fcf7083caf46909115a21990e61a2d5cc7a0
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/GradeTest.java
@@ -0,0 +1,24 @@
+package uk.ac.rhul.cs2800.model;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+class GradeTest {
+
+  @Test
+  void testGradeInitialization() {
+    Module module = new Module("CS2800", "CS4600", false);
+    Grade grade = new Grade(50, module);
+
+    equals(50);
+    assertEquals(module, grade.getModule());
+  }
+
+  @Test
+  void testSetScore() {
+    Grade grade = new Grade(50, null);
+    grade.setScore(95);
+    assertEquals(95, grade.getScore());
+  }
+}
diff --git a/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/ModuleTest.java b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/ModuleTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..60cf663a94322d520cc81f5e192796a49d9ee033
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/ModuleTest.java
@@ -0,0 +1,18 @@
+package uk.ac.rhul.cs2800.model;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import org.junit.jupiter.api.Test;
+
+class ModuleTest {
+
+  @Test
+  void testModuleInitialization() {
+    Module module = new Module("CS2800", "ComputerScience", false);
+
+    assertEquals("CS2800", module.getCode());
+    assertEquals("ComputerScience", module.getName());
+    assertFalse(module.isNmc());
+  }
+}
diff --git a/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/RegistrationTest.java b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/RegistrationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f658d75d1a292501ae9d4c0264482279c5f0753b
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/RegistrationTest.java
@@ -0,0 +1,18 @@
+package uk.ac.rhul.cs2800.model;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+class RegistrationTest {
+
+  @Test
+  void testRegistrationInitialization() {
+    Student student = new Student(1L, "Anna", "Angelina", "Alina", "Izzy");
+    Module module = new Module("CS2800", "ComputerScience", false);
+    Registration registration = new Registration(student, module);
+
+    assertEquals(student, registration.getStudent());
+    assertEquals(module, registration.getModule());
+  }
+}
diff --git a/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/StudentTest.java b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/StudentTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fbedc34987a2fcb5381dc19a616c7ff38509d82
--- /dev/null
+++ b/CW1/StudentGradeManagment/src/test/java/uk/ac/rhul/cs2800/model/StudentTest.java
@@ -0,0 +1,52 @@
+package uk.ac.rhul.cs2800.model;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import uk.ac.rhul.cs2800.model.exception.NoGradeAvailableException;
+
+
+class StudentTest {
+
+  private Student student;
+  private Module module;
+  private Grade grade;
+
+
+  @BeforeEach
+  void setUp() {
+    student = new Student(1L, "Anna", "Angelina", "Alina", "Izzy");
+    module = new Module("CS2800", "ComputerScience", false);
+    grade = new Grade(85, module);
+  }
+
+  @Test
+  void testAddGrade() throws NoGradeAvailableException {
+    student.addGrade(grade);
+    assertEquals(grade, student.getGrade(module));
+  }
+
+  @Test
+  void testComputeAverage() {
+    student.addGrade(new Grade(50, module));
+    student.addGrade(new Grade(90, new Module("CS2800", "ComputerScience", false)));
+    assertEquals(70.0, student.computeAverage(), 0.01);
+  }
+
+  @Test
+  void testGetGradeThrowsExceptionWhenNoGrade() {
+    Module newModule = new Module("CS2800", "ComputerScience", false);
+    assertThrows(NoGradeAvailableException.class, () -> student.getGrade(newModule));
+  }
+
+  @Test
+  void testRegisterModule() {
+    student.registerModule(module);
+
+    assertTrue(student.getModules().contains(module));
+  }
+}