diff --git a/ping/admin.py b/ping/admin.py
index 8a9827390482d2b4ce6e8bde7dd5195cf7917802..ced47caaca8a68a6796f3af79cf6979fcb8eee5d 100644
--- a/ping/admin.py
+++ b/ping/admin.py
@@ -8,4 +8,5 @@ admin.site.register(Experiment)
 admin.site.register(Metrics)
 admin.site.register(CurrentExperiment)
 admin.site.register(Network)
-admin.site.register(Link)
\ No newline at end of file
+admin.site.register(Link)
+admin.site.register(Node)
\ No newline at end of file
diff --git a/ping/models.py b/ping/models.py
index abec77261bd3d873244e04c60d66d710140c4754..39863365bec1e58b316e14f0202539f8bc65399e 100644
--- a/ping/models.py
+++ b/ping/models.py
@@ -62,6 +62,8 @@ class CurrentExperiment(models.Model):
     scheduling = models.CharField(default="sync", max_length=10)
 
     com_graph = models.BooleanField(default=False)
+    com_fun = models.CharField(default="linear", max_length=64)
+    com_refresh = models.PositiveIntegerField(default=1)
 
 
 class Network(models.Model):
@@ -73,7 +75,13 @@ class Network(models.Model):
 
     path_to_iotamak = models.CharField(max_length=60)
 
+
 class Link(models.Model):
     id1 = models.PositiveIntegerField(default=0)
     id2 = models.PositiveIntegerField(default=0)
