diff --git a/tp/src/main/java/org/example/Contact.java b/tp/src/main/java/org/example/Contact.java
index 15b12ef02297955d58f1f44f7dc78fa4dad89cc9..590b07c3f556f13bf006470bde5c0e0ca94908ee 100644
--- a/tp/src/main/java/org/example/Contact.java
+++ b/tp/src/main/java/org/example/Contact.java
@@ -1,13 +1,13 @@
 package org.example;
 
-public class Contact {
+public abstract class Contact {
     //Fields
-    private Person pers;
-    private String addr;
-    private String[] phone;
-    private String[] email;
-    private String[] social;
-    private String job;
+    protected Person pers;
+    protected String addr;
+    protected String[] phone;
+    protected String[] email;
+    protected String[] social;
+    protected String job;
 
     //Ctor
     public Contact(Person pers, String addr, String[] phone, String[] email,
diff --git a/tp/src/main/java/org/example/Family.java b/tp/src/main/java/org/example/Family.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5266bc4e56a2f52b0ce2e422a2eabf07186c6c6
--- /dev/null
+++ b/tp/src/main/java/org/example/Family.java
@@ -0,0 +1,30 @@
+package org.example;
+
+public class Family extends Contact{
+    private String relation;
+    public Family(Person pers, String addr, String[] phone, String[] email,
+                  String[] social, String job, String relation){
+        super(pers, addr, phone, email, social, job);
+        this.relation = relation;
+    }
+
+    @Override
+    public String toString(){
+        String w_phone = "";
+        String w_email = "";
+        String w_social = "";
+
+        for(String elem: this.phone){
+            w_phone += elem + " ";
+        }
+        for(String elem: this.email){
+            w_email += elem + " ";
+        }
+        for(String elem: this.social){
+            w_social += elem + " ";
+        }
+
+        return pers.toString() + "\n" + this.addr + "\n" + w_phone + "\n" + w_email + "\n"
+                + w_social + "\n" + this.job + "\n" + this.relation;
+    }
+}
diff --git a/tp/src/main/java/org/example/Friend.java b/tp/src/main/java/org/example/Friend.java
new file mode 100644
index 0000000000000000000000000000000000000000..16e8c74067b4f18447310337e8126feecc154f22
--- /dev/null
+++ b/tp/src/main/java/org/example/Friend.java
@@ -0,0 +1,9 @@
+package org.example;
+
+public class Friend extends Contact{
+
+    public Friend(Person pers, String addr, String[] phone, String[] email,
+                  String[] social, String job){
+        super(pers, addr, phone, email, social, job);
+    }
+}
diff --git a/tp/src/main/java/org/example/Main.java b/tp/src/main/java/org/example/Main.java
index d82ac5a22153c8eba43c4edb1e5455effac746c7..65e89b86a253954d1242d88e377e84e5d5ceba2c 100644
--- a/tp/src/main/java/org/example/Main.java
+++ b/tp/src/main/java/org/example/Main.java
@@ -1,9 +1,10 @@
 package org.example;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Scanner;
 
 public class Main {
-    static Contact[] contactArray = {};
+    static ArrayList<Contact> contactArray = new ArrayList<Contact>();
     public static void main(String[] args) {
         while(true){
             System.out.println("");
@@ -11,13 +12,14 @@ public class Main {
             System.out.println("[1] Edit Contact");
             System.out.println("[2] Delete Contact");
             System.out.println("[3] Show Contact");
+            System.out.println("[4] Search Contact");
 
             Scanner myObj = new Scanner(System.in);
             String usrInput = myObj.nextLine();
 
             switch (usrInput){
                 case "0":
-                    Add();
+                    Pick();
                     break;
                 case  "1":
                     Edit();
@@ -28,15 +30,42 @@ public class Main {
                 case "3":
                     Show();
                     break;
+                case "4":
+                    Search();
+                    break;
                 default:
                     System.out.println("Please enter valid input");
                     break;
             }
         }
     }
-    public static void Add(){
-        int size_array = contactArray.length;
-        Contact[] newContactArray = new Contact[size_array + 1];
+    public static void Pick(){
+        int size_array = contactArray.size();
+
+        System.out.println("");
+        System.out.println("[0] Friend");
+        System.out.println("[1] Family");
+        System.out.println("[2] Professional");
+
+        Scanner myObj = new Scanner(System.in);
+        String usrInput = myObj.nextLine();
+
+        switch (usrInput){
+            case "0":
+                AddPal();
+                break;
+            case  "1":
+                AddFam();
+                break;
+            case "2":
+                AddPro();
+                break;
+            default:
+                System.out.println("Please enter valid input");
+                break;
+        }
+    }
+    public static void AddPal(){
         System.out.println("Enter first names");
         Scanner myObj = new Scanner(System.in);
         String firstName = myObj.nextLine();
@@ -59,15 +88,71 @@ public class Main {
         String[] emailList = phone.split(" ");
         String[] socialList = phone.split(" ");
 
-        Contact c = new Contact(p, address, phoneList, emailList, socialList, job);
-        System.arraycopy(contactArray,0,newContactArray, 0,size_array);
-        newContactArray[size_array] = c;
-        contactArray = newContactArray;
-        OrderArray();
+        Friend pal = new Friend(p, address, phoneList, emailList, socialList, job);
+        Add(pal);
+    }
+    public static void AddFam(){
+        System.out.println("Enter first names");
+        Scanner myObj = new Scanner(System.in);
+        String firstName = myObj.nextLine();
+        System.out.println("Enter last names");
+        String lastName = myObj.nextLine();
+        Person p = new Person(lastName, firstName);
+
+        System.out.println("Enter Address");
+        String address = myObj.nextLine();
+        System.out.println("Enter Phone");
+        String phone = myObj.nextLine();
+        System.out.println("Enter Emails");
+        String emails = myObj.nextLine();
+        System.out.println("Enter Socials");
+        String social = myObj.nextLine();
+        System.out.println("Enter Job");
+        String job = myObj.nextLine();
+        System.out.println("Enter relation");
+        String relation = myObj.nextLine();
+
+        String[] phoneList = phone.split(" ");
+        String[] emailList = phone.split(" ");
+        String[] socialList = phone.split(" ");
 
+        Family fam = new Family(p, address, phoneList, emailList, socialList, job, relation);
+        Add(fam);
+    }
+    public static void AddPro(){
+        System.out.println("Enter first names");
+        Scanner myObj = new Scanner(System.in);
+        String firstName = myObj.nextLine();
+        System.out.println("Enter last names");
+        String lastName = myObj.nextLine();
+        Person p = new Person(lastName, firstName);
+
+        System.out.println("Enter Address");
+        String address = myObj.nextLine();
+        System.out.println("Enter Phone");
+        String phone = myObj.nextLine();
+        System.out.println("Enter Emails");
+        String emails = myObj.nextLine();
+        System.out.println("Enter Socials");
+        String social = myObj.nextLine();
+        System.out.println("Enter Job");
+        String job = myObj.nextLine();
+        System.out.println("Enter Work Place");
+        String wp = myObj.nextLine();
+
+        String[] phoneList = phone.split(" ");
+        String[] emailList = phone.split(" ");
+        String[] socialList = phone.split(" ");
+
+        Professional pro = new Professional(p, address, phoneList, emailList, socialList, job, wp);
+        Add(pro);
+    }
+    public static void Add(Contact c){
+        contactArray.add(c);
+        OrderArray();
     }
     public static void Edit(){
-        int size_array = contactArray.length;
+        int size_array = contactArray.size();
         if(size_array == 0){
             System.out.println("List is empty");
         }
@@ -89,40 +174,40 @@ public class Main {
                     case "0":
                         System.out.println("Enter new first names");
                         String editFirst = myObj.nextLine();
-                        contactArray[Integer.parseInt(contactNb)].EditFirstName(editFirst);
+                        contactArray.get(Integer.parseInt(contactNb)).EditFirstName(editFirst);
                         break;
                     case "1":
                         System.out.println("Enter new last names");
                         String editLast = myObj.nextLine();
-                        contactArray[Integer.parseInt(contactNb)].EditLastName(editLast);
+                        contactArray.get(Integer.parseInt(contactNb)).EditLastName(editLast);
                         break;
                     case "2":
                         System.out.println("Enter new first address");
                         String editAddr = myObj.nextLine();
-                        contactArray[Integer.parseInt(contactNb)].EditFirstName(editAddr);
+                        contactArray.get(Integer.parseInt(contactNb)).EditFirstName(editAddr);
                         break;
                     case "3":
                         System.out.println("Enter new phone numbers (use / as separator)");
                         String editPhone = myObj.nextLine();
                         String[] editPhoneList = editPhone.split("/");
-                        contactArray[Integer.parseInt(contactNb)].EditPhone(editPhoneList);
+                        contactArray.get(Integer.parseInt(contactNb)).EditPhone(editPhoneList);
                         break;
                     case "4":
                         System.out.println("Enter new Emails (use / as separator)");
                         String editEmail = myObj.nextLine();
                         String[] editEmailList = editEmail.split("/");
-                        contactArray[Integer.parseInt(contactNb)].EditEmail(editEmailList);
+                        contactArray.get(Integer.parseInt(contactNb)).EditEmail(editEmailList);
                         break;
                     case "5":
                         System.out.println("Enter new Socials (use / as separator)");
                         String editSocial = myObj.nextLine();
                         String[] editSocialList = editSocial.split("/");
-                        contactArray[Integer.parseInt(contactNb)].EditEmail(editSocialList);
+                        contactArray.get(Integer.parseInt(contactNb)).EditEmail(editSocialList);
                         break;
                     case "6":
                         System.out.println("Enter new Job");
                         String editJob = myObj.nextLine();
-                        contactArray[Integer.parseInt(contactNb)].EditLastName(editJob);
+                        contactArray.get(Integer.parseInt(contactNb)).EditLastName(editJob);
                         break;
                     default:
                         System.out.println("Please enter correct value");
@@ -136,25 +221,16 @@ public class Main {
         }
     }
     public static void Delete(){
-        int size_array = contactArray.length;
+        int size_array = contactArray.size();
         if(size_array == 0){
             System.out.println("List is empty");
         }
         else{
-            Contact[] newContactArray = new Contact[size_array -1];
             System.out.println("Which Contact?");
             Scanner myObj = new Scanner(System.in);
             String usrInput = myObj.nextLine();
             if(TryNumber(usrInput)){
-                for(int i = 0; i < size_array -1; i++){
-                    if(i >= Integer.parseInt(usrInput)){
-                        newContactArray[i] = contactArray[i+1];
-                    }
-                    else{
-                        newContactArray[i] = contactArray[i];
-                    }
-                }
-                contactArray = newContactArray;
+                contactArray.remove(usrInput);
             }
             else{
                 System.out.println("Please enter valid input");
@@ -168,9 +244,16 @@ public class Main {
             System.out.println();
         }
     }
+    public static void Search(){
+        for(Contact c: contactArray){
+            if(c.getPers().getFirst_name() == ""){
+
+            }
+        }
+    }
     //Test if the value is a number or not and if it's withing the range of the array
     public static boolean TryNumber(String nb){
-        int size_array = contactArray.length;
+        int size_array = contactArray.size();
         int nbInt = 0;
         try{
             nbInt = Integer.parseInt(nb);
@@ -181,21 +264,22 @@ public class Main {
         return (nbInt < size_array);
     }
     public static void OrderArray(){
-        int size_array = contactArray.length;
+        int size_array = contactArray.size();
         if(size_array > 1){
-            Contact[] newContactArray = new Contact[size_array];
-            for(int i = 0; i < size_array - 1; i++){ //-1 as we check +1 later
-                String nameP1 = contactArray[i].getPers().getFirst_name();
-                String nameP2 = contactArray[i+1].getPers().getFirst_name();
+            ArrayList<Contact> newContactArray = new ArrayList<Contact>();
+            for(int i = 0; i < size_array - 1; i++){ //-1 as we check +1 later (< as lst starts at 0)
+                String nameP1 = contactArray.get(i).getPers().getFirst_name();
+                String nameP2 = contactArray.get(i+1).getPers().getFirst_name();
                 int test = nameP1.compareTo(nameP2); //Return distance between 2 letter (f and a = -5 / a and b = 1)
                 if(test > 0){
-                    newContactArray[i] = contactArray[i+1];
-                    newContactArray[i+1] = contactArray[i];
+                    newContactArray.add(contactArray.get(i+1));
+                    newContactArray.add(contactArray.get(i));
                 }
                 else{
-                    newContactArray[i] = contactArray[i];
+                    newContactArray.add(contactArray.get(i));
                 }
-                if(i == size_array - 2){ //-2 to take last iteration only (as we do "i < size -1")
+                if(i == size_array - 1){ //-2 to take last iteration only (as we do "i < size -1")
+                    newContactArray.add(contactArray.get(i+1));
                     contactArray = newContactArray;
                 }
             }
diff --git a/tp/src/main/java/org/example/Professional.java b/tp/src/main/java/org/example/Professional.java
new file mode 100644
index 0000000000000000000000000000000000000000..bdb6496fc2f3647a43c0e41db510f52f71404647
--- /dev/null
+++ b/tp/src/main/java/org/example/Professional.java
@@ -0,0 +1,30 @@
+package org.example;
+
+public class Professional extends Contact{
+    private String work_place;
+    public Professional(Person pers, String addr, String[] phone, String[] email,
+                  String[] social, String job, String work_place){
+        super(pers, addr, phone, email, social, job);
+        this.work_place = work_place;
+    }
+
+    @Override
+    public String toString(){
+        String w_phone = "";
+        String w_email = "";
+        String w_social = "";
+
+        for(String elem: this.phone){
+            w_phone += elem + " ";
+        }
+        for(String elem: this.email){
+            w_email += elem + " ";
+        }
+        for(String elem: this.social){
+            w_social += elem + " ";
+        }
+
+        return pers.toString() + "\n" + this.addr + "\n" + w_phone + "\n" + w_email + "\n"
+                + w_social + "\n" + this.job + "\n" + this.work_place;
+    }
+}
diff --git a/tp/target/classes/org/example/Contact.class b/tp/target/classes/org/example/Contact.class
index 90149e1f5120b89e0d5dc82f9bf65d6683aca544..90a523062b11ba0b0f791d92073dc5d969add585 100644
Binary files a/tp/target/classes/org/example/Contact.class and b/tp/target/classes/org/example/Contact.class differ
diff --git a/tp/target/classes/org/example/Family.class b/tp/target/classes/org/example/Family.class
new file mode 100644
index 0000000000000000000000000000000000000000..a80639b27961d303be0f4113fc674724e8c9f1b8
Binary files /dev/null and b/tp/target/classes/org/example/Family.class differ
diff --git a/tp/target/classes/org/example/Friend.class b/tp/target/classes/org/example/Friend.class
new file mode 100644
index 0000000000000000000000000000000000000000..7502894edd022967e3f0e47ff76321052ab7666a
Binary files /dev/null and b/tp/target/classes/org/example/Friend.class differ
diff --git a/tp/target/classes/org/example/Main.class b/tp/target/classes/org/example/Main.class
index 611c4014bad05fc0a784690238cdc1e343376535..26c69ecfe8a389705cae4a52d07bc900fb788bde 100644
Binary files a/tp/target/classes/org/example/Main.class and b/tp/target/classes/org/example/Main.class differ
diff --git a/tp/target/classes/org/example/Professional.class b/tp/target/classes/org/example/Professional.class
new file mode 100644
index 0000000000000000000000000000000000000000..b23347c22668ebf646f715c6f737764224ccf42e
Binary files /dev/null and b/tp/target/classes/org/example/Professional.class differ