diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
index 2c221d11bc4c24613c0ca612b60f215915bb95db..390fa3402cd354eb356f97a793dc5c2dfe305be6 100644
--- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
@@ -85,6 +85,12 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co
         new SupervisorStatus(readyVariables =  status.readyVariables + variable,
           isFirstRound = status.isFirstRound)
 
+    //when it receives an InformValue from an early agent
+    case Event(InformValue(_), status) => {
+      stash
+      stay using status
+    }
+
     //When all the agents become ready
     case Event(Ready, status) if status.nbReady == pb.size - 1  =>
       val variable = directory.variableOf(sender)
@@ -93,6 +99,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co
         if (trace) println(s"Supervisor -> $anyVariable : Trigger")
         directory.addressOf(anyVariable) ! Trigger
       }
+      unstashAll
       goto(RunningSupervisorState) using
         new SupervisorStatus(readyVariables =  status.readyVariables + variable,
           isFirstRound = status.isFirstRound)
@@ -109,22 +116,25 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co
       stay using status
 
     // When an agent becomes inactive
-    case Event(InformValue(value), status) if status.assignment.valuation.size < pb.size - 1 =>
+    case Event(InformValue(value), status) if status.informValCounter < pb.size - 1 =>
       val variable: Variable = directory.variableOf(sender)
       if (debug) println(s"Supervisor ($stateName): $variable is inactive")
-      stay using new SupervisorStatus(readyVariables = status.readyVariables,
+      var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables,
         inactiveVariables = status.inactiveVariables + variable,
         assignment = status.assignment.fix(variable,value),
         isFirstRound = status.isFirstRound)
+        updatedStatus.incrementInformValCounter()
+      stay using updatedStatus
 
     // When all the agent become inactive
-    case Event(InformValue(value), status) if status.assignment.valuation.size == pb.size - 1 =>
+    case Event(InformValue(value), status) if status.informValCounter == pb.size - 1 =>
       val variable: Variable = directory.variableOf(sender)
       if (debug) println(s"Supervisor ($stateName): $variable is finally inactive")
-      val updatedStatus =  new SupervisorStatus(readyVariables = status.readyVariables,
+      var updatedStatus =  new SupervisorStatus(readyVariables = status.readyVariables,
         inactiveVariables = status.inactiveVariables + variable,
         assignment = status.assignment.fix(variable,value),
         isFirstRound = false)
+        updatedStatus.incrementInformValCounter()
 
       if (! updatedStatus.isTerminated){// If the solving must be restart for another round
         pb.variables.foreach { anyVariable: Variable =>
diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala
index bc71821bd566acddcb3f8b94d167c8f85b40f58a..160acec0ad9d03e5c7c3bc65b8e67fc869d420ac 100644
--- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala
@@ -18,7 +18,8 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(),
                        val killedVariables: Set[Variable] = Set(),
                        val assignment: Context = new Context(),
                        val metric: Metric= collection.mutable.Map[String,Double](),
-                       val isFirstRound : Boolean = true
+                       val isFirstRound : Boolean = true,
+                       val informValCounter: Int = 0
                       ){
 
   /**
@@ -42,14 +43,26 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(),
     */
   def isTerminated : Boolean = Supervisor.incrementCounter() > Supervisor.NB_ROUNDS
 
+  def incrementInformValCounter(): SupervisorStatus = {
+   new SupervisorStatus(readyVariables,
+                       inactiveVariables,
+                       killedVariables,
+                       assignment,
+                       metric,
+                       isFirstRound,
+                       informValCounter = informValCounter + 1
+                      )
+  }
+
   /*Returns the updated supervisor's status when resetting the context*/
   def resetContext(): SupervisorStatus = {
     new SupervisorStatus(readyVariables,
       inactiveVariables = Set(),
       killedVariables,
-      assignment = new Context(),
+      assignment,
       metric,
-      isFirstRound
+      isFirstRound,
+      informValCounter = 0
     )
   }
 }