diff --git a/pom.xml b/pom.xml
index 510dba5feb165de23e1fdb5ebace40ea408731fe..175265c83c59871234b210e59c77eb5a9c6f6fb4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -14,4 +13,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
-</project>
\ No newline at end of file
+    <dependencies>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>5.8.2</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
+
diff --git a/src/main/java/org/petriNet/Arc.java b/src/main/java/org/petriNet/Arc.java
index c9d30fabf32e88fb7b8a77d83719fdaf8b527992..0f04b62b6d812b95dba7600400e04f45c07dae9b 100644
--- a/src/main/java/org/petriNet/Arc.java
+++ b/src/main/java/org/petriNet/Arc.java
@@ -1,36 +1,49 @@
 package org.petriNet;
 
 public abstract class Arc {
+
     private int id;
     private Place place;
     private Transition transition;
     private int poids;
 
-    public Arc(Place place, Transition transition, int poids, int id) {
+    public Arc(Transition transition, Place place,  int poids, int id) {
         this.place = place;
         this.transition = transition;
-        this.poids = poids;
-        this.id = id;
+        // verify that the weight is not negative
+        if (poids >= 0) {
+            this.poids = poids;
+        } else {
+            System.out.println("The weight cannot be negative.");
+        }
+        this.id = id; // Assign a unique ID with the generateId method in the ReseauPetri class
     }
 
-
-    public abstract void modifierPoids(int poids);
-
     public abstract void valider();
 
-    public abstract int getPoids() ;
+    public int getPoids(){
+        return this.poids;
+    } ;
 
-    public abstract int getId();
+    public int getId(){
+        return this.id;
+    };
 
-    public abstract void setId(int id);
-
-    public abstract void setPoid(int poids);
+    public void setPoids(int poids){
+        this.poids = poids;
+    };
 
-    public abstract Place getPlace();
+    public Place getPlace(){
+        return this.place;
+    };
 
-    public abstract void setPlace(Place place);
+    public void setPlace(Place place){
+        this.place = place;
+    };
 
-    public abstract Transition getTransition();
+    public Transition getTransition(){
+        return this.transition;
+    };
 }
 
 
diff --git a/src/main/java/org/petriNet/Arc_ENTRANT.java b/src/main/java/org/petriNet/Arc_ENTRANT.java
index cf43fc20b666957d726d10946d6e5fc55253a9b3..5ef376c2c35384cd767d00707c9dac6b0fab1b0a 100644
--- a/src/main/java/org/petriNet/Arc_ENTRANT.java
+++ b/src/main/java/org/petriNet/Arc_ENTRANT.java
@@ -14,13 +14,8 @@ public abstract class Arc_ENTRANT extends Arc {
     private int poids;
     private int id;
 
-    public Arc_ENTRANT(Place place, Transition transition, int poids, int id) {
-        super(place, transition, poids, id);
-    }
-
-    @Override
-    public void modifierPoids(int poids) {
-        this.poids = poids;
+    public Arc_ENTRANT( Transition transition, Place place, int poids, int id) {
+        super(transition, place, poids, id);
     }
 
     /**
@@ -29,61 +24,14 @@ public abstract class Arc_ENTRANT extends Arc {
      *  ceci pour justifier le cahngement par rapport au diagramme de classe soumis
      */
 
-    public void enleverJetons() {
-        // On retire le nombre de jetons du poids de l'arc
-        this.place.enlever_jeton(this.poids);
-    }
-
     public boolean verifier_tirable() {
-        if (this.place.get_nombre_jetons() >= this.poids) {
-            return true;
-        }
-        return false;
+        return this.getPlace().get_nombre_jetons() >= this.getPoids();
     }
 
-
     @Override
     public void valider() {
         // On retire le nombre de jetons du poids de l'arc
-        // prendre en cond la place choisie
-        this.place.enlever_jeton(this.poids);
-    }
-
-
-
-    @Override
-    public int getPoids() {
-        return this.poids;
-    }
-
-    @Override
-    public int getId() {
-        return this.id;
-    }
-
-    @Override
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    @Override
-    public void setPoid(int poids) {
-        this.poids = poids;
-    }
-
-    @Override
-    public Place getPlace() {
-        return this.place;
-    }
-
-    @Override
-    public void setPlace(Place place) {
-        this.place = place;
-    }
-
-    @Override
-    public Transition getTransition() {
-        return this.transition;
+        this.getPlace().enlever_jeton(this.getPoids());
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/petriNet/Arc_SORTANT.java b/src/main/java/org/petriNet/Arc_SORTANT.java
index bd0efc7deb5eb1bb424aa5d3f8a7e30e4bd034f9..ff4cf5406880b6af384018fba15a880483e86638 100644
--- a/src/main/java/org/petriNet/Arc_SORTANT.java
+++ b/src/main/java/org/petriNet/Arc_SORTANT.java
@@ -7,16 +7,10 @@ public class Arc_SORTANT extends Arc {
     private int poids;
     private int id;
 
-    public Arc_SORTANT(Place place, Transition transition, int poids, int id) {
-        super(place, transition, poids, id);
+    public Arc_SORTANT( Transition transition, Place place, int poids, int id) {
+        super(transition, place, poids, id);
     }
 
-    @Override
-    public void modifierPoids(int poids) {
-        this.poids = poids;
-    }
-
-
 
     @Override
     public void valider() {
@@ -24,52 +18,4 @@ public class Arc_SORTANT extends Arc {
         this.place.ajouter_jeton(this.poids);
     }
 
-    @Override
-    public int getPoids() {
-        return this.poids;
-    }
-
-    @Override
-    public int getId() {
-        return this.id;
-    }
-
-    @Override
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    @Override
-    public void setPoid(int poids) {
-        this.poids = poids;
-    }
-
-    @Override
-    public Place getPlace() {
-        return this.place;
-    }
-
-    @Override
-    public void setPlace(Place place) {
-        this.place = place;
-    }
-
-    @Override
-    public Transition getTransition() {
-        return this.transition;
-    }
-
-    /**
-     * Dans la classe Arc_SORTANT, on ajoute les jetons à la place seulement,
-     *  il n'y a pas de jetons à enlever
-     *  ceci pour justifier le cahngement par rapport au diagramme de classe soumis
-     */
-
-
-    public void ajouterJetons() {
-        // On ajoute le nombre de jetons du poids de l'arc
-        this.place.ajouter_jeton(this.poids);
-    }
-
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/petriNet/Arc_entrant_simple.java b/src/main/java/org/petriNet/Arc_entrant_simple.java
index b24636a32627073bc7edb52d78f21e616a9f6154..370be3f210b1f5897bf604a8427350b9d91db43d 100644
--- a/src/main/java/org/petriNet/Arc_entrant_simple.java
+++ b/src/main/java/org/petriNet/Arc_entrant_simple.java
@@ -8,8 +8,8 @@ public class Arc_entrant_simple extends Arc_ENTRANT {
         int id;
 
 
-    public Arc_entrant_simple(Place place, Transition transition, int poids, int id) {
-        super(place, transition, poids, id);
+    public Arc_entrant_simple( Transition transition, Place place, int poids, int id) {
+        super(transition, place, poids, id);
     }
 
 }
diff --git a/src/main/java/org/petriNet/Arc_videur.java b/src/main/java/org/petriNet/Arc_videur.java
index 35549acf1b2fede99d392038a319c266c5e27476..e0193bfc092605d9d7fdd507a2fe890a7dd06fd4 100644
--- a/src/main/java/org/petriNet/Arc_videur.java
+++ b/src/main/java/org/petriNet/Arc_videur.java
@@ -7,8 +7,8 @@ public class Arc_videur extends Arc_ENTRANT {
     int poids;
     int id;
 
-    public Arc_videur(Place place, Transition transition, int poids, int id) {
-        super(place, transition, poids, id);
+    public Arc_videur( Transition transition, Place place, int poids, int id) {
+        super(transition, place, poids, id);
     }
 
     // Les arcs «videurs» qui sont actifs dès qu’il y a un jeton dans la place source et qui enlèvent
@@ -30,5 +30,4 @@ public class Arc_videur extends Arc_ENTRANT {
     }
 
 
-
 }
diff --git a/src/main/java/org/petriNet/Arc_zero.java b/src/main/java/org/petriNet/Arc_zero.java
index 3e46166ac4c8f27d83c97262d24bdfb9e217c1db..0bc6433573e9a921d26367ed841ff88967563581 100644
--- a/src/main/java/org/petriNet/Arc_zero.java
+++ b/src/main/java/org/petriNet/Arc_zero.java
@@ -5,21 +5,18 @@ package org.petriNet;
     Place place;
     Transition transition;
     int poids;
-    int id;
     boolean etat;
+    int id;
 
 
-    public Arc_zero(Place place, Transition transition, int poids, int id) {
-        super(place, transition, poids, id);
+    public Arc_zero( Transition transition, Place place, int poids, int id) {
+        super(transition, place, poids, id);
     }
 
-    // Les arcs « zéro » qui ne sont actifs que quand la place source est vide.
+        // Les arcs « zéro » qui ne sont actifs que quand la place source est vide.
 
     @Override
     public boolean verifier_tirable() {
-        if (this.place.get_nombre_jetons() == 0) {
-            return true;
-        }
-        return false;
+        return this.place.get_nombre_jetons() == 0;
     }
 }
diff --git a/src/main/java/org/petriNet/MainPetriNet.java b/src/main/java/org/petriNet/MainPetriNet.java
index d5078a636a4f7849febfa0f57ba62712f406e9b7..657fdda4d8b3423b5482588ebbeee075f5cd8a48 100644
--- a/src/main/java/org/petriNet/MainPetriNet.java
+++ b/src/main/java/org/petriNet/MainPetriNet.java
@@ -1,27 +1,25 @@
 package org.petriNet;
 
-import java.util.ArrayList;
-
 public class MainPetriNet {
 
     public static void main(String[] args) {
         // Create a Petri net
-        ReseauPerti reseauPerti = new ReseauPerti();
+        ReseauPetri reseauPetri = new ReseauPetri();
 
         // Create places
-        Place p1 = new Place(1,3);
-        Place p2 = new Place(2,3);
-        Place p3 = new Place(3,3);
+        Place p1 = new Place(1, reseauPetri.generateId(1));
+        Place p2 = new Place(2, reseauPetri.generateId(2));
+        Place p3 = new Place(3, reseauPetri.generateId(3));
 
         // Create transitions with empty Arcs_ENTRANT and Arcs_SORTANT
-        Transition t1 = new Transition(1, new ArrayList<Arc_SORTANT>(), new ArrayList<Arc_ENTRANT>());
-        Transition t2 = new Transition(2, new ArrayList<Arc_SORTANT>(), new ArrayList<Arc_ENTRANT>());
+        Transition t1 = new Transition("t1", reseauPetri.generateId(2));
+        Transition t2 = new Transition("t2", reseauPetri.generateId(2));
 
         // Create arcs
-        Arc_ENTRANT a1 = new Arc_entrant_simple(p1, t1, 1, 1);
-        Arc_SORTANT a2 = new Arc_SORTANT(p2, t1, 1, 2);
-        Arc_ENTRANT a3 = new Arc_entrant_simple(p2, t2, 1, 3);
-        Arc_SORTANT a4 = new Arc_SORTANT(p3, t2, 1, 4);
+        Arc_ENTRANT a1 = new Arc_entrant_simple(t1, p1, 1, reseauPetri.generateId(0));
+        Arc_SORTANT a2 = new Arc_SORTANT(t1, p2, 1, reseauPetri.generateId(0));
+        Arc_ENTRANT a3 = new Arc_entrant_simple(t2, p2, 1, reseauPetri.generateId(0));
+        Arc_SORTANT a4 = new Arc_SORTANT(t2, p3, 1, reseauPetri.generateId(0));
 
         // Add arcs to transitions
         t1.ajouterArc_ENTRANT(a1);
@@ -36,22 +34,13 @@ public class MainPetriNet {
         a4.setPlace(p3);
 
         // Add places and transitions to the Petri net
-        reseauPerti.ajouterPlace(p1);
-        reseauPerti.ajouterPlace(p2);
-        reseauPerti.ajouterPlace(p3);
-        reseauPerti.ajouterTransition(t1);
-        reseauPerti.ajouterTransition(t2);
+        reseauPetri.ajouterPlace(p1);
+        reseauPetri.ajouterPlace(p2);
+        reseauPetri.ajouterPlace(p3);
+        reseauPetri.ajouterTransition(t1);
+        reseauPetri.ajouterTransition(t2);
 
         // Display the Petri net
-        reseauPerti.afficherEtat();
-
-        // Test the tirer method
-//        if (t1.est_tirable()) {
-//            reseauPerti.tirerTransition(t1);
-//        }
-//        if (t2.est_tirable()) {
-//            reseauPerti.tirerTransition(t2);
-//        }
-
+        reseauPetri.afficherEtat();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/org/petriNet/Place.java b/src/main/java/org/petriNet/Place.java
index 0dd674b0021bbe992c0036f09216654b0d8e0376..af7b421c4f166247ae316f7da6954418e0bbdee6 100644
--- a/src/main/java/org/petriNet/Place.java
+++ b/src/main/java/org/petriNet/Place.java
@@ -1,23 +1,35 @@
 package org.petriNet;
 
 public class Place {
+
     private int id;
     private int nombre_jeton;
 
-    public Place(int id, int nombre_jeton) {
+    public Place(int nombre_jeton, int id) {
         this.id = id;
-        this.nombre_jeton = nombre_jeton;
+        // VERIFY THAT THE NUMBER OF TOKENS IS NOT NEGATIVE
+        if (nombre_jeton >= 0) {
+            this.nombre_jeton = nombre_jeton;
+        } else {
+            System.out.println("The number of tokens cannot be negative.");
+        }
     }
 
     public void ajouter_jeton(int jetons) {
-        this.nombre_jeton += jetons;
+        // verify that the number of tokens is not negative
+        if (jetons >= 0) {
+            this.nombre_jeton += jetons;
+        } else {
+            System.out.println("The number of tokens cannot be negative.");
+        }
     }
 
     public void enlever_jeton(int jetons) {
-        if (this.nombre_jeton > 0) {
+        // verify that the number of tokens is not negative
+        if (jetons >= 0) {
             this.nombre_jeton -= jetons;
         } else {
-            System.out.println("No more tokens to remove.");
+            System.out.println("The number of tokens cannot be negative.");
         }
     }
 
@@ -36,4 +48,7 @@ public class Place {
     public void setNombre_jeton(int nombre_jeton) {
         this.nombre_jeton = nombre_jeton;
     }
+
+    // Une fonction pour trouver les arcs entrants d'une place
+
 }
diff --git a/src/main/java/org/petriNet/ReseauPerti.java b/src/main/java/org/petriNet/ReseauPerti.java
deleted file mode 100644
index 60e498b02e0ea2f68ffd5d07397d63a7ef83e22a..0000000000000000000000000000000000000000
--- a/src/main/java/org/petriNet/ReseauPerti.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.petriNet;
-
-import java.util.*;
-
-public class ReseauPerti implements PetriNetService {
-
-	// Creat attributes as Lists of Places, Transitions and Arcs
-
-	private List<Place> places;
-	private List<Transition> transitions;
-	// create a LinkedHashSet to store the arcs in order to have unique ids
-	private LinkedHashSet<Arc> arcs;
-	private String etat_reseau = "Pas de transition tirée";
-
-	// Create a constructor
-	public ReseauPerti() {
-		// initialiser les listes vide
-		this.places = new ArrayList<>();
-		this.transitions = new ArrayList<>();
-		this.arcs = new LinkedHashSet<>();
-	}
-
-	// Create getters and setters
-	public List<Place> getPlaces() {
-		return places;
-	}
-
-	public void setPlaces(List<Place> places) {
-		this.places = places;
-	}
-
-	public List<Transition> getTransitions() {
-		return transitions;
-	}
-
-	public void setTransitions(List<Transition> transitions) {
-		this.transitions = transitions;
-	}
-
-	public  LinkedHashSet<Arc> getArcs() {
-		return this.arcs;
-	}
-
-	public void setArcs(LinkedHashSet arcs) {
-		this.arcs = arcs;
-	}
-
-
-	@Override
-	public void ajouterPlace(Place place) {
-		// TODO Auto-generated method stub
-		this.places.add(place);
-	}
-
-	@Override
-	public void ajouterTransition(Transition transition) {
-		// TODO Auto-generated method stub
-		this.transitions.add(transition);
-	}
-
-	@Override
-	public void ajouterArc(Arc arc) {
-		// TODO Auto-generated method stub
-		this.arcs.add(arc);
-	}
-
-	@Override
-	public void tirer_transition(String id) {
-
-		// set the state of the network to "Transition en cours de verification"
-		this.etat_reseau = "Transition en cours de validation";
-
-		// Find the transition with the id
-		Transition transition_choisie = null;
-		for (Transition transition : this.transitions) {
-			if (transition.getId() == Integer.parseInt(id)) {
-				transition_choisie = transition;
-			}
-		}
-
-
-		// Check if the transition id is valid
-		if (transition_choisie == null) {
-			System.out.println("L'id de la transition n'est pas valide");
-			return;
-		} else {
-			// Check if the transition is tirable
-			transition_choisie.est_tirable();
-		}
-
-		// Ask if the user wants to validate the firing of the transition
-		Scanner scanner = new Scanner(System.in);
-		System.out.println("Voulez-vous valider le tirage de la transition? (O/N)");
-		String reponse = scanner.nextLine();
-		if (reponse.equals("O")) {
-			transition_choisie.tirer();
-		}
-
-		// set the state of the network to "Pas de transition tirée"
-		this.etat_reseau = "Pas de transition tirée";
-
-	}
-
-	@Override
-	public void afficherEtat() {
-		// TODO Auto-generated method stub
-		if (this.etat_reseau.equals("Pas de transition tirée")) {
-			System.out.println("Pas de transition tirée");
-			// Ask the user if they want to fire a transition
-			Scanner scanner = new Scanner(System.in);
-			System.out.println("Voulez-vous tirer une transition? (O/N)");
-			String reponse = scanner.nextLine();
-			if (reponse.equals("O")) {
-				// Show the Petri Net
-				afficherReseau();
-				// Ask the user for the id of the transition to fire
-				System.out.println("Saisir l'id de la transition à tirer: ");
-				String id = scanner.nextLine();
-				tirer_transition(id);
-			}
-		} else {
-			System.out.println("Transition en cours de validation");
-		}
-	}
-
-
-	@Override
-	public void afficherReseau() {
-		// TODO Auto-generated method stub
-
-		System.out.println(this.etat_reseau);
-
-		/**
-		 * afficher les places, les transitions et les arcs
-		 * comme un dessin du réseau de petri
-		 * les places comme des cercles
-		 * les transitions comme des rectangles
-		 * les arcs comme des flèches
-		 * les poinds des arcs à côté des flèches
-		 * les jetons des points dans les places
-		 * relier les arcs aux places et aux transitions par des flèches
-		 */
-
-//		// afficher Petri Net
-//		System.out.println("Petri Net : ");
-//		// afficher les places, les arcs, le poids et les transitions
-//		for (Arc arc : arcs) {
-//			System.out.println("Arc : " + arc.getPlace().getId() + " -> " + arc.getTransition().getId() + " : " + arc.getPoids());
-//		}
-
-
-	}
-
-}
diff --git a/src/main/java/org/petriNet/ReseauPetri.java b/src/main/java/org/petriNet/ReseauPetri.java
new file mode 100644
index 0000000000000000000000000000000000000000..743d1794abc0a2edf9909210d6d26b5e1e31d419
--- /dev/null
+++ b/src/main/java/org/petriNet/ReseauPetri.java
@@ -0,0 +1,219 @@
+package org.petriNet;
+
+import java.util.*;
+
+public class ReseauPetri implements PetriNetService {
+
+	// Creat attributes as Lists of Places, Transitions and Arcs
+
+	private LinkedList<Integer> Id_couters;
+	private List<Place> places;
+	private List<Transition> transitions;
+	// create a LinkedHashSet to store the arcs in order to have unique ids
+	private LinkedList<Arc> arcs;
+	private String etat_reseau = "Pas de transition tirée";
+
+	// Create a constructor
+	public ReseauPetri() {
+		// initialiser les listes vide
+		this.places = new ArrayList<>();
+		this.transitions = new ArrayList<>();
+		this.arcs = new LinkedList<>();
+		Id_couters = new LinkedList<>();
+
+		// initialiser les compteurs des ids pour Arcs, Places et Transitions
+		Id_couters.add(0);
+		Id_couters.add(0);
+		Id_couters.add(0);
+	}
+
+	// Create a method to generate unique ids
+	public int generateId(int index) {
+		int id = Id_couters.get(index);
+		Id_couters.set(index, id + 1);
+		return id;
+	}
+
+	// Create getters and setters
+	public List<Place> getPlaces() {
+		return places;
+	}
+
+	public void setPlaces(List<Place> places) {
+		this.places = places;
+	}
+
+	public List<Transition> getTransitions() {
+		return transitions;
+	}
+
+	public void setTransitions(List<Transition> transitions) {
+		this.transitions = transitions;
+	}
+
+	public  LinkedList<Arc> getArcs() {
+		return this.arcs;
+	}
+
+	public void setArcs(LinkedList arcs) {
+		this.arcs = arcs;
+	}
+
+
+	@Override
+	public void ajouterPlace(Place place) {
+		// TODO Auto-generated method stub
+		// verify that there is no similar place in the list
+		for (Place place1 : this.places) {
+			if (place1.getId() == place.getId()) {
+				System.out.println("Place already exists");
+				return;
+			}
+		}
+		this.places.add(place);
+	}
+
+	@Override
+	public void ajouterTransition(Transition transition) {
+		// TODO Auto-generated method stub
+		// verify that there is no similar transition in the list
+		for (Transition transition1 : this.transitions) {
+			if (transition1.getId() == transition.getId()) {
+				System.out.println("Transition already exists");
+				return;
+			}
+		}
+		this.transitions.add(transition);
+	}
+
+	@Override
+	public void ajouterArc(Arc arc) {
+		// TODO Auto-generated method stub
+		// verify that there is no similar arc in the list
+		for (Arc arc1 : this.arcs) {
+			if (arc1.getPlace().getId() == arc.getPlace().getId() &&
+					arc1.getTransition().getId() == arc.getTransition().getId() &&
+					arc1.getClass() == arc.getClass()) {
+
+				System.out.println("Arc already exists");
+				return;
+			}
+		}
+		this.arcs.add(arc);
+	}
+
+	@Override
+	public void tirer_transition(String id) {
+
+		// set the state of the network to "Transition en cours de verification"
+		this.etat_reseau = "Transition en cours de validation";
+
+		// Find the transition with the id
+		Transition transition_choisie = null;
+		for (Transition transition : this.transitions) {
+			if (String.valueOf(transition.getId()).equals(id)) {
+				transition_choisie = transition;
+			}
+		}
+
+		// Check if the transition id is valid
+		if (transition_choisie == null) {
+			System.out.println("L'id de la transition n'est pas valide");
+			return;
+		} else {
+			transition_choisie.tirer();
+		}
+
+		// set the state of the network to "Pas de transition tirée"
+		this.etat_reseau = "Pas de transition tirée";
+
+	}
+
+	@Override
+	public void afficherEtat() {
+		// TODO Auto-generated method stub
+		if (this.etat_reseau.equals("Pas de transition tirée")) {
+			System.out.println("Pas de transition tirée");
+			// Ask the user if they want to fire a transition
+			Scanner scanner = new Scanner(System.in);
+			System.out.println("Voulez-vous tirer une transition? (O/N)");
+			String reponse = scanner.nextLine();
+			if (reponse.equals("O")) {
+				// Show the Petri Net
+				afficherReseau();
+				// Ask the user for the id of the transition to fire
+				System.out.println("Saisir l'id de la transition à tirer: ");
+				String id = scanner.nextLine();
+				tirer_transition(id);
+			}
+		} else {
+			System.out.println("Transition en cours de validation");
+		}
+	}
+
+
+	@Override
+	public void afficherReseau() {
+		// TODO Auto-generated method stub
+
+		/**
+		 * L'affichage est sous la forme suivante:
+		 * Réseau de Petri
+		 * 2 places
+		 * 1 transition
+		 * 2 arcs
+		 * Liste des places :
+		 * 1 : place avec 4 jetons, 1 arc simple sortant, 0 arc simple entrant
+		 * 2 : place avec 0 jetons, 0 arc simple sortant, 1 arc simple entrant
+		 * Liste des transitions
+		 * 1 : transition, 1 arc entrant, 1 arc sortant
+		 * Liste des arcs :
+		 * 1 : arc simple poids 1 (place avec 4 jetons vers transition)
+		 * 2 : arc simple poids 1 (transition vers place avec 0 jetons)
+		 */
+
+		System.out.println("Réseau de Petri");
+		System.out.println(this.places.size() + " places");
+		System.out.println(this.transitions.size() + " transitions");
+		System.out.println(this.arcs.size() + " arcs");
+
+		System.out.println("Liste des places :");
+			// On parcourt la liste des arcs pour afficher les places
+			// une liste pur les arcs entrants et une liste pour les arcs sortants
+			List<Arc> arcs_ENTRANTS = new ArrayList<>();
+			List<Arc> arcs_SORTANTS = new ArrayList<>();
+		for (Place place : this.places) {
+			for (Arc arc : this.arcs) {
+				// we verify getting arc.getPlace() == place
+				if (arc.getPlace().getId() == place.getId()) {
+					// we verify if it's an arc entrant
+					if (arc instanceof Arc_ENTRANT) {
+						arcs_ENTRANTS.add(arc);
+					} else {
+						arcs_SORTANTS.add(arc);
+					}
+				}
+			}
+			System.out.println(place.getId() + " : place avec " + place.get_nombre_jetons() + " jetons, "
+					+ arcs_SORTANTS.size() + " arc simple sortant, " + arcs_ENTRANTS.size() + " arc simple entrant");
+		}
+
+		System.out.println("Liste des transitions :");
+		for (Transition transition : this.transitions) {
+			System.out.println(transition.getId() + " : transition " + transition.getNom() + " " + transition.getArcs_ENTRANTS().size()
+					+ " arc entrant, " + transition.getArcs_SORTANTS().size() + " arc sortant");
+		}
+
+		System.out.println("Liste des arcs :");
+		for (Arc arc : this.arcs) {
+			if (arc instanceof Arc_ENTRANT) {
+				System.out.println(arc.getId() + " : arc simple poids " + arc.getPoids() + " ("
+						+ "Place d'Id " + arc.getPlace().getId() + " vers " + arc.getTransition().getNom() + ")");
+			} else {
+				System.out.println(arc.getId() + " : arc simple poids " + arc.getPoids() + " ("
+						+ arc.getTransition().getNom()  + " vers " + "Place d'Id " + arc.getPlace().getId()  + ")");
+			}
+		}
+	}
+
+}
diff --git a/src/main/java/org/petriNet/Transition.java b/src/main/java/org/petriNet/Transition.java
index e6f9a7323050f12a8411f9f722feb1d391720041..474dc5edf97a0537b75f79451a2d8b5ace0e0f70 100644
--- a/src/main/java/org/petriNet/Transition.java
+++ b/src/main/java/org/petriNet/Transition.java
@@ -2,16 +2,17 @@ package org.petriNet;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Scanner;
 
 public class Transition {
+
     private int id;
+    String nom;
     private List<Arc_SORTANT> arcs_SORTANTS;
     private List<Arc_ENTRANT> arcs_ENTRANTS;
-    private List<Arc_ENTRANT> arcs_ENTRANTS_TIRABLE = new ArrayList<Arc_ENTRANT>();
 
-    public Transition(int id, List<Arc_SORTANT> arcs_SORTANTS, List<Arc_ENTRANT> arcs_ENTRANTS) {
+    public Transition(String nom, int id) {
         this.id = id;
+        this.nom = nom;
         this.arcs_SORTANTS = new ArrayList<Arc_SORTANT>();
         this.arcs_ENTRANTS = new ArrayList<Arc_ENTRANT>();
     }
@@ -22,6 +23,10 @@ public class Transition {
      * c'est une différence par rapport au diagramme de classe soumis
      */
 
+    public String getNom() {
+        return nom;
+    }
+
     public int getId() {
         return id;
     }
@@ -34,87 +39,68 @@ public class Transition {
         return arcs_SORTANTS;
     }
 
+    public List<Arc_ENTRANT> getArcs_ENTRANTS() {
+        return arcs_ENTRANTS;
+    }
+
     public void setArcs_SORTANTS(List<Arc_SORTANT> arcs_SORTANTS) {
         this.arcs_SORTANTS = arcs_SORTANTS;
     }
 
     public void ajouterArc_SORTANT(Arc_SORTANT arc_SORTANT) {
+        // verify that the arc doesn't already exist
+        for (Arc_SORTANT arc_SORTANT1 : arcs_SORTANTS) {
+            if (arc_SORTANT1.getPlace().getId() == arc_SORTANT.getPlace().getId() &&
+                    arc_SORTANT1.getTransition().getId() == arc_SORTANT.getTransition().getId() &&
+                    arc_SORTANT1.getClass() == arc_SORTANT.getClass()) {
+                System.out.println("The arc already exists.");
+                return;
+            }
+        }
         this.arcs_SORTANTS.add(arc_SORTANT);
     }
 
     public void ajouterArc_ENTRANT(Arc_ENTRANT arc_ENTRANT) {
+        // verify that the arc doesn't already exist
+        for (Arc_ENTRANT arc_ENTRANT1 : arcs_ENTRANTS) {
+            if (arc_ENTRANT1.getPlace().getId() == arc_ENTRANT.getPlace().getId() &&
+                    arc_ENTRANT1.getTransition().getId() == arc_ENTRANT.getTransition().getId() &&
+                    arc_ENTRANT1.getClass() == arc_ENTRANT.getClass()) {
+                System.out.println("The arc already exists.");
+                return;
+            }
+        }
         this.arcs_ENTRANTS.add(arc_ENTRANT);
     }
 
 
-    public void est_tirable() {
-
-        // creer liste vide d'arcs
-        this.arcs_ENTRANTS_TIRABLE = new ArrayList<Arc_ENTRANT>();
+    public boolean est_tirable() {
 
-        for (Arc_ENTRANT arc_ENTRANT : arcs_ENTRANTS) {
-            if (arc_ENTRANT.verifier_tirable()) {
-                arcs_ENTRANTS_TIRABLE.add(arc_ENTRANT);
+        for (Arc_ENTRANT arc_ENTRANT : this.arcs_ENTRANTS) {
+            if (!arc_ENTRANT.verifier_tirable()) {
+                System.out.println("La transition n'est pas tirable");
+                return false;
             }
         }
+        System.out.println("La transition est tirable");
+        return true;
 
-        if(arcs_ENTRANTS_TIRABLE.isEmpty()){
-            System.out.println("La transition n'est pas tirable");
-        }
-        else {
-            System.out.println("La transition est tirable");
-        }
     }
 
     public void tirer(){
 
-        est_tirable();
-
-        List<String> arcs_ENTRANTS_TIRABLE_String = Arcs_ENTRANTS_TIRABLE_toString();
-
-        // print the list of arcs entrants tirables
-        System.out.println("Arcs entrants tirable: " + arcs_ENTRANTS_TIRABLE_String
-                + "Saisir l'arc entrant à tirer: ");
-        Scanner scanner = new Scanner(System.in);
-
-
-        int id;
-        Arc_ENTRANT arc_ENTRANT_toTirer;
-
-        // Get the input from user of the id of the arc entrant to tirer (java.util.Scanner)
-        while (true) {
-            System.out.print("Enter the id: ");
-            String input = scanner.next();
-            try {
-                id = Integer.parseInt(input);
-                if (arcs_ENTRANTS_TIRABLE_String.contains(String.valueOf(id))) {
-                    arc_ENTRANT_toTirer = arcs_ENTRANTS_TIRABLE.get(arcs_ENTRANTS_TIRABLE_String.indexOf(String.valueOf(id)));
-                    break;
-                } else {
-                    System.out.println("Invalid id. Please enter a valid id.");
-                }
-            } catch (NumberFormatException e) {
-                System.out.println("Invalid id. Please enter a valid integer.");
-            }
-        }
+        boolean tirable = est_tirable();
 
-        // valider l'arc entrant
-        arc_ENTRANT_toTirer.valider();
+        if (tirable) {
+            for (Arc_ENTRANT arc_ENTRANT : arcs_ENTRANTS) {
+                arc_ENTRANT.valider();
+            }
 
-        for (Arc_SORTANT arc_SORTANT : arcs_SORTANTS) {
-            arc_SORTANT.valider();
+            for (Arc_SORTANT arc_SORTANT : arcs_SORTANTS) {
+                arc_SORTANT.valider();
+            }
+            System.out.println("Transition tirée avec succès");
         }
 
-        System.out.println("Transition tirée avec succès");
-
-    }
-
-    // Add a method to get the list of arcs entrants tirable en String
-        public List<String> Arcs_ENTRANTS_TIRABLE_toString() {
-        List<String> arcs_ENTRANTS_TIRABLE_String = new ArrayList<String>();
-        for (Arc_ENTRANT arc_ENTRANT : arcs_ENTRANTS_TIRABLE) {
-            arcs_ENTRANTS_TIRABLE_String.add(String.valueOf(arc_ENTRANT.getId()));
-        }
-        return arcs_ENTRANTS_TIRABLE_String;
     }
 }
diff --git a/src/test/java/org/petriNet/ReseauPetriTest.java b/src/test/java/org/petriNet/ReseauPetriTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..389443aa42bc1da020987d261eabd80a91a9b7c2
--- /dev/null
+++ b/src/test/java/org/petriNet/ReseauPetriTest.java
@@ -0,0 +1,289 @@
+package org.petriNet;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+import static org.junit.jupiter.api.Assertions.*;
+
+public class ReseauPetriTest {
+
+    /**
+     * Les fonctions à tester suivantes n’affichent rien. Elles créent des objets et les retournent à la
+     * fonction de test. C’est la fonction de test qui affiche afin que les testeurs puissent observer les
+     * résultats
+     */
+
+    private ReseauPetri reseauPetri;
+    private List<Place> places;
+    private List<Transition> transitions;
+    private LinkedList<Arc> arcs;
+
+    /**
+     * Créer un reseauPetri vide sans entrée. Résultat attendu : un RdP est créé vide
+     * Créer une transition. Résultat attendu : une transition est créée (sans lien)
+     * Créer une place avec nombres de jetons. Les cas : jetons ≥0, jetons < 0.
+     * Résultat attendu : une place est créée (sans lien), aucune place n’est créée ; Erreur
+     */
+
+    @BeforeEach
+    public void setUp() {
+        reseauPetri = new ReseauPetri();
+    }
+
+    @Test
+    public void testAjouterJeton() {
+        Place place = new Place(2, reseauPetri.generateId(1));
+        place.ajouter_jeton(-2);
+        place.ajouter_jeton(2);
+        assertEquals(4, place.get_nombre_jetons());
+    }
+
+    @Test
+    public void testEnleverJeton() {
+        Place place = new Place(2, reseauPetri.generateId(1));
+        place.enlever_jeton(-2);
+        place.enlever_jeton(2);
+        assertEquals(0, place.get_nombre_jetons());
+    }
+
+    @Test
+    public void testAjouterPlace() {
+        Place place = new Place(2,  reseauPetri.generateId(1));
+        reseauPetri.ajouterPlace(place);
+
+        // A test for an existing place
+        reseauPetri.ajouterPlace(place);
+        assertEquals(1, reseauPetri.getPlaces().size());
+    }
+
+    @Test
+    public void testAjouterTransition() {
+        Transition transition = new Transition("transition", reseauPetri.generateId(2));
+        reseauPetri.ajouterTransition(transition);
+        // A test for an existing transition
+        reseauPetri.ajouterTransition(transition);
+        assertEquals(1, reseauPetri.getTransitions().size());
+    }
+
+    @Test
+    public void testAjouterArc() {
+        Place place = new Place(2, reseauPetri.generateId(1));
+        Transition transition = new Transition("transition", reseauPetri.generateId(2));
+        Arc_SORTANT arc_0 = new Arc_SORTANT(transition, place, 1, reseauPetri.generateId(0));
+
+        // A test for a negative weight
+        Arc_SORTANT arc_1 = new Arc_SORTANT(transition, place, -1, reseauPetri.generateId(0));
+        reseauPetri.ajouterArc(arc_0);
+
+        // A test for an existing arc
+        reseauPetri.ajouterArc(arc_0);
+        assertEquals(1, reseauPetri.getArcs().size());
+    }
+
+    @Test
+    public void testAssemblerPetri(){
+
+        ReseauPetri Mutex = new ReseauPetri();
+        Arc arc;
+
+        Place P1 = new Place(0, Mutex.generateId(1));
+        Mutex.ajouterPlace(P1);
+        Mutex.ajouterPlace(P1);
+
+        Transition T1 = new Transition("T1", Mutex.generateId(2));
+        Mutex.ajouterTransition(T1);
+        Mutex.ajouterTransition(T1);
+
+        Place P2 = new Place(1, Mutex.generateId(1));
+        Mutex.ajouterPlace(P2);
+
+        Transition T2 = new Transition("T2", Mutex.generateId(2));
+        Mutex.ajouterTransition(T2);
+
+        Place P3 = new Place(0, Mutex.generateId(1));
+        Mutex.ajouterPlace(P3);
+
+        Transition T3 = new Transition("T3", Mutex.generateId(2));
+        Mutex.ajouterTransition(T3);
+
+        Place P4 = new Place(0, Mutex.generateId(1));
+        Mutex.ajouterPlace(P4);
+
+        Transition T4 = new Transition("T4", Mutex.generateId(2));
+        Mutex.ajouterTransition(T4);
+
+        Place P5 = new Place(1, Mutex.generateId(1));
+        Mutex.ajouterPlace(P5);
+
+        // Creer l'arc entrant simple à T1 de P1
+        arc = new Arc_entrant_simple(T1, P1, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T1.ajouterArc_ENTRANT((Arc_ENTRANT) arc);
+
+        // Creer l'arc sortant de T2 vers P1
+        arc = new Arc_SORTANT(T2, P1, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T2.ajouterArc_SORTANT((Arc_SORTANT) arc);
+
+        // Creer l'arc sortant de T1 vers P2
+        arc = new Arc_SORTANT(T1, P2, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T1.ajouterArc_SORTANT((Arc_SORTANT) arc);
+
+        // Creer l'arc entrant simple à T2 de P2
+        arc = new Arc_entrant_simple(T2, P2, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T2.ajouterArc_ENTRANT((Arc_ENTRANT) arc);
+
+        // Creer l'arc entrant simple à T1 de P3
+        arc = new Arc_entrant_simple(T1, P3, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T1.ajouterArc_ENTRANT((Arc_ENTRANT) arc);
+
+        // Creer l'arc sortant de T2 vers P3
+        arc = new Arc_SORTANT(T2, P3, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T2.ajouterArc_SORTANT((Arc_SORTANT) arc);
+
+        // Creer l'arc entrant simple à T3 de P3
+        arc = new Arc_entrant_simple(T3, P3, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T3.ajouterArc_ENTRANT((Arc_ENTRANT) arc);
+
+        // Creer l'arc sortant de T4 vers P3
+        arc = new Arc_SORTANT(T4, P3, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T4.ajouterArc_SORTANT((Arc_SORTANT) arc);
+
+        // Creer l'arc sortant de T3 à P4
+        arc = new Arc_SORTANT(T3, P4, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T3.ajouterArc_SORTANT((Arc_SORTANT) arc);
+
+        // Creer l'arc entrant à T4 de P4
+        arc = new Arc_entrant_simple(T4, P4, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T4.ajouterArc_ENTRANT((Arc_ENTRANT) arc);
+
+        // Creer l'arc entrant à T3 de P5
+        arc = new Arc_entrant_simple(T3, P5, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T3.ajouterArc_ENTRANT((Arc_ENTRANT) arc);
+
+        // Creer l'arc sortant de T4 vers P5
+        arc = new Arc_SORTANT(T4, P5, 1, Mutex.generateId(0));
+        Mutex.ajouterArc(arc);
+        T4.ajouterArc_SORTANT((Arc_SORTANT) arc);
+
+        Mutex.afficherReseau();
+
+    }
+
+    @Test
+    public void testActiverPetri_1() {
+        ReseauPetri Active = new ReseauPetri();
+
+        // Active has only one Transition
+        Transition T1 = new Transition("T1", Active.generateId(2));
+        Active.ajouterTransition(T1);
+
+        // Tirer T1
+        Active.tirer_transition(String.valueOf(T1.getId()));
+        Active.afficherReseau();
+    }
+
+    @Test
+    public void testActiverPetri_2() {
+        ReseauPetri Active = new ReseauPetri();
+
+        Transition T1 = new Transition("T1", Active.generateId(2));
+
+        // Active has only one Place with 0 jetons
+        Place P1 = new Place(0, Active.generateId(1));
+        Active.ajouterPlace(P1);
+
+        // Creer l'arc entrant simple à T1 de P1
+        Arc_ENTRANT arc = new Arc_entrant_simple(T1, P1, 1, Active.generateId(0));
+        Active.ajouterArc(arc);
+
+        T1.ajouterArc_ENTRANT(arc);
+        Active.ajouterTransition(T1);
+
+        // Tirer T1
+        Active.tirer_transition(String.valueOf(T1.getId()));
+        Active.afficherReseau();
+    }
+
+    @Test
+    public void testActiverPetri_3() {
+        ReseauPetri Active = new ReseauPetri();
+
+        Transition T1 = new Transition("T1", Active.generateId(2));
+
+        // Active has only one Place with 2 jeton
+        Place P1 = new Place(2, Active.generateId(1));
+        Active.ajouterPlace(P1);
+
+        // Creer l'arc entrant simple à T1 de P1
+        Arc_ENTRANT arc = new Arc_entrant_simple(T1, P1, 1, Active.generateId(0));
+        Active.ajouterArc(arc);
+
+        T1.ajouterArc_ENTRANT(arc);
+        Active.ajouterTransition(T1);
+
+        // Tirer T1
+        Active.tirer_transition(String.valueOf(T1.getId()));
+        Active.afficherReseau();
+    }
+
+    @Test
+    public void testActiverPetri_4() {
+        ReseauPetri Active = new ReseauPetri();
+
+        Transition T1 = new Transition("T1", Active.generateId(2));
+
+        // Active has only one Place with 5 jetons
+        Place P1 = new Place(5, Active.generateId(1));
+        Active.ajouterPlace(P1);
+
+        // Creer l'arc entrant simple à T1 de P1
+        Arc_ENTRANT arc = new Arc_entrant_simple(T1, P1, 3, Active.generateId(0));
+        Active.ajouterArc(arc);
+
+        T1.ajouterArc_ENTRANT(arc);
+        Active.ajouterTransition(T1);
+
+        // Tirer T1
+        Active.tirer_transition(String.valueOf(T1.getId()));
+        Active.afficherReseau();
+    }
+
+    @Test
+    public void testActiverPetri_5() {
+        ReseauPetri Active = new ReseauPetri();
+
+        Transition T1 = new Transition("T1", Active.generateId(2));
+
+        // Active has two Places with 0 and 2 jetons
+        Place P1 = new Place(0, Active.generateId(1));
+        Place P2 = new Place(2, Active.generateId(1));
+        Active.ajouterPlace(P1);
+        Active.ajouterPlace(P2);
+
+        // Creer l'arc entrant simple à T1 de P1
+        Arc_ENTRANT arc = new Arc_entrant_simple(T1, P1, 1, Active.generateId(0));
+        Active.ajouterArc(arc);
+        Arc_SORTANT arc_1 = new Arc_SORTANT(T1, P2, 1, Active.generateId(0));
+        Active.ajouterArc(arc_1);
+
+        T1.ajouterArc_ENTRANT(arc);
+        T1.ajouterArc_SORTANT(arc_1);
+        Active.ajouterTransition(T1);
+
+        // Tirer T1
+        Active.tirer_transition(String.valueOf(T1.getId()));
+        Active.afficherReseau();
+    }
+
+}
diff --git a/src/test/java/org/petriNet/TransitionTest.java b/src/test/java/org/petriNet/TransitionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2ab20b59584c33f1452340a6dccba4a9e186432
--- /dev/null
+++ b/src/test/java/org/petriNet/TransitionTest.java
@@ -0,0 +1,14 @@
+package org.petriNet;// src/test/java/org/petriNet/TransitionTest.java
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TransitionTest {
+    private Transition transition;
+    private List<Arc_SORTANT> arcs_SORTANTS;
+    private List<Arc_ENTRANT> arcs_ENTRANTS;
+
+}