diff --git a/dist/iotAmak-0.0.3-py3-none-any.whl b/dist/iotAmak-0.0.3-py3-none-any.whl
index d507a96c580dba28375964768a3027df3086f88c..9c6d61d0c9440660ef9b9a1c4112336e65cab689 100644
Binary files a/dist/iotAmak-0.0.3-py3-none-any.whl and b/dist/iotAmak-0.0.3-py3-none-any.whl differ
diff --git a/iotAmak/scheduler.py b/iotAmak/scheduler.py
index ef7f5b5d1484912dd5bd45b5badb9b6e89c072a3..13203119af943a6a31cab2fc4d5eeadc5d2f37b4 100644
--- a/iotAmak/scheduler.py
+++ b/iotAmak/scheduler.py
@@ -1,6 +1,7 @@
 """
 Scheduler class file
 """
+from threading import Semaphore
 from time import sleep
 
 import sys
@@ -19,9 +20,6 @@ class Scheduler(Schedulable):
     def __init__(self, broker_ip: str) -> None:
 
         Schedulable.__init__(self, broker_ip, "Scheduler")
-        self.sleep_between_cycle = 0
-
-        self.ihm_token = 0
         self.paused = True
 
         self.nbr_agent = 0
@@ -32,8 +30,9 @@ class Scheduler(Schedulable):
         self.subscribe("ihm/pause", self.pause)
         self.subscribe("ihm/unpause", self.unpause)
 
-        self.agent_waiting = 0
-        self.schedulable_waiting = 0
+        self.agent_semaphore = Semaphore(0)
+        self.schedulable_semaphore = Semaphore(0)
+        self.ihm_semaphore = Semaphore(0)
 
         print("Init done")
 
@@ -42,26 +41,26 @@ class Scheduler(Schedulable):
         Function called when the IHM pause the scheduler
         """
         self.paused = True
-        self.ihm_token = 0
+        self.ihm_semaphore.acquire()
 
     def unpause(self, client, userdata, message) -> None:
         """
         Function called when the IHM unpause the scheduler
         """
         self.paused = False
-        self.ihm_token = 1
+        self.ihm_semaphore.release()
 
     def step(self, client, userdata, message) -> None:
         """
         Function called by the IHM when the scheduler is in Step by Step mode
         """
-        self.ihm_token += 1
+        self.ihm_semaphore.release()
 
     def update_schedulable(self, client, userdata, message) -> None:
         """
         Function called whenever the amas/env have finished an action and is waiting
         """
-        self.schedulable_waiting += 1
+        self.schedulable_semaphore.release()
         print("__Schedulable is waiting")
 
     def update_nbr_agent(self, client, userdata, message) -> None:
@@ -77,24 +76,22 @@ class Scheduler(Schedulable):
         """
         Called whenever an agent have done an action and is waiting
         """
-        self.agent_waiting += 1
+        self.agent_semaphore.release()
         print("__Agent done")
 
     def wait_agent(self) -> None:
         """
         Called when the scheduler is waiting for all agent do have finished their action
         """
-        while self.agent_waiting < self.nbr_agent:
-            sleep(self.wait_delay)
-        self.agent_waiting = 0
+        for _ in range(self.nbr_agent):
+            self.agent_semaphore.acquire()
 
     def wait_schedulable(self) -> None:
         """
         Called when the scheduler is waiting for both amas and env to have finished their action
         """
-        while self.schedulable_waiting < 2:
-            sleep(self.wait_delay)
-        self.schedulable_waiting = 0
+        for _ in range(2):
+            self.schedulable_semaphore.acquire()
 
     def wait_ihm(self) -> None:
         """
@@ -102,9 +99,7 @@ class Scheduler(Schedulable):
         """
         if not self.paused:
             return
-        while self.ihm_token == 0:
-            sleep(self.wait_delay)
-        self.ihm_token -= 1
+        self.ihm_semaphore.acquire()
 
     def first_part(self) -> None:
         """
@@ -158,7 +153,6 @@ class Scheduler(Schedulable):
             print("-Last part")
             self.last_part()
 
-            sleep(self.sleep_between_cycle)
             self.nbr_cycle += 1
             self.publish("scheduler/cycledone", "")