diff --git a/.gitignore b/.gitignore
index 5cc30b11118c1d1ed582f34035c76b420c5805eb..af6a8dadb2a10907ee13594ae070bbbb6ae8b44c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,6 @@ desktop.ini
 .idea
 venv
 *.bat
-__pycache__/
\ No newline at end of file
+__pycache__/
+build/
+iotAmak.egg-info/
diff --git a/README.md b/README.md
index 4ad75c4ce928bba3885a75e30292662934553002..b3277092045634590f128fd35acb8cc17dbd21eb 100644
--- a/README.md
+++ b/README.md
@@ -183,6 +183,9 @@ if __name__ == '__main__':
 
 Pour ajouter des attributs a l'initialisation aux agents il suffit de rajouter des `type(sys.argv[x])`.
 
+**A AJOUTER**
+un .config dans les experience avec la version du coeur
+
 # Topics
 
 ## Agent
diff --git a/dist/iotAmak-0.0.1-py3-none-any.whl b/dist/iotAmak-0.0.1-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..e38251787425c0cad929d37ca11b93eef2c65cae
Binary files /dev/null and b/dist/iotAmak-0.0.1-py3-none-any.whl differ
diff --git a/ihm.py b/ihm.py
deleted file mode 100644
index 6e520c416e0c322cbab9435aa23ee5f7d8a585d5..0000000000000000000000000000000000000000
--- a/ihm.py
+++ /dev/null
@@ -1,145 +0,0 @@
-import pathlib
-import platform  # For getting the operating system name
-import subprocess  # For executing a shell command
-import sys
-from os import path
-from subprocess import Popen
-from time import sleep
-
-from tool.confi_reader import read_ssh, read_broker
-from tool.mqtt_client import MqttClient
-from tool.ssh_client import SSHClient, Cmd
-
-
-class Ihm(MqttClient, SSHClient):
-
-    def __init__(self):
-        self.broker_ip = read_broker(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json")
-        MqttClient.__init__(self, self.broker_ip, "Ihm")
-        SSHClient.__init__(self, read_ssh(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json"))
-
-    def run(self):
-
-        exit_bool = False
-        experiment_folder = ""
-
-        while not exit_bool:
-
-            print("\n")
-            cmd = input(">")
-
-            # Envoie un signal a tout le monde pour exit
-            if cmd.lower() == "exit":
-                self.client.publish("ping/exit")
-                exit_bool = True
-
-            # cherche tout les potentiel agents sur les raspberry et les tuent
-            if cmd.lower() == "kill":
-
-                commands = [
-                    Cmd(
-                        cmd="ps -ef | grep 'python '",
-                        prefix="[BEFORE]"
-                    ),
-                    Cmd(
-                        cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done",
-                        do_print=False
-                    ),
-                    Cmd(
-                        cmd="ps -ef | grep 'python '",
-                        prefix="[AFTER]"
-                    )
-                ]
-
-                for i_client in range(len(self.clients)):
-                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
-                    self.run_cmd(i_client, commands)
-
-            # affiche tout les agents en vie
-            if cmd.lower() == "agent":
-                commands = [
-                    Cmd(
-                        cmd="ps -ef | grep 'python '"
-                    )]
-
-                for i_client in range(len(self.clients)):
-                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
-                    self.run_cmd(i_client, commands)
-
-            # automatise la mise a jour de l'exerience sur les raspberry
-            if cmd.lower() == "update":
-                commands = [
-                    Cmd(
-                        cmd="rm -r Desktop/mqtt_goyon/iotamak-core"
-                    )
-                ]
-                for i_client in range(len(self.clients)):
-                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
-                    self.run_cmd(i_client, commands)
-
-                self.update()
-
-            # charge une experience et verifie le format
-            if cmd.lower() == "load":
-                print("Give Path to experiment folder(relavive)")
-                cmd = input(">")
-                # check if exist
-                print("Check experiment:")
-                print(" | -> folder : ", path.exists(cmd))
-                print(" | -> agent.py : ", path.exists(cmd + "/agent.py"))
-                print(" | -> amas.py : ", path.exists(cmd + "/amas.py"))
-                print(" | -> env.py : ", path.exists(cmd + "/env.py"))
-                if path.exists(cmd) and path.exists(cmd + "/agent.py") and path.exists(
-                        cmd + "/amas.py") and path.exists(cmd + "/env.py"):
-                    experiment_folder = cmd
-                    print("Experiment loaded")
-
-            # Crée les processus amas/env/scheduler de l'experience chargé
-            if cmd.lower() == "start":
-
-                if experiment_folder != "":
-
-                    # choose exec
-                    print("Choose execution mode for the scheduler")
-                    print("0 : step by step, 1 : auto")
-                    while cmd not in ["0", "1"]:
-                        cmd = input(">")
-
-                    # start subprocess scheduler
-                    p1 = Popen([sys.executable, 'scheduler.py', cmd, self.broker_ip])
-                    sleep(1)
-                    # start subprocess amas
-                    send_client = [ c.to_send() for c in self.clients]
-                    p2 = Popen([sys.executable, experiment_folder + '/amas.py', self.broker_ip, str(send_client)])
-                    # start subprocess env
-                    p3 = Popen([sys.executable, experiment_folder + '/env.py', self.broker_ip])
-
-            if cmd.lower() == "pause":
-                self.client.publish("ping/pause")
-
-            if cmd.lower() == "unpause":
-                self.client.publish("ping/unpause")
-
-            if cmd.lower() in ["s", "step"]:
-                self.client.publish("ping/step")
-
-            if cmd.lower() == "ping":
-
-                for client in read_ssh(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json"):
-                    param = '-n' if platform.system().lower() == 'windows' else '-c'
-                    command = ['ping', param, '1', client.hostname]
-
-                    result = subprocess.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
-
-                    print("Hostname :", client.hostname, " Responded : ", result)
-
-            if cmd.lower() == "mode":
-                self.client.publish("ping/mode")
-
-        self.client.publish("ping/step")
-        sleep(2)
-
-
-if __name__ == '__main__':
-    a = Ihm()
-    a.run()
diff --git a/__init__.py b/iotAmak/__init__.py
similarity index 100%
rename from __init__.py
rename to iotAmak/__init__.py
diff --git a/agent.py b/iotAmak/agent.py
similarity index 95%
rename from agent.py
rename to iotAmak/agent.py
index 958e026c33e317836d3c47b303ffd6e61aaea5ca..52a1bf3d74af6df508105ee4740f4ba6e483a033 100644
--- a/agent.py
+++ b/iotAmak/agent.py
@@ -4,7 +4,12 @@ Agent class file
 from ast import literal_eval
 from typing import Dict
 
-from tool.schedulable import Schedulable
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.schedulable import Schedulable
 
 
 class Agent(Schedulable):
diff --git a/amas.py b/iotAmak/amas.py
similarity index 94%
rename from amas.py
rename to iotAmak/amas.py
index e8e97d3932ba2dc5b90fcedf5a095c5de51c5fa9..84248902706f76b68f7cb060fe6ab33893eee64f 100644
--- a/amas.py
+++ b/iotAmak/amas.py
@@ -4,9 +4,14 @@ Amas class
 from ast import literal_eval
 from typing import List
 
-from tool.remote_client import RemoteClient
-from tool.schedulable import Schedulable
-from tool.ssh_client import SSHClient, Cmd
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.remote_client import RemoteClient
+from iotAmak.tool.schedulable import Schedulable
+from iotAmak.tool.ssh_client import SSHClient, Cmd
 
 
 class Amas(Schedulable, SSHClient):
diff --git a/environment.py b/iotAmak/environment.py
similarity index 90%
rename from environment.py
rename to iotAmak/environment.py
index 24ea96e0e699aeb137df3897cbbdd7b5b60e0c8e..9adb3989458c17e086609cb70a2a081da0f48686 100644
--- a/environment.py
+++ b/iotAmak/environment.py
@@ -1,8 +1,12 @@
 """
 Environment class
 """
+import sys
+import pathlib
 
-from tool.schedulable import Schedulable
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.schedulable import Schedulable
 
 
 class Environment(Schedulable):
diff --git a/iotAmak/ihm.py b/iotAmak/ihm.py
new file mode 100644
index 0000000000000000000000000000000000000000..1347488bef00492a8b281a124ea8250e30911426
--- /dev/null
+++ b/iotAmak/ihm.py
@@ -0,0 +1,163 @@
+from os import path
+from subprocess import Popen
+from time import sleep
+
+import platform
+import subprocess
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.confi_reader import read_ssh, read_broker
+from iotAmak.tool.mqtt_client import MqttClient
+from iotAmak.tool.ssh_client import SSHClient, Cmd
+
+
+class Ihm(MqttClient, SSHClient):
+
+    def __init__(self, config_path):
+        self.broker_ip = read_broker(config_path)
+        MqttClient.__init__(self, self.broker_ip, "Ihm")
+        SSHClient.__init__(self, read_ssh(config_path))
+
+        self.experiment_loaded = False
+        self.ping_is_true = False
+
+    def loading(self):
+        print("[LOADING]")
+        print("Check experiment:")
+        print(" | -> agent.py : ", path.exists("./agent.py"))
+        print(" | -> amas.py : ", path.exists("./amas.py"))
+        print(" | -> env.py : ", path.exists("./env.py"))
+        if path.exists("./agent.py") and path.exists("./amas.py") and path.exists("./env.py"):
+            self.experiment_loaded = True
+            print("Experiment loaded")
+        else:
+            print("[WARNING] experiment isn't conform with the expected format, starting won't be possible")
+
+    def ping(self):
+        print("[PING]")
+        print("Checking connection to clients in config.json")
+        res = True
+        for client in self.clients:
+            param = '-n' if platform.system().lower() == 'windows' else '-c'
+            command = ['ping', param, '1', client.hostname]
+
+            result = subprocess.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
+            res = res and result
+
+            print("Hostname :", client.hostname, " Responded : ", result)
+        if res:
+            print("Connection established")
+            self.ping_is_true = True
+        else:
+            print("[WARNING] Some client are unavailable, update the config file")
+
+    def agent(self):
+        print("[AGENT]")
+        print("Checking if an experiment is already running")
+
+        commands = [
+            Cmd(
+                cmd="ps -ef | grep 'python '"
+            )]
+
+        for i_client in range(len(self.clients)):
+            print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
+            self.run_cmd(i_client, commands)
+
+        print(
+            "If any agent is currently running, you should" +
+            "kill them before starting the application with the command 'kill'"
+        )
+
+    def run(self):
+
+        exit_bool = False
+
+        self.loading()
+        self.ping()
+        if self.ping_is_true:
+            self.agent()
+
+        while not exit_bool:
+
+            print("\n")
+            cmd = input(">")
+
+            # Envoie un signal a tout le monde pour exit
+            if cmd.lower() == "exit":
+                self.client.publish("ihm/exit")
+                exit_bool = True
+
+            # cherche tout les potentiel agents sur les raspberry et les tuent
+            if cmd.lower() == "kill":
+
+                commands = [
+                    Cmd(
+                        cmd="ps -ef | grep 'python '",
+                        prefix="[BEFORE]"
+                    ),
+                    Cmd(
+                        cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done",
+                        do_print=False
+                    ),
+                    Cmd(
+                        cmd="ps -ef | grep 'python '",
+                        prefix="[AFTER]"
+                    )
+                ]
+
+                for i_client in range(len(self.clients)):
+                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
+                    self.run_cmd(i_client, commands)
+
+            # automatise la mise a jour de l'exerience sur les raspberry
+            if cmd.lower() == "update":
+                commands = [
+                    Cmd(
+                        cmd="rm -r Desktop/mqtt_goyon/iotamak-core"
+                    )
+
+                ]
+                for i_client in range(len(self.clients)):
+                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
+                    self.run_cmd(i_client, commands)
+
+                self.update()
+
+            # Crée les processus amas/env/scheduler de l'experience chargé
+            if cmd.lower() == "start":
+
+                if self.experiment_loaded and self.ping_is_true:
+
+                    # choose exec
+                    print("Choose execution mode for the scheduler")
+                    print("0 : step by step, 1 : auto")
+                    while cmd not in ["0", "1"]:
+                        cmd = input(">")
+
+                    # start subprocess scheduler
+                    p1 = Popen([sys.executable, './scheduler.py', cmd, self.broker_ip])
+                    sleep(1)
+                    # start subprocess amas
+                    send_client = [c.to_send() for c in self.clients]
+                    p2 = Popen([sys.executable, './amas.py', self.broker_ip, str(send_client)])
+                    # start subprocess env
+                    p3 = Popen([sys.executable, './env.py', self.broker_ip])
+
+            if cmd.lower() == "pause":
+                self.client.publish("ihm/pause")
+
+            if cmd.lower() == "unpause":
+                self.client.publish("ihm/unpause")
+
+            if cmd.lower() in ["s", "step"]:
+                self.client.publish("ihm/step")
+
+            if cmd.lower() == "mode":
+                self.client.publish("ihm/mode")
+
+        self.client.publish("ihm/step")
+        sleep(2)
diff --git a/scheduler.py b/iotAmak/scheduler.py
similarity index 94%
rename from scheduler.py
rename to iotAmak/scheduler.py
index e42d8cd8af631142a45bb303e88c15e5c9bce4d9..51ecdcc0c2f66ab9fc20dd24374b7919623aecb0 100644
--- a/scheduler.py
+++ b/iotAmak/scheduler.py
@@ -1,10 +1,14 @@
 """
 Scheduler class file
 """
-import sys
 from time import sleep
 
-from tool.schedulable import Schedulable
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.schedulable import Schedulable
 
 
 class Scheduler(Schedulable):
@@ -26,10 +30,10 @@ class Scheduler(Schedulable):
         self.subscribe("amas/agent/new", self.update_nbr_agent)
         self.subscribe("amas/action_done", self.update_schedulable)
         self.subscribe("env/action_done", self.update_schedulable)
-        self.subscribe("ping/step", self.step)
-        self.subscribe("ping/pause", self.pause)
-        self.subscribe("ping/unpause", self.unpause)
-        self.subscribe("ping/mode", self.mode)
+        self.subscribe("ihm/step", self.step)
+        self.subscribe("ihm/pause", self.pause)
+        self.subscribe("ihm/unpause", self.unpause)
+        self.subscribe("ihm/mode", self.mode)
 
         self.agent_waiting = 0
         self.schedulable_waiting = 0
diff --git a/philosophers/__init__.py b/iotAmak/tool/__init__.py
similarity index 100%
rename from philosophers/__init__.py
rename to iotAmak/tool/__init__.py
diff --git a/tool/confi_reader.py b/iotAmak/tool/confi_reader.py
similarity index 91%
rename from tool/confi_reader.py
rename to iotAmak/tool/confi_reader.py
index 66ae9e92f7234850d8292637f0d64b456ecd5e7f..ca9b3448bd0e2015bec66bfdfa067ccd5da25e5a 100644
--- a/tool/confi_reader.py
+++ b/iotAmak/tool/confi_reader.py
@@ -1,9 +1,10 @@
 import json
-import pathlib
 import sys
+import pathlib
 
 sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-from tool.remote_client import RemoteClient
+
+from iotAmak.tool.remote_client import RemoteClient
 
 
 def read_ssh(path):
diff --git a/tool/mqtt_client.py b/iotAmak/tool/mqtt_client.py
similarity index 100%
rename from tool/mqtt_client.py
rename to iotAmak/tool/mqtt_client.py
diff --git a/tool/remote_client.py b/iotAmak/tool/remote_client.py
similarity index 100%
rename from tool/remote_client.py
rename to iotAmak/tool/remote_client.py
diff --git a/tool/schedulable.py b/iotAmak/tool/schedulable.py
similarity index 95%
rename from tool/schedulable.py
rename to iotAmak/tool/schedulable.py
index 2b6f5aebe0f6fa23aa9b020eb43a0f8a6011c53e..e1e1e717da68d140a43c3b0dc48d5a9899992438 100644
--- a/tool/schedulable.py
+++ b/iotAmak/tool/schedulable.py
@@ -1,13 +1,14 @@
 """
 Tool class that implement basic interaction that help to finish processes
 """
-import pathlib
-import sys
 from time import sleep
 
+import sys
+import pathlib
+
 sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
 
-from tool.mqtt_client import MqttClient
+from iotAmak.tool.mqtt_client import MqttClient
 
 
 class Schedulable(MqttClient):
diff --git a/tool/ssh_client.py b/iotAmak/tool/ssh_client.py
similarity index 98%
rename from tool/ssh_client.py
rename to iotAmak/tool/ssh_client.py
index ea20d4e7f6826d1091f49ea99727b763c022758f..3f7d2e287c7c41066e9add3ddd73b17d26ac46ea 100644
--- a/tool/ssh_client.py
+++ b/iotAmak/tool/ssh_client.py
@@ -1,14 +1,16 @@
-import os
-import pathlib
-import sys
+
 from typing import List
 
 import paramiko
-from pexpect import pxssh
+import os
+import sys
+import pathlib
 
+from pexpect import pxssh
 
 sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-from tool.remote_client import RemoteClient
+
+from iotAmak.tool.remote_client import RemoteClient
 
 
 class Cmd:
diff --git a/philosophers/agent.py b/philosophers/agent.py
deleted file mode 100644
index 6826aed0abbf3d5133a01d43b99463a825d5e6fb..0000000000000000000000000000000000000000
--- a/philosophers/agent.py
+++ /dev/null
@@ -1,100 +0,0 @@
-from ast import literal_eval
-from time import sleep
-
-import sys
-import pathlib
-
-sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-
-from agent import Agent
-from philosophers.fork import Fork
-from random import randrange
-
-
-class PhiAgent(Agent):
-
-    def __init__(self, identifier: int, broker_ip: str, total_agent):
-        self.total_agent = total_agent
-        Agent.__init__(self, identifier, broker_ip)
-
-    def on_initialization(self):
-        # 0: thinking, 1: hungry, 2: eat
-        self.state = 0
-
-        self.subscribe("env/fork/" + str(self.id), self.left_fork_update)
-        self.left_fork = Fork(self.id)
-
-        right_id = (self.id - 1) % self.total_agent
-        self.subscribe("env/fork/" + str(right_id), self.right_fork_update)
-        self.right_fork = Fork(right_id)
-
-        self.fork_wait = True
-
-        self.subscribe("env/agent/" + str(self.id) + "/ask_spoon", self.spoon_response)
-
-    def spoon_response(self, client, userdata, message):
-        res = literal_eval(message.payload.decode("utf-8"))
-        if res.get("response") == "True":
-            if res.get("side") == "right":
-                self.right_fork.taken_by = self.id
-                self.right_fork.state = res.get("state")
-            else:
-                self.left_fork.taken_by = self.id
-                self.left_fork.state = res.get("state")
-        self.fork_wait = False
-
-    def left_fork_update(self, client, userdata, message):
-        res = literal_eval(message.payload.decode("utf-8"))
-        self.left_fork.state = res.get("state")
-        self.left_fork.taken_by = res.get("tanken_by")
-
-    def right_fork_update(self, client, userdata, message):
-        res = literal_eval(message.payload.decode("utf-8"))
-        self.right_fork.state = res.get("state")
-        self.right_fork.taken_by = res.get("tanken_by")
-
-    def ask_spoon(self, left):
-        if left :
-            self.publish("ask_spoon", "left")
-        else :
-            self.publish("ask_spoon", "right")
-        while self.fork_wait:
-            sleep(self.wait_delay)
-        self.fork_wait = True
-
-    def on_decide(self):
-        super().on_decide()
-
-        if self.right_fork.taken_by == -1:
-            self.ask_spoon(False)
-
-        if self.left_fork.taken_by == -1:
-            self.ask_spoon(True)
-
-        if self.state == 1:
-            if self.right_fork.taken_by != self.id:
-                self.ask_spoon(False)
-            if self.left_fork.taken_by != self.id:
-                self.ask_spoon(True)
-
-    def on_act(self):
-        super().on_act()
-
-        if self.state == 0:
-            self.log("Is Thinking")
-            res = randrange(100)
-            if res % 5 == 0:
-                self.state = 1
-        elif self.state == 1:
-            self.log("Is Hungry")
-            if self.left_fork.taken_by == self.right_fork.taken_by == self.id:
-                self.state = 2
-        elif self.state == 2:
-            self.log("Is Eating")
-            self.publish("done_eating", "")
-            self.state = 0
-
-
-if __name__ == '__main__':
-    a = PhiAgent(int(sys.argv[1]), str(sys.argv[2]), int(sys.argv[3]))
-    a.run()
diff --git a/philosophers/amas.py b/philosophers/amas.py
deleted file mode 100644
index af9eeb2e325dec429df11bdf22d757e0aceff00f..0000000000000000000000000000000000000000
--- a/philosophers/amas.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import sys
-import pathlib
-
-sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-
-from amas import Amas
-
-
-class PhiAmas(Amas):
-
-    def __init__(self, broker_ip: str, clients, nbr_agent):
-        self.agent_to_create = nbr_agent
-        super().__init__(broker_ip, clients)
-
-    def on_initial_agents_creation(self):
-        for _ in range(self.agent_to_create):
-            self.add_agent("philosophers", [str(self.agent_to_create)])
-
-
-if __name__ == '__main__':
-    s = PhiAmas(str(sys.argv[1]), sys.argv[2], 5)
-    s.run()
diff --git a/philosophers/env.py b/philosophers/env.py
deleted file mode 100644
index 8ababf9f5b31509cc982114429d1197fdee1d5aa..0000000000000000000000000000000000000000
--- a/philosophers/env.py
+++ /dev/null
@@ -1,69 +0,0 @@
-
-import sys
-import pathlib
-
-sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-
-from environment import Environment
-from philosophers.fork import Fork
-
-
-class PhiEnv(Environment):
-
-    def __init__(self, broker_ip, nbr_phil):
-        self.nbr_phil = nbr_phil
-        super().__init__(broker_ip)
-
-    def on_initialization(self):
-        self.forks = []
-        for i in range(self.nbr_phil):
-            self.forks.append(Fork(i))
-            self.subscribe("agent/" + str(i) + "/ask_spoon", self.ask_spoon)
-            self.subscribe("agent/" + str(i) + "/done_eating", self.done_eating)
-
-    def ask_spoon(self, client, userdata, message):
-        res = str(message.payload.decode("utf-8"))
-        agent_id = int(str(message.topic).split("/")[1])
-
-        if res == "left":
-            fork_id = agent_id
-        else:
-            fork_id = (agent_id - 1) % self.nbr_phil
-
-        if self.forks[fork_id].state == 1:
-            message = {
-                "response": "False"
-            }
-        elif self.forks[fork_id].taken_by == -1:
-            message = {
-                "response": "True",
-                "side": res,
-                "state": 0
-            }
-            self.forks[fork_id].taken_by = agent_id
-        else:
-            message = {
-                "response": "True",
-                "side": res,
-                "state": 1
-            }
-            self.forks[fork_id].taken_by = agent_id
-            self.forks[fork_id].state = 1
-
-        self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message))
-
-    def done_eating(self, client, userdata, message):
-        agent_id = int(str(message.topic).split("/")[1])
-
-        for fork_id in [agent_id, (agent_id - 1) % self.nbr_phil]:
-            self.forks[fork_id].state = 0
-
-    def on_cycle_begin(self) -> None:
-        for fork in self.forks:
-            self.client.publish("env/fork/" + str(fork.identifier), str(fork.to_msg()))
-            print("Fork : ", fork.identifier," taken by ", fork.taken_by, " and is :", fork.state)
-
-
-if __name__ == '__main__':
-    s = PhiEnv(str(sys.argv[1]), 5)
-    s.run()
\ No newline at end of file
diff --git a/philosophers/fork.py b/philosophers/fork.py
deleted file mode 100644
index 8e59e66a5067d00f0fc6ba2bfe284dc551240698..0000000000000000000000000000000000000000
--- a/philosophers/fork.py
+++ /dev/null
@@ -1,16 +0,0 @@
-class Fork:
-
-    def __init__(self, identifier):
-
-        self.identifier = identifier
-
-        # 0: dirty, 1: clean
-        self.state = 0
-
-        self.taken_by = -1
-
-    def to_msg(self):
-        return {
-                "state": self.state,
-                "taken_by": self.taken_by
-            }
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a48456a278a658364cf08eab0f626369f23a0622
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+paho-mqtt
+paramiko
+pexpect
\ No newline at end of file
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..c1654f3852c9c7ad3dd054fe260975e19b8a5e33
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,10 @@
+from setuptools import setup, find_packages
+
+setup(
+    name='iotAmak',
+    packages=find_packages(),
+    version='0.0.1',
+    description='AmakFramework in python',
+    author='SMAC - GOYON Sebastien',
+    install_requires=[],
+)
diff --git a/tool/__init__.py b/tool/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/tool/config.json b/tool/config.json
deleted file mode 100644
index 84fb1a9b134349d10e0a750b3ac98d9355c279b5..0000000000000000000000000000000000000000
--- a/tool/config.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "broker" : "192.168.153.209",
-  "clients_ssh" : [
-    {
-      "hostname" : "192.168.153.18",
-      "user" : "pi",
-      "password" : "raspberry"
-    },
-    {
-      "hostname" : "192.168.153.227",
-      "user" : "pi",
-      "password" : "raspberry"
-    },
-    {
-      "hostname" : "192.168.153.61",
-      "user" : "pi",
-      "password" : "raspberry"
-    },
-    {
-      "hostname" : "192.168.153.75",
-      "user" : "pi",
-      "password" : "raspberry"
-    }
-  ]
-}
\ No newline at end of file