diff --git a/tp1/Cohort.java b/tp1/Cohort.java
new file mode 100644
index 0000000000000000000000000000000000000000..e199e790e8c0dad4a95033147e150e6a0a1a8fd6
--- /dev/null
+++ b/tp1/Cohort.java
@@ -0,0 +1,53 @@
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A group of students.
+ */
+
+public class Cohort {
+  private final String name;
+  private final List<Student> students;
+
+  /**
+   * Constructs a cohort with a name equals to the specified {@code name} and no students.
+   * @param name the name of the constructed Cohort
+   */
+
+  public Cohort(String name) {
+    this.name = name;
+    this.students = new ArrayList<>();
+  }
+
+  /**
+   * Add the specified {@code student} to the students of the cohort.
+   * @param student the student to be added to the cohort
+   */
+  public void addStudent(Student student){
+  }
+
+  /**
+   * Returns the list of students of the cohort.
+   * @return the list of students of the cohort.
+   */
+  public List<Student> getStudents(){
+  }
+
+  /**
+   * Print via the standard output the name of the cohort and all results associated to the students with their average
+   * grade.
+   */
+  public void printStudentsResults(){
+  }
+
+  private void printName(){
+  }
+
+  /**
+   * Returns the name of the cohort.
+   * @return the name of the cohort
+   */
+  @Override
+  public String toString() {
+  }
+}
diff --git a/tp1/Grade.java b/tp1/Grade.java
new file mode 100644
index 0000000000000000000000000000000000000000..f25893ad124c14486ec41755c07bd60cd3a9148b
--- /dev/null
+++ b/tp1/Grade.java
@@ -0,0 +1,77 @@
+import java.util.List;
+
+/**
+ * A grade with a float value comprised between 0 and 20.
+ *
+ */
+public class Grade {
+  /**
+   * The maximum value of a grade.
+   */
+  private static final int MAXIMUM_GRADE = 20;
+  private final double value;
+
+  /**
+   * Constructs a grade with a value equals to the specified {@code value}.
+   *
+   * @param value the value of the constructed grade
+   */
+
+  public Grade(double value) {
+    this.value = value;
+  }
+
+  /**
+   * Returns the value of the grade as a double.
+   *
+   * @return the value of the grade
+   */
+
+  public double getValue() {
+  }
+
+  /**
+   * Returns a string representation of the grade in the format X.X/20.
+   * @return a string representation of the grade
+   */
+  @Override
+  public String toString() {
+  }
+
+  /**
+   * Returns a grade with a value equals to the arithmetic mean of the values of the grade in
+   * the specified list.
+   *
+   * @param grades a list of grades
+   * @return a grade corresponding to the mean of grade in {@code grades}
+   */
+  public static Grade averageGrade(List<Grade> grades){
+  }
+
+  /**
+   * Determines whether or not two grades are equal. Two instances of Grade are equal if the values
+   * of their {@code value} member field are the same.
+   * @param o  an object to be compared with this Grade
+   * @return {@code true} if the object to be compared is an instance of Grade and has the same value; {@code false}
+   * otherwise.
+   */
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    Grade grade = (Grade) o;
+
+    return Double.compare(grade.value, value) == 0;
+  }
+
+  /**
+   * Returns a hash code value for the object.
+   * @return a hash code value for this object.
+   */
+  @Override
+  public int hashCode() {
+    long temp = Double.doubleToLongBits(value);
+    return (int) (temp ^ (temp >>> 32));
+  }
+}
diff --git a/tp1/Main.java b/tp1/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..48c980587340fceae55d795e21d60eec84c51690
--- /dev/null
+++ b/tp1/Main.java
@@ -0,0 +1,14 @@
+public class Main {
+  public static void main(String[] args){
+    Student student1 = new Student("Arnaud", "Labourel");
+    Student student2 = new Student("Paul", "Calcul");
+    student1.addResult("Programmation 2", new Grade(20));
+    student2.addResult("Programmation 2", new Grade(0));
+    student1.addResult("Structures discrètes", new Grade(20));
+    student2.addResult("Structures discrètes", new Grade(0));
+    Cohort cohort = new Cohort("L2 informatique");
+    cohort.addStudent(student1);
+    cohort.addStudent(student2);
+    cohort.printStudentsResults();
+  }
+}
diff --git a/tp1/Student.java b/tp1/Student.java
new file mode 100644
index 0000000000000000000000000000000000000000..193bd848809f4941b8d098898c0c373aa7f459bd
--- /dev/null
+++ b/tp1/Student.java
@@ -0,0 +1,91 @@
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A students with results.
+ */
+
+public class Student {
+  private final String firstName;
+  private final String lastName;
+  private final List<TeachingUnitResult> results;
+
+  /**
+   * Constructs a student with the specified first name and last name and no associated results.
+   *
+   * @param firstName the first name of the constructed student
+   * @param lastName the last name of the constructed student
+   */
+
+  public Student(String firstName, String lastName) {
+    this.firstName = firstName;
+    this.lastName = lastName;
+    this.results = new ArrayList<>();
+  }
+
+  /**
+   * Add a grade associated to a teaching unit to the results of the student.
+   *
+   * @param teachingUnitName the name of the teaching unit of the added result
+   * @param grade the grade of the added result
+   */
+  public void addResult(String teachingUnitName, Grade grade){
+  }
+
+  /**
+   * Returns a string representation of the student in the format first name last name.
+   * @return a string representation of the student
+   */
+  @Override
+  public String toString() {
+  }
+
+
+  /**
+   * Returns the grades of the student.
+   *
+   * @return the grades of the student
+   */
+  public List<Grade> getGrades(){
+  }
+
+  /**
+   * Returns the average grade of the student.
+   *
+   * @return the average grade of the student
+   */
+  public Grade getAverageGrade() {
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    Student student = (Student) o;
+
+    if (!firstName.equals(student.firstName)) return false;
+    return lastName.equals(student.lastName);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = firstName.hashCode();
+    result = 31 * result + lastName.hashCode();
+    return result;
+  }
+
+  /**
+   * Print via the standard output the name of the student, all results associated to the students and
+   * the average grade of the student.
+   */
+  public void printResults(){
+  }
+
+  private void printName() {
+  }
+
+  private void printAverageGrade() {
+  }
+
+}
diff --git a/tp1/TeachingUnitResult.java b/tp1/TeachingUnitResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..c052586a62e9513c55979121bb6ff8b67972fc71
--- /dev/null
+++ b/tp1/TeachingUnitResult.java
@@ -0,0 +1,38 @@
+/**
+ * A result corresponding to a grade associated with a teaching unit.
+ */
+
+public class TeachingUnitResult {
+  private final String teachingUnitName;
+  private final Grade grade;
+
+
+  /**
+   * Constructs an instance of TeachingUnitResult with a grade equals to the specified {@code grade}
+   * and a teaching unit name equals to the specified {@code teachingUnitName}.
+   *
+   * @param teachingUnitName the name of the teaching unit of the constructed TeachingUnitResult
+   * @param grade the grade of the constructed TeachingUnitResult
+   */
+
+  public TeachingUnitResult(String teachingUnitName, Grade grade) {
+    this.teachingUnitName = teachingUnitName;
+    this.grade = grade;
+  }
+
+  /**
+   * Returns the grade associated to the result.
+   *
+   * @return the grade associated to the result
+   */
+  public Grade getGrade() {
+  }
+
+  /**
+   * Returns a string representation of the result in the format Name of the teaching unit : X.X.
+   * @return a string representation of the result
+   */
+  @Override
+  public String toString() {
+  }
+}