diff --git a/src/main/java/com/irit/oppocompo/OCEApplication.java b/src/main/java/com/irit/oppocompo/OCEApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..0cc50ece93c78196fd99141715180870727d405c
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/OCEApplication.java
@@ -0,0 +1,43 @@
+package com.irit.oppocompo;
+
+import com.irit.oppocompo.ambient_environments.mockup.ui.MockupController;
+import com.irit.oppocompo.end_user_interfaces.ice_adapter.ICEToEndUserInterfaceAdapter;
+import com.irit.oppocompo.engine.OCE;
+import com.irit.oppocompo.engine.ui.OCEController;
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+
+public class OCEApplication extends Application {
+
+    @Override
+    public void start(Stage primaryStage) throws Exception {
+        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/views/mockup/ui.fxml"));
+        primaryStage.setScene(
+                new Scene(
+                        fxmlLoader.load()
+                )
+        );
+
+        MockupController mockupController = fxmlLoader.getController();
+
+        Stage stage = new Stage();
+        fxmlLoader = new FXMLLoader(getClass().getResource("/views/engine/ui.fxml"));
+        stage.setScene(
+                new Scene(
+                        fxmlLoader.load()
+                )
+        );
+        OCEController oceController = fxmlLoader.getController();
+
+        oceController.setOce(new OCE(
+                mockupController.getMockup(),
+                new ICEToEndUserInterfaceAdapter(),
+                () -> {}
+        ));
+
+        primaryStage.show();
+        stage.show();
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/MockupEnvironmentApplication.java b/src/main/java/com/irit/oppocompo/ambient_environments/mockup/MockupEnvironmentApplication.java
deleted file mode 100644
index 3175837bd76a1fd7c92ccb325992212429b9d69b..0000000000000000000000000000000000000000
--- a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/MockupEnvironmentApplication.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.irit.oppocompo.ambient_environments.mockup;
-
-
-import javafx.application.Application;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-
-public class MockupEnvironmentApplication extends Application {
-
-    @Override
-    public void start(Stage primaryStage) throws Exception {
-        primaryStage.setScene(
-                new Scene(
-                        new FXMLLoader(
-                                getClass().getResource("/views/mockup/view.fxml")
-                        ).load()
-                )
-        );
-        primaryStage.show();
-    }
-}
diff --git a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java b/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java
index 444dd7aaba24f262ed0e084692a1d37928631514..093165b59df79ec97fbff4c3bc7a01a6c77e987c 100644
--- a/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java
+++ b/src/main/java/com/irit/oppocompo/ambient_environments/mockup/ui/MockupController.java
@@ -50,4 +50,8 @@ public class MockupController implements Initializable {
     public void removeComponent(MouseEvent mouseEvent) {
         mockup.removeComponent(currentComponentsListView.getSelectionModel().getSelectedItem());
     }
+
+    public MockupEnvironment getMockup() {
+        return mockup;
+    }
 }
diff --git a/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java b/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java
index 728ba2165fd41590ab2b15c6490092917c16d276..ce40416777b5a54dfca0919f243b32b83880f0a3 100644
--- a/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java
+++ b/src/main/java/com/irit/oppocompo/end_user_interfaces/EndUserInterface.java
@@ -6,6 +6,5 @@ import java.util.function.Consumer;
 
 public interface EndUserInterface {
 
-    void displayAssemblyProposition(Assembly assembly);
-    void subscribeForUserSubmittedAssemblies(Consumer<Assembly> assemblyConsumer);
+    void displayAssemblyProposition(Assembly assembly, Consumer<Assembly> userSubmittedAssemblyCallback);
 }
diff --git a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java
index b1d81f5ccd35ab3c764d1c757623ddd565c5ede1..4264495f1afb4f730c27f0a2ea1ab621f7093ba5 100644
--- a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java
+++ b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapter.java
@@ -28,20 +28,20 @@ public class ICEToEndUserInterfaceAdapter implements EndUserInterface {
     }
 
     @Override
-    public void displayAssemblyProposition(Assembly assembly) {
+    public void displayAssemblyProposition(Assembly assembly, Consumer<Assembly> userSubmittedAssemblyCallback) {
         try {
             iceEditorMarshaller.convertToXml(
                     iceConverter.getEnvironmentFromAssembly(assembly),
                     PropertiesStore.getProperty(PropertiesStore.ICE_INPUT_PATH)
             );
+
+            iceOutputWatch.addAssemblyConsumer(a -> {
+                userSubmittedAssemblyCallback.accept(a);
+                iceOutputWatch.removeAssemblyConsumer(userSubmittedAssemblyCallback);
+            });
         } catch (JAXBException | IOException e) {
             e.printStackTrace();
         }
     }
 
-    @Override
-    public void subscribeForUserSubmittedAssemblies(Consumer<Assembly> assemblyConsumer) {
-        iceOutputWatch.addAssemblyConsumer(assemblyConsumer);
-    }
-
 }
diff --git a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java
index 203aef2be2e2b2f4bcddd8295e81dac6d1848533..f4113790cf9c5692621b65105da7fb4559b27bda 100644
--- a/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java
+++ b/src/main/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/services/ICEOutputWatch.java
@@ -59,6 +59,10 @@ public class ICEOutputWatch implements Runnable {
         observers.add(assemblyConsumer);
     }
 
+    public void removeAssemblyConsumer(Consumer<Assembly> assemblyConsumer) {
+        observers.remove(assemblyConsumer);
+    }
+
     private void sendNewAssemblyToObservers() throws FileNotFoundException, JAXBException, SAXException {
         Assembly assembly = iceConverter.getAssemblyFromEnvironment(
                 iceEditorUnmarshaller.convertFromXml(
diff --git a/src/main/java/com/irit/oppocompo/engine/OCE.java b/src/main/java/com/irit/oppocompo/engine/OCE.java
index fed42099a1ea36c4343b0c589429a16ac0771e24..e2f3d42cfe8cd505b2cf4db5b42bc068191b045d 100644
--- a/src/main/java/com/irit/oppocompo/engine/OCE.java
+++ b/src/main/java/com/irit/oppocompo/engine/OCE.java
@@ -1,4 +1,91 @@
 package com.irit.oppocompo.engine;
 
+import com.irit.oppocompo.ambient_environments.AmbientEnvironment;
+import com.irit.oppocompo.end_user_interfaces.EndUserInterface;
+import com.irit.oppocompo.engine.cycle.AdvertiseStep;
+import com.irit.oppocompo.engine.cycle.AgreeStep;
+import com.irit.oppocompo.engine.cycle.ReplyStep;
+import com.irit.oppocompo.engine.cycle.SelectStep;
+import com.irit.oppocompo.engine.mas_infrastructure.Infrastructure;
+import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent;
+import com.irit.oppocompo.entities.*;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 public class OCE {
+
+    private final AmbientEnvironment ambientEnvironment;
+
+    private final Infrastructure infrastructure = new Infrastructure();
+
+    private final EndUserInterface endUserInterface;
+
+    private Assembly assembly = new Assembly();
+
+    private final Runnable readyForNextCycleCallback;
+
+    public OCE(AmbientEnvironment ambientEnvironment, EndUserInterface endUserInterface, Runnable readyForNextCycleCallback) {
+        this.ambientEnvironment = ambientEnvironment;
+        this.endUserInterface = endUserInterface;
+        this.readyForNextCycleCallback = readyForNextCycleCallback;
+    }
+
+    public void cycle() {
+        //maj de la liste des agents...
+        Set<Component> intersection = ambientEnvironment.getCurrentEnvironment().getComponents().stream().filter(component -> assembly.getComponents().contains(component)).collect(Collectors.toSet());
+
+        // enlever les agents des composants qui ont disparu
+        assembly.getComponents().stream().filter(
+                component -> !intersection.contains(component)
+        ).forEach(
+                component -> component.getServices().forEach(
+                        service -> infrastructure.getAgentFactory().removeAgent(
+                                infrastructure.getAgentFactory().getAgents().stream().filter(
+                                        agent -> agent.getHandledService().equals(service)
+                                ).findAny().orElse(null))
+                )
+        );
+
+        // ajouter les agents des composants qui sont apparu
+        ambientEnvironment.getCurrentEnvironment().getComponents().stream().filter(
+                component -> !intersection.contains(component)
+        ).forEach(
+                component -> component.getServices().forEach(
+                        service -> infrastructure.getAgentFactory().makeAgent(service)
+                )
+        );
+
+        assembly = new Assembly(ambientEnvironment.getCurrentEnvironment().getComponents(), new HashSet<>());
+
+        Set<Binding> bindings;
+        Set<Agent> requiredServiceAgents = infrastructure.getAgentFactory().getAgents().stream().filter(agent -> agent.getHandledService() instanceof RequiredService).collect(Collectors.toSet());
+        Set<Agent> providedServiceAgents = infrastructure.getAgentFactory().getAgents().stream().filter(agent -> agent.getHandledService() instanceof ProvidedService).collect(Collectors.toSet());
+
+        do {
+            bindings = new HashSet<>(assembly.getBindings());
+
+            providedServiceAgents.forEach(agent -> new AdvertiseStep(agent.getHandledService(), agent.getId(), infrastructure.getAgentCommunication()).run());
+
+            requiredServiceAgents.forEach(agent -> new ReplyStep(agent.getHandledService(), agent.getId(), agent.getMailbox(), infrastructure.getAgentCommunication()).run());
+
+            providedServiceAgents.forEach(agent -> new SelectStep(agent.getHandledService(), agent.getId(), agent.getMailbox(), infrastructure.getAgentCommunication()).run());
+
+            Set<Agent> requiredServiceAgentsToRemove = new HashSet<>();
+
+            requiredServiceAgents.forEach(agent -> new AgreeStep(agent.getHandledService(), agent.getId(), agent.getMailbox(), infrastructure.getAgentCommunication(), assembly, providedServiceAgents, requiredServiceAgents, requiredServiceAgentsToRemove).run());
+
+            requiredServiceAgents.removeAll(requiredServiceAgentsToRemove);
+
+        } while (!bindings.containsAll(assembly.getBindings()));
+
+        endUserInterface.displayAssemblyProposition(assembly, userSubmittedAssembly -> {
+            // traiter feedback
+            System.out.println(assembly.getComponents().size());
+            System.out.println(assembly.getBindings().size());
+
+            readyForNextCycleCallback.run();
+        });
+    }
 }
diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/AdvertiseStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/AdvertiseStep.java
new file mode 100644
index 0000000000000000000000000000000000000000..3904fd328175820836565d010d7e592bc6094052
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/cycle/AdvertiseStep.java
@@ -0,0 +1,28 @@
+package com.irit.oppocompo.engine.cycle;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication;
+import com.irit.oppocompo.engine.messages.Advertise;
+import com.irit.oppocompo.entities.Service;
+
+import java.util.UUID;
+
+public class AdvertiseStep implements Runnable {
+
+    private final Service service;
+    private final UUID ownerId;
+    private final Communication communicationService;
+
+
+    public AdvertiseStep(Service service, UUID ownerId, Communication communicationService) {
+        this.service = service;
+        this.ownerId = ownerId;
+        this.communicationService = communicationService;
+    }
+
+    @Override
+    public void run() {
+        communicationService.broadcastMessage(
+                new Advertise(ownerId, service)
+        );
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/AgreeStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/AgreeStep.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8417bbb49112413bbfce51709b2bcae213937d5
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/cycle/AgreeStep.java
@@ -0,0 +1,55 @@
+package com.irit.oppocompo.engine.cycle;
+
+import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent;
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication;
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+import com.irit.oppocompo.engine.messages.Agree;
+import com.irit.oppocompo.engine.messages.Select;
+import com.irit.oppocompo.entities.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class AgreeStep implements Runnable {
+
+    private final Service service;
+    private final UUID ownerId;
+    private final Set<Message> messages;
+    private final Communication communicationService;
+    private final Assembly assembly;
+    private final Set<Agent> providedServiceAgents;
+    private final Set<Agent> requiredServiceAgents;
+    private final Set<Agent> requiredServiceAgentsToRemove;
+
+    public AgreeStep(Service service, UUID ownerId, Set<Message> messages, Communication communicationService, Assembly assembly, Set<Agent> providedServiceAgents, Set<Agent> requiredServiceAgents, Set<Agent> requiredServiceAgentsToRemove) {
+        this.service = service;
+        this.ownerId = ownerId;
+        this.messages = messages;
+        this.communicationService = communicationService;
+        this.assembly = assembly;
+        this.providedServiceAgents = providedServiceAgents;
+        this.requiredServiceAgents = requiredServiceAgents;
+        this.requiredServiceAgentsToRemove = requiredServiceAgentsToRemove;
+    }
+
+    @Override
+    public void run() {
+        List<Message> selections = messages.stream().filter(message -> message instanceof Select).collect(Collectors.toList());
+
+        Message selected = selections.get(new Random().nextInt(selections.size()));
+
+
+        // peut-ĂȘtre que c'est pas nĂ©cessaire...
+        communicationService.sendMessage(new Agree(ownerId), Collections.singleton(selected.getEmitter()));
+
+        Agent requiredAgentOfTheBinding = requiredServiceAgents.stream().filter(agent -> agent.getId().equals(ownerId)).findAny().get();
+        Agent providedAgentOfTheBinding = providedServiceAgents.stream().filter(agent -> agent.getId().equals(selected.getEmitter())).findAny().get();
+
+        assembly.getBindings().add(new Binding((RequiredService) service, (ProvidedService) providedAgentOfTheBinding.getHandledService()));
+
+        requiredServiceAgentsToRemove.add(requiredAgentOfTheBinding);
+        providedServiceAgents.remove(providedAgentOfTheBinding);
+
+        messages.clear();
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/ReplyStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/ReplyStep.java
new file mode 100644
index 0000000000000000000000000000000000000000..c369ed9a197a8745e945a0affab3d32c4724c11c
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/cycle/ReplyStep.java
@@ -0,0 +1,37 @@
+package com.irit.oppocompo.engine.cycle;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication;
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+import com.irit.oppocompo.engine.messages.Advertise;
+import com.irit.oppocompo.engine.messages.Reply;
+import com.irit.oppocompo.entities.Service;
+
+import java.util.Collections;
+import java.util.Queue;
+import java.util.Set;
+import java.util.UUID;
+
+public class ReplyStep implements Runnable {
+
+    private final Service service;
+    private final UUID ownerId;
+    private final Set<Message> messages;
+    private final Communication communicationService;
+
+    public ReplyStep(Service service, UUID ownerId, Set<Message> messages, Communication communicationService) {
+        this.service = service;
+        this.ownerId = ownerId;
+        this.messages = messages;
+        this.communicationService = communicationService;
+    }
+
+    @Override
+    public void run() {
+        messages.forEach(message -> {
+            if(message instanceof Advertise && service.getInterfaceId().equals(((Advertise)message).getService().getInterfaceId())) {
+                communicationService.sendMessage(new Reply(ownerId), Collections.singleton(message.getEmitter()));
+            }
+        });
+        messages.clear();
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/cycle/SelectStep.java b/src/main/java/com/irit/oppocompo/engine/cycle/SelectStep.java
new file mode 100644
index 0000000000000000000000000000000000000000..453882ad7cb59e546ca9d139c6771dbec7a8001a
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/cycle/SelectStep.java
@@ -0,0 +1,40 @@
+package com.irit.oppocompo.engine.cycle;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Communication;
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+import com.irit.oppocompo.engine.messages.Reply;
+import com.irit.oppocompo.engine.messages.Select;
+import com.irit.oppocompo.entities.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class SelectStep implements Runnable {
+
+    private final Service service;
+    private final UUID ownerId;
+    private final Set<Message> messages;
+    private final Communication communicationService;
+
+    public SelectStep(Service service, UUID ownerId, Set<Message> messages, Communication communicationService) {
+        this.service = service;
+        this.ownerId = ownerId;
+        this.messages = messages;
+        this.communicationService = communicationService;
+    }
+
+    @Override
+    public void run() {
+        List<Message> replies = messages.stream().filter(
+                message -> message instanceof Reply
+        ).collect(Collectors.toList());
+
+        if(replies.size() == 0) {
+            return;
+        }
+
+        Message selectedReply = replies.get(new Random().nextInt(replies.size()));
+        communicationService.sendMessage(new Select(ownerId), Collections.singleton(selectedReply.getEmitter()));
+        messages.clear();
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java
index 4d3acb27e112dea0fbba1442255514271e47568f..1577fe691735d92e56fe5ccc0ee4ff21c63b10ec 100644
--- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java
+++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/agent/Agent.java
@@ -6,23 +6,16 @@ import com.irit.oppocompo.entities.Service;
 
 import java.util.*;
 
-public class Agent implements Runnable {
+public class Agent {
 
     private final UUID id = UUID.randomUUID();
     private final Service handledService;
-    private final Queue<Message> messageQueue = new LinkedList<>();
-    private final Runnable execution;
+    private final Set<Message> mailbox = new HashSet<>();
     private final Communication communication;
 
-    public Agent(Service handledService, Communication communication, Runnable execution) {
+    public Agent(Service handledService, Communication communication) {
         this.handledService = handledService;
         this.communication = communication;
-        this.execution = execution;
-    }
-
-    @Override
-    public void run() {
-        execution.run();
     }
 
     public UUID getId() {
@@ -37,12 +30,13 @@ public class Agent implements Runnable {
         return communication;
     }
 
-    public Queue<Message> getMessageQueue() {
-        return messageQueue;
+    public Set<Message> getMailbox() {
+        return mailbox;
     }
 
     @Override
     public String toString() {
         return "Agent{" + id + "}";
     }
+
 }
diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java
index b6370ed1916d5e1ff2f5a83fe6fb8960fb5956cd..9f9449101afc08fa7ef7c32f53654b35660a6a92 100644
--- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java
+++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/communication/AgentCommunication.java
@@ -7,27 +7,27 @@ import java.util.*;
 public class AgentCommunication implements Communication {
 
     private final Map<UUID, Agent> agents = new HashMap<>();
-    private final Map<UUID, Queue<Message>> messageQueues = new HashMap<>();
+    private final Map<UUID, Set<Message>> mailboxes = new HashMap<>();
 
     public void addAgent(Agent agent) {
         agents.put(agent.getId(), agent);
-        messageQueues.put(agent.getId(), agent.getMessageQueue());
+        mailboxes.put(agent.getId(), agent.getMailbox());
     }
 
     public void removeAgentWithId(UUID id) {
         agents.remove(id);
-        messageQueues.remove(id);
+        mailboxes.remove(id);
     }
 
     @Override
     public void sendMessage(Message message, Set<UUID> receivers) {
-        receivers.forEach(id -> messageQueues.get(id).add(message));
+        receivers.forEach(id -> mailboxes.get(id).add(message));
     }
 
     @Override
     public void broadcastMessage(Message message) {
-        messageQueues.keySet().stream().filter(id -> !id.equals(message.getEmitter())).forEach(
-                id -> messageQueues.get(id).add(message)
+        mailboxes.keySet().stream().filter(id -> !id.equals(message.getEmitter())).forEach(
+                id -> mailboxes.get(id).add(message)
         );
     }
 }
diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java
index 956979df7c7b4c9a5513602958dc4fa4b457fe3a..fac515255fd191df5257b4743c58ee1a665cbcce 100644
--- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java
+++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/factory/AgentFactory.java
@@ -5,25 +5,36 @@ import com.irit.oppocompo.engine.mas_infrastructure.communication.AgentCommunica
 import com.irit.oppocompo.engine.mas_infrastructure.scheduler.Scheduler;
 import com.irit.oppocompo.entities.Service;
 
+import java.util.HashSet;
+import java.util.Set;
+
 public class AgentFactory {
 
     private final AgentCommunication communication;
     private final Scheduler scheduler;
+    private final Set<Agent> agents = new HashSet<>();
+
 
     public AgentFactory(AgentCommunication communication, Scheduler scheduler) {
         this.communication = communication;
         this.scheduler = scheduler;
     }
 
-    public Agent makeAgent(Service service, Runnable execution) {
-        Agent agent = new Agent(service, communication, execution);
+    public Agent makeAgent(Service service) {
+        Agent agent = new Agent(service, communication);
         communication.addAgent(agent);
         scheduler.addAgent(agent);
+        agents.add(agent);
         return agent;
     }
 
     public void removeAgent(Agent agent) {
         communication.removeAgentWithId(agent.getId());
         scheduler.removeAgent(agent);
+        agents.remove(agent);
+    }
+
+    public Set<Agent> getAgents() {
+        return agents;
     }
 }
diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java
index 0cd199babb620ff56ac15164d204ad2df2bc5ec9..16f37c7fe721ee98be2c83f5b3c63a9cce87560d 100644
--- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java
+++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/Scheduler.java
@@ -2,12 +2,12 @@ package com.irit.oppocompo.engine.mas_infrastructure.scheduler;
 
 import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 public class Scheduler implements SchedulerService {
 
-    private final List<Agent> agents = new ArrayList<>();
+    private final Set<Agent> agents = new HashSet<>();
     private static final int CYCLE_NUMBER = 600;
 
     @Override
@@ -16,9 +16,9 @@ public class Scheduler implements SchedulerService {
     }
 
     @Override
-    public void start(List<Agent> agents, int cycleNumber) {
+    public void start(Set<Agent> agents, int cycleNumber) {
         for(int i = 0; i < cycleNumber; i++) {
-            agents.forEach(Agent::run);
+            agents.forEach(agent -> {});
         }
     }
 
diff --git a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java
index 2b441a789813b725a3ab057cb2fe403f9a648a30..0ac4d502c4f5254422a6d2bdb4ee9e24deeb75a9 100644
--- a/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java
+++ b/src/main/java/com/irit/oppocompo/engine/mas_infrastructure/scheduler/SchedulerService.java
@@ -2,10 +2,10 @@ package com.irit.oppocompo.engine.mas_infrastructure.scheduler;
 
 import com.irit.oppocompo.engine.mas_infrastructure.agent.Agent;
 
-import java.util.List;
+import java.util.Set;
 
 public interface SchedulerService {
     void start();
 
-    void start(List<Agent> agents, int cycleNumber);
+    void start(Set<Agent> agents, int cycleNumber);
 }
diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Advertise.java b/src/main/java/com/irit/oppocompo/engine/messages/Advertise.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1f461203d4cc139ba305b1f2e296e28177fea4e
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/messages/Advertise.java
@@ -0,0 +1,27 @@
+package com.irit.oppocompo.engine.messages;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+import com.irit.oppocompo.entities.Service;
+
+import java.util.UUID;
+
+public class Advertise implements Message {
+
+    private final UUID emitter;
+
+    private final Service service;
+
+    public Advertise(UUID emitter, Service service) {
+        this.emitter = emitter;
+        this.service = service;
+    }
+
+    @Override
+    public UUID getEmitter() {
+        return emitter;
+    }
+
+    public Service getService() {
+        return service;
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Agree.java b/src/main/java/com/irit/oppocompo/engine/messages/Agree.java
new file mode 100644
index 0000000000000000000000000000000000000000..3246284836d2d597849f930b69ab85862a3bf120
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/messages/Agree.java
@@ -0,0 +1,19 @@
+package com.irit.oppocompo.engine.messages;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+
+import java.util.UUID;
+
+public class Agree implements Message {
+
+    private final UUID emitter;
+
+    public Agree(UUID emitter) {
+        this.emitter = emitter;
+    }
+
+    @Override
+    public UUID getEmitter() {
+        return emitter;
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Disagree.java b/src/main/java/com/irit/oppocompo/engine/messages/Disagree.java
new file mode 100644
index 0000000000000000000000000000000000000000..cda99b8d496c0e1b935060a787e2220ff8dacbc3
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/messages/Disagree.java
@@ -0,0 +1,19 @@
+package com.irit.oppocompo.engine.messages;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+
+import java.util.UUID;
+
+public class Disagree implements Message {
+
+    private final UUID emitter;
+
+    public Disagree(UUID emitter) {
+        this.emitter = emitter;
+    }
+
+    @Override
+    public UUID getEmitter() {
+        return emitter;
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Reply.java b/src/main/java/com/irit/oppocompo/engine/messages/Reply.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d9862f40eadbf89d2943617449fae5df8a986af
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/messages/Reply.java
@@ -0,0 +1,19 @@
+package com.irit.oppocompo.engine.messages;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+
+import java.util.UUID;
+
+public class Reply implements Message {
+
+    private final UUID emitter;
+
+    public Reply(UUID emitter) {
+        this.emitter = emitter;
+    }
+
+    @Override
+    public UUID getEmitter() {
+        return emitter;
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/messages/Select.java b/src/main/java/com/irit/oppocompo/engine/messages/Select.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ddd1ed800fa3a5b2fd2ba31c897e36412c4eee1
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/messages/Select.java
@@ -0,0 +1,19 @@
+package com.irit.oppocompo.engine.messages;
+
+import com.irit.oppocompo.engine.mas_infrastructure.communication.Message;
+
+import java.util.UUID;
+
+public class Select implements Message {
+
+    private final UUID emitter;
+
+    public Select(UUID emitter) {
+        this.emitter = emitter;
+    }
+
+    @Override
+    public UUID getEmitter() {
+        return emitter;
+    }
+}
diff --git a/src/main/java/com/irit/oppocompo/engine/ui/OCEController.java b/src/main/java/com/irit/oppocompo/engine/ui/OCEController.java
new file mode 100644
index 0000000000000000000000000000000000000000..e54ce73474b1a9a0506cef9704b8572caab8ae34
--- /dev/null
+++ b/src/main/java/com/irit/oppocompo/engine/ui/OCEController.java
@@ -0,0 +1,29 @@
+package com.irit.oppocompo.engine.ui;
+
+import com.irit.oppocompo.engine.OCE;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Button;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class OCEController implements Initializable {
+
+    private OCE oce;
+
+    @Override
+    public void initialize(URL location, ResourceBundle resources) {
+
+    }
+
+    public void setOce(OCE oce) {
+        this.oce = oce;
+    }
+
+    @FXML
+    public void startOCECycle(ActionEvent actionEvent) {
+        oce.cycle();
+    }
+}
diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties
index 04e04f442c195ae354af03527551e2c0290f9885..586f5ba897412d6b987daa01d39a071d27917137 100644
--- a/src/main/resources/config.properties
+++ b/src/main/resources/config.properties
@@ -1 +1 @@
-ice.input_filepath = /home/kevin/Downloads/runtime-Editor/org.eclipse.iceEditor.sample/editor.ice_editor
\ No newline at end of file
+ice.input_filepath = absolute path to org.eclipse.iceEditor.sample/editor.ice_editor
\ No newline at end of file
diff --git a/src/main/resources/ice_output/assembly.ice_editor b/src/main/resources/ice_output/assembly.ice_editor
index 309484cb2f3528a14a82f345201f27a8012d2756..cbb8c82c8d9376923095529668ef597553efc77a 100644
--- a/src/main/resources/ice_output/assembly.ice_editor
+++ b/src/main/resources/ice_output/assembly.ice_editor
@@ -1,4 +1,16 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <iCE_Editor:Environment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:iCE_Editor="http://www.eclipse.org/sirius/sample/ice_editor">
-<component Name="two"/>
-</iCE_Editor:Environment>
\ No newline at end of file
+    <component Name="Slider">
+        <service xsi:type="iCE_Editor:RequiredService" Name="Sender" ID="SendIntegers" Cardinality="1" bindProvided="//@component.1/@service.1"/>
+    </component>
+    <component Name="Converter">
+        <service xsi:type="iCE_Editor:RequiredService" Name="Click" ID="CLick" Cardinality="1" bindProvided="//@component.2/@service.0"/>
+        <service xsi:type="iCE_Editor:ProvidedService" Name="Convert" ID="SendIntegers" Cardinality="1" bindRequired="//@component.0/@service.0"/>
+    </component>
+    <component Name="Lamp 1">
+        <service xsi:type="iCE_Editor:ProvidedService" Name="Click" ID="CLick" Cardinality="1" bindRequired="//@component.1/@service.0"/>
+    </component>
+    <component Name="Lamp 2">
+        <service xsi:type="iCE_Editor:ProvidedService" Name="Click" ID="CLick" Cardinality="1"/>
+    </component>
+</iCE_Editor:Environment>
diff --git a/src/main/resources/views/engine/ui.fxml b/src/main/resources/views/engine/ui.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..65460060a7c8922cdd96615332e9d8e115daeec1
--- /dev/null
+++ b/src/main/resources/views/engine/ui.fxml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.layout.AnchorPane?>
+
+
+<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.irit.oppocompo.engine.ui.OCEController">
+   <children>
+      <Button layoutX="14.0" layoutY="14.0" mnemonicParsing="false" onAction="#startOCECycle" text="Start" />
+   </children>
+</AnchorPane>
diff --git a/src/main/resources/views/mockup/view.fxml b/src/main/resources/views/mockup/ui.fxml
similarity index 100%
rename from src/main/resources/views/mockup/view.fxml
rename to src/main/resources/views/mockup/ui.fxml
diff --git a/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java b/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java
index 7219c334ed2bf4d7e9dff41ca236f2ed6f6ca9c1..eb5548a908a8a0f0f4ee6a32690660271f8de0b5 100644
--- a/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java
+++ b/src/test/java/com/irit/oppocompo/end_user_interfaces/ice_adapter/ICEToEndUserInterfaceAdapterIntegrationTest.java
@@ -20,7 +20,7 @@ public class ICEToEndUserInterfaceAdapterIntegrationTest {
 
     @Test
     public void testDisplayAssembly() throws JAXBException, IOException {
-        new ICEToEndUserInterfaceAdapter().displayAssemblyProposition(makeTestAssembly());
+        new ICEToEndUserInterfaceAdapter().displayAssemblyProposition(makeTestAssembly(), assembly -> {});
         //Go to ICE and assert *manually* that the assembly is displayed
     }
 
@@ -42,7 +42,7 @@ public class ICEToEndUserInterfaceAdapterIntegrationTest {
     @Test
     public void testOutputWatchIsTriggered() throws JAXBException, IOException, InterruptedException {
         AtomicBoolean pass = new AtomicBoolean(false);
-        new ICEToEndUserInterfaceAdapter().subscribeForUserSubmittedAssemblies(assembly -> pass.set(true));
+        new ICEToEndUserInterfaceAdapter().displayAssemblyProposition(new Assembly(), assembly -> pass.set(true));
 
         FileWriter myWriter = new FileWriter(ICE_OUTPUT_PATH);
         myWriter.write(SAMPLE_XML);