diff --git a/agent.py b/agent.py
index 16959979fb60966fb18c2291d48105a7bd88b347..3d79a4a59b943b7e1918654cbf09063d7873e926 100644
--- a/agent.py
+++ b/agent.py
@@ -12,7 +12,7 @@ class Agent(Schedulable):
 
         Schedulable.__init__(self, client_id="Agent"+str(self.id))
 
-        self.subscribe("scheduler/agent/wakeup", self.scheduler_wake_up)
+        self.subscribe("scheduler/agent/wakeup", self.wake_up)
 
         self.neighbors = []
         self.next_neighbors = []
@@ -41,10 +41,6 @@ class Agent(Schedulable):
     def publish(self, topic: str, message) -> None:
         self.client.publish("agent/" + str(self.id) + "/" + topic, message)
 
-    def scheduler_wake_up(self, client, userdata, message):
-        self.wake_up_token = True
-        print("waked up")
-
     def on_cycle_begin(self):
         self.log("on_cycle_begin")
 
diff --git a/amas.py b/amas.py
index 1f2d533ee6c8cb99b4cab8df85c9894b01ffd14b..d11c697974fb062758bbd8d6fabfbaab61fcaf16 100644
--- a/amas.py
+++ b/amas.py
@@ -15,7 +15,7 @@ class Amas(Schedulable):
     def __init__(self):
         Schedulable.__init__(self, client_id="Amas")
 
-        self.subscribe("scheduler/schedulable/wakeup", self.scheduler_wake_up)
+        self.subscribe("scheduler/schedulable/wakeup", self.wake_up)
 
         self.next_id = 0
 
@@ -29,10 +29,6 @@ class Amas(Schedulable):
     def on_initial_agents_creation(self):
         pass
 
-    def scheduler_wake_up(self, client, userdata, message):
-        self.wake_up_token = True
-        print("waked up")
-
     def add_agent(self):
         try:
             s = pxssh.pxssh()
diff --git a/environment.py b/environment.py
index 407fef81869ce28a7f20a97f4398a59ebfa72cba..562a268947d54242af3ee38c8248a4122d13975a 100644
--- a/environment.py
+++ b/environment.py
@@ -13,16 +13,12 @@ class Environment(Schedulable):
     def __init__(self):
         Schedulable.__init__(self, client_id="Env")
 
-        self.subscribe("scheduler/schedulable/wakeup", self.scheduler_wake_up)
+        self.subscribe("scheduler/schedulable/wakeup", self.wake_up)
 
         self.on_initialization()
 
         self.client.publish("env/action_done", "")
 
-    def scheduler_wake_up(self, client, userdata, message):
-        self.wake_up_token = True
-        print("waked up")
-
     def on_initialization(self) -> None:
         """
         This method will be executed at the end of __init__()
diff --git a/schedulable.py b/schedulable.py
index 43e33c5aeece22cb809acd82776bc115c98f27a2..7b1fe6fa26c070b3ec3b6c1477ed6a1c609da5ad 100644
--- a/schedulable.py
+++ b/schedulable.py
@@ -21,9 +21,13 @@ class Schedulable(MqttClient):
         self.wait_delay: float = 0.01
         self.wake_up_token: int = 0
 
+    def wake_up(self, client, userdata, message):
+        self.wake_up_token += 1
+        print("Waked up")
+
     def wait(self):
         # print("Waiting")
-        while not self.wake_up_token > 1:
+        while self.wake_up_token == 0:
             sleep(self.wait_delay)
         self.wake_up_token -= 1
         # print("End wait")
diff --git a/scheduler.py b/scheduler.py
index d5290db3e99f63686f50d27898d1aa8a23bf8597..888c10e67712bab28c167b78c10753f232c7b35b 100644
--- a/scheduler.py
+++ b/scheduler.py
@@ -22,8 +22,6 @@ class Scheduler(Schedulable):
 
     def update_schedulable(self, client, userdata, message):
         self.schedulable_waiting += 1
-        if self.schedulable_waiting == 2:
-            self.wake_up_token += 1
         print("__Schedulable is waiting")
 
     def update_nbr_agent(self, client, userdata, message):
@@ -33,10 +31,18 @@ class Scheduler(Schedulable):
 
     def agent_done(self, client, userdata, message):
         self.agent_waiting += 1
-        if self.agent_waiting >= self.nbr_agent:
-            self.wake_up_token += 1
         print("__Agent done")
 
+    def wait_agent(self):
+        while self.agent_waiting < self.nbr_agent:
+            sleep(self.wait_delay)
+        self.agent_waiting = 0
+
+    def wait_schedulable(self):
+        while self.schedulable_waiting < 2:
+            sleep(self.wait_delay)
+        self.schedulable_waiting = 0
+
     def first_part(self) -> None:
         """
         first part of a cycle
@@ -44,7 +50,7 @@ class Scheduler(Schedulable):
         self.client.publish("scheduler/schedulable/wakeup", "")
         # Amas on cycle begin
         # Environment on cycle begin
-        self.wait()
+        self.wait_schedulable()
 
     def main_part(self) -> None:
         """
@@ -52,10 +58,10 @@ class Scheduler(Schedulable):
         """
         self.client.publish("scheduler/agent/wakeup", "")
         # Agent doing phase 1
-        self.wait()
+        self.wait_agent()
         self.client.publish("scheduler/agent/wakeup", "")
         # agent doing phase 2
-        self.wait()
+        self.wait_agent()
 
     def last_part(self) -> None:
         """
@@ -64,7 +70,7 @@ class Scheduler(Schedulable):
         self.client.publish("scheduler/schedulable/wakeup", "")
         # Amas on cycle end
         # Environment on cycle end
-        self.wait()
+        self.wait_schedulable()
 
     def run(self) -> None:
         """
@@ -73,10 +79,10 @@ class Scheduler(Schedulable):
 
         # wait that all schedulable have init
         print("Waiting schedulable")
-        self.wait()
+        self.wait_schedulable()
         # Wait that all agent have init
         print("Waiting agents :", self.nbr_agent)
-        self.wait()
+        self.wait_agent()
 
         while not self.exit_bool:
             print("Cycle : ", self.nbr_cycle)