diff --git a/src/tpQU/tp03/Defense.java b/src/tpQU/tp03/Defense.java
new file mode 100644
index 0000000000000000000000000000000000000000..3936f54f63b70f3a36a34c5123d40aae7869fe75
--- /dev/null
+++ b/src/tpQU/tp03/Defense.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class Defense {
+    
+}
diff --git a/src/tpQU/tp03/Person.java b/src/tpQU/tp03/Person.java
new file mode 100644
index 0000000000000000000000000000000000000000..0382a7c0220642f0f2afc7656eaf5e6f40e27ac8
--- /dev/null
+++ b/src/tpQU/tp03/Person.java
@@ -0,0 +1,20 @@
+package tpQU.tp03;
+
+public class Person {
+    String name;
+    String forename;
+
+    Person(String name, String forename){
+        this.name = name;
+        this.forename = forename;
+    }
+
+    String getName(){
+        return this.name;
+    }
+
+    String getForeame(){
+        return this.forename;
+    }
+}
+
diff --git a/src/tpQU/tp03/Planning.java b/src/tpQU/tp03/Planning.java
new file mode 100644
index 0000000000000000000000000000000000000000..55cebc9059c7a0008b083079eaeedf38674a55aa
--- /dev/null
+++ b/src/tpQU/tp03/Planning.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class Planning {
+    
+}
diff --git a/src/tpQU/tp03/Student.java b/src/tpQU/tp03/Student.java
new file mode 100644
index 0000000000000000000000000000000000000000..478cdbb1cf576d4b24120df5c505a43ad99ed0ab
--- /dev/null
+++ b/src/tpQU/tp03/Student.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class Student {
+    
+}
diff --git a/src/tpQU/tp03/Student1.java b/src/tpQU/tp03/Student1.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1db5f7dcd70c22e35911dfe2d6dff4842b32983
--- /dev/null
+++ b/src/tpQU/tp03/Student1.java
@@ -0,0 +1,12 @@
+package tpQU.tp03;
+
+public class Student1 extends Person{
+    boolean thirdtimecredit;
+    final static int DEFAULT_DURATION_STUDENT1=20;
+
+    Student1(boolean thirdtimecredit, String name, String forename){
+        super(name, forename);
+        this.thirdtimecredit = thirdtimecredit;
+    }
+
+}
diff --git a/src/tpQU/tp03/Student2.java b/src/tpQU/tp03/Student2.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e341a6a6879af988107eda4b1c27165aafeb0a0
--- /dev/null
+++ b/src/tpQU/tp03/Student2.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class Student2 {
+    
+}
diff --git a/src/tpQU/tp03/StudentBUT1.java b/src/tpQU/tp03/StudentBUT1.java
new file mode 100644
index 0000000000000000000000000000000000000000..a749fc2c1881c64d640f10ea195ee8598ae01b7d
--- /dev/null
+++ b/src/tpQU/tp03/StudentBUT1.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class StudentBUT1 {
+    
+}
diff --git a/src/tpQU/tp03/StudentBUT2.java b/src/tpQU/tp03/StudentBUT2.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8fc6b9dbf7c78d4013e297b50a701260e64303c
--- /dev/null
+++ b/src/tpQU/tp03/StudentBUT2.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class StudentBUT2 {
+    
+}
diff --git a/src/tpQU/tp03/UseStudent.java b/src/tpQU/tp03/UseStudent.java
new file mode 100644
index 0000000000000000000000000000000000000000..01cf9145bac4534b77c653b4d3d5829b0768ff85
--- /dev/null
+++ b/src/tpQU/tp03/UseStudent.java
@@ -0,0 +1,5 @@
+package tpQU.tp03;
+
+public class UseStudent {
+    
+}
diff --git a/test/tpQU/tp03/DefenseTest.java b/test/tpQU/tp03/DefenseTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6865e39ebbc454f5f7d8a3e88c0f4a42efc3ba23
--- /dev/null
+++ b/test/tpQU/tp03/DefenseTest.java
@@ -0,0 +1,90 @@
+package tpQU.tp03;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class DefenseTest {
+    public LocalDate day1, day2;
+    public LocalTime time1, time2;
+    public Student s1, s2, s3;
+    public Defense d1, d2, d3;
+    public String titleA, titleB, titleC;
+
+    @BeforeEach
+    public void initialization() {
+        titleA = "defenseA";
+        titleB = "defenseB";
+        titleC = "defenseC";
+        day1 = LocalDate.of(2022, 2, 2);
+        day2 = LocalDate.of(2023, 3, 3);
+        time1 = LocalTime.of(11, 11);
+        time2 = LocalTime.of(22, 22);
+        s1 = new StudentBUT1("Alice", "a");
+        s2 = new StudentBUT1("Bruno", "b");
+        s3 = new StudentBUT2("Clément", "c");
+        d1 = new Defense(Room.r0A20, s1, titleA);
+        d2 = new Defense(day1, Room.r0A20, s2, time1, titleB);
+        d3 = new Defense(day2, Room.r0A49, s3, time2, titleC);
+    }
+    
+    @Test
+    void testGetDay() {
+        assertNull(d1.getDay());
+        assertEquals(day1, d2.getDay());
+        assertEquals(day2, d3.getDay());
+    }
+
+    @Test
+    void testGetDuration() {
+        assertEquals(s1.getDuration(), d1.getDuration());
+        assertEquals(s2.getDuration(), d2.getDuration());
+        assertEquals(s3.getDuration(), d3.getDuration());
+    }
+
+    @Test
+    void testGetHour() {
+        assertNull(d1.getHour());
+        assertEquals(time1, d2.getHour());
+        assertEquals(time2, d3.getHour());
+    }
+
+    @Test
+    void testSetDay() {
+        assertNull(d1.getDay());
+        d1.setDay(day1);
+        assertEquals(day1, d1.getDay());
+        d1.setDay(day2);
+        assertEquals(day2, d1.getDay());
+        d1.setDay(LocalDate.now());
+        assertEquals(LocalDate.now(), d1.getDay());
+        d1.setDay(null);
+        assertNull(d1.getDay());
+    }
+
+    @Test
+    void testSetHour() {
+        assertNull(d1.getHour());
+        d1.setHour(time1);
+        assertEquals(time1, d1.getHour());
+        d1.setHour(time2);
+        assertEquals(time2, d1.getHour());
+        d1.setHour(null);
+        assertNull(d1.getHour());
+    }
+
+    @Test
+    void testToString() {
+        String result = d1.getDay() + ":" + d1.getHour() + " in " + d1.getPlace() + " --> " + d1.getStudent() + " :: " + d1.getTitle();
+        assertEquals(result, d1.toString());
+        result = d2.getDay() + ":" + d2.getHour() + " in " + d2.getPlace() + " --> " + d2.getStudent() + " :: " + d2.getTitle();
+        assertEquals(result, d2.toString());
+        result = d3.getDay() + ":" + d3.getHour() + " in " + d3.getPlace() + " --> " + d3.getStudent() + " :: " + d3.getTitle();
+        assertEquals(result, d3.toString());
+    }
+}
diff --git a/test/tpQU/tp03/PlanningTest.java b/test/tpQU/tp03/PlanningTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c8dfd062c6d4d4454ae2765e8f91955ffd2a316
--- /dev/null
+++ b/test/tpQU/tp03/PlanningTest.java
@@ -0,0 +1,168 @@
+package tpQU.tp03;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.ArrayList;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class PlanningTest {
+    public LocalDate day1, day2;
+    public LocalTime time1, time2;
+    public Student s1, s2, s3;
+    public Defense d1, d2, d3;
+    public String titleA, titleB, titleC;
+    public Planning plan;
+
+    @BeforeEach
+    public void initialization() {
+        titleA = "defenseA";
+        titleB = "defenseB";
+        titleC = "defenseC";
+        day1 = LocalDate.of(2022, 2, 2);
+        day2 = LocalDate.of(2023, 3, 3);
+        time1 = LocalTime.of(11, 11);
+        time2 = LocalTime.of(22, 22);
+        s1 = new StudentBUT1("Alice", "a");
+        s2 = new StudentBUT1("Bruno", "b");
+        s3 = new StudentBUT2("Clément", "c");
+        d1 = new Defense(Room.r0A20, s1, titleA);
+        d2 = new Defense(Room.r0A20, s2, titleB);
+        d3 = new Defense(day2, Room.r0A49, s3, time1, titleC);
+        plan = new Planning(day1);
+    }
+
+    @Test
+    void testAddDefense() {
+        assertEquals(0, plan.getNbDefense());
+        plan.addDefense(d1);
+        assertEquals(1, plan.getNbDefense());
+        assertEquals(d1, plan.getDefense(0));
+        plan.addDefense(d2);
+        assertEquals(2, plan.getNbDefense());
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+    }
+
+    @Test
+    void testAddDefense2() {
+        ArrayList<Defense> tmp = new ArrayList<Defense>();
+        tmp.add(d1); tmp.add(d2);
+        assertEquals(0, plan.getNbDefense());
+        plan.addDefense(tmp);
+        assertEquals(2, plan.getNbDefense());
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+    }
+
+    @Test
+    void testSetDay() {
+        assertEquals(day1, plan.getDay());
+        plan.setDay(LocalDate.now());
+        assertEquals(LocalDate.now(), plan.getDay());
+    }
+
+    @Test
+    void testGetDefense() {
+        plan.addDefense(d1); plan.addDefense(d2); plan.addDefense(d3);
+        assertNull(plan.getDefense(-1));
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+        assertEquals(d3, plan.getDefense(2));
+        assertNull(plan.getDefense(3));
+    }
+
+    @Test
+    void testScheduling() {
+        assertNull(d1.getHour());
+        assertNull(d1.getDay());
+        assertNull(d2.getHour());
+        assertNull(d2.getDay());
+        assertEquals(time1, d3.getHour());
+        assertEquals(day2, d3.getDay());
+        assertEquals(0, plan.getNbDefense());
+        plan.addDefense(d1); plan.addDefense(d2); plan.addDefense(d3);
+        plan.scheduling();
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+        assertEquals(d3, plan.getDefense(2));
+        assertEquals(day1, d1.getDay());
+        assertEquals(day1, d2.getDay());
+        assertEquals(day1, d3.getDay());
+        assertEquals(Planning.defaultStart, d1.getHour());
+        assertEquals(Planning.defaultStart.plusMinutes(d1.getDuration() + Planning.breakDuration), d2.getHour());
+        assertEquals(Planning.defaultStart.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2)), d3.getHour());
+    }
+
+    @Test
+    void testScheduling2() {
+        assertEquals(0, plan.getNbDefense());
+        assertNull(d1.getHour());
+        assertNull(d1.getDay());
+        assertNull(d2.getHour());
+        assertNull(d2.getDay());
+        assertEquals(time1, d3.getHour());
+        assertEquals(day2, d3.getDay());
+        assertEquals(0, plan.getNbDefense());
+        plan.addDefense(d1); plan.addDefense(d2); plan.addDefense(d3);
+        plan.scheduling(time2);
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+        assertEquals(d3, plan.getDefense(2));
+        assertEquals(time2, d1.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + Planning.breakDuration), d2.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2)), d3.getHour());
+    }
+
+    @Test
+    void testSwapDefense() {
+        assertEquals(0, plan.getNbDefense());
+        plan.addDefense(d1); plan.addDefense(d2); plan.addDefense(d3);
+        plan.scheduling(time2);
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+        assertEquals(d3, plan.getDefense(2));
+        assertEquals(time2, d1.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + Planning.breakDuration), d2.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2)), d3.getHour());
+        plan.swapDefense(d1, d3);
+        assertEquals(d3, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+        assertEquals(d1, plan.getDefense(2));
+        assertEquals(time2, d3.getHour());
+        assertEquals(time2.plusMinutes(d3.getDuration() + Planning.breakDuration), d2.getHour());
+        assertEquals(time2.plusMinutes(d3.getDuration() + d2.getDuration() + (Planning.breakDuration*2)), d1.getHour());
+    }
+
+    @Test
+    void testDelayDefense() {
+        assertEquals(0, plan.getNbDefense());
+        plan.addDefense(d1); plan.addDefense(d2); plan.addDefense(d3);
+        plan.scheduling(time2);
+        assertEquals(d1, plan.getDefense(0));
+        assertEquals(d2, plan.getDefense(1));
+        assertEquals(d3, plan.getDefense(2));
+        assertEquals(time2, d1.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + Planning.breakDuration), d2.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2)), d3.getHour());
+        // 5 minutes delay for d3 only
+        plan.delayDefense(d3, 5);
+        assertEquals(time2, d1.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + Planning.breakDuration), d2.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2)+5), d3.getHour());
+        // 10 minutes delay for d2 and d3
+        plan.delayDefense(d2, 10);
+        assertEquals(time2, d1.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + Planning.breakDuration + 10), d2.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2) + 15), d3.getHour());
+        // 20 minutes delay for every defenses
+        plan.delayDefense(d1, 20);
+        assertEquals(time2.plusMinutes(20), d1.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + Planning.breakDuration + 30), d2.getHour());
+        assertEquals(time2.plusMinutes(d1.getDuration() + d2.getDuration() + (Planning.breakDuration*2) + 35), d3.getHour());
+    }
+}