diff --git a/classes/org/scadcop/solver/decentralized/mgm2/SupervisorBehaviour.Scala b/classes/org/scadcop/solver/decentralized/mgm2/SupervisorBehaviour.Scala
new file mode 100755
index 0000000000000000000000000000000000000000..e7371d9beb5556ee42df70ae5b85bc4640d44ec9
--- /dev/null
+++ b/classes/org/scadcop/solver/decentralized/mgm2/SupervisorBehaviour.Scala
@@ -0,0 +1,45 @@
+// Copyright (C) Maxime MORGE, Alex VIGNERON 2020
+package org.scadcop.solver.decentralized.mgm2
+
+import org.scadcop.problem._
+import org.scadcop.solver.decentralized._
+import org.scadcop.solver.decentralized.agent._
+
+import akka.actor.{FSM, Stash}
+
+/**
+  * Negotiation behaviour for an agent in the MGM2 algorithm
+  * See Maheswaran R.T., Pearce J.P., Tambe M. (2006)
+  * A Family of Graphical-Game-Based Algorithms for Distributed Constraint Optimization Problems.
+  * In: Scerri P., Vincent R., Mailler R. (eds)
+  * Coordination of Large-Scale Multiagent Systems. Springer, Boston, MA.
+  * @param variable which should be valuated
+  * @param neighbours the variables which are linked to the variables
+  * @param constraints which should be valuated
+  */
+class SupervisorBehaviour(variable: Variable,
+                     neighbours : Set[Variable],
+                     constraints: Set[Constraint])
+  extends VariableAgent(variable, neighbours, constraints)
+    with FSM[MGM2State, MGM2Mind]
+    with Stash {
+
+  debug = true
+
+
+  /**
+    * Initially the agent has no task in the bundle
+    */
+  startWith(Init, new MGM2Mind())
+
+  when(Start){
+      //when it receives a 
+      case Event(Trigger, mind) => {
+          stay using mind
+      }
+
+  }
+
+  
+}
+
diff --git a/doc/fsm/fullFSM.png b/doc/fsm/fullFSM.png
new file mode 100755
index 0000000000000000000000000000000000000000..b29be54624b3e359bd1fdbb3f741178b454aa81a
Binary files /dev/null and b/doc/fsm/fullFSM.png differ
diff --git a/doc/fsm/uncommitted.png b/doc/fsm/uncommitted.png
new file mode 100755
index 0000000000000000000000000000000000000000..842f6e17ffc136ac972ebca6a63f1857ea813ba0
Binary files /dev/null and b/doc/fsm/uncommitted.png differ
diff --git a/doc/related/fsm_mgm_1.png b/doc/related/fsm_mgm_1.png
new file mode 100755
index 0000000000000000000000000000000000000000..c2360a24d135c03c2ae0958b8125fe7fc1c848d7
Binary files /dev/null and b/doc/related/fsm_mgm_1.png differ
diff --git a/src/main/scala/org/scadcop/dfs/DFS.scala b/src/main/scala/org/scadcop/dfs/DFS.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/example/DalekSurveillanceSystem.scala b/src/main/scala/org/scadcop/example/DalekSurveillanceSystem.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/example/RobeColouringExample.scala b/src/main/scala/org/scadcop/example/RobeColouringExample.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/example/ToyExample.scala b/src/main/scala/org/scadcop/example/ToyExample.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/problem/Constraint.scala b/src/main/scala/org/scadcop/problem/Constraint.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/problem/Context.scala b/src/main/scala/org/scadcop/problem/Context.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/problem/DCOP.scala b/src/main/scala/org/scadcop/problem/DCOP.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/problem/Value.scala b/src/main/scala/org/scadcop/problem/Value.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/problem/Variable.scala b/src/main/scala/org/scadcop/problem/Variable.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/Solver.scala b/src/main/scala/org/scadcop/solver/Solver.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/Algorithm.scala b/src/main/scala/org/scadcop/solver/decentralized/Algorithm.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/DecentralizedSolver.scala b/src/main/scala/org/scadcop/solver/decentralized/DecentralizedSolver.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/Directory.scala b/src/main/scala/org/scadcop/solver/decentralized/Directory.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/Message.scala b/src/main/scala/org/scadcop/solver/decentralized/Message.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/Metric.scala b/src/main/scala/org/scadcop/solver/decentralized/Metric.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/State.scala b/src/main/scala/org/scadcop/solver/decentralized/State.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/agent/Mind.scala b/src/main/scala/org/scadcop/solver/decentralized/agent/Mind.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/agent/VariableAgent.scala b/src/main/scala/org/scadcop/solver/decentralized/agent/VariableAgent.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Message.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Message.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Mind.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Mind.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2State.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2State.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/Move.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/Move.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/Offer.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/Offer.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
old mode 100644
new mode 100755
index 390fa3402cd354eb356f97a793dc5c2dfe305be6..2c221d11bc4c24613c0ca612b60f215915bb95db
--- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala
@@ -85,12 +85,6 @@ 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)
@@ -99,7 +93,6 @@ 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)
@@ -116,25 +109,22 @@ 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.informValCounter < pb.size - 1 =>
+    case Event(InformValue(value), status) if status.assignment.valuation.size < pb.size - 1 =>
       val variable: Variable = directory.variableOf(sender)
       if (debug) println(s"Supervisor ($stateName): $variable is inactive")
-      var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables,
+      stay using 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.informValCounter == pb.size - 1 =>
+    case Event(InformValue(value), status) if status.assignment.valuation.size == pb.size - 1 =>
       val variable: Variable = directory.variableOf(sender)
       if (debug) println(s"Supervisor ($stateName): $variable is finally inactive")
-      var updatedStatus =  new SupervisorStatus(readyVariables = status.readyVariables,
+      val 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/SupervisorState.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala
old mode 100644
new mode 100755
index 160acec0ad9d03e5c7c3bc65b8e67fc869d420ac..bc71821bd566acddcb3f8b94d167c8f85b40f58a
--- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala
+++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala
@@ -18,8 +18,7 @@ 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 informValCounter: Int = 0
+                       val isFirstRound : Boolean = true
                       ){
 
   /**
@@ -43,26 +42,14 @@ 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,
+      assignment = new Context(),
       metric,
-      isFirstRound,
-      informValCounter = 0
+      isFirstRound
     )
   }
 }
diff --git a/src/main/scala/org/scadcop/util/Main.scala b/src/main/scala/org/scadcop/util/Main.scala
old mode 100644
new mode 100755
diff --git a/src/main/scala/org/scadcop/util/MathUtils.scala b/src/main/scala/org/scadcop/util/MathUtils.scala
old mode 100644
new mode 100755
diff --git a/src/test/scala/org/scadcop/problem/ObjectiveDalekSurveillanceSystemSpec.scala b/src/test/scala/org/scadcop/problem/ObjectiveDalekSurveillanceSystemSpec.scala
old mode 100644
new mode 100755
diff --git a/src/test/scala/org/scadcop/problem/ObjectiveRobeColouringExampleSpec.scala b/src/test/scala/org/scadcop/problem/ObjectiveRobeColouringExampleSpec.scala
old mode 100644
new mode 100755