-    value = models.PositiveIntegerField(default=1)
\ No newline at end of file
+    value = models.PositiveIntegerField(default=1)
+
+
+class Node(models.Model):
+    name = models.CharField(max_length=60)
+    group = models.PositiveIntegerField(default=0)
diff --git a/ping/templates/ping/play.html b/ping/templates/ping/play.html
index 294e493af869af4e1ebdfcd1c18d9d735ede7e79..83f08bff42607614846fe96aa4cac99fb5c8bbfc 100644
--- a/ping/templates/ping/play.html
+++ b/ping/templates/ping/play.html
@@ -169,7 +169,7 @@ const myChart = new Chart(document.getElementById("line-chart"), {
   {% endif %}
 
 
-<svg width="960" height="600"></svg>
+<svg width="500" height="500" style="border:1px solid #000000;"></svg>
 <script>
 
 var graph = {
@@ -182,34 +182,22 @@ var graph = {
   "links": []
 };
 
-
-
-
 var svg = d3.select("svg"),
     width = +svg.attr("width"),
     height = +svg.attr("height");
 
-var color = d3.scaleOrdinal(d3.schemeCategory20);
+var color = d3.schemeCategory10;
 
 var simulation = d3.forceSimulation()
     .force("link", d3.forceLink().id(function(d) { return d.id; }))
     .force("charge", d3.forceManyBody().strength(-2500))
     .force("center", d3.forceCenter(width / 2, height / 2));
 
-  var link = svg.append("g").attr("class", "links").selectAll("line")
-  .data(graph.links).enter().append("line")
+  var link = svg.append("g").attr("class", "links").selectAll("line").data(graph.links).enter().append("line")
   .attr("stroke-width", function(d) { return Math.sqrt(d.value); });
 
-  var node = svg.append("g")
-      .attr("class", "nodes")
-    .selectAll("g")
-    .data(graph.nodes)
-    .enter().append("g")
-
-  var circles = node.append("circle")
-    .attr("r", 20)
-    .attr("fill", function(d) { return color(d.group); });
-
+  var node = svg.append("g").attr("class", "nodes").selectAll("g").data(graph.nodes).enter().append("g")
+  var circles = node.append("circle").attr("r", 20).attr("fill", function(d) { return color[d.group]; });
   var lables = node.append("text").text(function(d) {return d.id;}).attr('x', 16).attr('y', 13);
 
   node.append("title").text(function(d) { return d.id; });
@@ -239,8 +227,19 @@ const comSocket = new WebSocket(
 comSocket.onmessage = function (e) {
   graph = JSON.parse(e.data).message;
   console.log(graph);
+  console.log(typeof graph);
 
-  //simulation.nodes(graph.nodes);
+  svg.selectAll("*").remove();
+  link = svg.append("g").attr("class", "links").selectAll("line").data(graph.links).enter().append("line")
+  .attr("stroke-width", function(d) { return Math.sqrt(d.value); });
+
+  node = svg.append("g").attr("class", "nodes").selectAll("g").data(graph.nodes).enter().append("g")
+  circles = node.append("circle").attr("r", 20).attr("fill", function(d) { return color[d.group]; });
+  lables = node.append("text").text(function(d) {return d.id;}).attr('x', 16).attr('y', 13);
+
+  node.append("title").text(function(d) { return d.id; });
+
+  simulation.nodes(graph.nodes).on("tick", ticked);
   simulation.force("link").links(graph.links);
   simulation.alpha(1).restart();
   };
diff --git a/ping/views/play.py b/ping/views/play.py
index 4018f9bdaa5e6c65dcd5f5490860e3803b4628b6..4b9270f643a802e492cea85067b9c01fb6ea333d 100644
--- a/ping/views/play.py
+++ b/ping/views/play.py
@@ -17,7 +17,7 @@ from iotAmak.tool.ssh_client import Cmd
 from paho.mqtt.client import Client as MQTTClient
 
 from .tool import delete_folder, get_ssh_client, canvas_event_triger, graph_event_triger, com_event_triger
-from ..models import Experiment, CurrentExperiment, Metrics, Network, Link
+from ..models import Experiment, CurrentExperiment, Metrics, Network, Link, Node
 
 client = MQTTClient(client_id="django-ihm")
 
@@ -42,7 +42,8 @@ def agent_message(client, userdata, message) -> None:
         id1, id2 = id2, id1
 
     link = Link.objects.filter(id1=id1, id2=id2)[0]
-    link.value += 1
+    if link.value < 30:
+        link.value += 1
     link.save()
 
 
@@ -69,37 +70,54 @@ def agent_metric(client, userdata, message) -> None:
     graph_event_triger([data, exp.cycle])
 
 
+def evaporation():
+    links = Link.objects.all()
+
+    for link in links:
+        link.value -= 1
+        if link.value <= 0:
+            link.value = 0
+        link.save()
+
+
 def cycle_done(client, userdata, message) -> None:
     cur_exp = CurrentExperiment.objects.all()[0]
     cur_exp.cycle += 1
     cur_exp.save()
 
-    data = {
-        "nodes": [
-            {"id": "Agent_0", "group": 1},
-            {"id": "Agent_1", "group": 2},
-            {"id": "Agent_2", "group": 1},
-            {"id": "Agent_3", "group": 3}
-        ],
-        "links": [
-            {
-                "source": "Agent_"+str(elem.id1),
-                "target": "Agent_"+str(elem.id2),
-                "value": elem.value
+    if cur_exp.com_graph:
+        if cur_exp.cycle % cur_exp.com_refresh == 0:
+            for _ in range(cur_exp.com_refresh):
+                evaporation()
+
+            data = {
+                "nodes": [
+                    {"id": node.name, "group": node.group}
+                    for node in Node.objects.all()
+                ],
+                "links": [
+                    {
+                        "source": "Agent_" + str(elem.id1),
+                        "target": "Agent_" + str(elem.id2),
+                        "value": elem.value
+                    }
+                    for elem in Link.objects.all()
+                ]
             }
-            for elem in Link.objects.all()
-        ]
-    }
-    com_event_triger(str(data))
+            com_event_triger(data)
 
 
 def update_nbr_agent(client, userdata, message) -> None:
+    results = literal_eval(message.payload.decode("utf-8"))
     exp = CurrentExperiment.objects.all()[0]
-    subscribe(client, "agent/" + str(exp.nbr_agent) + "/log", agent_log)
+
+    subscribe(client, "agent/" + str(results.get("id")) + "/log", agent_log)
     if exp.com_graph:
-        subscribe(client, "agent/" + str(exp.nbr_agent) + "/mail", agent_message)
+        subscribe(client, "agent/" + str(results.get("id")) + "/mail", agent_message)
+        node = Node(name="Agent_"+str(results.get("id")), group=results.get("ip"))
+        node.save()
         for i in range(exp.nbr_agent):
-            link = Link(id1=i, id2=exp.nbr_agent)
+            link = Link(id1=i, id2=results.get("id"))
             link.save()
     exp.nbr_agent += 1
     exp.save()
@@ -131,7 +149,10 @@ def experiment_load(request):
 
     if "com_graph" in config:
         cur_exp.com_graph = True
+        cur_exp.com_fun = config.get("com_graph").get("fun")
+        cur_exp.com_refresh = config.get("com_graph").get("refresh")
         Link.objects.all().delete()
+        Node.objects.all().delete()
 
     cur_exp.scheduling = config.get("scheduling_type")
 
@@ -300,9 +321,9 @@ def experiment_share(request):
 
 
 def experiment_stop(request):
-    get_nohup()
     client.publish("ihm/exit")
     client.publish("ihm/step")
+    get_nohup()
     return HttpResponseRedirect(reverse('ping:play'))