diff --git a/activity_1/index.html b/activity_1/index.html
index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644
--- a/activity_1/index.html
+++ b/activity_1/index.html
@@ -35,16 +35,18 @@
 			<div id="toolsArea">
 				<div id="animationArea"></div>
 				<a class="button" id="connectButton">Connecter à la maquette</a>
-				<a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a>
+				<a class="button" id="runButton">Lancer le programme !</a>
 			</div>
+
 		</section>
 
 		<footer id="footer"></footer>
 	</body>
 
 	<!-- Script d'intanciation lancé au chargement, doit toujours être à la fin-->
-	<script src="arduino_blocks_def.js"></script>
-	<script src="arduino_blocks_gen.js"></script>
+	<script src="../res/blocks/arduino_blocks_def.js"></script>
+	<script src="../res/blocks/arduino_blocks_gen.js"></script>
+	<script src="../res/activity_functions.js"></script>
 	<script src="main-script.js"></script>
 
 </html>
diff --git a/activity_1/main-script.js b/activity_1/main-script.js
index 91be7ad2e25a62cef5bbec4a5b0bc43b3d46fcd5..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644
--- a/activity_1/main-script.js
+++ b/activity_1/main-script.js
@@ -1,143 +1,3 @@
-var blocklyDiv = document.getElementById('blocklyDiv');
-var blocklyArea = document.getElementById('blocklyArea');
-var connectButton = document.getElementById('connectButton');
-
-var receivedMsg = "";
-
-var port;
-let textEncoder = new TextEncoder();
-
-//Chargement de la toolbox
-var xml = null;
-var request = new XMLHttpRequest();
-request.open('GET', 'toolbox.xml', false);
-request.send();
-if (request.readyState == 4 && request.status == 200) {
-  xml = request.responseXML;
-}
-var toolbox = new XMLSerializer().serializeToString(xml.documentElement);
-
-//Instancie l'espace de travail blockly
-var workspace = Blockly.inject(blocklyDiv,
-      {toolbox: toolbox});
-
-/* Adapte la taille du conteneur de l'espace du travail à l'environnement
-Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc
-officielle de google xD*/
-var onresize = function(e) {
-	// Compute the absolute coordinates and dimensions of blocklyArea.
-    var element = blocklyArea;
-    var x = 0;
-    var y = 0;
-    do {
-      x += element.offsetLeft;
-      y += element.offsetTop;
-      element = element.offsetParent;
-    } while (element);
-    // Position blocklyDiv over blocklyArea.
-    blocklyDiv.style.left = x + 'px';
-    blocklyDiv.style.top = y + 'px';
-    blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
-    blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
-    Blockly.svgResize(workspace);
-  };
-  window.addEventListener('resize', onresize, false);
-  onresize();
-  Blockly.svgResize(workspace);
-
-//Instanciation de la liaison série à la fin du chargement de la page
-document.addEventListener('DOMContentLoaded', event => {
-  function connect() {
-    console.log('Connecting to ' + port.device_.productName + '...');
-    port.connect().then(() => {
-      console.log(port);
-      console.log('Connected.');
-      connectButton.textContent = 'Se déconnecter';
-      port.onReceive = data => {
-        let textDecoder = new TextDecoder();
-        receivedMsg = textDecoder.decode(data);
-        //console.log("Reçu :" + receivedMsg);
-      }
-      port.onReceiveError = error => {
-        console.log('Receive error: ' + error);
-      };
-    }, error => {
-      console.log('Connection error: ' + error);
-    });
-  };
-
-  connectButton.addEventListener('click', function() {
-    if (port) {
-      port.disconnect();
-      connectButton.textContent = 'Connecter à la maquette';
-      port = null;
-    } else {
-      serial.requestPort().then(selectedPort => {
-        port = selectedPort;
-        connect();
-      }).catch(error => {
-        console.log('Connection error: ' + error);
-      });
-    }
-  });
-
-  serial.getPorts().then(ports => {
-    if (ports.length == 0) {
-      console.log('No devices found.');
-    } else {
-      port = ports[0];
-      connect();
-    }
-  });
-});
-
-
-//Envoie ce string à l'Arduino
-function sendString(str) {
-  if (port !== undefined) {
-    port.send(textEncoder.encode(str)).catch(error => {
-      console.console.log('Send error: ' + error);
-    });
-  }
-}
-
-//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino
-function waitForUnlockFromArduino() {
-  if (receivedMsg != "UNLOCK;") {
-    setTimeout(waitForUnlockFromArduino, 10);
-    return;
-  }
-}
-
-//Lance le code tel que rentré par le joueur
-function runCode() {
-	var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript
-	var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites
-	myInterpreter.run(); //On lance le code de l'utilisateur dans la VM
-  //Il est possible de lancer le code de façon séquencielle
-}
-
-
-//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO)
-function initApi(interpreter, scope) {
-	// Add an API function for the alert() block.
-	var wrapper = function(text) {
-		return alert(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'alert',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the sendString() block.
-	wrapper = function(text) {
-		return sendString(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'sendString',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the waitForUnlockFromArduino() block.
-  wrapper = function() {
-		return waitForUnlockFromArduino();
-	};
-	interpreter.setProperty(scope, 'waitForUnlockFromArduino',
-	interpreter.createNativeFunction(wrapper));
-}
+/* Insérer ici les fonctions spécifiques à cette activité. Elles peuvent marcher
+avec les fonctions et variables déjà définies dans 'activity_functions.js' du
+dossier 'res'.*/
diff --git a/activity_2/arduino_blocks_def.js b/activity_2/arduino_blocks_def.js
deleted file mode 100644
index 07da611f6f60f41051c15192e36c23e0e5c4bb16..0000000000000000000000000000000000000000
--- a/activity_2/arduino_blocks_def.js
+++ /dev/null
@@ -1,41 +0,0 @@
-Blockly.Blocks['sendtoarduino'] = {
-  init: function() {
-    this.appendValueInput("MESSAGE")
-        .setCheck("String")
-        .appendField("Envoyer à l'arduino :");
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(330);
- this.setTooltip("envoi d'un string à l'Arduino de la maquette");
- this.setHelpUrl("");
-  }
-};
-
-Blockly.Blocks['turn_led'] = {
-  init: function() {
-    this.appendDummyInput()
-        .appendField("Mettre la LED en l'état")
-        .appendField(new Blockly.FieldDropdown([["allumée","on"], ["éteinte","off"]]), "val");
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(345);
- this.setTooltip("Change l'état d'une LED");
- this.setHelpUrl("");
-  }
-};
-
-Blockly.Blocks['arduino_wait'] = {
-  init: function() {
-    this.appendValueInput("time")
-        .setCheck("Number")
-        .appendField("Attendre");
-    this.appendDummyInput()
-        .appendField("secondes");
-    this.setInputsInline(true);
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(330);
- this.setTooltip("");
- this.setHelpUrl("");
-  }
-};
diff --git a/activity_2/arduino_blocks_gen.js b/activity_2/arduino_blocks_gen.js
deleted file mode 100644
index 45a5cd607237fea18c537c7aea5c90b65123a869..0000000000000000000000000000000000000000
--- a/activity_2/arduino_blocks_gen.js
+++ /dev/null
@@ -1,20 +0,0 @@
-Blockly.JavaScript['sendtoarduino'] = function(block) {
-  var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC);
-  // TODO: Assemble JavaScript into code variable.
-  var code = 'sendString("'+ value_message + ';"); \n';
-  return code;
-};
-
-Blockly.JavaScript['turn_led'] = function(block) {
-  var dropdown_val = block.getFieldValue('val');
-  // TODO: Assemble JavaScript into code variable.
-  var code = 'sendString("LED_'+ dropdown_val + ';");\n';
-  return code;
-};
-
-Blockly.JavaScript['arduino_wait'] = function(block) {
-  var value_time = Blockly.JavaScript.valueToCode(block, 'time', Blockly.JavaScript.ORDER_ATOMIC);
-  let time_ms = Math.round(value_time*1000);
-  var code = 'sendString("DELAY_'+time_ms+';");\n waitForUnlockFromArduino();\n';
-  return code;
-};
diff --git a/activity_2/index.html b/activity_2/index.html
index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644
--- a/activity_2/index.html
+++ b/activity_2/index.html
@@ -35,16 +35,18 @@
 			<div id="toolsArea">
 				<div id="animationArea"></div>
 				<a class="button" id="connectButton">Connecter à la maquette</a>
-				<a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a>
+				<a class="button" id="runButton">Lancer le programme !</a>
 			</div>
+
 		</section>
 
 		<footer id="footer"></footer>
 	</body>
 
 	<!-- Script d'intanciation lancé au chargement, doit toujours être à la fin-->
-	<script src="arduino_blocks_def.js"></script>
-	<script src="arduino_blocks_gen.js"></script>
+	<script src="../res/blocks/arduino_blocks_def.js"></script>
+	<script src="../res/blocks/arduino_blocks_gen.js"></script>
+	<script src="../res/activity_functions.js"></script>
 	<script src="main-script.js"></script>
 
 </html>
diff --git a/activity_2/main-script.js b/activity_2/main-script.js
index c49b0ae1c04f3d940195bee3c2a2996017289bd8..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644
--- a/activity_2/main-script.js
+++ b/activity_2/main-script.js
@@ -1,144 +1,3 @@
-var blocklyDiv = document.getElementById('blocklyDiv');
-var blocklyArea = document.getElementById('blocklyArea');
-var connectButton = document.getElementById('connectButton');
-
-var receivedMsg = "";
-var prevRecievedMsg = "";
-
-var port;
-let textEncoder = new TextEncoder();
-
-//Chargement de la toolbox
-var xml = null;
-var request = new XMLHttpRequest();
-request.open('GET', 'toolbox.xml', false);
-request.send();
-if (request.readyState == 4 && request.status == 200) {
-  xml = request.responseXML;
-}
-var toolbox = new XMLSerializer().serializeToString(xml.documentElement);
-
-//Instancie l'espace de travail blockly
-var workspace = Blockly.inject(blocklyDiv,
-      {toolbox: toolbox});
-
-/* Adapte la taille du conteneur de l'espace du travail à l'environnement
-Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc
-officielle de google xD*/
-var onresize = function(e) {
-	// Compute the absolute coordinates and dimensions of blocklyArea.
-    var element = blocklyArea;
-    var x = 0;
-    var y = 0;
-    do {
-      x += element.offsetLeft;
-      y += element.offsetTop;
-      element = element.offsetParent;
-    } while (element);
-    // Position blocklyDiv over blocklyArea.
-    blocklyDiv.style.left = x + 'px';
-    blocklyDiv.style.top = y + 'px';
-    blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
-    blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
-    Blockly.svgResize(workspace);
-  };
-  window.addEventListener('resize', onresize, false);
-  onresize();
-  Blockly.svgResize(workspace);
-
-//Instanciation de la liaison série à la fin du chargement de la page
-document.addEventListener('DOMContentLoaded', event => {
-  function connect() {
-    console.log('Connecting to ' + port.device_.productName + '...');
-    port.connect().then(() => {
-      console.log(port);
-      console.log('Connected.');
-      connectButton.textContent = 'Se déconnecter';
-      port.onReceive = data => {
-        let textDecoder = new TextDecoder();
-        receivedMsg = textDecoder.decode(data);
-        //console.log("Reçu :" + receivedMsg);
-      }
-      port.onReceiveError = error => {
-        console.log('Receive error: ' + error);
-      };
-    }, error => {
-      console.log('Connection error: ' + error);
-    });
-  };
-
-  connectButton.addEventListener('click', function() {
-    if (port) {
-      port.disconnect();
-      connectButton.textContent = 'Connecter à la maquette';
-      port = null;
-    } else {
-      serial.requestPort().then(selectedPort => {
-        port = selectedPort;
-        connect();
-      }).catch(error => {
-        console.log('Connection error: ' + error);
-      });
-    }
-  });
-
-  serial.getPorts().then(ports => {
-    if (ports.length == 0) {
-      console.log('No devices found.');
-    } else {
-      port = ports[0];
-      connect();
-    }
-  });
-});
-
-
-//Envoie ce string à l'Arduino
-function sendString(str) {
-  if (port !== undefined) {
-    port.send(textEncoder.encode(str)).catch(error => {
-      console.console.log('Send error: ' + error);
-    });
-  }
-}
-
-//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino
-function waitForUnlockFromArduino() {
-  if (receivedMsg != "UNLOCK;") {
-    setTimeout(waitForUnlockFromArduino, 10);
-    return;
-  }
-}
-
-//Lance le code tel que rentré par le joueur
-function runCode() {
-	var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript
-	var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites
-	myInterpreter.run(); //On lance le code de l'utilisateur dans la VM
-  //Il est possible de lancer le code de façon séquencielle
-}
-
-
-//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO)
-function initApi(interpreter, scope) {
-	// Add an API function for the alert() block.
-	var wrapper = function(text) {
-		return alert(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'alert',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the sendString() block.
-	wrapper = function(text) {
-		return sendString(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'sendString',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the waitForUnlockFromArduino() block.
-  wrapper = function() {
-		return waitForUnlockFromArduino();
-	};
-	interpreter.setProperty(scope, 'waitForUnlockFromArduino',
-	interpreter.createNativeFunction(wrapper));
-}
+/* Insérer ici les fonctions spécifiques à cette activité. Elles peuvent marcher
+avec les fonctions et variables déjà définies dans 'activity_functions.js' du
+dossier 'res'.*/
diff --git a/activity_3/arduino_blocks_def.js b/activity_3/arduino_blocks_def.js
deleted file mode 100644
index 07da611f6f60f41051c15192e36c23e0e5c4bb16..0000000000000000000000000000000000000000
--- a/activity_3/arduino_blocks_def.js
+++ /dev/null
@@ -1,41 +0,0 @@
-Blockly.Blocks['sendtoarduino'] = {
-  init: function() {
-    this.appendValueInput("MESSAGE")
-        .setCheck("String")
-        .appendField("Envoyer à l'arduino :");
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(330);
- this.setTooltip("envoi d'un string à l'Arduino de la maquette");
- this.setHelpUrl("");
-  }
-};
-
-Blockly.Blocks['turn_led'] = {
-  init: function() {
-    this.appendDummyInput()
-        .appendField("Mettre la LED en l'état")
-        .appendField(new Blockly.FieldDropdown([["allumée","on"], ["éteinte","off"]]), "val");
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(345);
- this.setTooltip("Change l'état d'une LED");
- this.setHelpUrl("");
-  }
-};
-
-Blockly.Blocks['arduino_wait'] = {
-  init: function() {
-    this.appendValueInput("time")
-        .setCheck("Number")
-        .appendField("Attendre");
-    this.appendDummyInput()
-        .appendField("secondes");
-    this.setInputsInline(true);
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(330);
- this.setTooltip("");
- this.setHelpUrl("");
-  }
-};
diff --git a/activity_3/arduino_blocks_gen.js b/activity_3/arduino_blocks_gen.js
deleted file mode 100644
index 45a5cd607237fea18c537c7aea5c90b65123a869..0000000000000000000000000000000000000000
--- a/activity_3/arduino_blocks_gen.js
+++ /dev/null
@@ -1,20 +0,0 @@
-Blockly.JavaScript['sendtoarduino'] = function(block) {
-  var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC);
-  // TODO: Assemble JavaScript into code variable.
-  var code = 'sendString("'+ value_message + ';"); \n';
-  return code;
-};
-
-Blockly.JavaScript['turn_led'] = function(block) {
-  var dropdown_val = block.getFieldValue('val');
-  // TODO: Assemble JavaScript into code variable.
-  var code = 'sendString("LED_'+ dropdown_val + ';");\n';
-  return code;
-};
-
-Blockly.JavaScript['arduino_wait'] = function(block) {
-  var value_time = Blockly.JavaScript.valueToCode(block, 'time', Blockly.JavaScript.ORDER_ATOMIC);
-  let time_ms = Math.round(value_time*1000);
-  var code = 'sendString("DELAY_'+time_ms+';");\n waitForUnlockFromArduino();\n';
-  return code;
-};
diff --git a/activity_3/index.html b/activity_3/index.html
index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644
--- a/activity_3/index.html
+++ b/activity_3/index.html
@@ -35,16 +35,18 @@
 			<div id="toolsArea">
 				<div id="animationArea"></div>
 				<a class="button" id="connectButton">Connecter à la maquette</a>
-				<a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a>
+				<a class="button" id="runButton">Lancer le programme !</a>
 			</div>
+
 		</section>
 
 		<footer id="footer"></footer>
 	</body>
 
 	<!-- Script d'intanciation lancé au chargement, doit toujours être à la fin-->
-	<script src="arduino_blocks_def.js"></script>
-	<script src="arduino_blocks_gen.js"></script>
+	<script src="../res/blocks/arduino_blocks_def.js"></script>
+	<script src="../res/blocks/arduino_blocks_gen.js"></script>
+	<script src="../res/activity_functions.js"></script>
 	<script src="main-script.js"></script>
 
 </html>
diff --git a/activity_3/main-script.js b/activity_3/main-script.js
index c49b0ae1c04f3d940195bee3c2a2996017289bd8..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644
--- a/activity_3/main-script.js
+++ b/activity_3/main-script.js
@@ -1,144 +1,3 @@
-var blocklyDiv = document.getElementById('blocklyDiv');
-var blocklyArea = document.getElementById('blocklyArea');
-var connectButton = document.getElementById('connectButton');
-
-var receivedMsg = "";
-var prevRecievedMsg = "";
-
-var port;
-let textEncoder = new TextEncoder();
-
-//Chargement de la toolbox
-var xml = null;
-var request = new XMLHttpRequest();
-request.open('GET', 'toolbox.xml', false);
-request.send();
-if (request.readyState == 4 && request.status == 200) {
-  xml = request.responseXML;
-}
-var toolbox = new XMLSerializer().serializeToString(xml.documentElement);
-
-//Instancie l'espace de travail blockly
-var workspace = Blockly.inject(blocklyDiv,
-      {toolbox: toolbox});
-
-/* Adapte la taille du conteneur de l'espace du travail à l'environnement
-Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc
-officielle de google xD*/
-var onresize = function(e) {
-	// Compute the absolute coordinates and dimensions of blocklyArea.
-    var element = blocklyArea;
-    var x = 0;
-    var y = 0;
-    do {
-      x += element.offsetLeft;
-      y += element.offsetTop;
-      element = element.offsetParent;
-    } while (element);
-    // Position blocklyDiv over blocklyArea.
-    blocklyDiv.style.left = x + 'px';
-    blocklyDiv.style.top = y + 'px';
-    blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
-    blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
-    Blockly.svgResize(workspace);
-  };
-  window.addEventListener('resize', onresize, false);
-  onresize();
-  Blockly.svgResize(workspace);
-
-//Instanciation de la liaison série à la fin du chargement de la page
-document.addEventListener('DOMContentLoaded', event => {
-  function connect() {
-    console.log('Connecting to ' + port.device_.productName + '...');
-    port.connect().then(() => {
-      console.log(port);
-      console.log('Connected.');
-      connectButton.textContent = 'Se déconnecter';
-      port.onReceive = data => {
-        let textDecoder = new TextDecoder();
-        receivedMsg = textDecoder.decode(data);
-        //console.log("Reçu :" + receivedMsg);
-      }
-      port.onReceiveError = error => {
-        console.log('Receive error: ' + error);
-      };
-    }, error => {
-      console.log('Connection error: ' + error);
-    });
-  };
-
-  connectButton.addEventListener('click', function() {
-    if (port) {
-      port.disconnect();
-      connectButton.textContent = 'Connecter à la maquette';
-      port = null;
-    } else {
-      serial.requestPort().then(selectedPort => {
-        port = selectedPort;
-        connect();
-      }).catch(error => {
-        console.log('Connection error: ' + error);
-      });
-    }
-  });
-
-  serial.getPorts().then(ports => {
-    if (ports.length == 0) {
-      console.log('No devices found.');
-    } else {
-      port = ports[0];
-      connect();
-    }
-  });
-});
-
-
-//Envoie ce string à l'Arduino
-function sendString(str) {
-  if (port !== undefined) {
-    port.send(textEncoder.encode(str)).catch(error => {
-      console.console.log('Send error: ' + error);
-    });
-  }
-}
-
-//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino
-function waitForUnlockFromArduino() {
-  if (receivedMsg != "UNLOCK;") {
-    setTimeout(waitForUnlockFromArduino, 10);
-    return;
-  }
-}
-
-//Lance le code tel que rentré par le joueur
-function runCode() {
-	var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript
-	var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites
-	myInterpreter.run(); //On lance le code de l'utilisateur dans la VM
-  //Il est possible de lancer le code de façon séquencielle
-}
-
-
-//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO)
-function initApi(interpreter, scope) {
-	// Add an API function for the alert() block.
-	var wrapper = function(text) {
-		return alert(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'alert',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the sendString() block.
-	wrapper = function(text) {
-		return sendString(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'sendString',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the waitForUnlockFromArduino() block.
-  wrapper = function() {
-		return waitForUnlockFromArduino();
-	};
-	interpreter.setProperty(scope, 'waitForUnlockFromArduino',
-	interpreter.createNativeFunction(wrapper));
-}
+/* Insérer ici les fonctions spécifiques à cette activité. Elles peuvent marcher
+avec les fonctions et variables déjà définies dans 'activity_functions.js' du
+dossier 'res'.*/
diff --git a/activity_4/arduino_blocks_def.js b/activity_4/arduino_blocks_def.js
deleted file mode 100644
index 07da611f6f60f41051c15192e36c23e0e5c4bb16..0000000000000000000000000000000000000000
--- a/activity_4/arduino_blocks_def.js
+++ /dev/null
@@ -1,41 +0,0 @@
-Blockly.Blocks['sendtoarduino'] = {
-  init: function() {
-    this.appendValueInput("MESSAGE")
-        .setCheck("String")
-        .appendField("Envoyer à l'arduino :");
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(330);
- this.setTooltip("envoi d'un string à l'Arduino de la maquette");
- this.setHelpUrl("");
-  }
-};
-
-Blockly.Blocks['turn_led'] = {
-  init: function() {
-    this.appendDummyInput()
-        .appendField("Mettre la LED en l'état")
-        .appendField(new Blockly.FieldDropdown([["allumée","on"], ["éteinte","off"]]), "val");
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(345);
- this.setTooltip("Change l'état d'une LED");
- this.setHelpUrl("");
-  }
-};
-
-Blockly.Blocks['arduino_wait'] = {
-  init: function() {
-    this.appendValueInput("time")
-        .setCheck("Number")
-        .appendField("Attendre");
-    this.appendDummyInput()
-        .appendField("secondes");
-    this.setInputsInline(true);
-    this.setPreviousStatement(true, null);
-    this.setNextStatement(true, null);
-    this.setColour(330);
- this.setTooltip("");
- this.setHelpUrl("");
-  }
-};
diff --git a/activity_4/arduino_blocks_gen.js b/activity_4/arduino_blocks_gen.js
deleted file mode 100644
index 45a5cd607237fea18c537c7aea5c90b65123a869..0000000000000000000000000000000000000000
--- a/activity_4/arduino_blocks_gen.js
+++ /dev/null
@@ -1,20 +0,0 @@
-Blockly.JavaScript['sendtoarduino'] = function(block) {
-  var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC);
-  // TODO: Assemble JavaScript into code variable.
-  var code = 'sendString("'+ value_message + ';"); \n';
-  return code;
-};
-
-Blockly.JavaScript['turn_led'] = function(block) {
-  var dropdown_val = block.getFieldValue('val');
-  // TODO: Assemble JavaScript into code variable.
-  var code = 'sendString("LED_'+ dropdown_val + ';");\n';
-  return code;
-};
-
-Blockly.JavaScript['arduino_wait'] = function(block) {
-  var value_time = Blockly.JavaScript.valueToCode(block, 'time', Blockly.JavaScript.ORDER_ATOMIC);
-  let time_ms = Math.round(value_time*1000);
-  var code = 'sendString("DELAY_'+time_ms+';");\n waitForUnlockFromArduino();\n';
-  return code;
-};
diff --git a/activity_4/index.html b/activity_4/index.html
index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644
--- a/activity_4/index.html
+++ b/activity_4/index.html
@@ -35,16 +35,18 @@
 			<div id="toolsArea">
 				<div id="animationArea"></div>
 				<a class="button" id="connectButton">Connecter à la maquette</a>
-				<a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a>
+				<a class="button" id="runButton">Lancer le programme !</a>
 			</div>
+
 		</section>
 
 		<footer id="footer"></footer>
 	</body>
 
 	<!-- Script d'intanciation lancé au chargement, doit toujours être à la fin-->
-	<script src="arduino_blocks_def.js"></script>
-	<script src="arduino_blocks_gen.js"></script>
+	<script src="../res/blocks/arduino_blocks_def.js"></script>
+	<script src="../res/blocks/arduino_blocks_gen.js"></script>
+	<script src="../res/activity_functions.js"></script>
 	<script src="main-script.js"></script>
 
 </html>
diff --git a/activity_4/main-script.js b/activity_4/main-script.js
index c49b0ae1c04f3d940195bee3c2a2996017289bd8..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644
--- a/activity_4/main-script.js
+++ b/activity_4/main-script.js
@@ -1,144 +1,3 @@
-var blocklyDiv = document.getElementById('blocklyDiv');
-var blocklyArea = document.getElementById('blocklyArea');
-var connectButton = document.getElementById('connectButton');
-
-var receivedMsg = "";
-var prevRecievedMsg = "";
-
-var port;
-let textEncoder = new TextEncoder();
-
-//Chargement de la toolbox
-var xml = null;
-var request = new XMLHttpRequest();
-request.open('GET', 'toolbox.xml', false);
-request.send();
-if (request.readyState == 4 && request.status == 200) {
-  xml = request.responseXML;
-}
-var toolbox = new XMLSerializer().serializeToString(xml.documentElement);
-
-//Instancie l'espace de travail blockly
-var workspace = Blockly.inject(blocklyDiv,
-      {toolbox: toolbox});
-
-/* Adapte la taille du conteneur de l'espace du travail à l'environnement
-Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc
-officielle de google xD*/
-var onresize = function(e) {
-	// Compute the absolute coordinates and dimensions of blocklyArea.
-    var element = blocklyArea;
-    var x = 0;
-    var y = 0;
-    do {
-      x += element.offsetLeft;
-      y += element.offsetTop;
-      element = element.offsetParent;
-    } while (element);
-    // Position blocklyDiv over blocklyArea.
-    blocklyDiv.style.left = x + 'px';
-    blocklyDiv.style.top = y + 'px';
-    blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
-    blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
-    Blockly.svgResize(workspace);
-  };
-  window.addEventListener('resize', onresize, false);
-  onresize();
-  Blockly.svgResize(workspace);
-
-//Instanciation de la liaison série à la fin du chargement de la page
-document.addEventListener('DOMContentLoaded', event => {
-  function connect() {
-    console.log('Connecting to ' + port.device_.productName + '...');
-    port.connect().then(() => {
-      console.log(port);
-      console.log('Connected.');
-      connectButton.textContent = 'Se déconnecter';
-      port.onReceive = data => {
-        let textDecoder = new TextDecoder();
-        receivedMsg = textDecoder.decode(data);
-        //console.log("Reçu :" + receivedMsg);
-      }
-      port.onReceiveError = error => {
-        console.log('Receive error: ' + error);
-      };
-    }, error => {
-      console.log('Connection error: ' + error);
-    });
-  };
-
-  connectButton.addEventListener('click', function() {
-    if (port) {
-      port.disconnect();
-      connectButton.textContent = 'Connecter à la maquette';
-      port = null;
-    } else {
-      serial.requestPort().then(selectedPort => {
-        port = selectedPort;
-        connect();
-      }).catch(error => {
-        console.log('Connection error: ' + error);
-      });
-    }
-  });
-
-  serial.getPorts().then(ports => {
-    if (ports.length == 0) {
-      console.log('No devices found.');
-    } else {
-      port = ports[0];
-      connect();
-    }
-  });
-});
-
-
-//Envoie ce string à l'Arduino
-function sendString(str) {
-  if (port !== undefined) {
-    port.send(textEncoder.encode(str)).catch(error => {
-      console.console.log('Send error: ' + error);
-    });
-  }
-}
-
-//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino
-function waitForUnlockFromArduino() {
-  if (receivedMsg != "UNLOCK;") {
-    setTimeout(waitForUnlockFromArduino, 10);
-    return;
-  }
-}
-
-//Lance le code tel que rentré par le joueur
-function runCode() {
-	var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript
-	var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites
-	myInterpreter.run(); //On lance le code de l'utilisateur dans la VM
-  //Il est possible de lancer le code de façon séquencielle
-}
-
-
-//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO)
-function initApi(interpreter, scope) {
-	// Add an API function for the alert() block.
-	var wrapper = function(text) {
-		return alert(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'alert',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the sendString() block.
-	wrapper = function(text) {
-		return sendString(arguments.length ? text : '');
-	};
-	interpreter.setProperty(scope, 'sendString',
-	interpreter.createNativeFunction(wrapper));
-
-  // Add an API function for the waitForUnlockFromArduino() block.
-  wrapper = function() {
-		return waitForUnlockFromArduino();
-	};
-	interpreter.setProperty(scope, 'waitForUnlockFromArduino',
-	interpreter.createNativeFunction(wrapper));
-}
+/* Insérer ici les fonctions spécifiques à cette activité. Elles peuvent marcher
+avec les fonctions et variables déjà définies dans 'activity_functions.js' du
+dossier 'res'.*/
diff --git a/res/activity_functions.js b/res/activity_functions.js
new file mode 100644
index 0000000000000000000000000000000000000000..7194c35b7fe55a014200959746057693f53332df
--- /dev/null
+++ b/res/activity_functions.js
@@ -0,0 +1,195 @@
+var blocklyDiv = document.getElementById('blocklyDiv');
+var blocklyArea = document.getElementById('blocklyArea');
+var connectButton = document.getElementById('connectButton');
+var runButton = document.getElementById('runButton');
+
+var receivedMsg = "";
+
+var port;
+let textEncoder = new TextEncoder();
+
+
+//Lance le code tel que rentré par le joueur
+function runCode() {
+	var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript
+	var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites
+	myInterpreter.run(); //On lance le code de l'utilisateur dans la VM
+  //Il est possible de lancer le code de façon séquencielle
+}
+
+
+
+/************************************
+ FONCTIONS DE COMMUNICATION ARDUINO
+ ************************************/
+
+//Envoie ce string à l'Arduino
+function sendString(str) {
+  if (port !== undefined) {
+    port.send(textEncoder.encode(str)).catch(error => {
+      console.log('Send error: ' + error);
+    });
+  }
+}
+
+//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino
+function waitForUnlockFromArduino() {
+  if (receivedMsg != "UNLOCK;") {
+    setTimeout(waitForUnlockFromArduino, 10);
+    return;
+  }
+}
+
+//Attend un message de l'Arduino et retourne ses arguments éventuels
+//Les arguments sont séparés par '_'
+function waitForMessageFromArduino(message) {
+  var args = receivedMsg.split('_');
+  if (args[0] != message) {
+    setTimeout(waitForUnlockFromArduino, 10);
+    return;
+  }
+  return args.slice(1);
+}
+
+
+
+/*******************************************************
+IMPLEMENTATION DES FONCTIONS DANS L'INTERPRETEUR JS
+********************************************************/
+
+//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO)
+function initApi(interpreter, scope) {
+	// Add an API function for the alert() block.
+	var wrapper = function(text) {
+		return alert(arguments.length ? text : '');
+	};
+	interpreter.setProperty(scope, 'alert',
+	interpreter.createNativeFunction(wrapper));
+
+  // Add an API function for the sendString() block.
+	wrapper = function(text) {
+		return sendString(arguments.length ? text : '');
+	};
+	interpreter.setProperty(scope, 'sendString',
+	interpreter.createNativeFunction(wrapper));
+
+  // Add an API function for the waitForUnlockFromArduino() block.
+  wrapper = function() {
+		return waitForUnlockFromArduino();
+	};
+	interpreter.setProperty(scope, 'waitForUnlockFromArduino',
+	interpreter.createNativeFunction(wrapper));
+
+  // Add an API function for the waitForMessageFromArduino() block.
+  wrapper = function(text) {
+		return waitForUnlockFromArduino(arguments.length ? text : '');
+	};
+	interpreter.setProperty(scope, 'waitForMessageFromArduino',
+	interpreter.createNativeFunction(wrapper));
+}
+
+
+
+/***************************************************
+ GESTION DES CONNEXIONS ET INITIALISATION SERIAL
+***************************************************/
+
+//Instanciation de la liaison série à la fin du chargement de la page
+document.addEventListener('DOMContentLoaded', event => {
+  function connect() {
+    console.log('Connecting to ' + port.device_.productName + '...');
+    port.connect().then(() => {
+      console.log(port);
+      console.log('Connected.');
+      connectButton.textContent = 'Se déconnecter';
+			connectButton.style.background = 'linear-gradient(to bottom, #B52812 5%, #99220F 100%)';
+			connectButton.style.border = '3px solid #801C0D';
+			runButton.style.background = 'linear-gradient(to bottom, #77B55B 5%, #568241 100%)';
+			runButton.style.border = '3px solid #476B36';
+			runButton.addEventListener('click', runCode);
+      port.onReceive = data => {
+        let textDecoder = new TextDecoder();
+        receivedMsg = textDecoder.decode(data);
+        //console.log("Reçu :" + receivedMsg);
+      }
+      port.onReceiveError = error => {
+        console.log('Receive error: ' + error);
+      };
+    }, error => {
+      console.log('Connection error: ' + error);
+    });
+  };
+
+  connectButton.addEventListener('click', function() {
+    if (port) {
+      port.disconnect();
+      connectButton.textContent = 'Connecter à la maquette';
+			connectButton.style.background = 'linear-gradient(to bottom, #77B55B 5%, #568241 100%)';
+			connectButton.style.border = '3px solid #476B36';
+			runButton.style.background = 'linear-gradient(to bottom, #737375 5%, #5D5C5E 100%)';
+			runButton.style.border = '3px solid #353436';
+			runButton.removeEventListener('click', runCode);
+      port = null;
+    } else {
+      serial.requestPort().then(selectedPort => {
+        port = selectedPort;
+        connect();
+      }).catch(error => {
+        console.log('Connection error: ' + error);
+      });
+    }
+  });
+
+  serial.getPorts().then(ports => {
+    if (ports.length == 0) {
+      console.log('No devices found.');
+    } else {
+      port = ports[0];
+      connect();
+    }
+  });
+});
+
+
+
+/***********************************************
+INITIALISATION DU MODULE BLOCKLY AVEC SA TOOLBOX
+************************************************/
+
+//Chargement de la toolbox
+var xml = null;
+var request = new XMLHttpRequest();
+request.open('GET', 'toolbox.xml', false);
+request.send();
+if (request.readyState == 4 && request.status == 200) {
+  xml = request.responseXML;
+}
+var toolbox = new XMLSerializer().serializeToString(xml.documentElement);
+
+//Instancie l'espace de travail blockly
+var workspace = Blockly.inject(blocklyDiv,
+      {toolbox: toolbox});
+
+/* Adapte la taille du conteneur de l'espace du travail à l'environnement
+Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc
+officielle de google xD*/
+var onresize = function(e) {
+	// Compute the absolute coordinates and dimensions of blocklyArea.
+  var element = blocklyArea;
+  var x = 0;
+  var y = 0;
+  do {
+    x += element.offsetLeft;
+    y += element.offsetTop;
+    element = element.offsetParent;
+  } while (element);
+  // Position blocklyDiv over blocklyArea.
+  blocklyDiv.style.left = x + 'px';
+  blocklyDiv.style.top = y + 'px';
+  blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
+  blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
+  Blockly.svgResize(workspace);
+};
+window.addEventListener('resize', onresize, false);
+onresize();
+Blockly.svgResize(workspace);
diff --git a/activity_1/arduino_blocks_def.js b/res/blocks/arduino_blocks_def.js
similarity index 100%
rename from activity_1/arduino_blocks_def.js
rename to res/blocks/arduino_blocks_def.js
diff --git a/activity_1/arduino_blocks_gen.js b/res/blocks/arduino_blocks_gen.js
similarity index 100%
rename from activity_1/arduino_blocks_gen.js
rename to res/blocks/arduino_blocks_gen.js
diff --git a/res/style.css b/res/style.css
index da689c2fe5ee72b777c7984c9b44a8e86579b844..c97f011ad12d13a10fc20be72f5aea615bfd7494 100644
--- a/res/style.css
+++ b/res/style.css
@@ -90,7 +90,6 @@ margin: 50px;
 background-color: var(--main-bg-color-light);
 transition: color 1s, background-color 1s;
 }
-
 li.activitySelector:hover a{
 background-color: var(--main-bg-color-dark);
 color: white;
@@ -113,7 +112,6 @@ max-height: 210px;
 max-width: 280px;
 align-self: center;
 }
-
 li.activitySelector:hover a img {
 display: none;
 }
@@ -125,7 +123,6 @@ text-align: justify;
 color: var(--main-bg-color-light);
 transition: color 1s;
 }
-
 li.activitySelector:hover a p {
 display: inline-block;
 color: white;
@@ -150,16 +147,10 @@ text-decoration:none;
 
 #runButton {
 	order: 3;
-	background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%);
-	background-color:#77b55a;
-	border:3px solid #4b8f29;
+	background:linear-gradient(to bottom, #737375 5%, #5D5C5E 100%);
+	border:3px solid #353436;
 	color:#ffffff;
-	text-shadow:0px 1px 0px #5b8a3c;
-}
-
-#runButton:hover {
-	background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%);
-	background-color:#72b352;
+	text-shadow:0px 1px 0px #2E362B;
 }
 #runButton:active {
 	position:relative;
@@ -168,17 +159,11 @@ text-decoration:none;
 
 #connectButton {
 	order: 1;
-	background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%);
-	background-color:#77b55a;
-	border:3px solid #4b8f29;
+	background:linear-gradient(to bottom, #77B55B 5%, #568241 100%);
+	border:3px solid #476B36;
 	color:#ffffff;
-	text-shadow:0px 1px 0px #5b8a3c;
-
-}
+	text-shadow:0px 1px 0px #2E362B;
 
-#connectButton:hover {
-	background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%);
-	background-color:#72b352;
 }
 #connectButton:active {
 	position:relative;